From 7c96844451bb3afbc3c01d5d776e04ff0817718d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 20:51:40 +0200 Subject: [PATCH 01/13] :recycle: refactor(blossom): Reduce use of counter variables. --- src/core/blossom/blossom.js | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 96f90f3..de20a25 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -269,9 +269,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // variable to zero; relabel its T-vertices to S and add them to the queue. const addBlossom = function (base, k) { let i; - let j; - let nblist; - let nblists; let v = edges[k][0]; let w = edges[k][1]; const bb = inblossom[base]; @@ -359,20 +356,14 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { const length_ = path.length; for (let z = 0; z < length_; ++z) { + let nblists; bv = path[z]; - if (blossombestedges[bv] === null) { // This subblossom does not have a list of least-slack edges; // get the information from the vertices. nblists = []; for (const v of blossomLeaves(nvertex, blossomchilds, bv)) { - j = neighbend[v].length; - const temporary_ = new Array(j); - while (j--) { - const p = neighbend[v][j]; - temporary_[j] = Math.floor(p / 2); - } - + const temporary_ = neighbend[v].map((p) => Math.floor(p / 2)); nblists.push(temporary_); } } else { @@ -380,12 +371,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { nblists = [blossombestedges[bv]]; } - for (let x = 0, m = nblists.length; x < m; ++x) { - nblist = nblists[x]; - - for (let y = 0, n = nblist.length; y < n; ++y) { - const k = nblist[y]; - + for (const nblist of nblists) { + for (const k of nblist) { let i = edges[k][0]; let j = edges[k][1]; From fd34df397b88ce326c6444203e84a6bb7a90ab69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:08:33 +0200 Subject: [PATCH 02/13] :recycle: refactor(blossom): Avoid storing temporary list of lists. --- src/core/blossom/blossom.js | 48 +++++++++++++------------------- src/core/blossom/blossomEdges.js | 7 +++++ 2 files changed, 27 insertions(+), 28 deletions(-) create mode 100644 src/core/blossom/blossomEdges.js diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index de20a25..49a755f 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -8,6 +8,7 @@ import statistics from './statistics'; import endpoints from './endpoints'; import neighbours from './neighbours'; import blossomLeaves from './blossomLeaves'; +import blossomEdges from './blossomEdges'; // Adapted from http://jorisvr.nl/maximummatching.html // All credit for the implementation goes to Joris van Rantwijk [http://jorisvr.nl]. @@ -356,41 +357,32 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { const length_ = path.length; for (let z = 0; z < length_; ++z) { - let nblists; - bv = path[z]; - if (blossombestedges[bv] === null) { + const bv = path[z]; + // Walk this subblossom's least-slack edges. + let nblist = blossombestedges[bv]; + if (nblist === null) { // This subblossom does not have a list of least-slack edges; // get the information from the vertices. - nblists = []; - for (const v of blossomLeaves(nvertex, blossomchilds, bv)) { - const temporary_ = neighbend[v].map((p) => Math.floor(p / 2)); - nblists.push(temporary_); - } - } else { - // Walk this subblossom's least-slack edges. - nblists = [blossombestedges[bv]]; + nblist = blossomEdges(nvertex, blossomchilds, neighbend, bv); } - for (const nblist of nblists) { - for (const k of nblist) { - let i = edges[k][0]; - let j = edges[k][1]; + for (const k of nblist) { + let [i, j] = edges[k]; - if (inblossom[j] === b) { - const temporary_ = i; - i = j; - j = temporary_; - } + if (inblossom[j] === b) { + const temporary_ = i; + i = j; + j = temporary_; + } - const bj = inblossom[j]; + const bj = inblossom[j]; - if ( - bj !== b && - label[bj] === 1 && - (bestedgeto[bj] === -1 || slack(k) < slack(bestedgeto[bj])) - ) { - bestedgeto[bj] = k; - } + if ( + bj !== b && + label[bj] === 1 && + (bestedgeto[bj] === -1 || slack(k) < slack(bestedgeto[bj])) + ) { + bestedgeto[bj] = k; } } diff --git a/src/core/blossom/blossomEdges.js b/src/core/blossom/blossomEdges.js new file mode 100644 index 0000000..2aeb80c --- /dev/null +++ b/src/core/blossom/blossomEdges.js @@ -0,0 +1,7 @@ +import blossomLeaves from './blossomLeaves'; + +export default function* blossomEdges(nvertex, blossomchilds, neighbend, bv) { + for (const v of blossomLeaves(nvertex, blossomchilds, bv)) { + for (const p of neighbend[v]) yield Math.floor(p / 2); + } +} From c9ce5cc5731ab2e9b16aed6045190dfa6e3d8d79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:11:10 +0200 Subject: [PATCH 03/13] :recycle: refactor(blossom): Simplify logic. --- src/core/blossom/blossom.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 49a755f..70e6dab 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -367,15 +367,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } for (const k of nblist) { - let [i, j] = edges[k]; - - if (inblossom[j] === b) { - const temporary_ = i; - i = j; - j = temporary_; - } - - const bj = inblossom[j]; + const [i, j] = edges[k]; + const bj = inblossom[j] === b ? inblossom[i] : inblossom[j]; if ( bj !== b && From f10a183d71291cbb21583a5154ae8ea0263caa6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:17:46 +0200 Subject: [PATCH 04/13] :art: style(blossom): Reduce scope of variables and use booleans where it makes sense. --- src/core/blossom/blossom.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 70e6dab..64ceb13 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -537,12 +537,11 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Bubble up through the blossom tree from vertex v to an immediate // sub-blossom of b. let j; - let t; let jstep; let endptrick; let stop; let p; - t = v; + let t = v; while (blossomparent[t] !== b) t = blossomparent[t]; // Recursively deal with the first sub-blossom. if (t >= nvertex) augmentBlossom(t, v); @@ -652,9 +651,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { let b; let d; - let t; let v; - let augmented; let kslack; let base; let deltatype; @@ -663,7 +660,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { let deltablossom; // Main loop: continue until no further improvement is possible. - for (t = 0; t < nvertex; ++t) { + for (let t = 0; t < nvertex; ++t) { // Each iteration of this loop is a "stage". // A stage finds an augmenting path and uses that to improve // the matching. @@ -689,7 +686,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } // Loop until we succeed in augmenting the matching. - augmented = 0; + let augmented = false; // eslint-disable-next-line no-constant-condition while (true) { // Each iteration of this loop is a "substage". @@ -746,7 +743,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Found an augmenting path; augment the // matching and end this stage. augmentMatching(k); - augmented = 1; + augmented = true; break; } } else if (label[w] === 0) { From fb522128a6992e89d715bf1cfd023ca882b1867c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:26:04 +0200 Subject: [PATCH 05/13] :art: style(blossom): Detect uncovered cases with assertions. --- src/core/blossom/blossom.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 64ceb13..7ff1b29 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -189,6 +189,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { console.debug('DEBUG: assignLabel(' + w + ',' + t + ',' + p + ')'); const b = inblossom[w]; assert(label[w] === 0 && label[b] === 0); + assert(t === 1 || t === 2); label[w] = t; label[b] = t; labelend[w] = p; @@ -202,7 +203,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } console.debug('DEBUG: PUSH ' + queue); - } else if (t === 2) { + } else { // B became a T-vertex/blossom; assign label S to its mate. // (If b is a non-trivial blossom, its base is the only vertex // with an external mate.) @@ -888,6 +889,12 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Take action at the point where minimum delta occurred. console.debug('DEBUG: delta' + deltatype + '=' + delta); + assert( + deltatype === 1 || + deltatype === 2 || + deltatype === 3 || + deltatype === 4 + ); if (deltatype === 1) { // No further improvement possible; optimum reached. break; @@ -910,7 +917,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { const i = edges[deltaedge][0]; assert(label[inblossom[i]] === 1); queue.push(i); - } else if (deltatype === 4) { + } else { // Expand the least-z blossom. expandBlossom(deltablossom, false); } From 68cb34dbe5643d290d014c8fdfd909067139140a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:26:51 +0200 Subject: [PATCH 06/13] :art: style(blossom): Use arrow notation. --- src/core/blossom/blossom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 7ff1b29..aea1767 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -185,7 +185,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Assign label t to the top-level blossom containing vertex w // and record the fact that w was reached through the edge with // remote endpoint p. - const assignLabel = function (w, t, p) { + const assignLabel = (w, t, p) => { console.debug('DEBUG: assignLabel(' + w + ',' + t + ',' + p + ')'); const b = inblossom[w]; assert(label[w] === 0 && label[b] === 0); From 0b64fd5d6fdfe211d59abb1d9edb9301342fc418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:27:02 +0200 Subject: [PATCH 07/13] :art: style(blossom): Reduce scope of variables. --- src/core/blossom/blossom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index aea1767..ac3eb6b 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -682,7 +682,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { queue = []; // Label single blossoms/vertices with S and put them in the queue. - for (v = 0; v < nvertex; ++v) { + for (let v = 0; v < nvertex; ++v) { if (mate[v] === -1 && label[inblossom[v]] === 0) assignLabel(v, 1, -1); } From 58a263010472f0c2fe00cb4450fc6e68f7b9d1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:27:24 +0200 Subject: [PATCH 08/13] :art: style(blossom): Avoid unnecessary swap logic. --- src/core/blossom/blossom.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index ac3eb6b..f30e504 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -902,13 +902,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Use the least-slack edge to continue the search. allowedge[deltaedge] = true; let i = edges[deltaedge][0]; - let j = edges[deltaedge][1]; - if (label[inblossom[i]] === 0) { - const temporary = i; - i = j; - j = temporary; - } - + if (label[inblossom[i]] === 0) i = edges[deltaedge][1]; assert(label[inblossom[i]] === 1); queue.push(i); } else if (deltatype === 3) { From 780dcbaa4705787b805b6afe73275feb76c6d6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:30:20 +0200 Subject: [PATCH 09/13] :art: style(blossom): Reduce scope of variables, use for..of loops. --- src/core/blossom/blossom.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index f30e504..b1870ad 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -218,13 +218,11 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { const scanBlossom = function (v, w) { console.debug('DEBUG: scanBlossom(' + v + ',' + w + ')'); // Trace back from v and w, placing breadcrumbs as we go. - let b; - let i; const path = []; let base = -1; while (v !== -1 || w !== -1) { // Look for a breadcrumb in v's blossom or put a new breadcrumb. - b = inblossom[v]; + let b = inblossom[v]; if (label[b] & 4) { base = blossombase[b]; break; @@ -256,11 +254,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } // Remove breadcrumbs. - i = path.length; - while (i--) { - b = path[i]; - label[b] = 1; - } + for (const b of path) label[b] = 1; // Return base vertex, if we found one. return base; From 8c7383bfffd9c2451f7814e535a88d61b1f15275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:33:00 +0200 Subject: [PATCH 10/13] :art: style(blossom): Use arrow notation. --- src/core/blossom/blossom.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index b1870ad..d082589 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -56,7 +56,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { * @return {Array} */ - const maxWeightMatching = function (edges, maxCardinality = false) { + const maxWeightMatching = (edges, maxCardinality = false) => { // Vertices are numbered 0 .. (nvertex-1). // Non-trivial blossoms are numbered nvertex .. (2*nvertex-1) // @@ -215,7 +215,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Trace back from vertices v and w to discover either a new blossom // or an augmenting path. Return the base vertex of the new blossom or -1. - const scanBlossom = function (v, w) { + const scanBlossom = (v, w) => { console.debug('DEBUG: scanBlossom(' + v + ',' + w + ')'); // Trace back from v and w, placing breadcrumbs as we go. const path = []; @@ -263,7 +263,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Construct a new blossom with given base, containing edge k which // connects a pair of S vertices. Label the new blossom as S; set its dual // variable to zero; relabel its T-vertices to S and add them to the queue. - const addBlossom = function (base, k) { + const addBlossom = (base, k) => { let i; let v = edges[k][0]; let w = edges[k][1]; @@ -403,7 +403,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { }; // Expand the given top-level blossom. - const expandBlossom = function (b, endstage) { + const expandBlossom = (b, endstage) => { console.debug( 'DEBUG: expandBlossom(' + b + ',' + endstage + ') ' + blossomchilds[b] ); @@ -527,7 +527,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Swap matched/unmatched edges over an alternating path through blossom b // between vertex v and the base vertex. Keep blossom bookkeeping consistent. - const augmentBlossom = function (b, v) { + const augmentBlossom = (b, v) => { console.debug('DEBUG: augmentBlossom(' + b + ',' + v + ')'); // Bubble up through the blossom tree from vertex v to an immediate // sub-blossom of b. @@ -591,7 +591,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Swap matched/unmatched edges over an alternating path between two // single vertices. The augmenting path runs through edge k, which // connects a pair of S vertices. - const augmentMatching = function (k) { + const augmentMatching = (k) => { const v = edges[k][0]; const w = edges[k][1]; From ede74d87fbfac46f44419e706e2f3b3fa301dcdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:41:04 +0200 Subject: [PATCH 11/13] :art: style(blossom): Reduce scope of variables. --- src/core/blossom/blossom.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index d082589..897f5b1 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -644,9 +644,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } }; - let b; let d; - let v; let kslack; let base; let deltatype; @@ -696,7 +694,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // through an alternating path have got a label. while (queue.length && !augmented) { // Take an S vertex from the queue. - v = queue.pop(); + const v = queue.pop(); console.debug('DEBUG: POP v=' + v); assert(label[inblossom[v]] === 1); @@ -753,7 +751,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } else if (label[inblossom[w]] === 1) { // Keep track of the least-slack non-allowable edge to // a different S-blossom. - b = inblossom[v]; + const b = inblossom[v]; if (bestedge[b] === -1 || kslack < slack(bestedge[b])) bestedge[b] = k; } else if (label[w] === 0) { @@ -859,7 +857,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } // Update dual variables according to delta. - for (v = 0; v < nvertex; ++v) { + for (let v = 0; v < nvertex; ++v) { if (label[inblossom[v]] === 1) { // S-vertex: 2*u = 2*u - 2*delta dualvar[v] -= delta; @@ -869,7 +867,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } } - for (b = nvertex; b < 2 * nvertex; ++b) { + for (let b = nvertex; b < 2 * nvertex; ++b) { if (blossombase[b] >= 0 && blossomparent[b] === -1) { if (label[b] === 1) { // Top-level S-blossom: z = z + 2*delta @@ -917,7 +915,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { if (!augmented) break; // End of a stage; expand all S-blossoms which have dualvar = 0. - for (b = nvertex; b < 2 * nvertex; ++b) { + for (let b = nvertex; b < 2 * nvertex; ++b) { if ( blossomparent[b] === -1 && blossombase[b] >= 0 && @@ -945,13 +943,13 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { }); // Transform mate[] such that mate[v] is the vertex to which v is paired. - for (v = 0; v < nvertex; ++v) { + for (let v = 0; v < nvertex; ++v) { if (mate[v] >= 0) { mate[v] = endpoint[mate[v]]; } } - for (v = 0; v < nvertex; ++v) { + for (let v = 0; v < nvertex; ++v) { assert(mate[v] === -1 || mate[mate[v]] === v); } From d43f225f7c6b1e1e1c9fda2e77fd969b60c812d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:50:32 +0200 Subject: [PATCH 12/13] :art: style(blossom): Reduce scopes. --- src/core/blossom/blossom.js | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/core/blossom/blossom.js b/src/core/blossom/blossom.js index 897f5b1..35643da 100644 --- a/src/core/blossom/blossom.js +++ b/src/core/blossom/blossom.js @@ -264,7 +264,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // connects a pair of S vertices. Label the new blossom as S; set its dual // variable to zero; relabel its T-vertices to S and add them to the queue. const addBlossom = (base, k) => { - let i; let v = edges[k][0]; let w = edges[k][1]; const bb = inblossom[base]; @@ -381,7 +380,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { blossombestedges[b] = []; const length_2 = bestedgeto.length; - for (i = 0; i < length_2; ++i) { + for (let i = 0; i < length_2; ++i) { k = bestedgeto[i]; if (k !== -1) blossombestedges[b].push(k); } @@ -391,7 +390,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { const length_3 = blossombestedges[b].length; if (length_3 > 0) { bestedge[b] = blossombestedges[b][0]; - for (i = 1; i < length_3; ++i) { + for (let i = 1; i < length_3; ++i) { k = blossombestedges[b][i]; if (slack(k) < slack(bestedge[b])) { bestedge[b] = k; @@ -408,19 +407,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { 'DEBUG: expandBlossom(' + b + ',' + endstage + ') ' + blossomchilds[b] ); // Convert sub-blossoms into top-level blossoms. - let i; - let j; - let s; - let p; - let entrychild; - let jstep; - let endptrick; - let bv; - let stop; - let base; - - for (i = 0; i < blossomchilds[b].length; ++i) { - s = blossomchilds[b][i]; + for (let i = 0; i < blossomchilds[b].length; ++i) { + const s = blossomchilds[b][i]; blossomparent[s] = -1; if (s < nvertex) inblossom[s] = s; @@ -443,9 +431,13 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Figure out through which sub-blossom the expanding blossom // obtained its label initially. assert(labelend[b] >= 0); - entrychild = inblossom[endpoint[labelend[b] ^ 1]]; + const entrychild = inblossom[endpoint[labelend[b] ^ 1]]; // Decide in which direction we will go round the blossom. - j = blossomchilds[b].indexOf(entrychild); + let j = blossomchilds[b].indexOf(entrychild); + let jstep; + let endptrick; + let stop; + let base; if (j & 1) { // Start index is odd; go forward. jstep = 1; @@ -461,7 +453,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { } // Move along the blossom until we get to the base. - p = labelend[b]; + let p = labelend[b]; while (j !== stop) { // Relabel the T-sub-blossom. label[endpoint[p ^ 1]] = 0; @@ -478,7 +470,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) { // Relabel the base T-sub-blossom WITHOUT stepping through to // its mate (so don't call assignLabel). - bv = blossomchilds[b][0]; + let bv = blossomchilds[b][0]; label[endpoint[p ^ 1]] = 2; label[bv] = 2; labelend[endpoint[p ^ 1]] = p; From 08cc2f5501e23dd682327f0026fd78243dd4ecf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Thu, 24 Sep 2020 21:52:15 +0200 Subject: [PATCH 13/13] v1.0.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e31041..56bfc13 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@aureooms/js-maximum-matching", "description": "Maximum matching algorithms for JavaScript", - "version": "1.0.7", + "version": "1.0.8", "author": "aureooms", "ava": { "files": [