@Override public CHEdgeExplorer createEdgeExplorer() { return createEdgeExplorer(EdgeFilter.ALL_EDGES); }
GraphHopperStorage ghStorage = createGHStorage(em, Arrays.asList(weighting), false); CHGraphImpl g2 = (CHGraphImpl) ghStorage.getGraph(CHGraph.class, weighting); g2.edge(0, 1, 1, true); EdgeIteratorState iter1_1 = g2.edge(0, 2, 1.4, false); EdgeIteratorState iter1_2 = g2.edge(2, 5, 1.4, false); g2.edge(1, 2, 1, true); g2.edge(1, 3, 3, true); g2.edge(2, 3, 1, true); g2.edge(4, 3, 1, true); g2.edge(2, 5, 1.4, true); g2.edge(3, 5, 1, true); g2.edge(5, 6, 1, true); g2.edge(4, 6, 1, true); g2.edge(6, 7, 1, true); EdgeIteratorState iter2_2 = g2.edge(5, 7); iter2_2.setDistance(1.4).setFlags(encoder.setProperties(10, true, false)); CHEdgeIteratorState iter2_1 = g2.shortcut(0, 5); iter2_1.setDistance(2.8).setFlags(encoder.setProperties(10, true, false)); iter2_1.setSkippedEdges(iter1_1.getEdge(), iter1_2.getEdge()); CHEdgeIteratorState tmp = g2.shortcut(0, 7); tmp.setDistance(4.2).setFlags(encoder.setProperties(10, true, false)); tmp.setSkippedEdges(iter2_1.getEdge(), iter2_2.getEdge()); g2.setLevel(1, 0); g2.setLevel(3, 1); g2.setLevel(4, 2); g2.setLevel(6, 3); g2.setLevel(2, 4); g2.setLevel(5, 5);
public GraphHopperStorage(List<? extends Weighting> chWeightings, Directory dir, final EncodingManager encodingManager, boolean withElevation, GraphExtension extendedStorage) { if (extendedStorage == null) throw new IllegalArgumentException("GraphExtension cannot be null, use NoOpExtension"); if (encodingManager == null) throw new IllegalArgumentException("EncodingManager needs to be non-null since 0.7. Create one using new EncodingManager or EncodingManager.create(flagEncoderFactory, ghLocation)"); this.encodingManager = encodingManager; this.dir = dir; this.properties = new StorableProperties(dir); InternalGraphEventListener listener = new InternalGraphEventListener() { @Override public void initStorage() { for (CHGraphImpl cg : chGraphs) { cg.initStorage(); } } @Override public void freeze() { for (CHGraphImpl cg : chGraphs) { cg._freeze(); } } }; this.baseGraph = new BaseGraph(dir, encodingManager, withElevation, listener, extendedStorage); for (Weighting w : chWeightings) { chGraphs.add(new CHGraphImpl(w, dir, this.baseGraph)); } }
@Override public void flush() { for (CHGraphImpl cg : chGraphs) { cg.setEdgesHeader(); cg.flush(); } baseGraph.flush(); properties.flush(); }
@Override public CHEdgeIteratorState shortcut(int a, int b) { if (!baseGraph.isFrozen()) throw new IllegalStateException("Cannot create shortcut if graph is not yet frozen"); checkNodeId(a); checkNodeId(b); int scId = chEdgeAccess.internalEdgeAdd(nextShortcutId(), a, b); CHEdgeIteratorImpl iter = new CHEdgeIteratorImpl(baseGraph, chEdgeAccess, EdgeFilter.ALL_EDGES); boolean ret = iter.init(scId, b); assert ret; iter.setSkippedEdges(EdgeIterator.NO_EDGE, EdgeIterator.NO_EDGE); return iter; }
periodicUpdateSW.start(); sortedNodes.clear(); for (int node = 0; node < prepareGraph.getNodes(); node++) { if (prepareGraph.getLevel(node) != maxLevel) continue; prepareGraph.setLevel(polledNode, level); level++; contractionSW.stop(); if (prepareGraph.getLevel(nn) != maxLevel) continue; prepareGraph.disconnect(vehicleAllTmpExplorer, iter);
EdgeExplorer chCarOutExplorer = lg.createEdgeExplorer(carOutFilter); EdgeExplorer tmpCarInExplorer = lg.createEdgeExplorer(carInFilter); lg.edge(4, 1, 30, true); graph.freeze(); CHEdgeIteratorState tmp = lg.shortcut(1, 2); tmp.setDistance(10).setFlags(flags); tmp.setSkippedEdges(10, 11); tmp = lg.shortcut(1, 0); tmp.setDistance(20).setFlags(flags2); tmp.setSkippedEdges(12, 13); tmp = lg.shortcut(3, 1); tmp.setDistance(30).setFlags(flags2); tmp.setSkippedEdges(14, 15); EdgeIterator iter = lg.createEdgeExplorer().setBaseNode(1); iter.next(); assertEquals(3, iter.getAdjNode()); assertEquals(1, GHUtility.count(chCarOutExplorer.setBaseNode(3))); lg.disconnect(lg.createEdgeExplorer(), iter); assertEquals(0, GHUtility.count(chCarOutExplorer.setBaseNode(3))); assertEquals(0, iter.getAdjNode()); assertEquals(1, GHUtility.count(tmpCarInExplorer.setBaseNode(0))); lg.disconnect(lg.createEdgeExplorer(), iter); assertEquals(0, GHUtility.count(tmpCarInExplorer.setBaseNode(0))); assertEquals(2, iter.getAdjNode()); assertEquals(1, GHUtility.count(chCarOutExplorer.setBaseNode(2)));
lg.setLevel(0, 11); lg.setLevel(1, 10); lg.disconnect(lg.createEdgeExplorer(), iter1); lg.setLevel(2, 12); lg.setLevel(3, 13); lg.disconnect(lg.createEdgeExplorer(), iter1);
boolean prepareNodes() { int nodes = prepareGraph.getNodes(); for (int node = 0; node < nodes; node++) { prepareGraph.setLevel(node, maxLevel); } for (int node = 0; node < nodes; node++) { int priority = oldPriorities[node] = calculatePriority(node); sortedNodes.insert(node, priority); } if (sortedNodes.isEmpty()) return false; return true; }
private void initFromGraph() { ghStorage.freeze(); FlagEncoder prepareFlagEncoder = prepareWeighting.getFlagEncoder(); final EdgeFilter allFilter = DefaultEdgeFilter.allEdges(prepareFlagEncoder); maxLevel = prepareGraph.getNodes(); vehicleAllExplorer = prepareGraph.createEdgeExplorer(allFilter); vehicleAllTmpExplorer = prepareGraph.createEdgeExplorer(allFilter); // Use an alternative to PriorityQueue as it has some advantages: // 1. Gets automatically smaller if less entries are stored => less total RAM used. // Important because Graph is increasing until the end. // 2. is slightly faster // but we need the additional oldPriorities array to keep the old value which is necessary for the update method sortedNodes = new GHTreeMapComposed(); oldPriorities = new float[prepareGraph.getNodes()]; nodeContractor = new NodeBasedNodeContractor(dir, ghStorage, prepareGraph, weighting, pMap); nodeContractor.initFromGraph(); }
@Override public final void setLevel(int nodeIndex, int level) { checkNodeId(nodeIndex); nodesCH.setInt((long) nodeIndex * nodeCHEntryBytes + N_LEVEL, level); }
@Override public EdgeIteratorState edge(int a, int b, double distance, boolean bothDirections) { return edge(a, b).setDistance(distance).setFlags(baseGraph.encodingManager.flagsDefault(true, bothDirections)); }
@Override public void freeze() { for (CHGraphImpl cg : chGraphs) { cg._freeze(); } } };
@Override public void close() { properties.close(); baseGraph.close(); for (CHGraphImpl cg : chGraphs) { cg.close(); } }
/** * After configuring this storage you need to create it explicitly. */ @Override public GraphHopperStorage create(long byteCount) { baseGraph.checkInit(); if (encodingManager == null) throw new IllegalStateException("EncodingManager can only be null if you call loadExisting"); dir.create(); long initSize = Math.max(byteCount, 100); properties.create(100); properties.put("graph.bytes_for_flags", encodingManager.getBytesForFlags()); properties.put("graph.flag_encoders", encodingManager.toDetailsString()); properties.put("graph.byte_order", dir.getByteOrder()); properties.put("graph.dimension", baseGraph.nodeAccess.getDimension()); properties.putCurrentVersions(); baseGraph.create(initSize); for (CHGraphImpl cg : chGraphs) { cg.create(byteCount); } properties.put("graph.ch.weightings", getCHWeightings().toString()); return this; }
void contractNodes() { meanDegree = prepareGraph.getAllEdges().getMaxId() / prepareGraph.getNodes(); int level = 1; counter = 0; periodSW.start(); sortedNodes.clear(); int len = prepareGraph.getNodes(); for (int node = 0; node < len; node++) { if (prepareGraph.getLevel(node) != maxLevel) continue; findShortcuts(addScHandler.setNode(polledNode)); newShortcuts += addShortcuts(shortcuts.keySet()); prepareGraph.setLevel(polledNode, level); level++; while (iter.next()) { int nn = iter.getAdjNode(); if (prepareGraph.getLevel(nn) != maxLevel) continue; prepareGraph.disconnect(vehicleAllTmpExplorer, iter);
boolean prepareNodes() { int nodes = prepareGraph.getNodes(); for (int node = 0; node < nodes; node++) { prepareGraph.setLevel(node, maxLevel); } for (int node = 0; node < nodes; node++) { int priority = oldPriorities[node] = calculatePriority(node); sortedNodes.insert(node, priority); } if (sortedNodes.isEmpty()) return false; return true; }
vehicleInExplorer = prepareGraph.createEdgeExplorer(new DefaultEdgeFilter(prepareFlagEncoder, true, false)); vehicleOutExplorer = prepareGraph.createEdgeExplorer(new DefaultEdgeFilter(prepareFlagEncoder, false, true)); final EdgeFilter allFilter = new DefaultEdgeFilter(prepareFlagEncoder, true, true); maxLevel = prepareGraph.getNodes() + 1; ignoreNodeFilter = new IgnoreNodeFilter(prepareGraph, maxLevel); vehicleAllExplorer = prepareGraph.createEdgeExplorer(allFilter); vehicleAllTmpExplorer = prepareGraph.createEdgeExplorer(allFilter); calcPrioAllExplorer = prepareGraph.createEdgeExplorer(accessWithLevelFilter); oldPriorities = new int[prepareGraph.getNodes()]; prepareAlgo = new DijkstraOneToMany(prepareGraph, prepareFlagEncoder, prepareWeighting, traversalMode); return this;
@Override public void flush() { for (CHGraphImpl cg : chGraphs) { cg.setEdgesHeader(); cg.flush(); } baseGraph.flush(); properties.flush(); }