#18931: Boost shortest paths
-------------------------------------+-------------------------------------
Reporter: borassi | Owner:
Type: enhancement | Status: needs_work
Priority: major | Milestone: sage-6.9
Component: graph theory | Resolution:
Keywords: Boost, shortest | Merged in:
paths, Bellman-Ford, Johnson | Reviewers:
Authors: Michele Borassi | Work issues:
Report Upstream: N/A | Commit:
Branch: | 4897c8e27daa7c7939827524bec312ff8f39b3b7
u/borassi/boost_shortest_paths | Stopgaps:
Dependencies: #18910, #18938 |
-------------------------------------+-------------------------------------
Changes (by dcoudert):
* status: needs_review => needs_work
* milestone: sage-6.8 => sage-6.9
Comment:
Hello,
the output of the method is correct and already faster than networkx on
small graphs. Excellent!
{{{
sage: G = graphs.PetersenGraph()
sage: for u,v,_ in G.edges():
G.set_edge_label(u,v,1)
....:
sage: G.weighted(True)
sage: G.add_vertex(10)
sage: G.shortest_paths(0, by_weight=True, algorithm='Dijkstra_Boost',
check_weight=False)
{0: [0],
1: [0, 1],
2: [0, 1, 2],
3: [0, 4, 3],
4: [0, 4],
5: [0, 5],
6: [0, 1, 6],
7: [0, 5, 7],
8: [0, 5, 8],
9: [0, 4, 9]}
sage: %timeit G.shortest_paths(0, by_weight=True,
algorithm='Dijkstra_Boost', check_weight=False)
10000 loops, best of 3: 74 µs per loop
sage: %timeit G.shortest_paths(0, by_weight=True,
algorithm='Dijkstra_NetworkX', check_weight=False)
The slowest run took 1387.62 times longer than the fastest. This could
mean that an intermediate result is being cached
1 loops, best of 3: 146 µs per loop
sage: %timeit G.shortest_paths(0, by_weight=True,
algorithm='Dijkstra_NetworkX', check_weight=False)
10000 loops, best of 3: 86.7 µs per loop
}}}
do you also plan to add `G.shortest_path()` ?
For all pairs shortest paths:
- we don't have predecessors with `Johnson_Boost`
- distance to unreacheable vertices should be set to +Infinity to be
consistent with other methods.
{{{
sage: dist,pred = G.shortest_path_all_pairs(by_weight=True,
algorithm='Johnson_Boost')
sage: print dist
{0: {0: 0, 1: 1, 2: 2, 3: 2, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2, 9: 2}, 1: {0:
1, 1: 0, 2: 1, 3: 2, 4: 2, 5: 2, 6: 1, 7: 2, 8: 2, 9: 2}, 2: {0: 2, 1: 1,
2: 0, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1, 8: 2, 9: 2}, 3: {0: 2, 1: 2, 2: 1, 3:
0, 4: 1, 5: 2, 6: 2, 7: 2, 8: 1, 9: 2}, 4: {0: 1, 1: 2, 2: 2, 3: 1, 4: 0,
5: 2, 6: 2, 7: 2, 8: 2, 9: 1}, 5: {0: 1, 1: 2, 2: 2, 3: 2, 4: 2, 5: 0, 6:
2, 7: 1, 8: 1, 9: 2}, 6: {0: 2, 1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 0, 7: 2,
8: 1, 9: 1}, 7: {0: 2, 1: 2, 2: 1, 3: 2, 4: 2, 5: 1, 6: 2, 7: 0, 8: 2, 9:
1}, 8: {0: 2, 1: 2, 2: 2, 3: 1, 4: 2, 5: 1, 6: 1, 7: 2, 8: 0, 9: 2}, 9:
{0: 2, 1: 2, 2: 2, 3: 2, 4: 1, 5: 2, 6: 1, 7: 1, 8: 2, 9: 0}, 10: {10: 0}}
sage: print pred
None
sage: dist,pred = G.shortest_path_all_pairs(by_weight=True, algorithm
='Floyd-Warshall-Python')
sage: print dist
{0: {0: 0, 1: 1, 2: 2, 3: 2, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2, 9: 2, 10:
+Infinity}, 1: {0: 1, 1: 0, 2: 1, 3: 2, 4: 2, 5: 2, 6: 1, 7: 2, 8: 2, 9:
2, 10: +Infinity}, 2: {0: 2, 1: 1, 2: 0, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1, 8:
2, 9: 2, 10: +Infinity}, 3: {0: 2, 1: 2, 2: 1, 3: 0, 4: 1, 5: 2, 6: 2, 7:
2, 8: 1, 9: 2, 10: +Infinity}, 4: {0: 1, 1: 2, 2: 2, 3: 1, 4: 0, 5: 2, 6:
2, 7: 2, 8: 2, 9: 1, 10: +Infinity}, 5: {0: 1, 1: 2, 2: 2, 3: 2, 4: 2, 5:
0, 6: 2, 7: 1, 8: 1, 9: 2, 10: +Infinity}, 6: {0: 2, 1: 1, 2: 2, 3: 2, 4:
2, 5: 2, 6: 0, 7: 2, 8: 1, 9: 1, 10: +Infinity}, 7: {0: 2, 1: 2, 2: 1, 3:
2, 4: 2, 5: 1, 6: 2, 7: 0, 8: 2, 9: 1, 10: +Infinity}, 8: {0: 2, 1: 2, 2:
2, 3: 1, 4: 2, 5: 1, 6: 1, 7: 2, 8: 0, 9: 2, 10: +Infinity}, 9: {0: 2, 1:
2, 2: 2, 3: 2, 4: 1, 5: 2, 6: 1, 7: 1, 8: 2, 9: 0, 10: +Infinity}, 10: {0:
+Infinity, 1: +Infinity, 2: +Infinity, 3: +Infinity, 4: +Infinity, 5:
+Infinity, 6: +Infinity, 7: +Infinity, 8: +Infinity, 9: +Infinity, 10: 0}}
sage: print pred
{0: {0: None, 1: 0, 2: 1, 3: 4, 4: 0, 5: 0, 6: 1, 7: 5, 8: 5, 9: 4, 10:
None}, 1: {0: 1, 1: None, 2: 1, 3: 2, 4: 0, 5: 0, 6: 1, 7: 2, 8: 6, 9: 6,
10: None}, 2: {0: 1, 1: 2, 2: None, 3: 2, 4: 3, 5: 7, 6: 1, 7: 2, 8: 3, 9:
7, 10: None}, 3: {0: 4, 1: 2, 2: 3, 3: None, 4: 3, 5: 8, 6: 8, 7: 2, 8: 3,
9: 4, 10: None}, 4: {0: 4, 1: 0, 2: 3, 3: 4, 4: None, 5: 0, 6: 9, 7: 9, 8:
3, 9: 4, 10: None}, 5: {0: 5, 1: 0, 2: 7, 3: 8, 4: 0, 5: None, 6: 8, 7: 5,
8: 5, 9: 7, 10: None}, 6: {0: 1, 1: 6, 2: 1, 3: 8, 4: 9, 5: 8, 6: None, 7:
9, 8: 6, 9: 6, 10: None}, 7: {0: 5, 1: 2, 2: 7, 3: 2, 4: 9, 5: 7, 6: 9, 7:
None, 8: 5, 9: 7, 10: None}, 8: {0: 5, 1: 6, 2: 3, 3: 8, 4: 3, 5: 8, 6: 8,
7: 5, 8: None, 9: 6, 10: None}, 9: {0: 4, 1: 6, 2: 7, 3: 4, 4: 9, 5: 7, 6:
9, 7: 9, 8: 6, 9: None, 10: None}, 10: {0: None, 1: None, 2: None, 3:
None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 10: None}}
sage: dist,pred = G.shortest_path_all_pairs()
sage: print dist
{0: {0: 0, 1: 1, 2: 2, 3: 2, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2, 9: 2, 10:
+Infinity}, 1: {0: 1, 1: 0, 2: 1, 3: 2, 4: 2, 5: 2, 6: 1, 7: 2, 8: 2, 9:
2, 10: +Infinity}, 2: {0: 2, 1: 1, 2: 0, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1, 8:
2, 9: 2, 10: +Infinity}, 3: {0: 2, 1: 2, 2: 1, 3: 0, 4: 1, 5: 2, 6: 2, 7:
2, 8: 1, 9: 2, 10: +Infinity}, 4: {0: 1, 1: 2, 2: 2, 3: 1, 4: 0, 5: 2, 6:
2, 7: 2, 8: 2, 9: 1, 10: +Infinity}, 5: {0: 1, 1: 2, 2: 2, 3: 2, 4: 2, 5:
0, 6: 2, 7: 1, 8: 1, 9: 2, 10: +Infinity}, 6: {0: 2, 1: 1, 2: 2, 3: 2, 4:
2, 5: 2, 6: 0, 7: 2, 8: 1, 9: 1, 10: +Infinity}, 7: {0: 2, 1: 2, 2: 1, 3:
2, 4: 2, 5: 1, 6: 2, 7: 0, 8: 2, 9: 1, 10: +Infinity}, 8: {0: 2, 1: 2, 2:
2, 3: 1, 4: 2, 5: 1, 6: 1, 7: 2, 8: 0, 9: 2, 10: +Infinity}, 9: {0: 2, 1:
2, 2: 2, 3: 2, 4: 1, 5: 2, 6: 1, 7: 1, 8: 2, 9: 0, 10: +Infinity}, 10: {0:
+Infinity, 1: +Infinity, 2: +Infinity, 3: +Infinity, 4: +Infinity, 5:
+Infinity, 6: +Infinity, 7: +Infinity, 8: +Infinity, 9: +Infinity, 10: 0}}
sage: print pred
{0: {0: None, 1: 0, 2: 1, 3: 4, 4: 0, 5: 0, 6: 1, 7: 5, 8: 5, 9: 4, 10:
None}, 1: {0: 1, 1: None, 2: 1, 3: 2, 4: 0, 5: 0, 6: 1, 7: 2, 8: 6, 9: 6,
10: None}, 2: {0: 1, 1: 2, 2: None, 3: 2, 4: 3, 5: 7, 6: 1, 7: 2, 8: 3, 9:
7, 10: None}, 3: {0: 4, 1: 2, 2: 3, 3: None, 4: 3, 5: 8, 6: 8, 7: 2, 8: 3,
9: 4, 10: None}, 4: {0: 4, 1: 0, 2: 3, 3: 4, 4: None, 5: 0, 6: 9, 7: 9, 8:
3, 9: 4, 10: None}, 5: {0: 5, 1: 0, 2: 7, 3: 8, 4: 0, 5: None, 6: 8, 7: 5,
8: 5, 9: 7, 10: None}, 6: {0: 1, 1: 6, 2: 1, 3: 8, 4: 9, 5: 8, 6: None, 7:
9, 8: 6, 9: 6, 10: None}, 7: {0: 5, 1: 2, 2: 7, 3: 2, 4: 9, 5: 7, 6: 9, 7:
None, 8: 5, 9: 7, 10: None}, 8: {0: 5, 1: 6, 2: 3, 3: 8, 4: 3, 5: 8, 6: 8,
7: 5, 8: None, 9: 6, 10: None}, 9: {0: 4, 1: 6, 2: 7, 3: 4, 4: 9, 5: 7, 6:
9, 7: 9, 8: 6, 9: None, 10: None}, 10: {0: None, 1: None, 2: None, 3:
None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 10: None}}
}}}
Best,
David.
--
Ticket URL: <http://trac.sagemath.org/ticket/18931#comment:5>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.