Przeglądaj źródła

Fix the floating graph node sequence

Vadim Markovtsev 7 lat temu
rodzic
commit
74d485d1a3
2 zmienionych plików z 34 dodań i 0 usunięć
  1. 3 0
      pipeline.go
  2. 31 0
      toposort/toposort.go

+ 3 - 0
pipeline.go

@@ -445,6 +445,7 @@ func (pipeline *Pipeline) resolve(dumpPath string) {
 		for key := range ambiguousMap {
 			ambiguous = append(ambiguous, key)
 		}
+		sort.Strings(ambiguous)
 		bfsorder := graph.BreadthSort()
 		bfsindex := map[string]int{}
 		for i, s := range bfsorder {
@@ -496,6 +497,8 @@ func (pipeline *Pipeline) resolve(dumpPath string) {
 		}
 	}
 	if dumpPath != "" {
+		// If there is a floating difference, uncomment this:
+		// fmt.Fprint(os.Stderr, graphCopy.DebugDump())
 		ioutil.WriteFile(dumpPath, []byte(graphCopy.Serialize(strplan)), 0666)
 		absPath, _ := filepath.Abs(dumpPath)
 		fmt.Fprintf(os.Stderr, "Wrote the DAG to %s\n", absPath)

+ 31 - 0
toposort/toposort.go

@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"fmt"
 	"sort"
+	"strings"
 )
 
 // Reworked from https://github.com/philopon/go-toposort
@@ -227,6 +228,7 @@ func (g *Graph) FindChildren(from string) []string {
 	for child := range g.outputs[from] {
 		result = append(result, child)
 	}
+	sort.Strings(result)
 	return result
 }
 
@@ -257,3 +259,32 @@ func (g *Graph) Serialize(sorted []string) string {
 	buffer.WriteString("}")
 	return buffer.String()
 }
+
+func (g *Graph) DebugDump() string {
+	S := make([]string, 0, len(g.outputs))
+	for n := range g.outputs {
+		if g.inputs[n] == 0 {
+			S = append(S, n)
+		}
+	}
+	sort.Strings(S)
+	var buffer bytes.Buffer
+	buffer.WriteString(strings.Join(S, " ") + "\n")
+	keys := []string{}
+	vals := map[string][]string{}
+	for key, val1 := range g.outputs {
+		val2 := make([]string, len(val1))
+		for name, idx := range val1 {
+			val2[idx - 1] = name
+		}
+		keys = append(keys, key)
+		vals[key] = val2
+	}
+	sort.Strings(keys)
+	for _, key := range keys {
+		buffer.WriteString(fmt.Sprintf("%s %d = ", key, g.inputs[key]))
+		outs := vals[key]
+		buffer.WriteString(strings.Join(outs, " ") + "\n")
+	}
+	return buffer.String()
+}