evaluation/v0_vs_v1.js (115 lines of code) (raw):

'use strict'; var Promise = require('promise'); var _ = require('lodash'); var fs = require('fs'); var labella0 = require('./labella-0.1.1.min.js'); var labella1 = require('./labella-extra.min.js'); var metrics = labella1.metrics; var util = labella1.util; function layout(lib, version, nodes, options){ nodes = nodes.map(function(n){ var n2 = new lib.Node(); n2.idealPos = n.idealPos; n2.width = n.width; n2.currentPos = n.currentPos; return n2; }); var force = new lib.Force(options).nodes(nodes); if(version===0){ return new Promise(function (resolve, reject) { var t1 = process.hrtime(); force.on('end', function(){ resolve({ force: force, time: process.hrtime(t1) }); }) .start(); }); } else if(version===1){ var t1 = process.hrtime(); force.compute(); return Promise.resolve({ force: force, time: process.hrtime(t1) }); } } function run(steps, times, options){ var queue = []; steps.map(function(numNodes){ for(var i=0;i<times;i++){ queue.push([numNodes, i]); } }); var index = 0; var results = queue.map(function(){ return [null, null]; }); function iter(item, options){ var nodes = util.generateNodes(item[0], { minWidth: 10, maxWidth: 50, minPos: null, maxPos: null }); layout(labella1, 1, nodes, options) .then(function(result1){ results[index][1] = { time: result1.time, displacement: metrics.displacement(result1.force.nodes()) }; layout(labella0, 0, nodes, options) .then(function(result0){ results[index][0] = { time: result0.time, displacement: metrics.displacement(result0.force.nodes()) }; index++; if(index<queue.length){ iter(queue[index]); } else{ var output = _.zip(queue, results).map(function(d){ return { numNodes: d[0][0], index: d[0][1], r0: d[1][0].time[0] * 1000000000 + d[1][0].time[1], r1: d[1][1].time[0] * 1000000000 + d[1][1].time[1], d0: d[1][0].displacement, d1: d[1][1].displacement }; }); summarize(output); } }); }); } if(queue.length>0){ iter(queue[0], options); } } function summarize(results){ var summary = _.mapValues(_.groupBy(results, function(d){return d.numNodes;}), function(trials){ return { r0: _.mean(trials.map(function(d){return d.r0;})), r1: _.mean(trials.map(function(d){return d.r1;})), d0: _.mean(trials.map(function(d){return d.d0;})), d1: _.mean(trials.map(function(d){return d.d1;})) }; }); console.log('summarizing'); var rows = []; _.each(summary, function(value, key){ rows.push([+key, 'v0', value.r0/100000, value.d0]); rows.push([+key, 'v1', value.r1/100000, value.d1]); }); fs.writeFileSync('output/0vs1.csv', [['numNodes','version','ms', 'displacement']].concat(rows).map(function(d){return d.join(',');}).join('\n')); console.log('done'); } var options = { algorithm: 'none', roundsPerTick: 100 }; run(_.range(1,10,1).concat(_.range(10,101,10)), 10, options);