231 lines
5.7 KiB
JavaScript
231 lines
5.7 KiB
JavaScript
|
var fs = require('fs');
|
||
|
|
||
|
var roomTranslation = {
|
||
|
'lounge': false,
|
||
|
'garderobe': false,
|
||
|
'foyer': false,
|
||
|
'raucherhof': false,
|
||
|
'hof': false,
|
||
|
'cafeteria': false,
|
||
|
'vip': false,
|
||
|
'refillbar': false,
|
||
|
'stage1': 'stage1',
|
||
|
'stage2': 'stage2',
|
||
|
'stage3': 'stage3',
|
||
|
'stage4': 'stage4',
|
||
|
'stage5': 'stage5',
|
||
|
'stage6': 'stage6',
|
||
|
'stage7': 'stage7',
|
||
|
'workshop1': 'workshopa',
|
||
|
'workshop2': 'workshopb',
|
||
|
'workshop3': 'workshopc',
|
||
|
'workshop4': 'workshopd'
|
||
|
};
|
||
|
|
||
|
var log = fs.readFileSync('../cleaned/rp13-obj.json', 'utf8');
|
||
|
log = JSON.parse(log);
|
||
|
|
||
|
var accesspoints = fs.readFileSync('../cleaned/accesspoints.json', 'utf8');
|
||
|
accesspoints = JSON.parse(accesspoints);
|
||
|
|
||
|
var sessions = fs.readFileSync('../sources/sessions.json', 'utf8');
|
||
|
sessions = JSON.parse(sessions);
|
||
|
|
||
|
var sessionLookup = {};
|
||
|
sessions.forEach(function (session, index) {
|
||
|
var room = session.room.replace(/\s/g, '').toLowerCase();
|
||
|
if (sessionLookup[room] === undefined) sessionLookup[room] = [];
|
||
|
var t0 = (parseInt(session.date.substr(9,1),10) - 5)*1440 + session.startInt;
|
||
|
var t1 = t0 + session.duration;
|
||
|
for (var t = t0; t < t1; t++) {
|
||
|
sessionLookup[room][t] = index;
|
||
|
}
|
||
|
session.macs = {};
|
||
|
session.macCount = 0;
|
||
|
session.title = session.title.replace(/^\s+|\s+$/g, '');
|
||
|
if (session.title == 'brand eins') session.title += ' - ' + session.persons.join(', ');
|
||
|
session.title = session.title.replace(/[^a-zäöüß0-9\:\-\.\?\!]+/gi, ' ');
|
||
|
});
|
||
|
|
||
|
log.forEach(function (entry) {
|
||
|
var time = Math.round(((new Date(entry.date)).getTime()-1367712000000)/60000+120);
|
||
|
if (!accesspoints[entry.access_point]) return;
|
||
|
var room = accesspoints[entry.access_point].group;
|
||
|
var correctRoom = roomTranslation[room];
|
||
|
if (!correctRoom) return;
|
||
|
|
||
|
var sessionId = sessionLookup[correctRoom][time];
|
||
|
|
||
|
if (sessionId === undefined) return;
|
||
|
|
||
|
var session = sessions[sessionId];
|
||
|
|
||
|
var mac = entry.mac_hash;
|
||
|
if (session.macs[mac] === undefined) session.macs[mac] = 0;
|
||
|
session.macs[mac]++;
|
||
|
session.macCount++;
|
||
|
});
|
||
|
|
||
|
var n = 0;
|
||
|
newSessions = [];
|
||
|
sessions.forEach(function (session) {
|
||
|
if (session.macCount > 50) {
|
||
|
var count = [];
|
||
|
Object.keys(session.macs).forEach(function (mac) {
|
||
|
count.push(session.macs[mac]);
|
||
|
});
|
||
|
count.sort();
|
||
|
var m = count[Math.floor(count.length/2)];
|
||
|
|
||
|
var macs = {};
|
||
|
var mCount = 0;
|
||
|
Object.keys(session.macs).forEach(function (mac) {
|
||
|
if (session.macs[mac] >= m) {
|
||
|
macs[mac] = 1;
|
||
|
mCount++;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
session.macs = macs;
|
||
|
session.macCount = mCount;
|
||
|
|
||
|
newSessions.push(session);
|
||
|
n += mCount;
|
||
|
}
|
||
|
})
|
||
|
sessions = newSessions;
|
||
|
|
||
|
var matrix = [];
|
||
|
for (var i = 0; i < sessions.length; i++) matrix[i] = [];
|
||
|
console.log(n);
|
||
|
n = 2523;
|
||
|
var edges = ['source\ttarget\tweight'];
|
||
|
var nodes = ['id\tlabel\tsize'];
|
||
|
for (var i = 0; i < sessions.length; i++) {
|
||
|
var session1 = sessions[i];
|
||
|
var p1 = session1.macCount;
|
||
|
nodes.push([session1.title, session1.title, p1].join('\t'));
|
||
|
matrix[i][i] = p1;
|
||
|
for (var j = i+1; j < sessions.length; j++) {
|
||
|
var session2 = sessions[j];
|
||
|
var p2 = session2.macCount;
|
||
|
var c = 0;
|
||
|
Object.keys(session1.macs).forEach(function (mac) {
|
||
|
if (session2.macs[mac] !== undefined) {
|
||
|
c += Math.min(session1.macs[mac], session2.macs[mac]);
|
||
|
}
|
||
|
});
|
||
|
var v = 10*(c - p1*p2/n)/n;
|
||
|
v = Math.pow(Math.abs(v), 2)*((v > 0) ? 1 : -1);
|
||
|
if (v > 1e-4) {
|
||
|
edges.push([session1.title, session2.title, v].join('\t'));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fs.writeFileSync('edges.csv', edges.join('\n'), 'utf8');
|
||
|
fs.writeFileSync('nodes.csv', nodes.join('\n'), 'utf8');
|
||
|
|
||
|
/*
|
||
|
|
||
|
var ap = new Lookup();
|
||
|
Object.keys(accesspoints).forEach(function (name) {
|
||
|
var point = accesspoints[name];
|
||
|
var name = Math.round(point.x*100)+'_'+Math.round(point.y*50);
|
||
|
point.name = name;
|
||
|
ap.add(name);
|
||
|
});
|
||
|
|
||
|
var condensedAccesspoints = [];
|
||
|
Object.keys(accesspoints).forEach(function (name) {
|
||
|
var point = accesspoints[name];
|
||
|
point.index = ap.getId(point.name);
|
||
|
condensedAccesspoints[point.index] = {
|
||
|
x: point.x,
|
||
|
y: point.y,
|
||
|
room: point.group
|
||
|
};
|
||
|
});
|
||
|
|
||
|
var macs = new Lookup();
|
||
|
var times = new Lookup();
|
||
|
|
||
|
log.forEach(function (entry) {
|
||
|
if (accesspoints[entry.access_point] === undefined) return;
|
||
|
|
||
|
entry.time = ((new Date(entry.date)).getTime()-1367712000000)/60000+120;
|
||
|
times.add(entry.time);
|
||
|
|
||
|
macs.add(entry.mac_hash);
|
||
|
});
|
||
|
|
||
|
times.sort(function (a,b) { return a-b });
|
||
|
|
||
|
var newEntries = [];
|
||
|
var csv = [['Zeit','Accesspoint','Raum','x (ungefähr)','y (ungefähr)','fortlaufende Gerätenummer'].join(',')];
|
||
|
log.forEach(function (entry) {
|
||
|
if (accesspoints[entry.access_point] === undefined) return;
|
||
|
|
||
|
var mac = macs.getId(entry.mac_hash);
|
||
|
var time = times.getId(entry.time);
|
||
|
var point = accesspoints[entry.access_point].index;
|
||
|
|
||
|
if (newEntries[mac] === undefined) newEntries[mac] = [];
|
||
|
newEntries[mac][time] = point;
|
||
|
csv.push([
|
||
|
entry.date,
|
||
|
entry.access_point,
|
||
|
condensedAccesspoints[point].room,
|
||
|
condensedAccesspoints[point].x*2,
|
||
|
condensedAccesspoints[point].y,
|
||
|
mac
|
||
|
].join(','));
|
||
|
});
|
||
|
|
||
|
var result = {
|
||
|
times: times.getJSON(),
|
||
|
points: condensedAccesspoints,
|
||
|
matrix: newEntries
|
||
|
};
|
||
|
|
||
|
var json = JSON.stringify(result );
|
||
|
json = json.replace(/null/g, '');
|
||
|
|
||
|
fs.writeFileSync('../clients/anim/data.js', 'var data = '+json, 'utf8');
|
||
|
fs.writeFileSync('../clients/anim/republica13-wlan-data.csv', csv.join('\n'), 'utf8');
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
function Lookup() {
|
||
|
var me = this;
|
||
|
var entry2index = {};
|
||
|
var index2entry = [];
|
||
|
|
||
|
me.add = function (entry) {
|
||
|
if (entry2index[entry] === undefined) {
|
||
|
var index = index2entry.length;
|
||
|
entry2index[entry] = index;
|
||
|
index2entry[index] = entry;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
me.sort = function (callback) {
|
||
|
entry2index = {};
|
||
|
index2entry = index2entry.sort(callback);
|
||
|
index2entry.forEach(function (entry, index) {
|
||
|
entry2index[entry] = index;
|
||
|
})
|
||
|
}
|
||
|
|
||
|
me.getId = function (entry) {
|
||
|
return entry2index[entry];
|
||
|
}
|
||
|
|
||
|
me.getJSON = function () {
|
||
|
return index2entry.slice(0);
|
||
|
}
|
||
|
|
||
|
return me;
|
||
|
}
|
||
|
*/
|