@Test public void testTurnFlagEncoding_withCosts() { FlagEncoder tmpEncoder = new CarFlagEncoder(8, 5, 127); EncodingManager em = new EncodingManager(tmpEncoder); long flags_r0 = tmpEncoder.getTurnFlags(true, 0); long flags_0 = tmpEncoder.getTurnFlags(false, 0); assertTrue(Double.isInfinite(tmpEncoder.getTurnCost(flags_r0))); assertEquals(0, tmpEncoder.getTurnCost(flags_0), 1e-1); assertTrue(tmpEncoder.isTurnRestricted(flags_r0)); assertFalse(tmpEncoder.isTurnRestricted(flags_0)); long flags_r20 = tmpEncoder.getTurnFlags(true, 0); long flags_20 = tmpEncoder.getTurnFlags(false, 20); assertTrue(Double.isInfinite(tmpEncoder.getTurnCost(flags_r20))); assertEquals(20, tmpEncoder.getTurnCost(flags_20), 1e-1); assertTrue(tmpEncoder.isTurnRestricted(flags_r20)); assertFalse(tmpEncoder.isTurnRestricted(flags_20)); long flags_r220 = tmpEncoder.getTurnFlags(true, 0); try { tmpEncoder.getTurnFlags(false, 220); assertTrue(false); } catch (Exception ex) { } assertTrue(Double.isInfinite(tmpEncoder.getTurnCost(flags_r220))); assertTrue(tmpEncoder.isTurnRestricted(flags_r220)); }
@Test public void testTurnFlagEncoding_noCosts() { FlagEncoder tmpEnc = new CarFlagEncoder(8, 5, 0); EncodingManager em = new EncodingManager(tmpEnc); long flags_r0 = tmpEnc.getTurnFlags(true, 0); long flags_0 = tmpEnc.getTurnFlags(false, 0); long flags_r20 = tmpEnc.getTurnFlags(true, 0); long flags_20 = tmpEnc.getTurnFlags(false, 20); assertEquals(0, tmpEnc.getTurnCost(flags_r0), 1e-1); assertEquals(0, tmpEnc.getTurnCost(flags_0), 1e-1); assertEquals(0, tmpEnc.getTurnCost(flags_r20), 1e-1); assertEquals(0, tmpEnc.getTurnCost(flags_20), 1e-1); assertFalse(tmpEnc.isTurnRestricted(flags_r0)); assertFalse(tmpEnc.isTurnRestricted(flags_0)); assertFalse(tmpEnc.isTurnRestricted(flags_r20)); assertFalse(tmpEnc.isTurnRestricted(flags_20)); }
@Test public void testMergeFlagsBeforeAdding() { FlagEncoder carEncoder = new CarFlagEncoder(5, 5, 3); FlagEncoder bikeEncoder = new BikeFlagEncoder(5, 5, 3); EncodingManager manager = new EncodingManager(carEncoder, bikeEncoder); GraphHopperStorage g = new GraphBuilder(manager).create(); initGraph(g); TurnCostExtension tcs = (TurnCostExtension) g.getExtension(); long carRestricted = carEncoder.getTurnFlags(true, 0); long bikeRestricted = bikeEncoder.getTurnFlags(true, 0); int edge23 = getEdge(g, 2, 3).getEdge(); int edge02 = getEdge(g, 0, 2).getEdge(); tcs.addTurnInfo(edge02, 2, edge23, carRestricted | bikeRestricted); long flags023 = tcs.getTurnCostFlags(edge02, 2, edge23); assertEquals(Double.POSITIVE_INFINITY, carEncoder.getTurnCost(flags023), 0); assertEquals(Double.POSITIVE_INFINITY, bikeEncoder.getTurnCost(flags023), 0); } }
TurnCostExtension tcs = (TurnCostExtension) g.getExtension(); long tflags = carEncoder.getTurnFlags(false, 2); tcs.addTurnInfo(getEdge(g, 5, 2).getEdge(), 2, getEdge(g, 2, 3).getEdge(), tflags); tcs.addTurnInfo(getEdge(g, 2, 0).getEdge(), 0, getEdge(g, 0, 1).getEdge(), tflags); tcs.addTurnInfo(getEdge(g, 5, 6).getEdge(), 6, getEdge(g, 6, 3).getEdge(), tflags); tflags = carEncoder.getTurnFlags(false, 1); tcs.addTurnInfo(getEdge(g, 6, 7).getEdge(), 7, getEdge(g, 7, 4).getEdge(), tflags);
long carRestricted = carEncoder.getTurnFlags(true, 0); long carCosts = carEncoder.getTurnFlags(false, 2); long bikeRestricted = bikeEncoder.getTurnFlags(true, 0); long bikeCosts = bikeEncoder.getTurnFlags(false, 2);
@Test public void testTurnCostsProperlyPropagated_Issue282() { TurnCostExtension turnExt = new TurnCostExtension(); FlagEncoder encoder = new CarFlagEncoder(5, 5, 15); GraphHopperStorage graphWithTurnCosts = new GraphHopperStorage(new RAMDirectory(), new EncodingManager(encoder), false, turnExt). create(100); NodeAccess na = graphWithTurnCosts.getNodeAccess(); na.setNode(0, .00, .00); na.setNode(1, .00, .01); na.setNode(2, .01, .01); EdgeIteratorState edge0 = graphWithTurnCosts.edge(0, 1, 10, true); EdgeIteratorState edge1 = graphWithTurnCosts.edge(2, 1, 10, true); QueryGraph qGraph = new QueryGraph(graphWithTurnCosts); FastestWeighting weighting = new FastestWeighting(encoder); TurnWeighting turnWeighting = new TurnWeighting(weighting, (TurnCostExtension) qGraph.getExtension()); assertEquals(0, turnWeighting.calcTurnWeight(edge0.getEdge(), 1, edge1.getEdge()), .1); // now use turn costs and QueryGraph turnExt.addTurnInfo(edge0.getEdge(), 1, edge1.getEdge(), encoder.getTurnFlags(false, 10)); assertEquals(10, turnWeighting.calcTurnWeight(edge0.getEdge(), 1, edge1.getEdge()), .1); QueryResult res1 = createLocationResult(0.000, 0.005, edge0, 0, QueryResult.Position.EDGE); QueryResult res2 = createLocationResult(0.005, 0.010, edge1, 0, QueryResult.Position.EDGE); qGraph.lookup(Arrays.asList(res1, res2)); int fromQueryEdge = GHUtility.getEdge(qGraph, res1.getClosestNode(), 1).getEdge(); int toQueryEdge = GHUtility.getEdge(qGraph, res2.getClosestNode(), 1).getEdge(); assertEquals(10, turnWeighting.calcTurnWeight(fromQueryEdge, 1, toQueryEdge), .1); graphWithTurnCosts.close(); }
@Test public void testBasicTurnCosts() { GraphHopperStorage g = createStorage(createEncodingManager(false)); initGraph(g); TurnCostExtension tcs = (TurnCostExtension) g.getExtension(); Path p = createAlgo(g, AlgorithmOptions.start(). weighting(createWeighting(carEncoder, tcs, 40)). traversalMode(TraversalMode.EDGE_BASED_1DIR).build()). calcPath(5, 1); // no restriction and costs EdgeIteratorState e3_6 = getEdge(g, 5, 6); e3_6.setDistance(2); assertEquals(IntArrayList.from(new int[]{5, 2, 3, 1}), p.calcNodes()); // now introduce some turn costs long tflags = carEncoder.getTurnFlags(false, 2); tcs.addTurnInfo(getEdge(g, 5, 2).getEdge(), 2, getEdge(g, 2, 3).getEdge(), tflags); p = createAlgo(g, AlgorithmOptions.start(). weighting(createWeighting(carEncoder, tcs, 40)). traversalMode(TraversalMode.EDGE_BASED_1DIR).build()). calcPath(5, 1); assertEquals(IntArrayList.from(new int[]{5, 6, 3, 1}), p.calcNodes()); }
@Test public void testUTurns() { GraphHopperStorage g = createStorage(createEncodingManager(true)); initGraph(g); TurnCostExtension tcs = (TurnCostExtension) g.getExtension(); long tflags = carEncoder.getTurnFlags(true, 0); // force u-turn via lowering the cost for it EdgeIteratorState e3_6 = getEdge(g, 3, 6); e3_6.setDistance(0.1); getEdge(g, 3, 2).setDistance(864); getEdge(g, 1, 0).setDistance(864); tcs.addTurnInfo(getEdge(g, 7, 6).getEdge(), 6, getEdge(g, 6, 5).getEdge(), tflags); tcs.addTurnInfo(getEdge(g, 4, 3).getEdge(), 3, e3_6.getEdge(), tflags); AlgorithmOptions opts = AlgorithmOptions.start(). weighting(createWeighting(carEncoder, tcs, 50)). traversalMode(TraversalMode.EDGE_BASED_2DIR_UTURN).build(); Path p = createAlgo(g, opts).calcPath(7, 5); assertEquals(IntArrayList.from(new int[]{7, 6, 3, 6, 5}), p.calcNodes()); // no u-turn for 6-3 opts = AlgorithmOptions.start(). weighting(createWeighting(carEncoder, tcs, 100)). traversalMode(TraversalMode.EDGE_BASED_2DIR_UTURN).build(); tcs.addTurnInfo(getEdge(g, 6, 3).getEdge(), 3, getEdge(g, 3, 6).getEdge(), tflags); p = createAlgo(g, opts).calcPath(7, 5); assertEquals(IntArrayList.from(new int[]{7, 6, 3, 2, 5}), p.calcNodes()); }