Skip to content

Commit 5e64b80

Browse files
authored
refactored graphs (#225)
1 parent 40693fa commit 5e64b80

File tree

5 files changed

+31
-33
lines changed

5 files changed

+31
-33
lines changed

pydatastructs/graphs/adjacency_list.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __new__(cls, *vertices):
1919
obj = object.__new__(cls)
2020
for vertex in vertices:
2121
obj.__setattr__(vertex.name, vertex)
22-
obj.vertices = set([vertex.name for vertex in vertices])
22+
obj.vertices = [vertex.name for vertex in vertices]
2323
obj.edge_weights = dict()
2424
return obj
2525

@@ -32,7 +32,7 @@ def neighbors(self, node):
3232
return [self.__getattribute__(name) for name in node.adjacent]
3333

3434
def add_vertex(self, node):
35-
self.vertices.add(node.name)
35+
self.vertices.append(node.name)
3636
self.__setattr__(node.name, node)
3737

3838
def remove_vertex(self, name):
@@ -47,8 +47,7 @@ def remove_vertex(self, name):
4747
def add_edge(self, source, target, cost=None):
4848
source, target = self.__getattribute__(source), \
4949
self.__getattribute__(target)
50-
source.__setattr__(target.name, target)
51-
source.adjacent.add(target.name)
50+
source.add_adjacent_node(target.name)
5251
if cost is not None:
5352
self.edge_weights[source.name + "_" + target.name] = \
5453
GraphEdge(source, target, cost)
@@ -61,7 +60,6 @@ def get_edge(self, source, target):
6160
def remove_edge(self, source, target):
6261
source, target = self.__getattribute__(source), \
6362
self.__getattribute__(target)
64-
source.adjacent.remove(target.name)
65-
delattr(source, target.name)
63+
source.remove_adjacent_node(target.name)
6664
self.edge_weights.pop(source.name + "_" + target.name,
6765
None)

pydatastructs/graphs/adjacency_matrix.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,28 @@ class AdjacencyMatrix(Graph):
1717
"""
1818
def __new__(cls, *vertices):
1919
obj = object.__new__(cls)
20-
num_vertices = len(vertices)
2120
obj.vertices = [vertex.name for vertex in vertices]
2221
for vertex in vertices:
23-
obj.__setattr__(str(vertex.name), vertex)
24-
obj.matrix = OneDimensionalArray(
25-
OneDimensionalArray,
26-
num_vertices)
27-
for i in range(num_vertices):
28-
obj.matrix[i] = OneDimensionalArray(
29-
bool,
30-
num_vertices)
31-
obj.matrix[i].fill(False)
22+
obj.__setattr__(vertex.name, vertex)
23+
obj.matrix = dict()
24+
for vertex in vertices:
25+
obj.matrix[vertex.name] = dict()
3226
obj.edge_weights = dict()
3327
return obj
3428

3529
def is_adjacent(self, node1, node2):
36-
return self.matrix[node1][node2]
30+
node1, node2 = str(node1), str(node2)
31+
row = self.matrix.get(node1, dict())
32+
return row.get(node2, False) is not False
3733

3834
def neighbors(self, node):
35+
node = str(node)
3936
neighbors = []
40-
for i in range(self.matrix[node]._size):
41-
if self.matrix[node][i]:
37+
row = self.matrix.get(node, dict())
38+
for node, presence in row.items():
39+
if presence:
4240
neighbors.append(self.__getattribute__(
43-
str(self.vertices[i])))
41+
str(node)))
4442
return neighbors
4543

4644
def add_vertex(self, node):
@@ -52,8 +50,9 @@ def remove_vertex(self, node):
5250
"adjacency matrix for static graphs only.")
5351

5452
def add_edge(self, source, target, cost=None):
55-
self.matrix[source][target] = True
5653
source, target = str(source), str(target)
54+
print(source, target)
55+
self.matrix[source][target] = True
5756
if cost is not None:
5857
self.edge_weights[source + "_" + target] = \
5958
GraphEdge(self.__getattribute__(source),
@@ -66,5 +65,6 @@ def get_edge(self, source, target):
6665
None)
6766

6867
def remove_edge(self, source, target):
68+
source, target = str(source), str(target)
6969
self.matrix[source][target] = False
7070
self.edge_weights.pop(str(source) + "_" + str(target), None)

pydatastructs/graphs/tests/test_adjacency_matrix.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ def test_AdjacencyMatrix():
1212
e1 = g.get_edge(0, 1)
1313
e2 = g.get_edge(1, 2)
1414
e3 = g.get_edge(2, 0)
15-
assert (e1.source.name, e1.target.name) == (0, 1)
16-
assert (e2.source.name, e2.target.name) == (1, 2)
17-
assert (e3.source.name, e3.target.name) == (2, 0)
15+
assert (e1.source.name, e1.target.name) == ('0', '1')
16+
assert (e2.source.name, e2.target.name) == ('1', '2')
17+
assert (e3.source.name, e3.target.name) == ('2', '0')
1818
assert g.is_adjacent(0, 1) is True
1919
assert g.is_adjacent(1, 2) is True
2020
assert g.is_adjacent(2, 0) is True

pydatastructs/utils/misc_util.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ class AdjacencyListGraphNode(GraphNode):
201201
in the graph. Must be unique.
202202
data
203203
The data to be stored at each graph node.
204-
adjacency_list: iterator
204+
adjacency_list: list
205205
Any valid iterator to initialize the adjacent
206206
nodes of the current node.
207207
Optional, by default, None
@@ -213,11 +213,11 @@ def __new__(cls, name, data=None, adjacency_list=None):
213213
if adjacency_list is not None:
214214
for node in adjacency_list:
215215
obj.__setattr__(node.name, node)
216-
obj.adjacent = set(adjacency_list) if adjacency_list is not None \
217-
else set()
216+
obj.adjacent = adjacency_list if adjacency_list is not None \
217+
else []
218218
return obj
219219

220-
def add_adjacent_node(self, name, data):
220+
def add_adjacent_node(self, name, data=None):
221221
"""
222222
Adds adjacent node to the current node's
223223
adjacency list with given name and data.
@@ -227,7 +227,7 @@ def add_adjacent_node(self, name, data):
227227
else:
228228
new_node = AdjacencyListGraphNode(name, data)
229229
self.__setattr__(new_node.name, new_node)
230-
self.adjacent.add(new_node.name)
230+
self.adjacent.append(new_node.name)
231231

232232
def remove_adjacent_node(self, name):
233233
"""
@@ -247,7 +247,7 @@ class AdjacencyMatrixGraphNode(GraphNode):
247247
Parameters
248248
==========
249249
250-
name: int
250+
name: str
251251
The index of the node in the AdjacencyMatrix.
252252
data
253253
The data to be stored at each graph node.
@@ -257,7 +257,7 @@ class AdjacencyMatrixGraphNode(GraphNode):
257257
def __new__(cls, name, data=None):
258258
obj = GraphNode.__new__(cls)
259259
obj.name, obj.data, obj.is_connected = \
260-
int(name), data, None
260+
str(name), data, None
261261
obj._impl = 'adjacency_matrix'
262262
return obj
263263

pydatastructs/utils/tests/test_misc_util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ def test_AdjacencyListGraphNode():
1818
assert str(g) == "('g', 0)"
1919

2020
def test_AdjacencyMatrixGraphNode():
21-
g = AdjacencyMatrixGraphNode(1, 3)
22-
assert str(g) == "(1, 3)"
21+
g = AdjacencyMatrixGraphNode("1", 3)
22+
assert str(g) == "('1', 3)"
2323

2424
def test_GraphEdge():
2525
g_1 = AdjacencyListGraphNode('g_1', 1)

0 commit comments

Comments
 (0)