From e198a50b9740497885a12fe64f49f35eefce219c Mon Sep 17 00:00:00 2001 From: Nagajaideep Date: Fri, 14 Feb 2025 20:47:42 +0530 Subject: [PATCH 1/5] added only implementation of A_STAR algorithem --- pydatastructs/graphs/algorithms.py | 66 +++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/pydatastructs/graphs/algorithms.py b/pydatastructs/graphs/algorithms.py index ea3322c02..2262da91b 100644 --- a/pydatastructs/graphs/algorithms.py +++ b/pydatastructs/graphs/algorithms.py @@ -700,12 +700,14 @@ def shortest_paths(graph: Graph, algorithm: str, 'bellman_ford' -> Bellman-Ford algorithm as given in [1]. 'dijkstra' -> Dijkstra algorithm as given in [2]. + + 'A_star' -> A* algorithm as given in [3]. source: str The name of the source the node. target: str The name of the target node. Optional, by default, all pair shortest paths - are returned. + are returned. Required for A* algorithm. backend: pydatastructs.Backend The backend to be used. Optional, by default, the best available @@ -736,12 +738,20 @@ def shortest_paths(graph: Graph, algorithm: str, ({'V1': 0, 'V2': 11, 'V3': 21}, {'V1': None, 'V2': 'V1', 'V3': 'V2'}) >>> shortest_paths(G, 'dijkstra', 'V1') ({'V2': 11, 'V3': 21, 'V1': 0}, {'V1': None, 'V2': 'V1', 'V3': 'V2'}) - + >>> start = AdjacencyListGraphNode("0,0") + >>> middle = AdjacencyListGraphNode("1,1") + >>> goal = AdjacencyListGraphNode("2,2") + >>> G2 = Graph(start, middle, goal) + >>> G2.add_edge('0,0', '1,1', 2) + >>> G2.add_edge('1,1', '2,2', 2) + >>> shortest_paths(G2, 'A_star', '0,0', '2,2') + (4, {'0,0': None, '1,1': '0,0', '2,2': '1,1'}) References ========== .. [1] https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm .. [2] https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm + .. [3] https://en.wikipedia.org/wiki/A*_search_algorithm """ raise_if_backend_is_not_python( shortest_paths, kwargs.get('backend', Backend.PYTHON)) @@ -811,6 +821,58 @@ def _dijkstra_adjacency_list(graph: Graph, start: str, target: str): _dijkstra_adjacency_matrix = _dijkstra_adjacency_list +def _a_star_adjacency_list(graph: Graph, source: str, target: str) -> tuple: + """ + A* pathfinding algorithm implementation similar to Dijkstra's structure. + + Parameters + ========== + graph: Graph + The graph to search through + source: str + Starting node name + target: str + Target node name + + Returns + ======= + (distance, predecessors): tuple + Distance to target and dictionary of predecessors + """ + def heuristic(node: str, goal: str) -> float: + """Manhattan distance heuristic for A*""" + x1, y1 = map(int, node.split(',')) + x2, y2 = map(int, goal.split(',')) + return abs(x1 - x2) + abs(y1 - y2) + visited = {v: False for v in graph.vertices} + dist = {v: float('inf') for v in graph.vertices} + pred = {v: None for v in graph.vertices} + dist[source] = 0 + # Priority queue using f-score (g_score + heuristic) + pq = PriorityQueue(implementation='binomial_heap') + pq.push(source, heuristic(source, target)) + while not pq.is_empty: + current = pq.pop() + if current == target: + return dist[target], pred + if visited[current]: + continue + visited[current] = True + for neighbor in graph.neighbors(current): + if visited[neighbor.name]: + continue + edge = graph.get_edge(current, neighbor.name) + if not edge: + continue + new_dist = dist[current] + edge.value + if new_dist < dist[neighbor.name]: + dist[neighbor.name] = new_dist + pred[neighbor.name] = current + f_score = new_dist + heuristic(neighbor.name, target) + pq.push(neighbor.name, f_score) + return float('inf'), pred +_a_star_adjacency_matrix = _a_star_adjacency_list + def all_pair_shortest_paths(graph: Graph, algorithm: str, **kwargs) -> tuple: """ From b9dcaef61680ab15cdc8e3e04b69718edf262f53 Mon Sep 17 00:00:00 2001 From: Nagajaideep Date: Sat, 15 Feb 2025 20:19:55 +0530 Subject: [PATCH 2/5] added algorithm.lower() to resolve the error --- pydatastructs/graphs/algorithms.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pydatastructs/graphs/algorithms.py b/pydatastructs/graphs/algorithms.py index 2262da91b..fee116d6c 100644 --- a/pydatastructs/graphs/algorithms.py +++ b/pydatastructs/graphs/algorithms.py @@ -744,7 +744,7 @@ def shortest_paths(graph: Graph, algorithm: str, >>> G2 = Graph(start, middle, goal) >>> G2.add_edge('0,0', '1,1', 2) >>> G2.add_edge('1,1', '2,2', 2) - >>> shortest_paths(G2, 'A_star', '0,0', '2,2') + >>> shortest_paths(G2, 'a_star', '0,0', '2,2') (4, {'0,0': None, '1,1': '0,0', '2,2': '1,1'}) References ========== @@ -756,7 +756,7 @@ def shortest_paths(graph: Graph, algorithm: str, raise_if_backend_is_not_python( shortest_paths, kwargs.get('backend', Backend.PYTHON)) import pydatastructs.graphs.algorithms as algorithms - func = "_" + algorithm + "_" + graph._impl + func = "_" + algorithm.lower() + "_" + graph._impl if not hasattr(algorithms, func): raise NotImplementedError( "Currently %s algorithm isn't implemented for " @@ -824,7 +824,6 @@ def _dijkstra_adjacency_list(graph: Graph, start: str, target: str): def _a_star_adjacency_list(graph: Graph, source: str, target: str) -> tuple: """ A* pathfinding algorithm implementation similar to Dijkstra's structure. - Parameters ========== graph: Graph @@ -833,7 +832,6 @@ def _a_star_adjacency_list(graph: Graph, source: str, target: str) -> tuple: Starting node name target: str Target node name - Returns ======= (distance, predecessors): tuple From 280dd6208a1292b0df42a45ff7dbfab0586df137 Mon Sep 17 00:00:00 2001 From: Nagajaideep Date: Sun, 16 Feb 2025 07:44:56 +0530 Subject: [PATCH 3/5] added print statements at necessary positions for testing the errors --- pydatastructs/graphs/algorithms.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/pydatastructs/graphs/algorithms.py b/pydatastructs/graphs/algorithms.py index fee116d6c..9c60ee531 100644 --- a/pydatastructs/graphs/algorithms.py +++ b/pydatastructs/graphs/algorithms.py @@ -839,9 +839,14 @@ def _a_star_adjacency_list(graph: Graph, source: str, target: str) -> tuple: """ def heuristic(node: str, goal: str) -> float: """Manhattan distance heuristic for A*""" - x1, y1 = map(int, node.split(',')) - x2, y2 = map(int, goal.split(',')) - return abs(x1 - x2) + abs(y1 - y2) + try: + x1, y1 = map(int, node.split(',')) + x2, y2 = map(int, goal.split(',')) + return abs(x1 - x2) + abs(y1 - y2) + except ValueError: + raise ValueError(f"Invalid node format: {node}. Expected 'x,y'.") + if source not in graph.vertices or target not in graph.vertices: + raise KeyError(f"Either source '{source}' or target '{target}' is not in the graph.") visited = {v: False for v in graph.vertices} dist = {v: float('inf') for v in graph.vertices} pred = {v: None for v in graph.vertices} @@ -849,14 +854,18 @@ def heuristic(node: str, goal: str) -> float: # Priority queue using f-score (g_score + heuristic) pq = PriorityQueue(implementation='binomial_heap') pq.push(source, heuristic(source, target)) - while not pq.is_empty: + while not pq.is_empty(): current = pq.pop() if current == target: + print(f"Returning: {dist[target]}, {pred}") return dist[target], pred if visited[current]: continue visited[current] = True - for neighbor in graph.neighbors(current): + neighbors = graph.neighbors(current) + if not neighbors: + continue + for neighbor in neighbors: if visited[neighbor.name]: continue edge = graph.get_edge(current, neighbor.name) @@ -868,6 +877,7 @@ def heuristic(node: str, goal: str) -> float: pred[neighbor.name] = current f_score = new_dist + heuristic(neighbor.name, target) pq.push(neighbor.name, f_score) + print(f"Returning: {float('inf')}, {pred}") return float('inf'), pred _a_star_adjacency_matrix = _a_star_adjacency_list From 6a40f5cb8bd75f27be650aa9f96a705719b4e78e Mon Sep 17 00:00:00 2001 From: Nagajaideep Date: Sun, 23 Feb 2025 15:05:06 +0530 Subject: [PATCH 4/5] changed the implementation for Astar --- pydatastructs/graphs/algorithms.py | 18 ++++++++---------- .../cpp/_algorithms.cp312-win_amd64.pyd | Bin 0 -> 37888 bytes .../_backend/cpp/_arrays.cp312-win_amd64.pyd | Bin 0 -> 28160 bytes .../_backend/cpp/_stack.cp312-win_amd64.pyd | Bin 0 -> 28672 bytes .../_backend/cpp/_trees.cp312-win_amd64.pyd | Bin 0 -> 90624 bytes .../_backend/cpp/_nodes.cp312-win_amd64.pyd | Bin 0 -> 12800 bytes 6 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 pydatastructs/linear_data_structures/_backend/cpp/_algorithms.cp312-win_amd64.pyd create mode 100644 pydatastructs/linear_data_structures/_backend/cpp/_arrays.cp312-win_amd64.pyd create mode 100644 pydatastructs/miscellaneous_data_structures/_backend/cpp/_stack.cp312-win_amd64.pyd create mode 100644 pydatastructs/trees/_backend/cpp/_trees.cp312-win_amd64.pyd create mode 100644 pydatastructs/utils/_backend/cpp/_nodes.cp312-win_amd64.pyd diff --git a/pydatastructs/graphs/algorithms.py b/pydatastructs/graphs/algorithms.py index 9c60ee531..eecd34bc4 100644 --- a/pydatastructs/graphs/algorithms.py +++ b/pydatastructs/graphs/algorithms.py @@ -23,7 +23,7 @@ 'all_pair_shortest_paths', 'topological_sort', 'topological_sort_parallel', - 'max_flow' + 'max_flow', ] Stack = Queue = deque @@ -851,20 +851,20 @@ def heuristic(node: str, goal: str) -> float: dist = {v: float('inf') for v in graph.vertices} pred = {v: None for v in graph.vertices} dist[source] = 0 - # Priority queue using f-score (g_score + heuristic) - pq = PriorityQueue(implementation='binomial_heap') - pq.push(source, heuristic(source, target)) - while not pq.is_empty(): + from pydatastructs.miscellaneous_data_structures.queue import PriorityQueue, BinomialHeapPriorityQueue + pq = PriorityQueue(implementation='binomial_heap') + f_score = heuristic(source, target) + pq.push(source, f_score) + while not pq.is_empty: current = pq.pop() if current == target: - print(f"Returning: {dist[target]}, {pred}") return dist[target], pred if visited[current]: continue - visited[current] = True + visited[current] = True neighbors = graph.neighbors(current) if not neighbors: - continue + continue for neighbor in neighbors: if visited[neighbor.name]: continue @@ -877,10 +877,8 @@ def heuristic(node: str, goal: str) -> float: pred[neighbor.name] = current f_score = new_dist + heuristic(neighbor.name, target) pq.push(neighbor.name, f_score) - print(f"Returning: {float('inf')}, {pred}") return float('inf'), pred _a_star_adjacency_matrix = _a_star_adjacency_list - def all_pair_shortest_paths(graph: Graph, algorithm: str, **kwargs) -> tuple: """ diff --git a/pydatastructs/linear_data_structures/_backend/cpp/_algorithms.cp312-win_amd64.pyd b/pydatastructs/linear_data_structures/_backend/cpp/_algorithms.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c66d0431b1f008c204176df64bd56e0fe31fb62b GIT binary patch literal 37888 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 NklWCN$KTNP{{Yf5x848% literal 0 HcmV?d00001 diff --git a/pydatastructs/miscellaneous_data_structures/_backend/cpp/_stack.cp312-win_amd64.pyd b/pydatastructs/miscellaneous_data_structures/_backend/cpp/_stack.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..892a45886a1431fffaee2ab78252b9077da65c5f GIT binary patch literal 28672 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 K?$s~d`2PcPVXwdd literal 0 HcmV?d00001 diff --git a/pydatastructs/trees/_backend/cpp/_trees.cp312-win_amd64.pyd b/pydatastructs/trees/_backend/cpp/_trees.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..9aa2aa29342f384ccf199dbd6c628ec04ac80bea GIT binary patch literal 90624 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 literal 0 HcmV?d00001 diff --git a/pydatastructs/utils/_backend/cpp/_nodes.cp312-win_amd64.pyd b/pydatastructs/utils/_backend/cpp/_nodes.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..053b9e88a9c20da9c01e39a0823c57dc5a560dfc GIT binary patch literal 12800 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 Q{KKuV^S+Mw-_+p$7j- Date: Fri, 28 Feb 2025 00:20:35 +0530 Subject: [PATCH 5/5] changed the addressed errors and fixed the main error --- pydatastructs/graphs/algorithms.py | 22 +++++---- pydatastructs/graphs/tests/test_algorithms.py | 46 ++++++++++++++++++- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/pydatastructs/graphs/algorithms.py b/pydatastructs/graphs/algorithms.py index eecd34bc4..fd5249477 100644 --- a/pydatastructs/graphs/algorithms.py +++ b/pydatastructs/graphs/algorithms.py @@ -744,8 +744,11 @@ def shortest_paths(graph: Graph, algorithm: str, >>> G2 = Graph(start, middle, goal) >>> G2.add_edge('0,0', '1,1', 2) >>> G2.add_edge('1,1', '2,2', 2) - >>> shortest_paths(G2, 'a_star', '0,0', '2,2') - (4, {'0,0': None, '1,1': '0,0', '2,2': '1,1'}) + >>> dist, pred = shortest_paths(G2, 'a_star', '0,0', '2,2') + >>> dist + 4 + >>> pred == {'0,0': None, '1,1': '0,0', '2,2': '1,1'} + True References ========== @@ -852,19 +855,20 @@ def heuristic(node: str, goal: str) -> float: pred = {v: None for v in graph.vertices} dist[source] = 0 from pydatastructs.miscellaneous_data_structures.queue import PriorityQueue, BinomialHeapPriorityQueue - pq = PriorityQueue(implementation='binomial_heap') + pq = PriorityQueue(implementation='binomial_heap') f_score = heuristic(source, target) pq.push(source, f_score) - while not pq.is_empty: + while not pq.is_empty: current = pq.pop() if current == target: - return dist[target], pred + result = (dist[target], dict(sorted(pred.items()))) + return result if visited[current]: continue - visited[current] = True + visited[current] = True neighbors = graph.neighbors(current) if not neighbors: - continue + continue for neighbor in neighbors: if visited[neighbor.name]: continue @@ -877,7 +881,9 @@ def heuristic(node: str, goal: str) -> float: pred[neighbor.name] = current f_score = new_dist + heuristic(neighbor.name, target) pq.push(neighbor.name, f_score) - return float('inf'), pred + if dist[target] == float('inf'): + raise ValueError(f"Either source '{source}' and target '{target}' have no path between them.") + return float('inf'), dict(sorted(pred.items())) _a_star_adjacency_matrix = _a_star_adjacency_list def all_pair_shortest_paths(graph: Graph, algorithm: str, **kwargs) -> tuple: diff --git a/pydatastructs/graphs/tests/test_algorithms.py b/pydatastructs/graphs/tests/test_algorithms.py index fde3571da..a8b15e9da 100644 --- a/pydatastructs/graphs/tests/test_algorithms.py +++ b/pydatastructs/graphs/tests/test_algorithms.py @@ -1,3 +1,4 @@ +import pytest from pydatastructs import (breadth_first_search, Graph, breadth_first_search_parallel, minimum_spanning_tree, minimum_spanning_tree_parallel, strongly_connected_components, @@ -314,13 +315,56 @@ def _test_shortest_paths_negative_edges(ds, algorithm): dist, pred = shortest_paths(graph, algorithm, 's', 'd') assert dist == 2 assert pred == {'s': None, 'a': 'b', 'b': 's', 'c': 'a', 'd': 'c'} - + def _test_a_star_manhattan(ds): + import pydatastructs.utils.misc_util as utils + GraphNode = getattr(utils, "Adjacency" + ds + "GraphNode") + vertices = [ + GraphNode("0,0"), + GraphNode("1,1"), + GraphNode("2,2") + ] + graph = Graph(*vertices) + graph.add_edge("0,0", "1,1", 2) + graph.add_edge("1,1", "2,2", 2) + distance, pred = shortest_paths(graph, 'a_star', "0,0", "2,2") + assert distance == 4 + assert pred == {'0,0': None, '1,1': '0,0', '2,2': '1,1'} + no_path_graph = Graph( + GraphNode("0,0"), + GraphNode("1,1"), + GraphNode("2,2") + ) + with pytest.raises(ValueError, match="Either source '0,0' and target '2,2' have no path between them."): + shortest_paths(no_path_graph, 'a_star', "0,0", "2,2") + same_node_graph = Graph(GraphNode("1,1")) + distance, pred = shortest_paths(same_node_graph, 'a_star', "1,1", "1,1") + assert distance == 0 + assert pred == {'1,1': None} + invalid_graph = Graph(GraphNode("invalid")) + with pytest.raises(ValueError, match="Invalid node format: invalid. Expected 'x,y'."): + shortest_paths(invalid_graph, 'a_star', "invalid", "invalid") + complex_vertices = [ + GraphNode("0,0"), + GraphNode("0,1"), + GraphNode("1,0"), + GraphNode("1,1") + ] + complex_graph = Graph(*complex_vertices) + complex_graph.add_edge("0,0", "0,1", 1) + complex_graph.add_edge("0,1", "1,1", 1) + complex_graph.add_edge("0,0", "1,0", 2) + complex_graph.add_edge("1,0", "1,1", 1) + distance, pred = shortest_paths(complex_graph, 'a_star', "0,0", "1,1") + assert distance == 2 + assert pred == {'0,0': None, '0,1': '0,0', '1,1': '0,1', '1,0': '0,0'} _test_shortest_paths_positive_edges("List", 'bellman_ford') _test_shortest_paths_positive_edges("Matrix", 'bellman_ford') _test_shortest_paths_negative_edges("List", 'bellman_ford') _test_shortest_paths_negative_edges("Matrix", 'bellman_ford') _test_shortest_paths_positive_edges("List", 'dijkstra') _test_shortest_paths_positive_edges("Matrix", 'dijkstra') + _test_a_star_manhattan("List") + _test_a_star_manhattan("Matrix") def test_all_pair_shortest_paths():