AddEdges adds multiple edges in one batch. See AddEdge for more details.
(edges Edges)
| 61 | |
| 62 | // AddEdges adds multiple edges in one batch. See AddEdge for more details. |
| 63 | func (d *DAG) AddEdges(edges Edges) error { |
| 64 | for _, edge := range edges { |
| 65 | for i := 0; i < len(edge); i++ { |
| 66 | if len(d.vertexes) <= int(edge[i]) || edge[i] < 0 { |
| 67 | return errors.Errorf("invalid vertex id %d", edge[i]) |
| 68 | } |
| 69 | } |
| 70 | } |
| 71 | for _, edge := range edges { |
| 72 | for i := 0; i < len(edge)-1; i++ { |
| 73 | d.vertexes[edge[i]].addChild(d.vertexes[edge[i+1]]) |
| 74 | } |
| 75 | } |
| 76 | if yes, badEdges := IsAcyclic(d); !yes { |
| 77 | for _, edge := range edges { |
| 78 | for i := 0; i < len(edge)-1; i++ { |
| 79 | d.vertexes[edge[i]].removeChild(d.vertexes[edge[i+1]]) |
| 80 | } |
| 81 | } |
| 82 | return errors.Errorf("dag is not acyclic: %s", d.fmtEdges(badEdges)) |
| 83 | } |
| 84 | return nil |
| 85 | } |
| 86 | |
| 87 | // Run runs the dag. Vertexes with no dependency will be scheduled concurrently |
| 88 | // while the inked vertexes will be scheduled sequentially. The Scheduler |