From 409777bc146b139ac2ddbf0cd6564275fd20928c Mon Sep 17 00:00:00 2001 From: Pitchaya Boonsarngsuk <2285135b@student.gla.ac.uk> Date: Tue, 30 Jan 2018 20:10:46 +0000 Subject: [PATCH] Link: optimize so that no link {} is used, less than half the ram used --- .../linkForce.js | 34 +++++++++++-------- src/link.js | 17 +++++----- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/examples/js/src/neighbourSampling-papaparsing/linkForce.js b/examples/js/src/neighbourSampling-papaparsing/linkForce.js index 681164c..cf35e17 100644 --- a/examples/js/src/neighbourSampling-papaparsing/linkForce.js +++ b/examples/js/src/neighbourSampling-papaparsing/linkForce.js @@ -8,17 +8,28 @@ function startLinkSimulation() { manualStop = true; simulation.stop(); p1 = performance.now(); - let links = []; + let links = [], force; - // Initialize link array. - nodes = simulation.nodes(); - for (i = nodes.length-1; i >= 1; i--) { - for (j = i-1; j >= 0; j--) { - links.push({ - source: nodes[i], - target: nodes[j], - }); + if (tweakedVerOfLink) { + force = d3.forceLinkTweaked() + .distance(function (n) { + return distanceFunction(n.source, n.target, props, norm); + }); + } + else { + for (i = nodes.length-1; i >= 1; i--) { + for (j = i-1; j >= 0; j--) { + links.push({ + source: nodes[i], + target: nodes[j], + }); + } } + force = d3.forceLink() + .distance(function (n) { + return distanceFunction(n.source, n.target, props, norm); + }) + .links(links); } /* Add force @@ -33,11 +44,6 @@ function startLinkSimulation() { * The full pre-calculation will then occur once when the force is being * initialized by the simulation. */ - let force = tweakedVerOfLink ? d3.forceLinkTweaked() : d3.forceLink(); - force.distance(function (n) { - return distanceFunction(n.source, n.target, props, norm); - }) - .links(links); simulation .alphaDecay(0) diff --git a/src/link.js b/src/link.js index 537ea1b..8037180 100644 --- a/src/link.js +++ b/src/link.js @@ -18,17 +18,16 @@ export default function(links) { function force(alpha) { // Each iteration in a tick - for (var k = 0, n = links.length; k < iterations; ++k) { + for (var k = 0, n = nodes.length, source, target, i, j, x, y, l; k < iterations; ++k) { // For each link - for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { - link = links[i]; + for (i = 1; i < n; i++) for (j = 0; j < i; j++) { // jiggle so it wont divide / multiply by zero after this - source = link.source; - target = link.target; + source = nodes[i]; + target = nodes[j]; x = target.x + target.vx - source.x - source.vx || jiggle(); y = target.y + target.vy - source.y - source.vy || jiggle(); l = Math.sqrt(x * x + y * y); - l = (l - distances[i]) / l * dataSizeFactor * alpha; + l = (l - distances[i*(i-1)/2+j]) / l * dataSizeFactor * alpha; x *= l, y *= l; target.vx -= x; target.vy -= y; @@ -46,8 +45,10 @@ export default function(links) { function initializeDistance() { if (!nodes) return; - for (var i = 0, n = links.length; i < n; ++i) { - distances[i] = +distance(links[i], i, links); + for (let i = 1, n = nodes.length; i < n; i++) { + for (let j = 0; j < i; j++) { + distances.push(distanceFunction(nodes[i], nodes[j], props, norm)); + } } }