...

Source file src/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/directed_acyclic.go

Documentation: k8s.io/kubernetes/third_party/forked/gonum/graph/simple

     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  }
    84  

View as plain text