예제 #1
0
  @Test
  public void testExpand() {
    LevelGraphStorage g = (LevelGraphStorage) createGraph(20);
    EdgeSkipIterator iter = g.edge(0, 1, 10, true); // 1
    g.edge(1, 2, 10, true); // 2
    EdgeSkipIterator iter3 = g.edge(2, 3, 10, true); // 3

    g.setLevel(1, -1);
    g.setLevel(2, -1);
    EdgeSkipIterator iter4 = g.edge(0, 2, 20, CarStreetType.flagsDefault(true));
    iter4.skippedEdge(iter.edge()); // 4

    Path4Shortcuts path = new Path4Shortcuts(g, ShortestCarCalc.DEFAULT);
    path.edgeEntry = new EdgeEntry(iter4.edge(), 2, 20);
    path.edgeEntry.parent = new EdgeEntry(EdgeIterator.NO_EDGE, 0, 0);
    path.edgeTo = new EdgeEntry(iter3.edge(), 2, 10);
    path.edgeTo.parent = new EdgeEntry(EdgeIterator.NO_EDGE, 3, 0);
    Path p = path.extract();
    assertEquals(Helper.createTList(0, 1, 2, 3), p.calcNodes());
    assertEquals(4, p.calcNodes().size());
  }
  @Test
  public void testFindShortcuts_Roundabout() {
    LevelGraphStorage g = (LevelGraphStorage) createGraph();
    EdgeSkipIterator iter1_1 = g.edge(1, 3, 1, true);
    EdgeSkipIterator iter1_2 = g.edge(3, 4, 1, true);
    EdgeSkipIterator iter2_1 = g.edge(4, 5, 1, false);
    EdgeSkipIterator iter2_2 = g.edge(5, 6, 1, false);
    EdgeSkipIterator iter3_1 = g.edge(6, 7, 1, true);
    EdgeSkipIterator iter3_2 = g.edge(6, 8, 2, false);
    g.edge(8, 4, 1, false);
    g.setLevel(3, 3);
    g.setLevel(5, 5);
    g.setLevel(7, 7);
    g.setLevel(8, 8);

    PrepareContractionHierarchies prepare = new PrepareContractionHierarchies().graph(g);
    g.edge(1, 4, 2, prepare.scBothDir()).skippedEdges(iter1_1.edge(), iter1_2.edge());
    int f = prepare.scOneDir();
    g.edge(4, 6, 2, f).skippedEdges(iter2_1.edge(), iter2_2.edge());
    g.edge(6, 4, 3, f).skippedEdges(iter3_1.edge(), iter3_2.edge());

    prepare.initFromGraph();
    // there should be two different shortcuts for both directions!
    Collection<Shortcut> sc = prepare.testFindShortcuts(4);
    assertEquals(2, sc.size());
  }
  void initUnpackingGraph(LevelGraphStorage g, WeightCalculation w) {
    double dist = 1;
    int flags = carEncoder.flags(30, false);
    g.edge(10, 0, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter1 = g.edge(0, 1, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter2 = g.edge(1, 2, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter3 = g.edge(2, 3, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter4 = g.edge(3, 4, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter5 = g.edge(4, 5, w.getWeight(dist, flags), flags);
    EdgeSkipIterator iter6 = g.edge(5, 6, w.getWeight(dist, flags), flags);
    int oneDirFlags = new PrepareContractionHierarchies().scOneDir();

    int tmp = iter1.edge();
    iter1 = g.edge(0, 2, 2, oneDirFlags);
    iter1.skippedEdges(tmp, iter2.edge());
    tmp = iter1.edge();
    iter1 = g.edge(0, 3, 3, oneDirFlags);
    iter1.skippedEdges(tmp, iter3.edge());
    tmp = iter1.edge();
    iter1 = g.edge(0, 4, 4, oneDirFlags);
    iter1.skippedEdges(tmp, iter4.edge());
    tmp = iter1.edge();
    iter1 = g.edge(0, 5, 5, oneDirFlags);
    iter1.skippedEdges(tmp, iter5.edge());
    tmp = iter1.edge();
    iter1 = g.edge(0, 6, 6, oneDirFlags);
    iter1.skippedEdges(tmp, iter6.edge());
    g.setLevel(0, 10);
    g.setLevel(6, 9);
    g.setLevel(5, 8);
    g.setLevel(4, 7);
    g.setLevel(3, 6);
    g.setLevel(2, 5);
    g.setLevel(1, 4);
    g.setLevel(10, 3);
  }