|
@@ -21,6 +21,7 @@ import (
|
21
|
21
|
"os"
|
22
|
22
|
"path/filepath"
|
23
|
23
|
"sort"
|
|
24
|
+ "errors"
|
24
|
25
|
"strconv"
|
25
|
26
|
"strings"
|
26
|
27
|
|
|
@@ -345,7 +346,7 @@ func (g *Graph) TrimTree(kept NodeSet) {
|
345
|
346
|
for _, cur := range oldNodes {
|
346
|
347
|
// A node may not have multiple parents
|
347
|
348
|
if len(cur.In) > 1 {
|
348
|
|
- fmt.Fprintf(os.Stderr, "ERROR: TrimTree only works on trees.\n")
|
|
349
|
+ panic(errors.New("TrimTree only works on trees.\n"))
|
349
|
350
|
}
|
350
|
351
|
|
351
|
352
|
// If a node should be kept, add it to the next list of nodes
|
|
@@ -354,6 +355,14 @@ func (g *Graph) TrimTree(kept NodeSet) {
|
354
|
355
|
continue
|
355
|
356
|
}
|
356
|
357
|
|
|
358
|
+ // If a node has no parents, delete all the in edges of the children to make them
|
|
359
|
+ // all roots of their own trees.
|
|
360
|
+ if len(cur.In) == 0 {
|
|
361
|
+ for _, outEdge := range cur.Out {
|
|
362
|
+ delete(outEdge.Dest.In, cur)
|
|
363
|
+ }
|
|
364
|
+ }
|
|
365
|
+
|
357
|
366
|
// Get the parent. Since cur.In may only be of size 0 or 1, parent will be
|
358
|
367
|
// equal to either nil or the only node in cur.In
|
359
|
368
|
var parent *Node
|
|
@@ -361,29 +370,21 @@ func (g *Graph) TrimTree(kept NodeSet) {
|
361
|
370
|
parent = edge.Src
|
362
|
371
|
}
|
363
|
372
|
|
364
|
|
- if parent != nil {
|
365
|
|
- // Remove the edge from the parent to this node
|
366
|
|
- delete(parent.Out, cur)
|
|
373
|
+ // Remove the edge from the parent to this node
|
|
374
|
+ delete(parent.Out, cur)
|
367
|
375
|
|
368
|
|
- // Reconfigure every edge from the current node to now begin at the parent.
|
369
|
|
- for _, outEdge := range cur.Out {
|
370
|
|
- child := outEdge.Dest
|
|
376
|
+ // Reconfigure every edge from the current node to now begin at the parent.
|
|
377
|
+ for _, outEdge := range cur.Out {
|
|
378
|
+ child := outEdge.Dest
|
371
|
379
|
|
372
|
|
- delete(child.In, cur)
|
373
|
|
- child.In[parent] = outEdge
|
374
|
|
- parent.Out[child] = outEdge
|
|
380
|
+ delete(child.In, cur)
|
|
381
|
+ child.In[parent] = outEdge
|
|
382
|
+ parent.Out[child] = outEdge
|
375
|
383
|
|
376
|
|
- outEdge.Src = parent
|
377
|
|
- outEdge.Residual = true
|
378
|
|
- // Any reconfigured edge can no longer be Inline.
|
379
|
|
- outEdge.Inline = false
|
380
|
|
- }
|
381
|
|
- } else {
|
382
|
|
- // If a node has no parents, delete all the in edges of the children to make them
|
383
|
|
- // all roots of their own trees.
|
384
|
|
- for _, outEdge := range cur.Out {
|
385
|
|
- delete(outEdge.Dest.In, cur)
|
386
|
|
- }
|
|
384
|
+ outEdge.Src = parent
|
|
385
|
+ outEdge.Residual = true
|
|
386
|
+ // Any reconfigured edge can no longer be Inline.
|
|
387
|
+ outEdge.Inline = false
|
387
|
388
|
}
|
388
|
389
|
}
|
389
|
390
|
g.RemoveRedundantEdges()
|