@Override protected SPTEntry createStartEntry(int node, double weight, boolean reverse) { return new SPTEntry(node, weight); }
@Override public SPTEntry clone() { return new SPTEntry(edge, adjNode, weight); }
@Override protected SPTEntry createEntry(EdgeIteratorState edge, double weight, SPTEntry parent, boolean reverse) { SPTEntry entry = new SPTEntry(edge.getEdge(), edge.getAdjNode(), weight); entry.parent = parent; return entry; }
@Override public Path calcPath(int from, int to) { checkAlreadyRun(); this.to = to; currEdge = new SPTEntry(from, 0); if (!traversalMode.isEdgeBased()) { fromMap.put(from, currEdge); } runAlgo(); return extractPath(); }
@Test public void testCloneFull() { SPTEntry de = new SPTEntry(EdgeIterator.NO_EDGE, 1, 10); SPTEntry de2 = de.parent = new SPTEntry(EdgeIterator.NO_EDGE, -2, 20); SPTEntry de3 = de2.parent = new SPTEntry(EdgeIterator.NO_EDGE, 3, 30); SPTEntry cloning = de.cloneFull(); SPTEntry tmp1 = de; SPTEntry tmp2 = cloning; assertNotNull(tmp1); while (tmp1 != null) { assertFalse(tmp1 == tmp2); assertEquals(tmp1.edge, tmp2.edge); tmp1 = tmp1.parent; tmp2 = tmp2.parent; } assertNull(tmp2); } }
nEdge = new SPTEntry(iter.getEdge(), iter.getAdjNode(), tmpWeight); nEdge.parent = currEdge; fromMap.put(traversalId, nEdge);
@Test public void testSize() { PriorityQueue<SPTEntry> juQueue = new PriorityQueue<>(100); BinHeapWrapper<Number, Integer> binHeap = createHeap(100); Random rand = new Random(1); int N = 1000; for (int i = 0; i < N; i++) { int val = rand.nextInt(); binHeap.insert(val, i); juQueue.add(new SPTEntry(EdgeIterator.NO_EDGE, i, val)); } assertEquals(juQueue.size(), binHeap.getSize()); for (int i = 0; i < N; i++) { assertEquals(juQueue.poll().adjNode, binHeap.pollElement(), 1e-5); } assertEquals(binHeap.getSize(), 0); } }
@Test public void testExtract() { Graph g = createGraph(); g.edge(1, 2, 10, true); PathBidirRef pw = new PathBidirRef(g, new FastestWeighting(carEncoder)); EdgeExplorer explorer = g.createEdgeExplorer(carOutEdges); EdgeIterator iter = explorer.setBaseNode(1); iter.next(); pw.sptEntry = new SPTEntry(iter.getEdge(), 2, 0); pw.sptEntry.parent = new SPTEntry(EdgeIterator.NO_EDGE, 1, 10); pw.edgeTo = new SPTEntry(EdgeIterator.NO_EDGE, 2, 0); Path p = pw.extract(); assertEquals(IntArrayList.from(new int[]{1, 2}), p.calcNodes()); assertEquals(10, p.getDistance(), 1e-4); }
@Test public void testExtract2() { Graph g = createGraph(); g.edge(1, 2, 10, false); g.edge(2, 3, 20, false); EdgeExplorer explorer = g.createEdgeExplorer(carOutEdges); EdgeIterator iter = explorer.setBaseNode(1); iter.next(); PathBidirRef pw = new PathBidirRef(g, new FastestWeighting(carEncoder)); pw.sptEntry = new SPTEntry(iter.getEdge(), 2, 10); pw.sptEntry.parent = new SPTEntry(EdgeIterator.NO_EDGE, 1, 0); explorer = g.createEdgeExplorer(DefaultEdgeFilter.inEdges(carEncoder)); iter = explorer.setBaseNode(3); iter.next(); pw.edgeTo = new SPTEntry(iter.getEdge(), 2, 20); pw.edgeTo.parent = new SPTEntry(EdgeIterator.NO_EDGE, 3, 0); Path p = pw.extract(); assertEquals(IntArrayList.from(new int[]{1, 2, 3}), p.calcNodes()); assertEquals(30, p.getDistance(), 1e-4); } }
SPTEntry e1 = new SPTEntry(edge2.getEdge(), 2, 1); e1.parent = new SPTEntry(edge1.getEdge(), 1, 1); e1.parent.parent = new SPTEntry(-1, 0, 1); path.setSPTEntry(e1); path.extract(); e1 = new SPTEntry(edge2.getEdge(), 2, 1); e1.parent = new SPTEntry(edge1.getEdge(), 1, 1); e1.parent.parent = new SPTEntry(-1, 0, 1); path.setSPTEntry(e1); path.extract(); e1 = new SPTEntry(edge1.getEdge(), 0, 1); e1.parent = new SPTEntry(edge2.getEdge(), 1, 1); e1.parent.parent = new SPTEntry(-1, 2, 1); path.setSPTEntry(e1); path.extract();
SPTEntry e1 = new SPTEntry(edge4.getEdge(), 4, 1); e1.parent = new SPTEntry(edge3.getEdge(), 3, 1); e1.parent.parent = new SPTEntry(edge2.getEdge(), 2, 1); e1.parent.parent.parent = new SPTEntry(edge1.getEdge(), 1, 1); e1.parent.parent.parent.parent = new SPTEntry(-1, 0, 1); path.setSPTEntry(e1); path.extract();
@Override public SPTEntry clone() { return new SPTEntry(edge, adjNode, weight); }
protected SPTEntry createSPTEntry( int node, double weight ) { return new SPTEntry(EdgeIterator.NO_EDGE, node, weight); }
protected SPTEntry createSPTEntry(int node, double weight) { return new SPTEntry(EdgeIterator.NO_EDGE, node, weight); }
@Override protected SPTEntry createStartEntry(int node, double weight, boolean reverse) { return new SPTEntry(node, weight); }
@Override public SPTEntry clone() { return new SPTEntry(edge, adjNode, weight); }
@Override public SPTEntry clone() { return new SPTEntry(edge, adjNode, weight); }
@Override protected SPTEntry createEntry(EdgeIteratorState edge, double weight, SPTEntry parent, boolean reverse) { SPTEntry entry = new SPTEntry(edge.getEdge(), edge.getAdjNode(), weight); entry.parent = parent; return entry; }
@Override public Path calcPath(int from, int to) { checkAlreadyRun(); this.to = to; currEdge = new SPTEntry(from, 0); if (!traversalMode.isEdgeBased()) { fromMap.put(from, currEdge); } runAlgo(); return extractPath(); }
void fillEdges(SPTEntry currEdge, PriorityQueue<SPTEntry> prioQueue, IntObjectMap<SPTEntry> bestWeightMap, EdgeExplorer explorer, boolean reverse) { EdgeIterator iter = explorer.setBaseNode(currEdge.adjNode); while (iter.next()) { if (!accept(iter, currEdge.edge)) continue; int traversalId = traversalMode.createTraversalId(iter, reverse); double tmpWeight = weighting.calcWeight(iter, reverse, currEdge.edge) + currEdge.weight; if (Double.isInfinite(tmpWeight)) continue; SPTEntry ee = bestWeightMap.get(traversalId); if (ee == null) { ee = new SPTEntry(iter.getEdge(), iter.getAdjNode(), tmpWeight); ee.parent = currEdge; bestWeightMap.put(traversalId, ee); prioQueue.add(ee); } else if (ee.weight > tmpWeight) { prioQueue.remove(ee); ee.edge = iter.getEdge(); ee.weight = tmpWeight; ee.parent = currEdge; prioQueue.add(ee); } else continue; if (updateBestPath) updateBestPath(iter, ee, traversalId); } }