in libs/apls/apls.py [0:0]
def make_graphs_yuge(G_gt, G_p,
weight='length',
speed_key='inferred_speed_mps',
travel_time_key='travel_time_s',
max_nodes=500,
max_snap_dist=4,
allow_renaming=True,
verbose=True, super_verbose=False):
"""
Match nodes in large ground truth and propsal graphs, and get paths.
Notes
-----
Skip midpoint injection and only select a subset of routes to compare.
The path length dictionaries returned by this function will be fed into
compute_metric().
Arguments
---------
G_gt : networkx graph
Ground truth graph.
G_p : networkd graph
Proposal graph over the same region.
weight : str
Key in the edge properties dictionary to use for the path length
weight. Defaults to ``'length'``.
speed_key : str
Key in the edge properties dictionary to use for the edge speed.
Defaults to ``'inferred_speed_mps'``.
travel_time_key : str
Name to assign travel time in the edge properties dictionary.
Defaults to ``'travel_time_s'``.
max_nodess : int
Maximum number of gt nodes to inject midpoints. If there are more
gt nodes than this, skip midpoints and use this number of points
to comput APLS.
max_snap_dist : float
Maximum distance a node can be snapped onto a graph.
Defaults to ``4``.
allow_renameing : boolean
Switch to allow renaming of an existing node with node_id if the
existing node is closest to the point. Defaults to ``False``.
verbose : boolean
Switch to print relevant values to screen. Defaults to ``False``.
super_verbose : boolean
Switch to print mucho values to screen. Defaults to ``False``.
Return
------
G_gt_cp, G_p_cp, G_gt_cp_prime, G_p_cp_prime, \
control_points_gt, control_points_prop, \
all_pairs_lengths_gt_native, all_pairs_lengths_prop_native, \
all_pairs_lengths_gt_prime, all_pairs_lengths_prop_prime : tuple
G_gt_cp is ground truth with control points inserted
G_p_cp is proposal with control points inserted
G_gt_cp_prime is ground truth with control points from prop inserted
G_p_cp_prime is proposal with control points from gt inserted
all_pairs_lengths_gt_native is path length dict corresponding to G_gt_cp
all_pairs_lengths_prop_native is path length dict corresponding to G_p_cp
all_pairs_lengths_gt_prime is path length dict corresponding to G_gt_cp_prime
all_pairs_lenfgths_prop_prime is path length dict corresponding to G_p_cp_prime
"""
t0 = time.time()
for i, (u, v, key, data) in enumerate(G_gt.edges(keys=True, data=True)):
try:
line = data['geometry']
except:
line = data[0]['geometry']
if type(line) == str: # or type(line) == unicode:
data['geometry'] = shapely.wkt.loads(line)
for i, (u, v, key, data) in enumerate(G_p.edges(keys=True, data=True)):
try:
line = data['geometry']
except:
line = data[0]['geometry']
if type(line) == str: # or type(line) == unicode:
data['geometry'] = shapely.wkt.loads(line)
# create graph with linestrings?
G_gt_cp = G_gt.to_undirected()
if verbose:
print("len(G_gt.nodes()):", len(G_gt_cp.nodes()))
print("len(G_gt.edges()):", len(G_gt_cp.edges()))
# gt node and edge props
node = random.choice(list(G_gt.nodes()))
print("node:", node, "G_gt random node props:", G_gt.nodes[node])
edge_tmp = random.choice(list(G_gt.edges()))
print("G_gt edge_tmp:", edge_tmp)
try:
print("edge:", edge_tmp, "G_gt random edge props:",
G_gt.edges[edge_tmp[0]][edge_tmp[1]])
except:
try:
print("edge:", edge_tmp, "G_gt random edge props:",
G_gt.edges[edge_tmp[0], edge_tmp[1], 0])
except:
pass
# prop node and edge props
node = random.choice(list(G_p.nodes()))
print("node:", node, "G_p random node props:", G_p.nodes[node])
edge_tmp = random.choice(list(G_p.edges()))
print("G_p edge_tmp:", edge_tmp)
try:
print("edge:", edge_tmp, "G_p random edge props:",
G_p.edges[edge_tmp[0]][edge_tmp[1]])
except:
try:
print("edge:", edge_tmp, "G_p random edge props:",
G_p.edges[edge_tmp[0], edge_tmp[1], 0])
except:
pass
# get ground truth control points, which will be a subset of nodes
sample_size = min(max_nodes, len(G_gt_cp.nodes()))
rand_nodes_gt = random.sample(G_gt_cp.nodes(), sample_size)
rand_nodes_gt_set = set(rand_nodes_gt)
control_points_gt = []
for itmp,n in enumerate(rand_nodes_gt):
if verbose and (i % 20) == 0:
print ("control_point", itmp, ":", n, ":", G_gt_cp.nodes[n])
u_x, u_y = G_gt_cp.nodes[n]['x'], G_gt_cp.nodes[n]['y']
control_points_gt.append([n, u_x, u_y])
if verbose:
print("len control_points_gt:", len(control_points_gt))
# add travel time
G_gt_cp = add_travel_time(G_gt_cp,
speed_key=speed_key,
travel_time_key=travel_time_key)
# get route lengths between all control points
# gather all paths from nodes of interest, keep only routes to control nodes
tt = time.time()
if verbose:
print("Computing all_pairs_lengths_gt_native...")
all_pairs_lengths_gt_native = {}
for itmp, source in enumerate(rand_nodes_gt):
if verbose and ((itmp % 50) == 0):
print((itmp, "source:", source))
paths_tmp = nx.single_source_dijkstra_path_length(
G_gt_cp, source, weight=weight)
# delete items
for k in list(paths_tmp.keys()):
if k not in rand_nodes_gt_set:
del paths_tmp[k]
all_pairs_lengths_gt_native[source] = paths_tmp
if verbose:
print(("Time to compute all source routes for",
sample_size, "nodes:", time.time() - tt, "seconds"))
###############
# get proposal graph with native midpoints
G_p_cp = G_p.to_undirected()
if verbose:
print("len G_p_cp.nodes():", len(G_p_cp.nodes()))
print("G_p_cp.edges():", len(G_p_cp.edges()))
# get control points, which will be a subset of nodes
# (original method sets proposal control points as all nodes in G_p_cp)
sample_size = min(max_nodes, len(G_p_cp.nodes()))
rand_nodes_p = random.sample(G_p_cp.nodes(), sample_size)
rand_nodes_p_set = set(rand_nodes_p)
control_points_prop = []
for n in rand_nodes_p:
u_x, u_y = G_p_cp.nodes[n]['x'], G_p_cp.nodes[n]['y']
control_points_prop.append([n, u_x, u_y])
# add travel time
G_p_cp = add_travel_time(G_p_cp,
speed_key=speed_key,
travel_time_key=travel_time_key)
# get paths
# gather all paths from nodes of interest, keep only routes to control nodes
tt = time.time()
if verbose:
print("Computing all_pairs_lengths_prop_native...")
all_pairs_lengths_prop_native = {}
for itmp, source in enumerate(rand_nodes_p):
if verbose and ((itmp % 50) == 0):
print((itmp, "source:", source))
paths_tmp = nx.single_source_dijkstra_path_length(
G_p_cp, source, weight=weight)
# delete items
for k in list(paths_tmp.keys()):
if k not in rand_nodes_p_set:
del paths_tmp[k]
all_pairs_lengths_prop_native[source] = paths_tmp
if verbose:
print(("Time to compute all source routes for",
max_nodes, "nodes:", time.time() - tt, "seconds"))
###############
# insert gt control points into proposal
if verbose:
print("Inserting", len(control_points_gt),
"control points into G_p...")
print("len G_p.nodes():", len(G_p.nodes()))
G_p_cp_prime, xn_p, yn_p = insert_control_points(
G_p.copy(), control_points_gt, max_distance_meters=max_snap_dist,
allow_renaming=allow_renaming, verbose=super_verbose)
# add travel time
G_p_cp_prime = add_travel_time(G_p_cp_prime,
speed_key=speed_key,
travel_time_key=travel_time_key)
###############
# now insert control points into ground truth
if verbose:
print("\nInserting", len(control_points_prop),
"control points into G_gt...")
# permit renaming of inserted nodes if coincident with existing node
G_gt_cp_prime, xn_gt, yn_gt = insert_control_points(
G_gt, control_points_prop, max_distance_meters=max_snap_dist,
allow_renaming=allow_renaming, verbose=super_verbose)
G_gt_cp_prime = add_travel_time(G_gt_cp_prime,
speed_key=speed_key,
travel_time_key=travel_time_key)
###############
# get paths for graphs_prime
# gather all paths from nodes of interest, keep only routes to control nodes
# gt_prime
tt = time.time()
all_pairs_lengths_gt_prime = {}
if verbose:
print("Computing all_pairs_lengths_gt_prime...")
G_gt_cp_prime_nodes_set = set(G_gt_cp_prime.nodes())
for itmp, source in enumerate(rand_nodes_p_set):
if verbose and ((itmp % 50) == 0):
print((itmp, "source:", source))
if source in G_gt_cp_prime_nodes_set:
paths_tmp = nx.single_source_dijkstra_path_length(
G_gt_cp_prime, source, weight=weight)
# delete items
for k in list(paths_tmp.keys()):
if k not in rand_nodes_p_set:
del paths_tmp[k]
all_pairs_lengths_gt_prime[source] = paths_tmp
if verbose:
print(("Time to compute all source routes for",
max_nodes, "nodes:", time.time() - tt, "seconds"))
# prop_prime
tt = time.time()
all_pairs_lengths_prop_prime = {}
if verbose:
print("Computing all_pairs_lengths_prop_prime...")
G_p_cp_prime_nodes_set = set(G_p_cp_prime.nodes())
for itmp, source in enumerate(rand_nodes_gt_set):
if verbose and ((itmp % 50) == 0):
print((itmp, "source:", source))
if source in G_p_cp_prime_nodes_set:
paths_tmp = nx.single_source_dijkstra_path_length(
G_p_cp_prime, source, weight=weight)
# delete items
for k in list(paths_tmp.keys()):
if k not in rand_nodes_gt_set:
del paths_tmp[k]
all_pairs_lengths_prop_prime[source] = paths_tmp
if verbose:
print(("Time to compute all source routes for",
max_nodes, "nodes:", time.time() - tt, "seconds"))
###############
tf = time.time()
if verbose:
print("Time to run make_graphs_yuge in apls.py:", tf - t0, "seconds")
return G_gt_cp, G_p_cp, G_gt_cp_prime, G_p_cp_prime, \
control_points_gt, control_points_prop, \
all_pairs_lengths_gt_native, all_pairs_lengths_prop_native, \
all_pairs_lengths_gt_prime, all_pairs_lengths_prop_prime