bug : Bellman-Ford/DAG ignore negative costs despite documented support — base_graph filtering
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 65/100
Direzione di ricerca
The issue is in src/dijkstra/shortestPath_driver.cpp and include/cpp_common/base_graph.hpp. Start by examining the graph_add_edge function (lines 732-761) that filters negative costs. Look at the driver's insert_edges call (line 240, 268) and the Which enum in include/c_common/enums.h to identify the algorithm types. The fix requires adding a new insertion function that allows negatives and routing Bellman-Ford, EdwardMoore, and DAGSP through it. Run the provided SQL queries to verify the bug and test the fix.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
The documented negative-cost support for pgr_bellmanFord, pgr_edwardMoore, and pgr_dagShortestPath does not actually work.
doc/bellman_ford/pgr_bellmanFord.rst:42,47 states some edge weights may be negative and the process is valid for edges with both positive and negative weights. The algorithm wrappers (include/bellman_ford/bellman_ford.hpp:132 boost::bellman_ford_shortest_paths, include/bellman_ford/edwardMoore.hpp:180 queue relaxation, and include/dagShortestPath/dagShortestPath.hpp:131 boost::dag_shortest_paths) all handle negatives.
However, every call goes through src/dijkstra/shortestPath_driver.cpp:240,268 (digraph.insert_edges(edges)) → include/cpp_common/base_graph.hpp:732-761 (graph_add_edge), where edges are guarded with if(cost>=0) and if(reverse>=0). Negatives are dropped before the algorithms ever receive them. This matches the Dijkstra contract (doc/src/pgRouting-concepts.rst:85,108 and doc/dijkstra/dijkstra-family.rst:57-59), but directly contradicts the Bellman and DAG contracts. The sibling helper base_graph.hpp:815-850 (graph_add_neg_edge) converts negative costs via (-0.5) * cost with a TODO at line 816, so it cannot be reused as-is.
To Reproduce
-- Bellman: negative middle edge should be used
SELECT * FROM pgr_bellmanFord(
'SELECT * FROM (VALUES (1,1,2,5),(2,2,3,-4),(3,1,3,10)) AS t(id,source,target,cost)',
1, 3, true);
-- Expected Bellman: path 1->2->3, agg_cost = 1
-- Actual today: path 1->3, agg_cost = 10 (the -4 edge was filtered out)
-- Bellman: negative reverse_cost on undirected graph
SELECT * FROM pgr_bellmanFord(
'SELECT * FROM (VALUES (1,1,2,5,2),(2,2,3,10,-3)) AS t(id,source,target,cost,reverse_cost)',
1, 3, false);
-- Expected: reverse edge with negative cost is traversed; Actual today: ignored
-- DAG: negative on an acyclic graph should be used
SELECT * FROM pgr_dagShortestPath(
'SELECT * FROM (VALUES (1,1,2,-2),(2,2,3,1),(3,1,3,5)) AS t(id,source,target,cost)',
1, 3);
-- Expected: path 1->2->3, agg_cost = -1
-- Actual today: path 1->3, agg_cost = 5
-- Dijkstra on identical data should preserve current behavior (negative = edge does not exist)
SELECT * FROM pgr_dijkstra(
'SELECT * FROM (VALUES (1,1,2,5),(2,2,3,-4),(3,1,3,10)) AS t(id,source,target,cost)',
1, 3, true);
-- Expected & Actual: path 1->3, agg_cost = 10 (filtering preserved)
Expectation
pgr_bellmanFord/pgr_edwardMoore(directed and undirected) andpgr_dagShortestPath(directed) include both negativecostandreverse_costvalues in the graph so underlying solvers (boost::bellman_ford_shortest_paths,edwardMoore,dag_shortest_paths) can route through them.pgr_dijkstra,pgr_bdDijkstra,pgr_aStar, andpgr_bdAstarpreserve their current filter (cost < 0implies the edge does not exist).- No changes to public SQL signatures or empty-SQL query checks (
ERROR: Empty edges SQLatshortestPath_driver.cpp:145-148).
Sample Data
The inline VALUES queries above reproduce the issue directly. Alternatively, using the standard sample dataset:
INSERT INTO edges(id, source, target, cost) VALUES (-1, 1, 2, -4);
Platform/versions
SELECT version(); -- PostgreSQL 17.x (affects 13-18, logic is in the C++ graph layer)
SELECT postgis_full_version();
SELECT pgr_version(); -- 4.1.0-dev, develop @ 350b1e533
- OS: Ubuntu 24.04 (platform-independent C++ graph logic)
Proposed approach
Minimal two-file fix without changing SQL signatures:
- Add
insert_edges_allow_negative/graph_add_edge_allow_negativetoinclude/cpp_common/base_graph.hpp(a non-filtering variant that storescostandreverse_costas-is, unlikegraph_add_edgeat lines 732–761). - Route
BELLMANFORD,EDWARDMOORE, andDAGSPthrough this new insertion path insrc/dijkstra/shortestPath_driver.cpp:239-292by matching onWhich(include/c_common/enums.h:34-36), ensuring DAG applies only to directed calls. - Keep Dijkstra/BDD/A*/BFS/WITHPOINTS on the existing filtered path.
- Add pgTAP regression tests covering negative
costandreverse_costfor Bellman-Ford and DAG.
Happy to follow ur direction ! :)
- Lingua principale
- C++
- Stelle
- 1.4k
- Fork
- 397
- Merge medio
- 2g 2h
- PR unite (30g)
- 4
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pgRouting/pgrouting
-
Boost broken linksForse già presa @Nandan-Raichura-Dev l’ha presa 2 giorni fa. ApertaEnhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
pgRouting/pgrouting#3176 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Administrative Enhancement
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 80/100
I maintainer di solito rispondono entro 2 giorni
-
points_input Developers docForse già presa @withaman69 l’ha presa 87 giorni fa. ApertaC/C++ Developers Doc. good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
pgRouting/pgrouting#973 · 10 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
get_check_data developers docForse già presa @withaman69 l’ha presa 89 giorni fa. ApertaC/C++ Developers Doc. good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
pgRouting/pgrouting#972 · 7 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
pgRouting/pgrouting#3180 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di pgRouting/pgrouting
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
jellyfin/jellyfin-desktop#1290 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
nasa/fprime#6301 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
godotengine/godot#125035 ·
I maintainer di solito rispondono entro 1 giorno
-
agent:WSL bug LOW security
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
mgradwohl/tasksmack#3290 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
mw00/project-maya#743 ·
I maintainer di solito rispondono entro 1 giorno