@@ -649,11 +649,6 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
649
649
// single vertices. The augmenting path runs through edge k, which
650
650
// connects a pair of S vertices.
651
651
const augmentMatching = function ( k ) {
652
- let bs ;
653
- let t ;
654
- let bt ;
655
- let j ;
656
-
657
652
const v = edges [ k ] [ 0 ] ;
658
653
const w = edges [ k ] [ 1 ] ;
659
654
@@ -662,50 +657,48 @@ export default function blossom(CHECK_OPTIMUM, CHECK_DELTA) {
662
657
) ;
663
658
console . debug ( 'DEBUG: PAIR ' + v + ' ' + w + ' (k=' + k + ')' ) ;
664
659
665
- [
666
- [ v , 2 * k + 1 ] ,
667
- [ w , 2 * k ]
668
- ] . forEach ( function ( edge ) {
669
- let s = edge [ 0 ] ;
670
- let p = edge [ 1 ] ;
671
- // Match vertex s to remote endpoint p. Then trace back from s
672
- // until we find a single vertex, swapping matched and unmatched
673
- // edges as we go.
674
- // eslint-disable-next-line no-constant-condition
675
- while ( true ) {
676
- bs = inblossom [ s ] ;
677
- assert ( label [ bs ] === 1 ) ;
678
- assert ( labelend [ bs ] === mate [ blossombase [ bs ] ] ) ;
679
- // Augment through the S-blossom from s to base.
680
- if ( bs >= nvertex ) augmentBlossom ( bs , s ) ;
681
- // Update mate[s]
682
- mate [ s ] = p ;
683
- // Trace one step back.
684
- if ( labelend [ bs ] === - 1 ) {
685
- // Reached single vertex; stop.
686
- break ;
687
- }
660
+ matchVerticesAndFix ( v , 2 * k + 1 ) ;
661
+ matchVerticesAndFix ( w , 2 * k ) ;
662
+ } ;
688
663
689
- t = endpoint [ labelend [ bs ] ] ;
690
- bt = inblossom [ t ] ;
691
- assert ( label [ bt ] === 2 ) ;
692
- // Trace one step back.
693
- assert ( labelend [ bt ] >= 0 ) ;
694
- s = endpoint [ labelend [ bt ] ] ;
695
- j = endpoint [ labelend [ bt ] ^ 1 ] ;
696
- // Augment through the T-blossom from j to base.
697
- assert ( blossombase [ bt ] === t ) ;
698
- if ( bt >= nvertex ) augmentBlossom ( bt , j ) ;
699
- // Update mate[j]
700
- mate [ j ] = labelend [ bt ] ;
701
- // Keep the opposite endpoint;
702
- // it will be assigned to mate[s] in the next step.
703
- p = labelend [ bt ] ^ 1 ;
704
- console . debug (
705
- 'DEBUG: PAIR ' + s + ' ' + t + ' (k=' + Math . floor ( p / 2 ) + ')'
706
- ) ;
664
+ const matchVerticesAndFix = ( s , p ) => {
665
+ // Match vertex s to remote endpoint p. Then trace back from s
666
+ // until we find a single vertex, swapping matched and unmatched
667
+ // edges as we go.
668
+ // eslint-disable-next-line no-constant-condition
669
+ while ( true ) {
670
+ const bs = inblossom [ s ] ;
671
+ assert ( label [ bs ] === 1 ) ;
672
+ assert ( labelend [ bs ] === mate [ blossombase [ bs ] ] ) ;
673
+ // Augment through the S-blossom from s to base.
674
+ if ( bs >= nvertex ) augmentBlossom ( bs , s ) ;
675
+ // Update mate[s]
676
+ mate [ s ] = p ;
677
+ // Trace one step back.
678
+ if ( labelend [ bs ] === - 1 ) {
679
+ // Reached single vertex; stop.
680
+ break ;
707
681
}
708
- } ) ;
682
+
683
+ const t = endpoint [ labelend [ bs ] ] ;
684
+ const bt = inblossom [ t ] ;
685
+ assert ( label [ bt ] === 2 ) ;
686
+ // Trace one step back.
687
+ assert ( labelend [ bt ] >= 0 ) ;
688
+ s = endpoint [ labelend [ bt ] ] ;
689
+ const j = endpoint [ labelend [ bt ] ^ 1 ] ;
690
+ // Augment through the T-blossom from j to base.
691
+ assert ( blossombase [ bt ] === t ) ;
692
+ if ( bt >= nvertex ) augmentBlossom ( bt , j ) ;
693
+ // Update mate[j]
694
+ mate [ j ] = labelend [ bt ] ;
695
+ // Keep the opposite endpoint;
696
+ // it will be assigned to mate[s] in the next step.
697
+ p = labelend [ bt ] ^ 1 ;
698
+ console . debug (
699
+ 'DEBUG: PAIR ' + s + ' ' + t + ' (k=' + Math . floor ( p / 2 ) + ')'
700
+ ) ;
701
+ }
709
702
} ;
710
703
711
704
let b ;
0 commit comments