public void doWork() { if (minNetworkSize <= 0 && minOneWayNetworkSize <= 0) return; logger.info("start finding subnetworks (min:" + minNetworkSize + ", min one way:" + minOneWayNetworkSize + ") " + Helper.getMemInfo()); int unvisitedDeadEnds = 0; for (FlagEncoder encoder : encoders) { // mark edges for one vehicle as inaccessible PrepEdgeFilter filter = new PrepEdgeFilter(encoder); if (minOneWayNetworkSize > 0) unvisitedDeadEnds += removeDeadEndUnvisitedNetworks(filter); List<IntArrayList> components = findSubnetworks(filter); keepLargeNetworks(filter, components); subnetworks = Math.max(components.size(), subnetworks); logger.info(components.size() + " subnetworks found for " + encoder + ", " + Helper.getMemInfo()); } markNodesRemovedIfUnreachable(); logger.info("optimize to remove subnetworks (" + subnetworks + "), " + "unvisited-dead-end-nodes (" + unvisitedDeadEnds + "), " + "maxEdges/node (" + maxEdgesPerNode.get() + ")"); ghStorage.optimize(); }
final FlagEncoder encoder = filter.getEncoder(); final EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); int locs = ghStorage.getNodes();
final FlagEncoder encoder = filter.getEncoder(); final EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); int locs = ghStorage.getNodes();
final FlagEncoder encoder = filter.getEncoder(); final EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); int locs = ghStorage.getNodes();
IntIndexedContainer oldComponent = null; int allRemoved = 0; FlagEncoder encoder = filter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); for (IntArrayList component : components) {
IntIndexedContainer oldComponent = null; int allRemoved = 0; FlagEncoder encoder = filter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); for (IntArrayList component : components) {
/** * This method removes networks that will be never be visited by this filter. See #235 for * example, small areas like parking lots are sometimes connected to the whole network through a * one-way road. This is clearly an error - but is causes the routing to fail when a point gets * connected to this small area. This routine removes all these networks from the graph. * <p> * * @return number of removed edges */ int removeDeadEndUnvisitedNetworks(final PrepEdgeFilter bothFilter) { StopWatch sw = new StopWatch(bothFilter.getEncoder() + " findComponents").start(); final EdgeFilter outFilter = new DefaultEdgeFilter(bothFilter.getEncoder(), false, true); // partition graph into strongly connected components using Tarjan's algorithm TarjansSCCAlgorithm tarjan = new TarjansSCCAlgorithm(ghStorage, outFilter, true); List<IntArrayList> components = tarjan.findComponents(); logger.info(sw.stop() + ", size:" + components.size()); return removeEdges(bothFilter, components, minOneWayNetworkSize); }
/** * This method removes networks that will be never be visited by this filter. See #235 for * example, small areas like parking lots are sometimes connected to the whole network through a * one-way road. This is clearly an error - but is causes the routing to fail when a point gets * connected to this small area. This routine removes all these networks from the graph. * <p> * * @return number of removed edges */ int removeDeadEndUnvisitedNetworks(final PrepEdgeFilter bothFilter) { StopWatch sw = new StopWatch(bothFilter.getEncoder() + " findComponents").start(); final EdgeFilter outFilter = DefaultEdgeFilter.outEdges(bothFilter.getEncoder()); // partition graph into strongly connected components using Tarjan's algorithm TarjansSCCAlgorithm tarjan = new TarjansSCCAlgorithm(ghStorage, outFilter, true); List<IntArrayList> components = tarjan.findComponents(); logger.info(sw.stop() + ", size:" + components.size()); return removeEdges(bothFilter, components, minOneWayNetworkSize); }
public void doWork() { if (minNetworkSize <= 0 && minOneWayNetworkSize <= 0) return; int unvisitedDeadEnds = 0; for (FlagEncoder encoder : encoders) { // mark edges for one vehicle as inaccessible PrepEdgeFilter filter = new PrepEdgeFilter(encoder); if (minOneWayNetworkSize > 0) unvisitedDeadEnds += removeDeadEndUnvisitedNetworks(filter); List<IntArrayList> components = findSubnetworks(filter); keepLargeNetworks(filter, components); subnetworks = Math.max(components.size(), subnetworks); logger.info(components.size() + " subnetworks found for " + encoder + ", " + Helper.getMemInfo()); } markNodesRemovedIfUnreachable(); logger.info("optimize to remove subnetworks (" + subnetworks + "), " + "unvisited-dead-end-nodes (" + unvisitedDeadEnds + "), " + "maxEdges/node (" + maxEdgesPerNode.get() + ")"); ghStorage.optimize(); }
public void doWork() { if (minNetworkSize <= 0 && minOneWayNetworkSize <= 0) return; logger.info("start finding subnetworks (min:" + minNetworkSize + ", min one way:" + minOneWayNetworkSize + ") " + Helper.getMemInfo()); int unvisitedDeadEnds = 0; for (FlagEncoder encoder : encoders) { // mark edges for one vehicle as inaccessible PrepEdgeFilter filter = new PrepEdgeFilter(encoder); if (minOneWayNetworkSize > 0) unvisitedDeadEnds += removeDeadEndUnvisitedNetworks(filter); List<IntArrayList> components = findSubnetworks(filter); keepLargeNetworks(filter, components); subnetworks = Math.max(components.size(), subnetworks); logger.info(components.size() + " subnetworks found for " + encoder + ", " + Helper.getMemInfo()); } markNodesRemovedIfUnreachable(); logger.info("optimize to remove subnetworks (" + subnetworks + "), " + "unvisited-dead-end-nodes (" + unvisitedDeadEnds + "), " + "maxEdges/node (" + maxEdgesPerNode.get() + ")"); ghStorage.optimize(); }
/** * This method removes the access to edges available from the nodes contained in the components. * But only if a components' size is smaller then the specified min value. * <p> * * @return number of removed edges */ int removeEdges(final PrepEdgeFilter bothFilter, List<IntArrayList> components, int min) { // remove edges determined from nodes but only if less than minimum size FlagEncoder encoder = bothFilter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(bothFilter); int removedEdges = 0; for (IntArrayList component : components) { removedEdges += removeEdges(explorer, encoder, component, min); } return removedEdges; }
/** * This method removes the access to edges available from the nodes contained in the components. * But only if a components' size is smaller then the specified min value. * <p> * * @return number of removed edges */ int removeEdges(final PrepEdgeFilter bothFilter, List<IntArrayList> components, int min) { // remove edges determined from nodes but only if less than minimum size FlagEncoder encoder = bothFilter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(bothFilter); int removedEdges = 0; for (IntArrayList component : components) { removedEdges += removeEdges(explorer, encoder, component, min); } return removedEdges; }
IntIndexedContainer oldComponent = null; int allRemoved = 0; FlagEncoder encoder = filter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); for (IntArrayList component : components) {
@Test public void test481() { // 0->1->3->4->5->6 // 2 7<--/ GraphHopperStorage g = createStorage(em); g.edge(0, 1, 1, false); g.edge(1, 2, 1, false); g.edge(2, 0, 1, false); g.edge(1, 3, 1, false); g.edge(3, 4, 1, false); g.edge(4, 5, 1, false); g.edge(5, 6, 1, false); g.edge(6, 7, 1, false); g.edge(7, 4, 1, false); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, Collections.singletonList(carFlagEncoder)). setMinOneWayNetworkSize(2). setMinNetworkSize(4); instance.doWork(); // only one remaining network List<IntArrayList> components = instance.findSubnetworks(new PrepEdgeFilter(carFlagEncoder)); assertEquals(1, components.size()); }
/** * This method removes networks that will be never be visited by this filter. See #235 for * example, small areas like parking lots are sometimes connected to the whole network through a * one-way road. This is clearly an error - but is causes the routing to fail when a point gets * connected to this small area. This routine removes all these networks from the graph. * <p> * * @return number of removed edges */ int removeDeadEndUnvisitedNetworks(final PrepEdgeFilter bothFilter) { StopWatch sw = new StopWatch(bothFilter.getEncoder() + " findComponents").start(); final EdgeFilter outFilter = DefaultEdgeFilter.outEdges(bothFilter.getEncoder()); // partition graph into strongly connected components using Tarjan's algorithm TarjansSCCAlgorithm tarjan = new TarjansSCCAlgorithm(ghStorage, outFilter, true); List<IntArrayList> components = tarjan.findComponents(); logger.info(sw.stop() + ", size:" + components.size()); return removeEdges(bothFilter, components, minOneWayNetworkSize); }
/** * This method removes the access to edges available from the nodes contained in the components. * But only if a components' size is smaller then the specified min value. * <p> * * @return number of removed edges */ int removeEdges(final PrepEdgeFilter bothFilter, List<IntArrayList> components, int min) { // remove edges determined from nodes but only if less than minimum size FlagEncoder encoder = bothFilter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(bothFilter); int removedEdges = 0; for (IntArrayList component : components) { removedEdges += removeEdges(explorer, encoder, component, min); } return removedEdges; }
@Test public void testKeepLargestNetworks() { GraphHopperStorage g = createSubnetworkTestStorage(); PrepEdgeFilter filter = new PrepEdgeFilter(carFlagEncoder); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, Collections.singletonList(carFlagEncoder)); List<IntArrayList> components = instance.findSubnetworks(filter); assertEquals(3, components.size()); int removedEdges = instance.keepLargeNetworks(filter, components); assertEquals(8, removedEdges); instance.markNodesRemovedIfUnreachable(); g.optimize(); assertEquals(8, g.getNodes()); assertEquals(Arrays.<String>asList(), GHUtility.getProblems(g)); components = instance.findSubnetworks(filter); assertEquals(1, components.size()); }
@Test public void testAddEdgesAfterwards() { GraphHopperStorage g = createDeadEndUnvisitedNetworkStorage(em); assertEquals(11, g.getNodes()); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, Collections.singletonList(carFlagEncoder)). setMinOneWayNetworkSize(3); int removed = instance.removeDeadEndUnvisitedNetworks(new PrepEdgeFilter(carFlagEncoder)); assertEquals(3, removed); instance.markNodesRemovedIfUnreachable(); g.optimize(); assertEquals(8, g.getNodes()); assertTrue(isConsistent(g)); g.edge(7,8); assertTrue(isConsistent(g)); }
@Test public void testNodeOrderingRegression() { // 1 -> 2 -> 0 GraphHopperStorage g = createStorage(em); g.edge(1, 2, 1, false); g.edge(2, 0, 1, false); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, Collections.singletonList(carFlagEncoder)). setMinOneWayNetworkSize(2); int removedEdges = instance.removeDeadEndUnvisitedNetworks(new PrepEdgeFilter(carFlagEncoder)); assertEquals(2, removedEdges); }
@Test public void testFindSubnetworks() { GraphHopperStorage g = createSubnetworkTestStorage(); PrepEdgeFilter filter = new PrepEdgeFilter(carFlagEncoder); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, Collections.singletonList(carFlagEncoder)); List<IntArrayList> components = instance.findSubnetworks(filter); assertEquals(3, components.size()); // start is at 0 => large network assertEquals(IntArrayList.from(0, 7, 3, 13, 5), components.get(0)); // next smallest and unvisited node is 1 => big network assertEquals(IntArrayList.from(1, 8, 4, 2, 11, 12, 9, 15), components.get(1)); assertEquals(IntArrayList.from(6, 14, 10), components.get(2)); }