mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 15:16:59 +08:00

With the approach to graph node mutation on edge setting the previously existed there was an issue that the edge last used connect a pair of nodes could result in a difference in the nodes being returned by a node query compared to the same node associated with edges returned from an edge query. This change avoids dealing with that by making it implementation dependent and stating this, and by making all the node-storing graphs we provide mutate the nodes when edges are set.
177 lines
5.1 KiB
Go
177 lines
5.1 KiB
Go
// Copyright ©2014 The Gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package graph
|
|
|
|
// Line is an edge in a multigraph. A Line returns an ID that must
|
|
// distinguish Lines sharing Node end points.
|
|
type Line interface {
|
|
Edge
|
|
ID() int64
|
|
}
|
|
|
|
// WeightedLine is a weighted multigraph edge.
|
|
type WeightedLine interface {
|
|
Line
|
|
Weight() float64
|
|
}
|
|
|
|
// Multigraph is a generalized multigraph.
|
|
type Multigraph interface {
|
|
// Has returns whether the node with the given ID exists
|
|
// within the multigraph.
|
|
Has(id int64) bool
|
|
|
|
// Node returns the node with the given ID if it exists
|
|
// in the multigraph, and nil otherwise.
|
|
Node(id int64) Node
|
|
|
|
// Nodes returns all the nodes in the multigraph.
|
|
Nodes() Nodes
|
|
|
|
// From returns all nodes that can be reached directly
|
|
// from the node with the given ID.
|
|
From(id int64) Nodes
|
|
|
|
// HasEdgeBetween returns whether an edge exists between
|
|
// nodes with IDs xid and yid without considering direction.
|
|
HasEdgeBetween(xid, yid int64) bool
|
|
|
|
// Lines returns the lines from u to v, with IDs uid and
|
|
// vid, if any such lines exist and nil otherwise. The
|
|
// node v must be directly reachable from u as defined by
|
|
// the From method.
|
|
Lines(uid, vid int64) Lines
|
|
}
|
|
|
|
// WeightedMultigraph is a weighted multigraph.
|
|
type WeightedMultigraph interface {
|
|
Multigraph
|
|
|
|
// WeightedLines returns the weighted lines from u to v
|
|
// with IDs uid and vid if any such lines exist and nil
|
|
// otherwise. The node v must be directly reachable
|
|
// from u as defined by the From method.
|
|
WeightedLines(uid, vid int64) WeightedLines
|
|
}
|
|
|
|
// UndirectedMultigraph is an undirected multigraph.
|
|
type UndirectedMultigraph interface {
|
|
Multigraph
|
|
|
|
// LinesBetween returns the lines between nodes x and y
|
|
// with IDs xid and yid.
|
|
LinesBetween(xid, yid int64) Lines
|
|
}
|
|
|
|
// WeightedUndirectedMultigraph is a weighted undirected multigraph.
|
|
type WeightedUndirectedMultigraph interface {
|
|
WeightedMultigraph
|
|
|
|
// WeightedLinesBetween returns the lines between nodes
|
|
// x and y with IDs xid and yid.
|
|
WeightedLinesBetween(xid, yid int64) WeightedLines
|
|
}
|
|
|
|
// DirectedMultigraph is a directed multigraph.
|
|
type DirectedMultigraph interface {
|
|
Multigraph
|
|
|
|
// HasEdgeFromTo returns whether an edge exists
|
|
// in the multigraph from u to v with IDs uid
|
|
// and vid.
|
|
HasEdgeFromTo(uid, vid int64) bool
|
|
|
|
// To returns all nodes that can reach directly
|
|
// to the node with the given ID.
|
|
To(id int64) Nodes
|
|
}
|
|
|
|
// WeightedDirectedMultigraph is a weighted directed multigraph.
|
|
type WeightedDirectedMultigraph interface {
|
|
WeightedMultigraph
|
|
|
|
// HasEdgeFromTo returns whether an edge exists
|
|
// in the multigraph from u to v with IDs uid
|
|
// and vid.
|
|
HasEdgeFromTo(uid, vid int64) bool
|
|
|
|
// To returns all nodes that can reach directly
|
|
// to the node with the given ID.
|
|
To(id int64) Nodes
|
|
}
|
|
|
|
// LineAdder is an interface for adding lines to a multigraph.
|
|
type LineAdder interface {
|
|
// NewLine returns a new Line from the source to the destination node.
|
|
NewLine(from, to Node) Line
|
|
|
|
// SetLine adds a Line from one node to another.
|
|
// If the multigraph supports node addition the nodes
|
|
// will be added if they do not exist, otherwise
|
|
// SetLine will panic.
|
|
// Whether l, l.From() and l.To() are stored
|
|
// within the graph is implementation dependent.
|
|
SetLine(l Line)
|
|
}
|
|
|
|
// WeightedLineAdder is an interface for adding lines to a multigraph.
|
|
type WeightedLineAdder interface {
|
|
// NewWeightedLine returns a new WeightedLine from
|
|
// the source to the destination node.
|
|
NewWeightedLine(from, to Node, weight float64) WeightedLine
|
|
|
|
// SetWeightedLine adds a weighted line from one node
|
|
// to another. If the multigraph supports node addition
|
|
// the nodes will be added if they do not exist,
|
|
// otherwise SetWeightedLine will panic.
|
|
// Whether l, l.From() and l.To() are stored
|
|
// within the graph is implementation dependent.
|
|
SetWeightedLine(l WeightedLine)
|
|
}
|
|
|
|
// LineRemover is an interface for removing lines from a multigraph.
|
|
type LineRemover interface {
|
|
// RemoveLine removes the line with the given end
|
|
// and line IDs, leaving the terminal nodes. If
|
|
// the line does not exist it is a no-op.
|
|
RemoveLine(fid, tid, id int64)
|
|
}
|
|
|
|
// MultigraphBuilder is a multigraph that can have nodes and lines added.
|
|
type MultigraphBuilder interface {
|
|
NodeAdder
|
|
LineAdder
|
|
}
|
|
|
|
// WeightedMultigraphBuilder is a multigraph that can have nodes and weighted lines added.
|
|
type WeightedMultigraphBuilder interface {
|
|
NodeAdder
|
|
WeightedLineAdder
|
|
}
|
|
|
|
// UndirectedMultgraphBuilder is an undirected multigraph builder.
|
|
type UndirectedMultigraphBuilder interface {
|
|
UndirectedMultigraph
|
|
MultigraphBuilder
|
|
}
|
|
|
|
// UndirectedWeightedMultigraphBuilder is an undirected weighted multigraph builder.
|
|
type UndirectedWeightedMultigraphBuilder interface {
|
|
UndirectedMultigraph
|
|
WeightedMultigraphBuilder
|
|
}
|
|
|
|
// DirectedMultigraphBuilder is a directed multigraph builder.
|
|
type DirectedMultigraphBuilder interface {
|
|
DirectedMultigraph
|
|
MultigraphBuilder
|
|
}
|
|
|
|
// DirectedWeightedMultigraphBuilder is a directed weighted multigraph builder.
|
|
type DirectedWeightedMultigraphBuilder interface {
|
|
DirectedMultigraph
|
|
WeightedMultigraphBuilder
|
|
}
|