mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 15:47:01 +08:00
graph: use int64 for node removal
This commit is contained in:

committed by
Dan Kortschak

parent
22ecbbb4f5
commit
a1b5d898fe
@@ -129,10 +129,11 @@ type NodeAdder interface {
|
||||
|
||||
// NodeRemover is an interface for removing nodes from a graph.
|
||||
type NodeRemover interface {
|
||||
// RemoveNode removes a node from the graph, as
|
||||
// well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
RemoveNode(Node)
|
||||
// RemoveNode removes the node with the given ID
|
||||
// from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is
|
||||
// a no-op.
|
||||
RemoveNode(id int64)
|
||||
}
|
||||
|
||||
// EdgeAdder is an interface for adding edges to a graph.
|
||||
|
@@ -65,25 +65,25 @@ func (g *DirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *DirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *DirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.from[n.ID()] {
|
||||
delete(g.to[from], n.ID())
|
||||
for from := range g.from[id] {
|
||||
delete(g.to[from], id)
|
||||
}
|
||||
delete(g.from, n.ID())
|
||||
delete(g.from, id)
|
||||
|
||||
for to := range g.to[n.ID()] {
|
||||
delete(g.from[to], n.ID())
|
||||
for to := range g.to[id] {
|
||||
delete(g.from[to], id)
|
||||
}
|
||||
delete(g.to, n.ID())
|
||||
delete(g.to, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewLine returns a new Line from the source to the destination node.
|
||||
|
@@ -58,7 +58,7 @@ func TestIssue123DirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -62,20 +62,20 @@ func (g *UndirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *UndirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *UndirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.lines[n.ID()] {
|
||||
delete(g.lines[from], n.ID())
|
||||
for from := range g.lines[id] {
|
||||
delete(g.lines[from], id)
|
||||
}
|
||||
delete(g.lines, n.ID())
|
||||
delete(g.lines, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewLine returns a new Line from the source to the destination node.
|
||||
|
@@ -24,9 +24,9 @@ func TestMaxID(t *testing.T) {
|
||||
g.AddNode(i)
|
||||
nodes[i] = struct{}{}
|
||||
}
|
||||
g.RemoveNode(Node(0))
|
||||
g.RemoveNode(int64(0))
|
||||
delete(nodes, Node(0))
|
||||
g.RemoveNode(Node(2))
|
||||
g.RemoveNode(int64(2))
|
||||
delete(nodes, Node(2))
|
||||
n := g.NewNode()
|
||||
g.AddNode(n)
|
||||
@@ -53,7 +53,7 @@ func TestIssue123UndirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -69,25 +69,25 @@ func (g *WeightedDirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *WeightedDirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *WeightedDirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.from[n.ID()] {
|
||||
delete(g.to[from], n.ID())
|
||||
for from := range g.from[id] {
|
||||
delete(g.to[from], id)
|
||||
}
|
||||
delete(g.from, n.ID())
|
||||
delete(g.from, id)
|
||||
|
||||
for to := range g.to[n.ID()] {
|
||||
delete(g.from[to], n.ID())
|
||||
for to := range g.to[id] {
|
||||
delete(g.from[to], id)
|
||||
}
|
||||
delete(g.to, n.ID())
|
||||
delete(g.to, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewWeightedLine returns a new WeightedLine from the source to the destination node.
|
||||
|
@@ -59,7 +59,7 @@ func TestIssue123WeightedDirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -66,20 +66,20 @@ func (g *WeightedUndirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *WeightedUndirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *WeightedUndirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.lines[n.ID()] {
|
||||
delete(g.lines[from], n.ID())
|
||||
for from := range g.lines[id] {
|
||||
delete(g.lines[from], id)
|
||||
}
|
||||
delete(g.lines, n.ID())
|
||||
delete(g.lines, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewLine returns a new WeightedLine from the source to the destination node.
|
||||
|
@@ -17,9 +17,9 @@ func TestWeightedMaxID(t *testing.T) {
|
||||
g.AddNode(i)
|
||||
nodes[i] = struct{}{}
|
||||
}
|
||||
g.RemoveNode(Node(0))
|
||||
g.RemoveNode(int64(0))
|
||||
delete(nodes, Node(0))
|
||||
g.RemoveNode(Node(2))
|
||||
g.RemoveNode(int64(2))
|
||||
delete(nodes, Node(2))
|
||||
n := g.NewNode()
|
||||
g.AddNode(n)
|
||||
@@ -46,7 +46,7 @@ func TestIssue123WeightedUndirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -54,25 +54,25 @@ func (g *DirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *DirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *DirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.from[n.ID()] {
|
||||
delete(g.to[from], n.ID())
|
||||
for from := range g.from[id] {
|
||||
delete(g.to[from], id)
|
||||
}
|
||||
delete(g.from, n.ID())
|
||||
delete(g.from, id)
|
||||
|
||||
for to := range g.to[n.ID()] {
|
||||
delete(g.from[to], n.ID())
|
||||
for to := range g.to[id] {
|
||||
delete(g.from[to], id)
|
||||
}
|
||||
delete(g.to, n.ID())
|
||||
delete(g.to, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewEdge returns a new Edge from the source to the destination node.
|
||||
|
@@ -58,7 +58,7 @@ func TestIssue123DirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -51,20 +51,20 @@ func (g *UndirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *UndirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *UndirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.edges[n.ID()] {
|
||||
delete(g.edges[from], n.ID())
|
||||
for from := range g.edges[id] {
|
||||
delete(g.edges[from], id)
|
||||
}
|
||||
delete(g.edges, n.ID())
|
||||
delete(g.edges, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewEdge returns a new Edge from the source to the destination node.
|
||||
|
@@ -31,9 +31,9 @@ func TestMaxID(t *testing.T) {
|
||||
g.AddNode(i)
|
||||
nodes[i] = struct{}{}
|
||||
}
|
||||
g.RemoveNode(Node(0))
|
||||
g.RemoveNode(int64(0))
|
||||
delete(nodes, Node(0))
|
||||
g.RemoveNode(Node(2))
|
||||
g.RemoveNode(int64(2))
|
||||
delete(nodes, Node(2))
|
||||
n := g.NewNode()
|
||||
g.AddNode(n)
|
||||
@@ -60,7 +60,7 @@ func TestIssue123UndirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -60,25 +60,25 @@ func (g *WeightedDirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *WeightedDirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *WeightedDirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.from[n.ID()] {
|
||||
delete(g.to[from], n.ID())
|
||||
for from := range g.from[id] {
|
||||
delete(g.to[from], id)
|
||||
}
|
||||
delete(g.from, n.ID())
|
||||
delete(g.from, id)
|
||||
|
||||
for to := range g.to[n.ID()] {
|
||||
delete(g.from[to], n.ID())
|
||||
for to := range g.to[id] {
|
||||
delete(g.from[to], id)
|
||||
}
|
||||
delete(g.to, n.ID())
|
||||
delete(g.to, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewWeightedEdge returns a new weighted edge from the source to the destination node.
|
||||
|
@@ -60,7 +60,7 @@ func TestIssue123WeightedDirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
@@ -57,20 +57,20 @@ func (g *WeightedUndirectedGraph) AddNode(n graph.Node) {
|
||||
g.nodeIDs.Use(n.ID())
|
||||
}
|
||||
|
||||
// RemoveNode removes n from the graph, as well as any edges attached to it. If the node
|
||||
// is not in the graph it is a no-op.
|
||||
func (g *WeightedUndirectedGraph) RemoveNode(n graph.Node) {
|
||||
if _, ok := g.nodes[n.ID()]; !ok {
|
||||
// RemoveNode removes the node with the given ID from the graph, as well as any edges attached
|
||||
// to it. If the node is not in the graph it is a no-op.
|
||||
func (g *WeightedUndirectedGraph) RemoveNode(id int64) {
|
||||
if _, ok := g.nodes[id]; !ok {
|
||||
return
|
||||
}
|
||||
delete(g.nodes, n.ID())
|
||||
delete(g.nodes, id)
|
||||
|
||||
for from := range g.edges[n.ID()] {
|
||||
delete(g.edges[from], n.ID())
|
||||
for from := range g.edges[id] {
|
||||
delete(g.edges[from], id)
|
||||
}
|
||||
delete(g.edges, n.ID())
|
||||
delete(g.edges, id)
|
||||
|
||||
g.nodeIDs.Release(n.ID())
|
||||
g.nodeIDs.Release(id)
|
||||
}
|
||||
|
||||
// NewWeightedEdge returns a new weighted edge from the source to the destination node.
|
||||
|
@@ -33,9 +33,9 @@ func TestWeightedMaxID(t *testing.T) {
|
||||
g.AddNode(i)
|
||||
nodes[i] = struct{}{}
|
||||
}
|
||||
g.RemoveNode(Node(0))
|
||||
g.RemoveNode(int64(0))
|
||||
delete(nodes, Node(0))
|
||||
g.RemoveNode(Node(2))
|
||||
g.RemoveNode(int64(2))
|
||||
delete(nodes, Node(2))
|
||||
n := g.NewNode()
|
||||
g.AddNode(n)
|
||||
@@ -62,7 +62,7 @@ func TestIssue123WeightedUndirectedGraph(t *testing.T) {
|
||||
n1 := g.NewNode()
|
||||
g.AddNode(n1)
|
||||
|
||||
g.RemoveNode(n0)
|
||||
g.RemoveNode(n0.ID())
|
||||
|
||||
n2 := g.NewNode()
|
||||
g.AddNode(n2)
|
||||
|
Reference in New Issue
Block a user