diff options
| author | Teddy Wing | 2022-09-20 21:00:42 +0200 |
|---|---|---|
| committer | Teddy Wing | 2022-09-20 21:00:42 +0200 |
| commit | 2cc79c6873dc59b0510045717b0359bc64513fc1 (patch) | |
| tree | cdac0f9a3671cc21374f43d1d5dae829e021737c /vendor/github.com/soniakeys/graph/adj_cg.go | |
| parent | 426afbfbee72c8c1e66c67c6837f62a9f5633698 (diff) | |
| download | gdrive-2cc79c6873dc59b0510045717b0359bc64513fc1.tar.bz2 | |
Untrack and ignore the vendor directory
I don't think this should be in version control.
Diffstat (limited to 'vendor/github.com/soniakeys/graph/adj_cg.go')
| -rw-r--r-- | vendor/github.com/soniakeys/graph/adj_cg.go | 387 |
1 files changed, 0 insertions, 387 deletions
diff --git a/vendor/github.com/soniakeys/graph/adj_cg.go b/vendor/github.com/soniakeys/graph/adj_cg.go deleted file mode 100644 index a484ee0..0000000 --- a/vendor/github.com/soniakeys/graph/adj_cg.go +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright 2014 Sonia Keys -// License MIT: http://opensource.org/licenses/MIT - -package graph - -// adj_RO.go is code generated from adj_cg.go by directives in graph.go. -// Editing adj_cg.go is okay. -// DO NOT EDIT adj_RO.go. The RO is for Read Only. - -import ( - "math/rand" - "time" -) - -// ArcSize returns the number of arcs in g. -// -// Note that for an undirected graph without loops, the number of undirected -// edges -- the traditional meaning of graph size -- will be ArcSize()/2. -// On the other hand, if g is an undirected graph that has or may have loops, -// g.ArcSize()/2 is not a meaningful quantity. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) ArcSize() int { - m := 0 - for _, to := range g { - m += len(to) - } - return m -} - -// BoundsOk validates that all arcs in g stay within the slice bounds of g. -// -// BoundsOk returns true when no arcs point outside the bounds of g. -// Otherwise it returns false and an example arc that points outside of g. -// -// Most methods of this package assume the BoundsOk condition and may -// panic when they encounter an arc pointing outside of the graph. This -// function can be used to validate a graph when the BoundsOk condition -// is unknown. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) BoundsOk() (ok bool, fr NI, to Half) { - for fr, to := range g { - for _, to := range to { - if to.To < 0 || to.To >= NI(len(g)) { - return false, NI(fr), to - } - } - } - return true, -1, to -} - -// BreadthFirst traverses a directed or undirected graph in breadth first order. -// -// Argument start is the start node for the traversal. If r is nil, nodes are -// visited in deterministic order. If a random number generator is supplied, -// nodes at each level are visited in random order. -// -// Argument f can be nil if you have no interest in the FromList path result. -// If FromList f is non-nil, the method populates f.Paths and sets f.MaxLen. -// It does not set f.Leaves. For convenience argument f can be a zero value -// FromList. If f.Paths is nil, the FromList is initialized first. If f.Paths -// is non-nil however, the FromList is used as is. The method uses a value of -// PathEnd.Len == 0 to indentify unvisited nodes. Existing non-zero values -// will limit the traversal. -// -// Traversal calls the visitor function v for each node starting with node -// start. If v returns true, traversal continues. If v returns false, the -// traversal terminates immediately. PathEnd Len and From values are updated -// before calling the visitor function. -// -// On return f.Paths and f.MaxLen are set but not f.Leaves. -// -// Returned is the number of nodes visited and ok = true if the traversal -// ran to completion or ok = false if it was terminated by the visitor -// function returning false. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) BreadthFirst(start NI, r *rand.Rand, f *FromList, v OkNodeVisitor) (visited int, ok bool) { - switch { - case f == nil: - e := NewFromList(len(g)) - f = &e - case f.Paths == nil: - *f = NewFromList(len(g)) - } - rp := f.Paths - // the frontier consists of nodes all at the same level - frontier := []NI{start} - level := 1 - // assign path when node is put on frontier, - rp[start] = PathEnd{Len: level, From: -1} - for { - f.MaxLen = level - level++ - var next []NI - if r == nil { - for _, n := range frontier { - visited++ - if !v(n) { // visit nodes as they come off frontier - return - } - for _, nb := range g[n] { - if rp[nb.To].Len == 0 { - next = append(next, nb.To) - rp[nb.To] = PathEnd{From: n, Len: level} - } - } - } - } else { // take nodes off frontier at random - for _, i := range r.Perm(len(frontier)) { - n := frontier[i] - // remainder of block same as above - visited++ - if !v(n) { - return - } - for _, nb := range g[n] { - if rp[nb.To].Len == 0 { - next = append(next, nb.To) - rp[nb.To] = PathEnd{From: n, Len: level} - } - } - } - } - if len(next) == 0 { - break - } - frontier = next - } - return visited, true -} - -// BreadthFirstPath finds a single path from start to end with a minimum -// number of nodes. -// -// Returned is the path as list of nodes. -// The result is nil if no path was found. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) BreadthFirstPath(start, end NI) []NI { - var f FromList - g.BreadthFirst(start, nil, &f, func(n NI) bool { return n != end }) - return f.PathTo(end, nil) -} - -// Copy makes a deep copy of g. -// Copy also computes the arc size ma, the number of arcs. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) Copy() (c LabeledAdjacencyList, ma int) { - c = make(LabeledAdjacencyList, len(g)) - for n, to := range g { - c[n] = append([]Half{}, to...) - ma += len(to) - } - return -} - -// DepthFirst traverses a graph depth first. -// -// As it traverses it calls visitor function v for each node. If v returns -// false at any point, the traversal is terminated immediately and DepthFirst -// returns false. Otherwise DepthFirst returns true. -// -// DepthFirst uses argument bm is used as a bitmap to guide the traversal. -// For a complete traversal, bm should be 0 initially. During the -// traversal, bits are set corresponding to each node visited. -// The bit is set before calling the visitor function. -// -// Argument bm can be nil if you have no need for it. -// In this case a bitmap is created internally for one-time use. -// -// Alternatively v can be nil. In this case traversal still proceeds and -// updates the bitmap, which can be a useful result. -// DepthFirst always returns true in this case. -// -// It makes no sense for both bm and v to be nil. In this case DepthFirst -// returns false immediately. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) DepthFirst(start NI, bm *Bits, v OkNodeVisitor) (ok bool) { - if bm == nil { - if v == nil { - return false - } - bm = &Bits{} - } - var df func(n NI) bool - df = func(n NI) bool { - if bm.Bit(n) == 1 { - return true - } - bm.SetBit(n, 1) - if v != nil && !v(n) { - return false - } - for _, nb := range g[n] { - if !df(nb.To) { - return false - } - } - return true - } - return df(start) -} - -// DepthFirstRandom traverses a graph depth first, but following arcs in -// random order among arcs from a single node. -// -// If Rand r is nil, the method creates a new source and generator for -// one-time use. -// -// Usage is otherwise like the DepthFirst method. See DepthFirst. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) DepthFirstRandom(start NI, bm *Bits, v OkNodeVisitor, r *rand.Rand) (ok bool) { - if bm == nil { - if v == nil { - return false - } - bm = &Bits{} - } - if r == nil { - r = rand.New(rand.NewSource(time.Now().UnixNano())) - } - var df func(n NI) bool - df = func(n NI) bool { - if bm.Bit(n) == 1 { - return true - } - bm.SetBit(n, 1) - if v != nil && !v(n) { - return false - } - to := g[n] - for _, i := range r.Perm(len(to)) { - if !df(to[i].To) { - return false - } - } - return true - } - return df(start) -} - -// HasArc returns true if g has any arc from node fr to node to. -// -// Also returned is the index within the slice of arcs from node fr. -// If no arc from fr to to is present, HasArc returns false, -1. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) HasArc(fr, to NI) (bool, int) { - for x, h := range g[fr] { - if h.To == to { - return true, x - } - } - return false, -1 -} - -// HasLoop identifies if a graph contains a loop, an arc that leads from a -// a node back to the same node. -// -// If the graph has a loop, the result is an example node that has a loop. -// -// If g contains a loop, the method returns true and an example of a node -// with a loop. If there are no loops in g, the method returns false, -1. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) HasLoop() (bool, NI) { - for fr, to := range g { - for _, to := range to { - if NI(fr) == to.To { - return true, to.To - } - } - } - return false, -1 -} - -// HasParallelMap identifies if a graph contains parallel arcs, multiple arcs -// that lead from a node to the same node. -// -// If the graph has parallel arcs, the method returns true and -// results fr and to represent an example where there are parallel arcs -// from node fr to node to. -// -// If there are no parallel arcs, the method returns false, -1 -1. -// -// Multiple loops on a node count as parallel arcs. -// -// "Map" in the method name indicates that a Go map is used to detect parallel -// arcs. Compared to method HasParallelSort, this gives better asymtotic -// performance for large dense graphs but may have increased overhead for -// small or sparse graphs. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) HasParallelMap() (has bool, fr, to NI) { - for n, to := range g { - if len(to) == 0 { - continue - } - m := map[NI]struct{}{} - for _, to := range to { - if _, ok := m[to.To]; ok { - return true, NI(n), to.To - } - m[to.To] = struct{}{} - } - } - return false, -1, -1 -} - -// IsSimple checks for loops and parallel arcs. -// -// A graph is "simple" if it has no loops or parallel arcs. -// -// IsSimple returns true, -1 for simple graphs. If a loop or parallel arc is -// found, simple returns false and a node that represents a counterexample -// to the graph being simple. -// -// See also separate methods HasLoop and HasParallel. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) IsSimple() (ok bool, n NI) { - if lp, n := g.HasLoop(); lp { - return false, n - } - if pa, n, _ := g.HasParallelSort(); pa { - return false, n - } - return true, -1 -} - -// IsolatedNodes returns a bitmap of isolated nodes in receiver graph g. -// -// An isolated node is one with no arcs going to or from it. -// -// There are equivalent labeled and unlabeled versions of this method. -func (g LabeledAdjacencyList) IsolatedNodes() (i Bits) { - i.SetAll(len(g)) - for fr, to := range g { - if len(to) > 0 { - i.SetBit(NI(fr), 0) - for _, to := range to { - i.SetBit(to.To, 0) - } - } - } - return -} - -/* -MaxmimalClique finds a maximal clique containing the node n. - -Not sure this is good for anything. It produces a single maximal clique -but there can be multiple maximal cliques containing a given node. -This algorithm just returns one of them, not even necessarily the -largest one. - -func (g LabeledAdjacencyList) MaximalClique(n int) []int { - c := []int{n} - var m bitset.BitSet - m.Set(uint(n)) - for fr, to := range g { - if fr == n { - continue - } - if len(to) < len(c) { - continue - } - f := 0 - for _, to := range to { - if m.Test(uint(to.To)) { - f++ - if f == len(c) { - c = append(c, to.To) - m.Set(uint(to.To)) - break - } - } - } - } - return c -} -*/ |
