evaluation/metrics.js (114 lines of code) (raw):

'use strict'; var _ = require('lodash'); var json2csv = require('json2csv'); var fs = require('fs'); var labella = require('../dist/labella-extra.min.js'); var util = labella.util; var metrics = labella.metrics; function applyTreatment(treatment, nodes){ if(_.isFunction(treatment)){ return treatment(nodes); } else{ return (new labella.Force(treatment)) .nodes(nodes) .compute(); } } function computeMetrics(treatment, nodes){ var inputNodes = nodes.map(function(d){return d.clone();}); var t1 = process.hrtime(); var force = applyTreatment(treatment, inputNodes); var time = process.hrtime(t1); time = time[0]*1000000000 + time[1]; var layers = force.getLayers(); var options = force.options(); return { time: time/1000000, // convert to ms layerCount: layers.length, displacement: metrics.displacement(layers), pathLength: metrics.pathLength(layers), overflowSpace: metrics.overflowSpace(layers, options.minPos, options.maxPos), overlapCount: metrics.overlapCount(layers), overlapSpace: metrics.overlapSpace(layers), overDensitySpace: metrics.overDensitySpace(layers, options.density, options.maxPos-options.minPos, options.nodeSpacing), weightedAllocation: metrics.weightedAllocation(layers), weightedAllocatedSpace: metrics.weightedAllocatedSpace(layers) }; } function run(steps, round, treatments, nodeOptions){ return _.flatMap(steps, function(step){ var nodeSets = _.range(0,round,1).map(function(){ return util.generateNodes(step, _.extend({ minWidth: 20, maxWidth: 50, minPos: 0, maxPos: 500 }, nodeOptions)); }); console.log('step', step); return treatments.map(function(treatment, index){ var results = nodeSets.map(function(nodes){ return computeMetrics(treatment, nodes); }); return Object.keys(results[0]).reduce(function(agg, name){ agg[name] = _.mean(results.map(function(d){return d[name];})); return agg; }, { numNodes: step, treatmentID: index, algorithm: treatment.algorithm, removeOverlap: treatment.removeOverlap }); }); }); } var treatments = [ { algorithm: 'none', removeOverlap: false, density: 0.85, minPos: 0, maxPos: 500 }, { algorithm: 'none', density: 0.85, minPos: 0, maxPos: 500 }, { algorithm: 'simple', density: 0.85, minPos: 0, maxPos: 500 }, { algorithm: 'simple', removeOverlap: false, density: 0.85, minPos: 0, maxPos: 500 }, { algorithm: 'overlap', density: 0.85, minPos: 0, maxPos: 500 }, { algorithm: 'overlap', removeOverlap: false, density: 0.85, minPos: 0, maxPos: 500 } ]; var scores = run(_.range(1,10,1).concat(_.range(10,301,10)), 10, treatments); json2csv({ data: scores }, function(err, csv) { if (err) console.log(err); // console.log(csv); fs.writeFileSync('output/metrics.csv', csv); console.log('done'); }); // console.log('scores', scores);