@@ -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