k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/third_party/forked/gonum/graph/simple/directed_acyclic.go (about) 1 package simple 2 3 import ( 4 "k8s.io/kubernetes/third_party/forked/gonum/graph" 5 ) 6 7 // DirectedAcyclicGraph implements graph.Directed using UndirectedGraph, 8 // which only stores one edge for any node pair. 9 type DirectedAcyclicGraph struct { 10 *UndirectedGraph 11 } 12 13 func NewDirectedAcyclicGraph(self, absent float64) *DirectedAcyclicGraph { 14 return &DirectedAcyclicGraph{ 15 UndirectedGraph: NewUndirectedGraph(self, absent), 16 } 17 } 18 19 func (g *DirectedAcyclicGraph) HasEdgeFromTo(u, v graph.Node) bool { 20 edge := g.UndirectedGraph.EdgeBetween(u, v) 21 if edge == nil { 22 return false 23 } 24 return (edge.From().ID() == u.ID()) 25 } 26 27 func (g *DirectedAcyclicGraph) From(n graph.Node) []graph.Node { 28 if !g.Has(n) { 29 return nil 30 } 31 32 fid := n.ID() 33 nodes := make([]graph.Node, 0, g.UndirectedGraph.edges[n.ID()].Len()) 34 g.UndirectedGraph.edges[n.ID()].Visit(func(neighbor int, edge graph.Edge) { 35 if edge.From().ID() == fid { 36 nodes = append(nodes, g.UndirectedGraph.nodes[edge.To().ID()]) 37 } 38 }) 39 return nodes 40 } 41 42 func (g *DirectedAcyclicGraph) VisitFrom(n graph.Node, visitor func(neighbor graph.Node) (shouldContinue bool)) { 43 if !g.Has(n) { 44 return 45 } 46 fid := n.ID() 47 g.UndirectedGraph.edges[n.ID()].Visit(func(neighbor int, edge graph.Edge) { 48 if edge.From().ID() == fid { 49 if !visitor(g.UndirectedGraph.nodes[edge.To().ID()]) { 50 return 51 } 52 } 53 }) 54 } 55 56 func (g *DirectedAcyclicGraph) To(n graph.Node) []graph.Node { 57 if !g.Has(n) { 58 return nil 59 } 60 61 tid := n.ID() 62 nodes := make([]graph.Node, 0, g.UndirectedGraph.edges[n.ID()].Len()) 63 g.UndirectedGraph.edges[n.ID()].Visit(func(neighbor int, edge graph.Edge) { 64 if edge.To().ID() == tid { 65 nodes = append(nodes, g.UndirectedGraph.nodes[edge.From().ID()]) 66 } 67 }) 68 return nodes 69 } 70 71 func (g *DirectedAcyclicGraph) VisitTo(n graph.Node, visitor func(neighbor graph.Node) (shouldContinue bool)) { 72 if !g.Has(n) { 73 return 74 } 75 tid := n.ID() 76 g.UndirectedGraph.edges[n.ID()].Visit(func(neighbor int, edge graph.Edge) { 77 if edge.To().ID() == tid { 78 if !visitor(g.UndirectedGraph.nodes[edge.From().ID()]) { 79 return 80 } 81 } 82 }) 83 }