use of com.graphhopper.routing.querygraph.QueryRoutingCHGraph in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method getWeight.
@Test
public void getWeight() {
// /---\
// 0-x-1-2
// 3
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge = addEdge(graph, 0, 1).set(encoder.getAverageSpeedEnc(), 90, 30);
addEdge(graph, 1, 2);
graph.freeze();
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScDirMask(), 20, 0, 1, 0, 1);
// without query graph
RoutingCHEdgeIterator iter = routingCHGraph.createOutEdgeExplorer().setBaseNode(0);
assertNextShortcut(iter, 0, 2, 0, 1);
assertEquals(20, iter.getWeight(false), 1.e-6);
assertEquals(20, iter.getWeight(true), 1.e-6);
assertNextEdge(iter, 0, 1, 0);
assertEquals(285.89888, iter.getWeight(false), 1.e-6);
assertEquals(857.69664, iter.getWeight(true), 1.e-6);
assertEnd(iter);
// for incoming edges its the same
iter = routingCHGraph.createInEdgeExplorer().setBaseNode(0);
assertNextShortcut(iter, 0, 2, 0, 1);
assertEquals(20, iter.getWeight(false), 1.e-6);
assertEquals(20, iter.getWeight(true), 1.e-6);
assertNextEdge(iter, 0, 1, 0);
assertEquals(285.89888, iter.getWeight(false), 1.e-6);
assertEquals(857.69664, iter.getWeight(true), 1.e-6);
assertEnd(iter);
// now including virtual edges
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
iter = queryCHGraph.createOutEdgeExplorer().setBaseNode(0);
assertNextEdge(iter, 0, 3, 2);
// should be about half the weight as for the original edge as the query point is in the middle of the edge
assertEquals(142.9494, iter.getWeight(false), 1.e-4);
assertEquals(428.8483, iter.getWeight(true), 1.e-4);
assertNextShortcut(iter, 0, 2, 0, 1);
assertEquals(20, iter.getWeight(false), 1.e-6);
assertEquals(20, iter.getWeight(true), 1.e-6);
assertEnd(iter);
iter = queryCHGraph.createInEdgeExplorer().setBaseNode(0);
assertNextEdge(iter, 0, 3, 2);
assertEquals(142.9494, iter.getWeight(false), 1.e-4);
assertEquals(428.8483, iter.getWeight(true), 1.e-4);
assertNextShortcut(iter, 0, 2, 0, 1);
assertEquals(20, iter.getWeight(false), 1.e-6);
assertEquals(20, iter.getWeight(true), 1.e-6);
assertEnd(iter);
// at the virtual node
iter = queryCHGraph.createOutEdgeExplorer().setBaseNode(3);
assertNextEdge(iter, 3, 0, 2);
assertEquals(428.8483, iter.getWeight(false), 1.e-4);
assertEquals(142.9494, iter.getWeight(true), 1.e-4);
assertNextEdge(iter, 3, 1, 3);
assertEquals(142.9494, iter.getWeight(false), 1.e-4);
assertEquals(428.8483, iter.getWeight(true), 1.e-4);
assertEnd(iter);
iter = queryCHGraph.createInEdgeExplorer().setBaseNode(3);
assertNextEdge(iter, 3, 0, 2);
assertEquals(428.8483, iter.getWeight(false), 1.e-4);
assertEquals(142.9494, iter.getWeight(true), 1.e-4);
assertNextEdge(iter, 3, 1, 3);
assertEquals(142.9494, iter.getWeight(false), 1.e-4);
assertEquals(428.8483, iter.getWeight(true), 1.e-4);
assertEnd(iter);
// getting a single edge
RoutingCHEdgeIteratorState edgeState = queryCHGraph.getEdgeIteratorState(3, 3);
assertEdgeState(edgeState, 0, 3, 2);
assertEquals(142.9494, edgeState.getWeight(false), 1.e-4);
assertEquals(428.8483, edgeState.getWeight(true), 1.e-4);
edgeState = queryCHGraph.getEdgeIteratorState(3, 0);
assertEdgeState(edgeState, 3, 0, 2);
assertEquals(428.8483, edgeState.getWeight(false), 1.e-4);
assertEquals(142.9494, edgeState.getWeight(true), 1.e-4);
}
use of com.graphhopper.routing.querygraph.QueryRoutingCHGraph in project graphhopper by graphhopper.
the class MiniGraphUI method createAlgo.
private RoutingAlgorithm createAlgo(GraphHopper hopper) {
Profile profile = hopper.getProfiles().iterator().next();
if (useCH) {
RoutingCHGraph chGraph = hopper.getCHGraphs().get(profile.getName());
logger.info("CH algo, profile: " + profile.getName());
QueryGraph qGraph = QueryGraph.create(hopper.getGraphHopperStorage(), fromRes, toRes);
QueryRoutingCHGraph queryRoutingCHGraph = new QueryRoutingCHGraph(chGraph, qGraph);
return new CHDebugAlgo(queryRoutingCHGraph, mg);
} else {
LandmarkStorage landmarks = hopper.getLandmarks().get(profile.getName());
RoutingAlgorithmFactory algoFactory = (g, w, opts) -> {
RoutingAlgorithm algo = new LMRoutingAlgorithmFactory(landmarks).createAlgo(g, w, opts);
if (algo instanceof AStarBidirection) {
return new DebugAStarBi(g, w, opts.getTraversalMode(), mg).setApproximation(((AStarBidirection) algo).getApproximation());
} else if (algo instanceof AStar) {
return new DebugAStar(g, w, opts.getTraversalMode(), mg);
} else if (algo instanceof DijkstraBidirectionRef) {
return new DebugDijkstraBidirection(g, w, opts.getTraversalMode(), mg);
} else if (algo instanceof Dijkstra) {
return new DebugDijkstraSimple(g, w, opts.getTraversalMode(), mg);
}
return algo;
};
AlgorithmOptions algoOpts = new AlgorithmOptions().setAlgorithm(Algorithms.ASTAR_BI);
logger.info("algoOpts:" + algoOpts + ", weighting: " + landmarks.getWeighting() + ", profile: " + profile.getName());
QueryGraph qGraph = QueryGraph.create(graph, fromRes, toRes);
return algoFactory.createAlgo(qGraph, landmarks.getWeighting(), algoOpts);
}
}
use of com.graphhopper.routing.querygraph.QueryRoutingCHGraph in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method getEdgeIteratorState.
@Test
public void getEdgeIteratorState() {
// /---\
// 0-x-1-2
// 3
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge = addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
graph.freeze();
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScFwdDir(), 20, 0, 1, 0, 1);
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertGetEdgeIteratorState(queryCHGraph, 1, 2, 1);
assertGetEdgeIteratorShortcut(queryCHGraph, 0, 2, 0, 1);
// the orig edge corresponds to the edge id of the edge in the (base) query graph
assertGetEdgeIteratorState(queryCHGraph, 0, 3, 2);
assertGetEdgeIteratorState(queryCHGraph, 3, 0, 2);
assertGetEdgeIteratorState(queryCHGraph, 1, 3, 3);
assertGetEdgeIteratorState(queryCHGraph, 3, 1, 3);
}
use of com.graphhopper.routing.querygraph.QueryRoutingCHGraph in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method basic.
@Test
public void basic() {
// 0-1-2
GHUtility.setSpeed(60, true, true, encoder, graph.edge(0, 1).setDistance(10));
GHUtility.setSpeed(60, true, true, encoder, graph.edge(1, 2).setDistance(10));
graph.freeze();
assertEquals(2, graph.getEdges());
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.<Snap>emptyList());
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertEquals(3, queryCHGraph.getNodes());
assertEquals(2, queryCHGraph.getEdges());
assertTrue(queryCHGraph.isEdgeBased());
assertTrue(queryCHGraph.hasTurnCosts());
assertNodesConnected(queryCHGraph, 0, 1, true);
assertNodesConnected(queryCHGraph, 1, 2, true);
RoutingCHEdgeIterator outIter = queryCHGraph.createOutEdgeExplorer().setBaseNode(0);
assertNextEdge(outIter, 0, 1, 0);
assertEnd(outIter);
RoutingCHEdgeIterator inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(1);
assertNextEdge(inIter, 1, 2, 1);
assertNextEdge(inIter, 1, 0, 0);
assertEnd(inIter);
inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(2);
assertNextEdge(inIter, 2, 1, 1);
assertEnd(inIter);
}
use of com.graphhopper.routing.querygraph.QueryRoutingCHGraph in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method withVirtualEdgesAndShortcuts.
@Test
public void withVirtualEdgesAndShortcuts() {
// /---\
// 0-x-1-2
// 3
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge = addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
graph.freeze();
assertEquals(2, graph.getEdges());
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScFwdDir(), 20, 0, 1, 0, 1);
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertEquals(4, queryCHGraph.getNodes());
assertEquals(3 + 4, queryCHGraph.getEdges());
assertNodesConnected(queryCHGraph, 0, 3, true);
assertNodesConnected(queryCHGraph, 3, 1, true);
assertNodesConnected(queryCHGraph, 1, 2, true);
// node 0 is not visible from node 0 via shortcut 0-2
// assertNodesConnected(queryCHGraph, 0, 2, false);
// at real nodes
RoutingCHEdgeIterator outIter = queryCHGraph.createOutEdgeExplorer().setBaseNode(0);
// note that orig edge of virtual edges corresponds to the id of the virtual edge on the base graph
assertNextEdge(outIter, 0, 3, 2);
assertNextShortcut(outIter, 0, 2, 0, 1);
assertEnd(outIter);
RoutingCHEdgeIterator inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(2);
assertNextEdge(inIter, 2, 1, 1);
assertEnd(inIter);
// at virtual nodes
outIter = queryCHGraph.createOutEdgeExplorer().setBaseNode(3);
assertNextEdge(outIter, 3, 0, 2);
assertNextEdge(outIter, 3, 1, 3);
assertEnd(outIter);
inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(3);
assertNextEdge(inIter, 3, 0, 2);
assertNextEdge(inIter, 3, 1, 3);
assertEnd(inIter);
}
Aggregations