private NodeContractor createNodeContractor() { NodeContractor nodeContractor = new NodeBasedNodeContractor(lg, weighting, new PMap()); nodeContractor.initFromGraph(); nodeContractor.prepareContraction(); return nodeContractor; }
private float calculatePriority(int node) { return nodeContractor.calculatePriority(node); }
private void close() { nodeContractor.close(); sortedNodes = null; oldPriorities = null; }
private void logStats(int updateCounter) { logger.info(String.format(Locale.ROOT, "nodes: %10s, shortcuts: %10s, updates: %2d, checked-nodes: %10s, %s, %s, %s", nf(sortedNodes.getSize()), nf(nodeContractor.getAddedShortcutsCount()), updateCounter, nf(checkCounter), getTimesAsString(), nodeContractor.getStatisticsString(), Helper.getMemInfo())); }
private void contractNodes() { nodeContractor.prepareContraction(); initSize = sortedNodes.getSize(); int level = 0; nodeContractor.contractNode(polledNode); prepareGraph.setLevel(polledNode, level); level++;
@Test public void testContractNode_directed_withWitness() { // 0 --> 1 --> 2 // \_________/ graph.edge(0, 1, 1, false); graph.edge(1, 2, 2, false); graph.edge(0, 2, 1, false); graph.freeze(); setMaxLevelOnAllNodes(); createNodeContractor().contractNode(1); checkNoShortcuts(); }
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(); }
public long getShortcuts() { return nodeContractor.getAddedShortcutsCount(); }
private String getTimesAsString() { float totalTime = allSW.getCurrentSeconds(); float periodicUpdateTime = periodicUpdateSW.getCurrentSeconds(); float lazyUpdateTime = lazyUpdateSW.getCurrentSeconds(); float neighborUpdateTime = neighborUpdateSW.getCurrentSeconds(); float contractionTime = contractionSW.getCurrentSeconds(); float otherTime = totalTime - (periodicUpdateTime + lazyUpdateTime + neighborUpdateTime + contractionTime); // dijkstra time is included in the others float dijkstraTime = nodeContractor.getDijkstraSeconds(); return String.format(Locale.ROOT, "t(total): %6.2f, t(period): %6.2f, t(lazy): %6.2f, t(neighbor): %6.2f, t(contr): %6.2f, t(other) : %6.2f, t(dijk): %6.2f", totalTime, periodicUpdateTime, lazyUpdateTime, neighborUpdateTime, contractionTime, otherTime, dijkstraTime); }
public long getDijkstraCount() { return nodeContractor.getDijkstraCount(); }
private void contractNodes() { nodeContractor.prepareContraction(); initSize = sortedNodes.getSize(); int level = 0; nodeContractor.contractNode(polledNode); prepareGraph.setLevel(polledNode, level); level++;
@Test public void testContractNode_directed_shortcutRequired() { // 0 --> 1 --> 2 final EdgeIteratorState edge1 = graph.edge(0, 1, 1, false); final EdgeIteratorState edge2 = graph.edge(1, 2, 2, false); graph.freeze(); setMaxLevelOnAllNodes(); createNodeContractor().contractNode(1); checkShortcuts(expectedShortcut(0, 2, edge1, edge2, true, false)); }
private void logStats(int updateCounter) { logger.info(String.format(Locale.ROOT, "nodes: %10s, shortcuts: %10s, updates: %2d, checked-nodes: %10s, %s, %s, %s", nf(sortedNodes.getSize()), nf(nodeContractor.getAddedShortcutsCount()), updateCounter, nf(checkCounter), getTimesAsString(), nodeContractor.getStatisticsString(), Helper.getMemInfo())); }
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 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)); }
private String getTimesAsString() { float totalTime = allSW.getCurrentSeconds(); float periodicUpdateTime = periodicUpdateSW.getCurrentSeconds(); float lazyUpdateTime = lazyUpdateSW.getCurrentSeconds(); float neighborUpdateTime = neighborUpdateSW.getCurrentSeconds(); float contractionTime = contractionSW.getCurrentSeconds(); float otherTime = totalTime - (periodicUpdateTime + lazyUpdateTime + neighborUpdateTime + contractionTime); // dijkstra time is included in the others float dijkstraTime = nodeContractor.getDijkstraSeconds(); return String.format(Locale.ROOT, "t(total): %6.2f, t(period): %6.2f, t(lazy): %6.2f, t(neighbor): %6.2f, t(contr): %6.2f, t(other) : %6.2f, t(dijk): %6.2f", totalTime, periodicUpdateTime, lazyUpdateTime, neighborUpdateTime, contractionTime, otherTime, dijkstraTime); }
public long getDijkstraCount() { return nodeContractor.getDijkstraCount(); }
@Test public void testContractNode_bidirected_shortcutsRequired() { // 0 -- 1 -- 2 final EdgeIteratorState edge1 = graph.edge(0, 1, 1, true); final EdgeIteratorState edge2 = graph.edge(1, 2, 2, true); graph.freeze(); setMaxLevelOnAllNodes(); createNodeContractor().contractNode(1); checkShortcuts(expectedShortcut(0, 2, edge2, edge1, true, true)); }
public long getShortcuts() { return nodeContractor.getAddedShortcutsCount(); }
private void close() { nodeContractor.close(); sortedNodes = null; oldPriorities = null; }