From 8d8c4868711a0000278b757b792cea3f7d24ec20 Mon Sep 17 00:00:00 2001 From: asmit27rai Date: Thu, 13 Mar 2025 00:24:59 +0530 Subject: [PATCH] feat: Implement add_vertex and remove_vertex for AdjacencyMatrix - Added `add_vertex` method to dynamically add vertices to the graph. - Added `remove_vertex` method to dynamically remove vertices and associated edges. - Updated adjacency matrix and edge weights accordingly. - Added test cases to verify the new functionality. --- pydatastructs/graphs/adjacency_matrix.py | 26 ++++++++++++++++--- .../graphs/tests/test_adjacency_matrix.py | 9 +++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pydatastructs/graphs/adjacency_matrix.py b/pydatastructs/graphs/adjacency_matrix.py index 48e0d3489..e479c2b89 100644 --- a/pydatastructs/graphs/adjacency_matrix.py +++ b/pydatastructs/graphs/adjacency_matrix.py @@ -57,12 +57,30 @@ def neighbors(self, node): return neighbors def add_vertex(self, node): - raise NotImplementedError("Currently we allow " - "adjacency matrix for static graphs only") + node_name = str(node.name) + if node_name in self.vertices: + raise ValueError(f"Vertex {node_name} already exists in the graph.") + self.vertices.append(node_name) + self.__setattr__(node_name, node) + self.matrix[node_name] = {} + for vertex in self.vertices: + self.matrix[vertex][node_name] = False + self.matrix[node_name][vertex] = False def remove_vertex(self, node): - raise NotImplementedError("Currently we allow " - "adjacency matrix for static graphs only.") + node_name = str(node) + if node_name not in self.vertices: + raise ValueError(f"Vertex {node_name} does not exist in the graph.") + self.vertices.remove(node_name) + del self.matrix[node_name] + for vertex in self.vertices: + del self.matrix[vertex][node_name] + edges_to_remove = [] + for edge in self.edge_weights.keys(): + if node_name in edge: + edges_to_remove.append(edge) + for edge in edges_to_remove: + del self.edge_weights[edge] def add_edge(self, source, target, cost=None): source, target = str(source), str(target) diff --git a/pydatastructs/graphs/tests/test_adjacency_matrix.py b/pydatastructs/graphs/tests/test_adjacency_matrix.py index 2dace4260..2c0ce67cd 100644 --- a/pydatastructs/graphs/tests/test_adjacency_matrix.py +++ b/pydatastructs/graphs/tests/test_adjacency_matrix.py @@ -30,3 +30,12 @@ def test_AdjacencyMatrix(): assert raises(ValueError, lambda: g.add_edge('v', 'x')) assert raises(ValueError, lambda: g.add_edge(2, 3)) assert raises(ValueError, lambda: g.add_edge(3, 2)) + v_3 = AdjacencyMatrixGraphNode(3, 3) + g.add_vertex(v_3) + assert '3' in g.vertices + assert g.is_adjacent(3, 0) is False + g.add_edge(3, 0, 0) + assert g.is_adjacent(3, 0) is True + g.remove_vertex(3) + assert '3' not in g.vertices + assert raises(ValueError, lambda: g.add_edge(3, 0))