9
9
App ,
10
10
TimeValue ,
11
11
Origin ,
12
- Log
12
+ Log ,
13
+ PrecedenceGraph
13
14
} from "../core/internal" ;
14
15
15
16
// This is the thrshold for the quicksort algorithm, feeding sorters below this number will use Array.prototype.sort()
@@ -32,7 +33,7 @@ class QuickSorter extends Reactor {
32
33
leftReactor : Reactor | undefined ;
33
34
rightReactor : Reactor | undefined ;
34
35
35
- constructor ( parent : Reactor , name = "Innocent QuickSorter " ) {
36
+ constructor ( parent : Reactor , name = "root " ) {
36
37
super ( parent , name ) ;
37
38
this . parentReadPort = new InPort < number [ ] > ( this ) ;
38
39
this . parentWritePort = new OutPort < number [ ] > ( this ) ;
@@ -47,33 +48,46 @@ class QuickSorter extends Reactor {
47
48
this . addMutation (
48
49
[ this . parentReadPort ] ,
49
50
[ this . parentReadPort ,
50
- this . parentWritePort ,
51
+ this . writable ( this . parentWritePort ) ,
51
52
this . leftWritePort ,
52
- this . rightWritePort
53
+ this . rightWritePort ,
54
+ this . leftReadPort ,
55
+ this . rightReadPort
53
56
] ,
54
- function ( this , parentReadPort , parentWritePort , leftWritePort , rightWritePort ) {
57
+ function ( this , parentReadPort , parentWritePort , leftWritePort , rightWritePort , leftread , rightread ) {
55
58
const fullarr = parentReadPort . get ( ) ;
56
59
if ( fullarr == null ) {
57
60
throw Error ( "Received null from port" )
58
61
}
59
62
if ( fullarr . length <= T ) {
60
63
const sorted = [ ...fullarr ] . sort ( ( a , b ) => ( a - b ) ) ;
61
- this . getReactor ( ) . writable ( parentWritePort ) . set ( sorted ) ;
64
+ parentWritePort . set ( sorted ) ;
62
65
return ;
63
66
}
64
67
const pivot = fullarr [ 0 ] ;
65
68
const leftToSort = fullarr . filter ( ( val ) => ( val <= pivot ) ) ;
66
69
const righttoSort = fullarr . filter ( ( val ) => ( val > pivot ) ) ;
70
+ // Hack: if either of them is empty, this is not a good pivot.
71
+ // Instead of choosing another pivot, we simply sort it.
72
+ if ( leftToSort . length === 0 || righttoSort . length === 0 ) {
73
+ const sorted = [ ...fullarr ] . sort ( ( a , b ) => ( a - b ) ) ;
74
+ parentWritePort . set ( sorted ) ;
75
+ return ;
76
+ }
67
77
68
78
console . log ( `I received a request! ${ fullarr } ! Pivot is ${ pivot } , so I divided it into ${ leftToSort } and ${ righttoSort } ` ) ;
69
79
70
80
// First, create 2 new reactors
71
- const leftReactor = this . getReactor ( ) . _uncheckedAddSibling ( QuickSorter ) ;
72
- const rightReactor = this . getReactor ( ) . _uncheckedAddSibling ( QuickSorter ) ;
81
+ const leftReactor = this . getReactor ( ) . _uncheckedAddSibling ( QuickSorter , ` ${ this . getReactor ( ) . _name } /l` ) ;
82
+ const rightReactor = this . getReactor ( ) . _uncheckedAddSibling ( QuickSorter , ` ${ this . getReactor ( ) . _name } /r` ) ;
73
83
74
84
// Connect ports accoringly
75
85
this . connect ( leftWritePort , leftReactor . parentReadPort ) ;
76
86
this . connect ( rightWritePort , rightReactor . parentReadPort ) ;
87
+ console . log ( "000" , arb [ "_getPrecedenceGraph" ] ( ) . toMermaidString ( [ [ leftReactor . parentWritePort , leftread ] ] ) ) ;
88
+
89
+ this . connect ( leftReactor . parentWritePort , leftread ) ;
90
+ this . connect ( rightReactor . parentWritePort , rightread ) ;
77
91
78
92
this . getReactor ( ) . writable ( leftWritePort ) . set ( leftToSort ) ;
79
93
this . getReactor ( ) . writable ( rightWritePort ) . set ( righttoSort ) ;
@@ -179,8 +193,8 @@ class Arbiter extends App {
179
193
fail ?: ( ) => void
180
194
) {
181
195
super ( timeout , keepAlive , fast , success , fail , name ) ;
182
- this . rootSorter = new QuickSorter ( this , "rootroot " ) ;
183
- this . supplier = new Supplier ( this , [ 5 , 1 , 4 , 1 , 1 , 4 , 8 , 1 , 0 , 1 , 9 , 1 , 9 ] ) ;
196
+ this . rootSorter = new QuickSorter ( this , "root " ) ;
197
+ this . supplier = new Supplier ( this , [ 578 , 530 , 482 , 105 , 400 , 787 , 563 , 613 , 483 , 888 , 439 , 928 , 857 , 404 , 949 , 736 , 68 , 761 , 951 , 432 , 799 , 212 , 108 , 937 , 562 , 616 , 436 , 358 , 221 , 315 , 423 , 539 , 215 , 795 , 409 , 227 , 715 , 847 , 66 , 242 , 168 , 637 , 572 , 468 , 116 , 668 , 213 , 859 , 880 , 291 , 609 , 502 , 486 , 710 , 662 , 172 , 991 , 631 , 120 , 905 , 751 , 293 , 411 , 503 , 901 , 53 , 774 , 145 , 831 , 140 , 592 , 184 , 228 , 111 , 907 , 640 , 553 , 519 , 579 , 389 , 735 , 545 , 975 , 255 , 83 , 449 , 673 , 427 , 369 , 854 , 86 , 33 , 885 , 940 , 904 , 764 , 834 , 250 , 183 , 191 ] ) ;
184
198
this . _connect ( this . supplier . rootWritePort , this . rootSorter . parentReadPort ) ;
185
199
this . _connect ( this . rootSorter . parentWritePort , this . supplier . rootReadPort ) ;
186
200
}
0 commit comments