public LevelEdgeFilter(CHGraph g) { graph = g; maxNodes = g.getNodes(); }
@Override public void prepareContraction() { // todo: initializing meanDegree here instead of in initFromGraph() means that in the first round of calculating // node priorities all shortcut searches are cancelled immediately and all possible shortcuts are counted because // no witness path can be found. this is not really what we want, but changing it requires re-optimizing the // graph contraction parameters, because it affects the node contraction order. // when this is done there should be no need for this method any longer. meanDegree = prepareGraph.getEdges() / prepareGraph.getNodes(); }
private void setMaxLevelOnAllNodes() { int nodes = lg.getNodes(); for (int node = 0; node < nodes; node++) { lg.setLevel(node, nodes); } }
private void initFromGraph() { 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(prepareGraph, weighting, pMap); nodeContractor.initFromGraph(); }
@Override public void initFromGraph() { inEdgeExplorer = prepareGraph.createEdgeExplorer(DefaultEdgeFilter.inEdges(encoder)); outEdgeExplorer = prepareGraph.createEdgeExplorer(DefaultEdgeFilter.outEdges(encoder)); maxLevel = prepareGraph.getNodes(); maxEdgesCount = prepareGraph.getOriginalEdges(); }
private boolean prepareNodes() { int nodes = prepareGraph.getNodes(); for (int node = 0; node < nodes; node++) { prepareGraph.setLevel(node, maxLevel); } periodicUpdateSW.start(); for (int node = 0; node < nodes; node++) { float priority = oldPriorities[node] = calculatePriority(node); sortedNodes.insert(node, priority); } periodicUpdateSW.stop(); return !sortedNodes.isEmpty(); }
@Override public void doSpecificWork() { allSW.start(); initFromGraph(); runGraphContraction(); logger.info("took:" + (int) allSW.stop().getSeconds() + "s " + ", new shortcuts: " + nf(nodeContractor.getAddedShortcutsCount()) + ", initSize:" + nf(initSize) + ", " + prepareWeighting + ", periodic:" + params.getPeriodicUpdatesPercentage() + ", lazy:" + params.getLastNodesLazyUpdatePercentage() + ", neighbor:" + params.getNeighborUpdatePercentage() + ", " + getTimesAsString() + ", lazy-overhead: " + (int) (100 * ((checkCounter / (double) initSize) - 1)) + "%" + ", " + Helper.getMemInfo()); int edgeCount = prepareGraph.getOriginalEdges(); logger.info("graph now - num edges: {}, num nodes: {}, num shortcuts: {}", nf(edgeCount), nf(prepareGraph.getNodes()), nf(prepareGraph.getEdges() - edgeCount)); }
periodicUpdateSW.start(); sortedNodes.clear(); for (int node = 0; node < prepareGraph.getNodes(); node++) { if (prepareGraph.getLevel(node) != maxLevel) continue;
public LevelEdgeFilter( CHGraph g ) { graph = g; maxNodes = g.getNodes(); }
public LevelEdgeFilter(CHGraph g) { graph = g; maxNodes = g.getNodes(); }
public LevelEdgeFilter(CHGraph g) { graph = g; maxNodes = g.getNodes(); }
@Test public void testQueryGraph() { graph = createGHStorage(); CHGraph chGraph = getGraph(graph); NodeAccess na = chGraph.getNodeAccess(); na.setNode(0, 1.00, 1.00); na.setNode(1, 1.02, 1.00); na.setNode(2, 1.04, 1.00); EdgeIteratorState edge1 = chGraph.edge(0, 1); chGraph.edge(1, 2); graph.freeze(); chGraph.shortcut(0, 1); QueryGraph qGraph = new QueryGraph(chGraph); QueryResult fromRes = createQR(1.004, 1.01, 0, edge1); QueryResult toRes = createQR(1.019, 1.00, 0, edge1); qGraph.lookup(fromRes, toRes); Graph baseGraph = qGraph.getBaseGraph(); EdgeExplorer explorer = baseGraph.createEdgeExplorer(); assertTrue(chGraph.getNodes() < qGraph.getNodes()); assertEquals(baseGraph.getNodes(), qGraph.getNodes()); // traverse virtual edges and normal edges but no shortcuts! assertEquals(GHUtility.asSet(fromRes.getClosestNode()), GHUtility.getNeighbors(explorer.setBaseNode(0))); assertEquals(GHUtility.asSet(toRes.getClosestNode(), 2), GHUtility.getNeighbors(explorer.setBaseNode(1))); // get neighbors from virtual nodes assertEquals(GHUtility.asSet(0, toRes.getClosestNode()), GHUtility.getNeighbors(explorer.setBaseNode(fromRes.getClosestNode()))); assertEquals(GHUtility.asSet(1, fromRes.getClosestNode()), GHUtility.getNeighbors(explorer.setBaseNode(toRes.getClosestNode()))); }
assertEquals(2.5, na.getLatitude(1), 1e-6); assertEquals(4.5, na.getLongitude(1), 1e-6); assertEquals(9, lg.getNodes()); EdgeIterator iter = lg.createEdgeExplorer().setBaseNode(8); iter.next();
assertEquals(10, chGraph.getNodes()); assertEquals(2, graph.getEdges()); assertEquals(3, chGraph.getEdges());
@Override public void prepareContraction() { // todo: initializing meanDegree here instead of in initFromGraph() means that in the first round of calculating // node priorities all shortcut searches are cancelled immediately and all possible shortcuts are counted because // no witness path can be found. this is not really what we want, but changing it requires re-optimizing the // graph contraction parameters, because it affects the node contraction order. // when this is done there should be no need for this method any longer. meanDegree = prepareGraph.getAllEdges().length() / prepareGraph.getNodes(); }
@Override public void initFromGraph() { inEdgeExplorer = prepareGraph.createEdgeExplorer(DefaultEdgeFilter.inEdges(encoder)); outEdgeExplorer = prepareGraph.createEdgeExplorer(DefaultEdgeFilter.outEdges(encoder)); maxLevel = prepareGraph.getNodes(); maxEdgesCount = ghStorage.getAllEdges().length(); }