@@ -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