directed_acyclic.go 2.0 KB

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