def main(args): parser = argparse.ArgumentParser() parser.add_argument('output', metavar='graph.pickle', help='Ouput graph file') parser.add_argument( '--connection', default='postgresql://*****:*****@localhost/osrm', help='Postgres connection string. Default %(default)s') parser.add_argument('--prune', action='store_true', help='Collapse redundant edges, prune tails') parser.add_argument('--verbose', action='store_true', help='Increase logging level') args = parser.parse_args() logging.basicConfig( level=logging.INFO if args.verbose else logging.WARNING) log.info("Creating DB engine") engine = create_engine(args.connection, echo=False) log.info("Creating DB session") Session = sessionmaker(bind=engine) session = Session() g = build_graph(session) if args.prune: log.info("Collapsing unidirectional strings") pruned = graphtools.collapse_degree_2_vtxs(g) log.info("Removed %i thru-nodes", pruned) log.info("Collapsing bidirectional strings") pruned = graphtools.collapse_bidirectional_streets(g) log.info("Removed %i thru-nodes", pruned) log.info("Snipping tails") snipped = graphtools.delete_degree_1_vtxs(g) log.info("Removed %i tails", snipped) loners = graphtools.delete_degree_0_vtxs(g) log.info("Removed %i loner-nodes (should be zero)", loners) redundancies = graphtools.identify_rendudant_nodes(g) log.info("Marked %i nodes as redundant", redundancies) log.info("Saving graph to %s", args.output) g.save(args.output)
def main(args): parser = argparse.ArgumentParser() parser.add_argument('output', metavar='graph.pickle', help='Ouput graph file') parser.add_argument( '--connection', default='postgresql://*****:*****@localhost/osrm', help='Postgres connection string. Default %(default)s' ) parser.add_argument('--prune', action='store_true', help='Collapse redundant edges, prune tails') parser.add_argument('--verbose', action='store_true', help='Increase logging level') args = parser.parse_args() logging.basicConfig( level=logging.INFO if args.verbose else logging.WARNING) log.info("Creating DB engine") engine = create_engine(args.connection, echo=False) log.info("Creating DB session") Session = sessionmaker(bind=engine) session = Session() g = build_graph(session) if args.prune: log.info("Collapsing unidirectional strings") pruned = graphtools.collapse_degree_2_vtxs(g) log.info("Removed %i thru-nodes", pruned) log.info("Collapsing bidirectional strings") pruned = graphtools.collapse_bidirectional_streets(g) log.info("Removed %i thru-nodes", pruned) log.info("Snipping tails") snipped = graphtools.delete_degree_1_vtxs(g) log.info("Removed %i tails", snipped) loners = graphtools.delete_degree_0_vtxs(g) log.info("Removed %i loner-nodes (should be zero)", loners) redundancies = graphtools.identify_rendudant_nodes(g) log.info("Marked %i nodes as redundant", redundancies) log.info("Saving graph to %s", args.output) g.save(args.output)
def test_collapse_bidirectional_streets(): g = igraph.Graph(directed=True) # Make a 1x3 rectangle, where the length-3 edges are bidirectional g.add_vertices(8) # unidirectional ends g.add_edges([ (0, 1), (4, 5) ]) # bidirectional side #1. Let's make it # so only 2/3 of this side is bi-directional g.add_edges([ # zero has degree 3 (0, 7), (7, 0), (6, 7), (7, 6), (6, 5), # missing (5, 6), so we should # only collapse node 7. ]) # fully bidirectional side #2. g.add_edges([ # one has degree 3 (1, 2), (2, 1), (2, 3), (3, 2), (3, 4), (4, 3), ]) # sides have flow=2 # top has flow=3 # bottom has flow=4 g.es["weight"] = [2]*2 + [3]*5 + [4]*6 eq_(len(g.vs), 8) eq_(len(g.es), 13) ret = gt.collapse_bidirectional_streets(g) eq_(ret, 3) eq_(len(g.vs), 5) eq_(len(g.es), 7)