Skip to content

Commit c62970b

Browse files
Dynamic Graphs - Enable adding and removing vertices
1 parent ed88315 commit c62970b

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

pydatastructs/graphs/adjacency_matrix.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,48 @@ def neighbors(self, node):
5757
return neighbors
5858

5959
def add_vertex(self, node):
60-
raise NotImplementedError("Currently we allow "
61-
"adjacency matrix for static graphs only")
60+
if node.name in self.matrix:
61+
raise ValueError("Vertex %s already exists in the graph." % node.name)
62+
self.vertices.append(node.name)
63+
setattr(self, node.name, node)
64+
self.matrix[node.name] = {}
6265

6366
def remove_vertex(self, node):
64-
raise NotImplementedError("Currently we allow "
65-
"adjacency matrix for static graphs only.")
67+
node = str(node)
68+
if node not in self.matrix:
69+
raise ValueError("Vertex '%s' is not present in the graph." % node)
70+
71+
# first we need to remove the edges involving the `node`
72+
73+
# removing records from dict while iterating over them is tricky
74+
# so we'll first identify which edges to remove first
75+
76+
edges_to_remove = []
77+
78+
for target in self.matrix[node]:
79+
if self.matrix[node].get(target, False):
80+
edges_to_remove.append((node, target))
81+
82+
for source in self.vertices:
83+
if self.matrix[source].get(node):
84+
edges_to_remove.append((source, node))
85+
86+
# remove the identified edge weights
87+
for source, target in edges_to_remove:
88+
edge_key = str(source) + "_" + str(target)
89+
self.edge_weights.pop(edge_key)
90+
91+
self.vertices.remove(node)
92+
# eliminate all outgoing edges
93+
self.matrix.pop(node, None)
94+
95+
# eliminate all incoming edges
96+
for source in self.vertices:
97+
self.matrix[source].pop(node, None)
98+
99+
100+
if hasattr(self, node):
101+
delattr(self, node)
66102

67103
def add_edge(self, source, target, cost=None):
68104
source, target = str(source), str(target)

0 commit comments

Comments
 (0)