Skip to content

Commit b29aaff

Browse files
♻️ refactor(blossom): Reduce the scope of some variables.
1 parent ad80fa3 commit b29aaff

File tree

1 file changed

+38
-63
lines changed

1 file changed

+38
-63
lines changed

src/core/blossom/blossom.js

+38-63
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
5656
*/
5757

5858
const maxWeightMatching = function (edges, maxCardinality = false) {
59-
let i;
60-
let j;
61-
let k;
62-
let p;
63-
let w;
64-
let length;
65-
66-
//
6759
// Vertices are numbered 0 .. (nvertex-1).
6860
// Non-trivial blossoms are numbered nvertex .. (2*nvertex-1)
6961
//
@@ -73,7 +65,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
7365
//
7466
// Many terms used in the comments (sub-blossom, T-vertex) come from
7567
// the paper by Galil; read the paper before reading this code.
76-
//
7768

7869
// Deal swiftly with empty graphs.
7970
if (edges.length === 0) return [];
@@ -121,9 +112,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
121112
// If v is a top-level vertex, v is itthis a blossom (a trivial blossom)
122113
// and inblossom[v] === v.
123114
// Initially all vertices are top-level trivial blossoms.
124-
i = nvertex;
125-
const inblossom = new Array(i);
126-
while (i--) inblossom[i] = i;
115+
const inblossom = new Array(nvertex);
116+
for (let i = 0; i < nvertex; ++i) inblossom[i] = i;
127117

128118
// If b is a sub-blossom,
129119
// blossomparent[b] is its immediate parent (sub-)blossom.
@@ -137,10 +127,9 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
137127

138128
// If b is a (sub-)blossom,
139129
// blossombase[b] is its base VERTEX (i.e. recursive sub-blossom).
140-
length = 2 * nvertex;
141-
const blossombase = new Array(length);
142-
for (i = 0; i < nvertex; ++i) blossombase[i] = i;
143-
for (; i < length; ++i) blossombase[i] = -1;
130+
const blossombase = new Array(2 * nvertex);
131+
for (let i = 0; i < nvertex; ++i) blossombase[i] = i;
132+
blossombase.fill(-1, nvertex, 2 * nvertex);
144133

145134
// If b is a non-trivial (sub-)blossom,
146135
// blossomendps[b] is a list of endpoints on its connecting edges,
@@ -164,9 +153,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
164153
const blossombestedges = new Array(2 * nvertex).fill(null);
165154

166155
// List of currently unused blossom numbers.
167-
i = nvertex;
168-
const unusedblossoms = new Array(i);
169-
while (i--) unusedblossoms[i] = nvertex + i;
156+
const unusedblossoms = new Array(nvertex);
157+
for (let i = 0; i < nvertex; ++i) unusedblossoms[i] = nvertex + i;
170158

171159
// If v is a vertex,
172160
// dualvar[v] = 2 * u(v) where u(v) is the v's variable in the dual
@@ -175,10 +163,9 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
175163
// If b is a non-trivial blossom,
176164
// dualvar[b] = z(b) where z(b) is b's variable in the dual optimization
177165
// problem.
178-
length = 2 * nvertex;
179-
const dualvar = new Array(length);
180-
for (i = 0; i < nvertex; ++i) dualvar[i] = maxweight;
181-
for (; i < length; ++i) dualvar[i] = 0;
166+
const dualvar = new Array(2 * nvertex);
167+
dualvar.fill(maxweight, 0, nvertex);
168+
dualvar.fill(0, nvertex, 2 * nvertex);
182169

183170
// If allowedge[k] is true, edge k has zero slack in the optimization
184171
// problem; if allowedge[k] is false, the edge's slack may or may not
@@ -230,7 +217,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
230217
console.debug('DEBUG: scanBlossom(' + v + ',' + w + ')');
231218
// Trace back from v and w, placing breadcrumbs as we go.
232219
let b;
233-
let temporary_;
234220
let i;
235221
const path = [];
236222
let base = -1;
@@ -261,7 +247,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
261247

262248
// Swap v and w so that we alternate between both paths.
263249
if (w !== -1) {
264-
temporary_ = v;
250+
const temporary_ = v;
265251
v = w;
266252
w = temporary_;
267253
}
@@ -284,13 +270,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
284270
const addBlossom = function (base, k) {
285271
let i;
286272
let j;
287-
let length_;
288-
let temporary_;
289-
let x;
290-
let y;
291-
let z;
292-
let m;
293-
let n;
294273
let nblist;
295274
let nblists;
296275
let v = edges[k][0];
@@ -376,12 +355,10 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
376355

377356
// Compute blossombestedges[b].
378357

379-
z = 2 * nvertex;
380-
const bestedgeto = new Array(z);
381-
while (z--) bestedgeto[z] = -1;
358+
const bestedgeto = new Array(2 * nvertex).fill(-1);
382359

383-
length_ = path.length;
384-
for (z = 0; z < length_; ++z) {
360+
const length_ = path.length;
361+
for (let z = 0; z < length_; ++z) {
385362
bv = path[z];
386363

387364
if (blossombestedges[bv] === null) {
@@ -390,7 +367,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
390367
nblists = [];
391368
for (const v of blossomLeaves(nvertex, blossomchilds, bv)) {
392369
j = neighbend[v].length;
393-
temporary_ = new Array(j);
370+
const temporary_ = new Array(j);
394371
while (j--) {
395372
const p = neighbend[v][j];
396373
temporary_[j] = Math.floor(p / 2);
@@ -403,17 +380,17 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
403380
nblists = [blossombestedges[bv]];
404381
}
405382

406-
for (x = 0, m = nblists.length; x < m; ++x) {
383+
for (let x = 0, m = nblists.length; x < m; ++x) {
407384
nblist = nblists[x];
408385

409-
for (y = 0, n = nblist.length; y < n; ++y) {
410-
k = nblist[y];
386+
for (let y = 0, n = nblist.length; y < n; ++y) {
387+
const k = nblist[y];
411388

412-
i = edges[k][0];
413-
j = edges[k][1];
389+
let i = edges[k][0];
390+
let j = edges[k][1];
414391

415392
if (inblossom[j] === b) {
416-
temporary_ = i;
393+
const temporary_ = i;
417394
i = j;
418395
j = temporary_;
419396
}
@@ -436,18 +413,18 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
436413
}
437414

438415
blossombestedges[b] = [];
439-
length_ = bestedgeto.length;
440-
for (i = 0; i < length_; ++i) {
416+
const length_2 = bestedgeto.length;
417+
for (i = 0; i < length_2; ++i) {
441418
k = bestedgeto[i];
442419
if (k !== -1) blossombestedges[b].push(k);
443420
}
444421

445422
// Select bestedge[b].
446423

447-
length_ = blossombestedges[b].length;
448-
if (length_ > 0) {
424+
const length_3 = blossombestedges[b].length;
425+
if (length_3 > 0) {
449426
bestedge[b] = blossombestedges[b][0];
450-
for (i = 1; i < length_; ++i) {
427+
for (i = 1; i < length_3; ++i) {
451428
k = blossombestedges[b][i];
452429
if (slack(k) < slack(bestedge[b])) {
453430
bestedge[b] = k;
@@ -712,7 +689,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
712689
let delta;
713690
let deltaedge;
714691
let deltablossom;
715-
let temporary;
716692

717693
// Main loop: continue until no further improvement is possible.
718694
for (t = 0; t < nvertex; ++t) {
@@ -761,11 +737,11 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
761737
assert(label[inblossom[v]] === 1);
762738

763739
// Scan its neighbours:
764-
length = neighbend[v].length;
765-
for (i = 0; i < length; ++i) {
766-
p = neighbend[v][i];
767-
k = Math.floor(p / 2);
768-
w = endpoint[p];
740+
const length = neighbend[v].length;
741+
for (let i = 0; i < length; ++i) {
742+
const p = neighbend[v][i];
743+
const k = Math.floor(p / 2);
744+
const w = endpoint[p];
769745
// W is a neighbour to v
770746
if (inblossom[v] === inblossom[w]) {
771747
// This edge is internal to a blossom; ignore it
@@ -870,7 +846,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
870846

871847
// Compute delta2: the minimum slack on any edge between
872848
// an S-vertex and a free vertex.
873-
for (v = 0; v < nvertex; ++v) {
849+
for (let v = 0; v < nvertex; ++v) {
874850
if (label[inblossom[v]] === 0 && bestedge[v] !== -1) {
875851
d = slack(bestedge[v]);
876852
if (deltatype === -1 || d < delta) {
@@ -883,7 +859,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
883859

884860
// Compute delta3: half the minimum slack on any edge between
885861
// a pair of S-blossoms.
886-
for (b = 0; b < 2 * nvertex; ++b) {
862+
for (let b = 0; b < 2 * nvertex; ++b) {
887863
if (blossomparent[b] === -1 && label[b] === 1 && bestedge[b] !== -1) {
888864
kslack = slack(bestedge[b]);
889865
d = kslack / 2;
@@ -896,7 +872,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
896872
}
897873

898874
// Compute delta4: minimum z variable of any T-blossom.
899-
for (b = nvertex; b < 2 * nvertex; ++b) {
875+
for (let b = nvertex; b < 2 * nvertex; ++b) {
900876
if (
901877
blossombase[b] >= 0 &&
902878
blossomparent[b] === -1 &&
@@ -949,10 +925,10 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
949925
} else if (deltatype === 2) {
950926
// Use the least-slack edge to continue the search.
951927
allowedge[deltaedge] = true;
952-
i = edges[deltaedge][0];
953-
j = edges[deltaedge][1];
928+
let i = edges[deltaedge][0];
929+
let j = edges[deltaedge][1];
954930
if (label[inblossom[i]] === 0) {
955-
temporary = i;
931+
const temporary = i;
956932
i = j;
957933
j = temporary;
958934
}
@@ -962,8 +938,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
962938
} else if (deltatype === 3) {
963939
// Use the least-slack edge to continue the search.
964940
allowedge[deltaedge] = true;
965-
i = edges[deltaedge][0];
966-
j = edges[deltaedge][1];
941+
const i = edges[deltaedge][0];
967942
assert(label[inblossom[i]] === 1);
968943
queue.push(i);
969944
} else if (deltatype === 4) {

0 commit comments

Comments
 (0)