use of com.graphhopper.storage.GraphBuilder in project graphhopper by graphhopper.
the class EdgeBasedTarjanSCCTest method tree.
@Test
public void tree() {
GraphHopperStorage g = new GraphBuilder(em).create();
// 0 - 1 - 2 - 4 - 5
// | \- 6 - 7
// 3 \- 8
GHUtility.setSpeed(60, true, true, encoder, g.edge(0, 1).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(1, 2).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(1, 3).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(2, 4).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(2, 6).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(4, 5).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(6, 7).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(6, 8).setDistance(1));
ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
assertEquals(16, result.getEdgeKeys());
assertEquals(1, result.getTotalComponents());
assertEquals(1, result.getComponents().size());
assertTrue(result.getSingleEdgeComponents().isEmpty());
assertEquals(result.getComponents().get(0), result.getBiggestComponent());
assertEquals(IntArrayList.from(1, 3, 7, 11, 10, 6, 9, 13, 12, 15, 14, 8, 2, 5, 4, 0), result.getComponents().get(0));
}
use of com.graphhopper.storage.GraphBuilder in project graphhopper by graphhopper.
the class EdgeBasedTarjanSCCTest method withTurnRestriction.
@Test
public void withTurnRestriction() {
GraphHopperStorage g = new GraphBuilder(em).create();
// here 0-1-2-3 would be a circle and thus belong to same connected component. but if there is a
// turn restriction for going 0->2->3 this splits the graph into multiple components
// 0->1
// | |
// 3<-2->4
// edge-keys 0,1
GHUtility.setSpeed(60, true, false, encoder, g.edge(0, 1).setDistance(1));
// edge-keys 2,3
GHUtility.setSpeed(60, true, false, encoder, g.edge(1, 2).setDistance(1));
// edge-keys 4,5
GHUtility.setSpeed(60, true, false, encoder, g.edge(2, 3).setDistance(1));
// edge-keys 6,7
GHUtility.setSpeed(60, true, false, encoder, g.edge(3, 0).setDistance(1));
// edge-keys 8,9
GHUtility.setSpeed(60, true, false, encoder, g.edge(2, 4).setDistance(1));
// first lets check what happens without turn costs
ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
assertEquals(7, result.getTotalComponents());
assertEquals(1, result.getComponents().size());
assertEquals(IntArrayList.from(6, 4, 2, 0), result.getBiggestComponent());
assertEquals(6, result.getSingleEdgeComponents().cardinality());
for (IntCursor c : IntArrayList.from(1, 3, 5, 7, 8, 9)) {
assertTrue(result.getSingleEdgeComponents().get(c.value));
}
// now lets try with a restricted turn
result = EdgeBasedTarjanSCC.findComponentsRecursive(g, (prev, edge) -> fwdAccessFilter.accept(prev, edge) && !(prev == 1 && edge.getBaseNode() == 2 && edge.getEdge() == 2), false);
// none of the edges are strongly connected anymore!
assertEquals(10, result.getTotalComponents());
assertEquals(0, result.getComponents().size());
assertEquals(IntArrayList.from(), result.getBiggestComponent());
assertEquals(10, result.getSingleEdgeComponents().cardinality());
for (IntCursor c : IntArrayList.from(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) {
assertTrue(result.getSingleEdgeComponents().get(c.value));
}
}
use of com.graphhopper.storage.GraphBuilder in project graphhopper by graphhopper.
the class EdgeBasedTarjanSCCTest method linearSimple.
@Test
public void linearSimple() {
GraphHopperStorage g = new GraphBuilder(em).create();
// 0 - 1 - 2
GHUtility.setSpeed(60, true, true, encoder, g.edge(0, 1).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(1, 2).setDistance(1));
ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
assertEquals(4, result.getEdgeKeys());
assertEquals(1, result.getTotalComponents());
assertEquals(1, result.getComponents().size());
assertTrue(result.getSingleEdgeComponents().isEmpty());
assertEquals(result.getComponents().get(0), result.getBiggestComponent());
assertEquals(IntArrayList.from(1, 3, 2, 0), result.getComponents().get(0));
}
use of com.graphhopper.storage.GraphBuilder in project graphhopper by graphhopper.
the class EdgeBasedTarjanSCCTest method linearSingle.
@Test
public void linearSingle() {
GraphHopperStorage g = new GraphBuilder(em).create();
// 0 - 1
GHUtility.setSpeed(60, true, true, encoder, g.edge(0, 1).setDistance(1));
ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
assertEquals(2, result.getEdgeKeys());
assertEquals(1, result.getTotalComponents());
assertEquals(1, result.getComponents().size());
assertTrue(result.getSingleEdgeComponents().isEmpty());
assertEquals(result.getComponents().get(0), result.getBiggestComponent());
assertEquals(IntArrayList.from(1, 0), result.getComponents().get(0));
}
use of com.graphhopper.storage.GraphBuilder in project graphhopper by graphhopper.
the class EdgeBasedTarjanSCCTest method linearBidirectionalEdge.
@Test
public void linearBidirectionalEdge() {
GraphHopperStorage g = new GraphBuilder(em).create();
// 0 -> 1 - 2 <- 3
GHUtility.setSpeed(60, true, false, encoder, g.edge(0, 1).setDistance(1));
GHUtility.setSpeed(60, true, true, encoder, g.edge(1, 2).setDistance(1));
GHUtility.setSpeed(60, true, false, encoder, g.edge(3, 2).setDistance(1));
ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
assertEquals(6, result.getEdgeKeys());
assertEquals(5, result.getTotalComponents());
// a single bidirectional edge is treated as a 'real' component with two edge-keys. this is not nearly as
// common as the single-edge-key components so no real need to do a special treatment for these as well.
assertEquals(1, result.getComponents().size());
assertEquals(4, result.getSingleEdgeComponents().cardinality());
assertEquals(result.getComponents().get(0), result.getBiggestComponent());
}
Aggregations