@Override public String toString() { return (isCHPossible() ? "CH|" : "") + encodingManager + "|" + getDirectory().getDefaultType() + "|" + baseGraph.nodeAccess.getDimension() + "D" + "|" + baseGraph.extStorage + "|" + getProperties().versionsToString(); }
@Override public void flush() { for (CHGraphImpl cg : chGraphs) { cg.setEdgesHeader(); cg.flush(); } baseGraph.flush(); properties.flush(); }
@Test public void testEnsureSize() { Directory dir = new RAMDirectory(); graph = newGHStorage(dir, false).create(defaultSize); int roughEdgeRowLength = 4 * 8; int testIndex = dir.find("edges", DAType.RAM_INT).getSegmentSize() * 3 / roughEdgeRowLength; // we need a big node index to trigger multiple segments, but low enough to avoid OOM graph.edge(0, testIndex, 10, true); // test if optimize works without error graph.optimize(); }
@Override protected GraphHopperStorage createGHStorage(EncodingManager em, List<? extends Weighting> weightings, boolean is3D) { return new GraphHopperStorage(weightings, new RAMDirectory(), em, is3D, new GraphExtension.NoOpExtension()). create(1000); }
final void connectNewEdge(int fromNode, int otherNode, int newOrExistingEdge) { int edge = getEdgeRef(fromNode); if (edge > EdgeIterator.NO_EDGE) { long edgePointer = toPointer(newOrExistingEdge); long lastLink = _getLinkPosInEdgeArea(fromNode, otherNode, edgePointer); edges.setInt(lastLink, edge); } setEdgeRef(fromNode, newOrExistingEdge); }
@Override public GraphHopperStorage createGHStorage(String location, boolean enabled3D) { // reduce segment size in order to test the case where multiple segments come into the game GraphHopperStorage gs = newGHStorage(new RAMDirectory(location), enabled3D); gs.setSegmentSize(defaultSize / 2); gs.create(defaultSize); return gs; }
@Override public final CHEdgeIterator setBaseNode(int baseNode) { assert baseGraph.isFrozen() : "Traversal CHGraph is only possible if BaseGraph is frozen"; // always use ch edge access setEdgeId(chEdgeAccess.getEdgeRef(baseNode)); _setBaseNode(baseNode); return this; }
@Override public long getCapacity() { long cnt = baseGraph.getCapacity() + properties.getCapacity(); for (CHGraphImpl cg : chGraphs) { cnt += cg.getCapacity(); } return cnt; }
@Override public boolean loadExisting() { if (!nodesCH.loadExisting() || !shortcuts.loadExisting()) return false; loadEdgesHeader(); return true; }
@Override public final void setLevel(int nodeIndex, int level) { checkNodeId(nodeIndex); nodesCH.setInt((long) nodeIndex * nodeCHEntryBytes + N_LEVEL, level); }
@Override public final int getLevel(int nodeIndex) { checkNodeId(nodeIndex); return nodesCH.getInt((long) nodeIndex * nodeCHEntryBytes + N_LEVEL); }
@Override public final int getSkippedEdge1() { checkShortcut(true, "getSkippedEdge1"); return shortcuts.getInt(edgePointer + S_SKIP_EDGE1); }
@Override final long reverseFlags(long edgePointer, long flags) { boolean isShortcut = edgePointer >= toPointer(baseGraph.edgeCount); if (!isShortcut) return baseGraph.edgeAccess.reverseFlags(edgePointer, flags); // we need a special swapping for CHGraph if it is a shortcut as we only store the weight and access flags then long dir = flags & scDirMask; if (dir == scDirMask || dir == 0) return flags; // swap the last bits with this mask return flags ^ scDirMask; }
@Override public void setSegmentSize(int bytes) { baseGraph.setSegmentSize(bytes); for (CHGraphImpl cg : chGraphs) { cg.setSegmentSize(bytes); } }
@Override public final CHEdgeIteratorState setWeight(double weight) { checkShortcut(true, "setWeight"); CHGraphImpl.this.setWeight(this, weight); return this; }
@Override public final EdgeIteratorState setName(String name) { checkShortcut(false, "setName"); return super.setName(name); }
@Override public final EdgeIteratorState setWayGeometry(PointList list) { checkShortcut(false, "setWayGeometry"); return super.setWayGeometry(list); }
@Override public final int getSkippedEdge1() { checkShortcut(true, "getSkippedEdge1"); return shortcuts.getInt(edgePointer + S_SKIP_EDGE1); }
@Override public final int getSkippedEdge2() { checkShortcut(true, "getSkippedEdge2"); return shortcuts.getInt(edgePointer + S_SKIP_EDGE2); }