@@ -56,14 +56,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
56
56
*/
57
57
58
58
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
- //
67
59
// Vertices are numbered 0 .. (nvertex-1).
68
60
// Non-trivial blossoms are numbered nvertex .. (2*nvertex-1)
69
61
//
@@ -73,7 +65,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
73
65
//
74
66
// Many terms used in the comments (sub-blossom, T-vertex) come from
75
67
// the paper by Galil; read the paper before reading this code.
76
- //
77
68
78
69
// Deal swiftly with empty graphs.
79
70
if ( edges . length === 0 ) return [ ] ;
@@ -121,9 +112,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
121
112
// If v is a top-level vertex, v is itthis a blossom (a trivial blossom)
122
113
// and inblossom[v] === v.
123
114
// 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 ;
127
117
128
118
// If b is a sub-blossom,
129
119
// blossomparent[b] is its immediate parent (sub-)blossom.
@@ -137,10 +127,9 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
137
127
138
128
// If b is a (sub-)blossom,
139
129
// 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 ) ;
144
133
145
134
// If b is a non-trivial (sub-)blossom,
146
135
// blossomendps[b] is a list of endpoints on its connecting edges,
@@ -164,9 +153,8 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
164
153
const blossombestedges = new Array ( 2 * nvertex ) . fill ( null ) ;
165
154
166
155
// 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 ;
170
158
171
159
// If v is a vertex,
172
160
// 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) {
175
163
// If b is a non-trivial blossom,
176
164
// dualvar[b] = z(b) where z(b) is b's variable in the dual optimization
177
165
// 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 ) ;
182
169
183
170
// If allowedge[k] is true, edge k has zero slack in the optimization
184
171
// 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) {
230
217
console . debug ( 'DEBUG: scanBlossom(' + v + ',' + w + ')' ) ;
231
218
// Trace back from v and w, placing breadcrumbs as we go.
232
219
let b ;
233
- let temporary_ ;
234
220
let i ;
235
221
const path = [ ] ;
236
222
let base = - 1 ;
@@ -261,7 +247,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
261
247
262
248
// Swap v and w so that we alternate between both paths.
263
249
if ( w !== - 1 ) {
264
- temporary_ = v ;
250
+ const temporary_ = v ;
265
251
v = w ;
266
252
w = temporary_ ;
267
253
}
@@ -284,13 +270,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
284
270
const addBlossom = function ( base , k ) {
285
271
let i ;
286
272
let j ;
287
- let length_ ;
288
- let temporary_ ;
289
- let x ;
290
- let y ;
291
- let z ;
292
- let m ;
293
- let n ;
294
273
let nblist ;
295
274
let nblists ;
296
275
let v = edges [ k ] [ 0 ] ;
@@ -376,12 +355,10 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
376
355
377
356
// Compute blossombestedges[b].
378
357
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 ) ;
382
359
383
- length_ = path . length ;
384
- for ( z = 0 ; z < length_ ; ++ z ) {
360
+ const length_ = path . length ;
361
+ for ( let z = 0 ; z < length_ ; ++ z ) {
385
362
bv = path [ z ] ;
386
363
387
364
if ( blossombestedges [ bv ] === null ) {
@@ -390,7 +367,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
390
367
nblists = [ ] ;
391
368
for ( const v of blossomLeaves ( nvertex , blossomchilds , bv ) ) {
392
369
j = neighbend [ v ] . length ;
393
- temporary_ = new Array ( j ) ;
370
+ const temporary_ = new Array ( j ) ;
394
371
while ( j -- ) {
395
372
const p = neighbend [ v ] [ j ] ;
396
373
temporary_ [ j ] = Math . floor ( p / 2 ) ;
@@ -403,17 +380,17 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
403
380
nblists = [ blossombestedges [ bv ] ] ;
404
381
}
405
382
406
- for ( x = 0 , m = nblists . length ; x < m ; ++ x ) {
383
+ for ( let x = 0 , m = nblists . length ; x < m ; ++ x ) {
407
384
nblist = nblists [ x ] ;
408
385
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 ] ;
411
388
412
- i = edges [ k ] [ 0 ] ;
413
- j = edges [ k ] [ 1 ] ;
389
+ let i = edges [ k ] [ 0 ] ;
390
+ let j = edges [ k ] [ 1 ] ;
414
391
415
392
if ( inblossom [ j ] === b ) {
416
- temporary_ = i ;
393
+ const temporary_ = i ;
417
394
i = j ;
418
395
j = temporary_ ;
419
396
}
@@ -436,18 +413,18 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
436
413
}
437
414
438
415
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 ) {
441
418
k = bestedgeto [ i ] ;
442
419
if ( k !== - 1 ) blossombestedges [ b ] . push ( k ) ;
443
420
}
444
421
445
422
// Select bestedge[b].
446
423
447
- length_ = blossombestedges [ b ] . length ;
448
- if ( length_ > 0 ) {
424
+ const length_3 = blossombestedges [ b ] . length ;
425
+ if ( length_3 > 0 ) {
449
426
bestedge [ b ] = blossombestedges [ b ] [ 0 ] ;
450
- for ( i = 1 ; i < length_ ; ++ i ) {
427
+ for ( i = 1 ; i < length_3 ; ++ i ) {
451
428
k = blossombestedges [ b ] [ i ] ;
452
429
if ( slack ( k ) < slack ( bestedge [ b ] ) ) {
453
430
bestedge [ b ] = k ;
@@ -712,7 +689,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
712
689
let delta ;
713
690
let deltaedge ;
714
691
let deltablossom ;
715
- let temporary ;
716
692
717
693
// Main loop: continue until no further improvement is possible.
718
694
for ( t = 0 ; t < nvertex ; ++ t ) {
@@ -761,11 +737,11 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
761
737
assert ( label [ inblossom [ v ] ] === 1 ) ;
762
738
763
739
// 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 ] ;
769
745
// W is a neighbour to v
770
746
if ( inblossom [ v ] === inblossom [ w ] ) {
771
747
// This edge is internal to a blossom; ignore it
@@ -870,7 +846,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
870
846
871
847
// Compute delta2: the minimum slack on any edge between
872
848
// an S-vertex and a free vertex.
873
- for ( v = 0 ; v < nvertex ; ++ v ) {
849
+ for ( let v = 0 ; v < nvertex ; ++ v ) {
874
850
if ( label [ inblossom [ v ] ] === 0 && bestedge [ v ] !== - 1 ) {
875
851
d = slack ( bestedge [ v ] ) ;
876
852
if ( deltatype === - 1 || d < delta ) {
@@ -883,7 +859,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
883
859
884
860
// Compute delta3: half the minimum slack on any edge between
885
861
// a pair of S-blossoms.
886
- for ( b = 0 ; b < 2 * nvertex ; ++ b ) {
862
+ for ( let b = 0 ; b < 2 * nvertex ; ++ b ) {
887
863
if ( blossomparent [ b ] === - 1 && label [ b ] === 1 && bestedge [ b ] !== - 1 ) {
888
864
kslack = slack ( bestedge [ b ] ) ;
889
865
d = kslack / 2 ;
@@ -896,7 +872,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
896
872
}
897
873
898
874
// 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 ) {
900
876
if (
901
877
blossombase [ b ] >= 0 &&
902
878
blossomparent [ b ] === - 1 &&
@@ -949,10 +925,10 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
949
925
} else if ( deltatype === 2 ) {
950
926
// Use the least-slack edge to continue the search.
951
927
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 ] ;
954
930
if ( label [ inblossom [ i ] ] === 0 ) {
955
- temporary = i ;
931
+ const temporary = i ;
956
932
i = j ;
957
933
j = temporary ;
958
934
}
@@ -962,8 +938,7 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
962
938
} else if ( deltatype === 3 ) {
963
939
// Use the least-slack edge to continue the search.
964
940
allowedge [ deltaedge ] = true ;
965
- i = edges [ deltaedge ] [ 0 ] ;
966
- j = edges [ deltaedge ] [ 1 ] ;
941
+ const i = edges [ deltaedge ] [ 0 ] ;
967
942
assert ( label [ inblossom [ i ] ] === 1 ) ;
968
943
queue . push ( i ) ;
969
944
} else if ( deltatype === 4 ) {
0 commit comments