@@ -0,0 +1,112 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $graph destroytializeCandidates $graph
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 3 gtcore Done.
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ClearHooks
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Internal methods
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Instead of searching the whole graph for the degree-0 nodes in
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # each iteration we compute the list once to start, and then only
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # update it incrementally based on the outgoing neighbours of the
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # node chosen for commit.
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc InitializeCandidates {graph} {
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # bottom = list (list (node, range min, range max))
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybottom
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach node [$graph nodes] {
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[$graph node degree -in $node]} continue
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend mybottom [list $node [DataHook $graph $node]]
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ScheduleCandidates $graph
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ShowPendingNodes $graph
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc WithoutPredecessor {graph nodevar} {
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybottom
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 $nodevar node
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $mybottom]} { return 0 }
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set node [lindex [lindex $mybottom 0] 0]
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set mybottom [lrange $mybottom 1 end]
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set changed 0
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Update list of nodes without predecessor, based on the
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # outgoing neighbours of the chosen node. This should be
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # faster than iterating of the whole set of nodes, finding all
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # without predecessors, sorting them by time, etc. pp.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach out [$graph nodes -out $node] {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[$graph node degree -in $out] > 1} continue
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Degree-1 neighbour, will have no predecessors after the
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # removal of n. Put on the list of candidates we can
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # process.
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend mybottom [list $out [DataHook $graph $out]]
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set changed 1
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$changed} {
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ScheduleCandidates $graph
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # We do not delete the node immediately, to allow the Save
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # procedure to save the dependencies as well (encoded in the
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # arcs).
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc ScheduleCandidates {graph} {
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybottom
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mysortcmd
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $mysortcmd]} {
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set mybottom [uplevel \#0 [linsert $mysortcmd end $graph $mybottom]]
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set mybottom [lsort -index 0 -dict $mybottom]
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc ShowPendingNodes {graph} {
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[log verbosity?] < 10} return
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mybottom
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable myformatcmd
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 10 gtcore "Pending..............................."
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach item [struct::list map $mybottom \
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [linsert $myformatcmd end $graph]] {
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 10 gtcore "Pending: $item"
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Callback invokation ...
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc DataHook {graph node} {
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Allow the user of the traverser to a client data to a node
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # in the list of nodes available for immediate processing.
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This data can be used by the sort callback.
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable mydatacmd
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $mydatacmd]} { return {} }
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [uplevel \#0 [linsert $mydatacmd end $graph $node]]
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc FormatHook {graph item} {
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Allow the user to format a pending item (node + client data)
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # according to its wishes.
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ::variable myformatcmd
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $myformatcmd]} { return $item }
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [uplevel \#0 [linsert $myformatcmd end $graph $item]]
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc ProcessedHook {graph node} {
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Give the user of the traverser the opportunity to work with
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # the node before it is removed from