in libs/apls/apls.py [0:0]
def make_graphs(G_gt_, G_p_,
weight='length',
speed_key='inferred_speed_mps',
travel_time_key='travel_time_s',
max_nodes_for_midpoints=500,
linestring_delta=50,
is_curved_eps=0.012,
max_snap_dist=4,
allow_renaming=True,
verbose=False,
super_verbose=False):
"""
Match nodes in ground truth and propsal graphs, and get paths.
Notes
-----
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_nodes_for_midpoints : 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.
linestring_delta : float
Distance in meters between linestring midpoints.
If len gt nodes > max_nodes_for_midppoints this argument is ignored.
Defaults to ``50``.
is_curved_eps : float
Minumum curvature for injecting nodes (if curvature is less than this
value, no midpoints will be injected). If < 0, always inject points
on line, regardless of curvature.
If len gt nodes > max_nodes_for_midppoints this argument is ignored.
Defaults to ``0.012``.
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, data) in enumerate(G_gt_.edges(keys=False, data=True)):
if weight not in data.keys():
print("Error!", weight, "not in G_gt_ edge u, v, data:", u, v, data)
return
for i, (u, v, key, data) in enumerate(G_gt_.edges(keys=True, data=True)):
try:
line = data['geometry']
except KeyError:
line = data[0]['geometry']
if type(line) == str: # or type(line) == unicode:
data['geometry'] = shapely.wkt.loads(line)
# create graph with midpoints
G_gt0 = create_edge_linestrings(G_gt_.to_undirected())
if verbose:
print("len G_gt.nodes():", len(list(G_gt0.nodes())))
print("len G_gt.edges():", len(list(G_gt0.edges())))
if verbose:
print("Creating gt midpoints")
G_gt_cp0, xms, yms = create_graph_midpoints(
G_gt0.copy(),
linestring_delta=linestring_delta,
is_curved_eps=is_curved_eps,
verbose=False)
# add travel time
G_gt_cp = add_travel_time(G_gt_cp0.copy(),
speed_key=speed_key,
travel_time_key=travel_time_key)
# get ground truth control points
control_points_gt = []
for n in G_gt_cp.nodes():
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))
# get ground truth paths
if verbose:
print("Get ground truth paths...")
all_pairs_lengths_gt_native = dict(
nx.shortest_path_length(G_gt_cp, weight=weight))
###############
# Proposal
for i, (u, v, data) in enumerate(G_p_.edges(keys=False, data=True)):
if weight not in data.keys():
print("Error!", weight, "not in G_p_ edge u, v, data:", u, v, data)
return
# get proposal graph with native midpoints
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)
G_p0 = create_edge_linestrings(G_p_.to_undirected())
# add travel time
G_p = add_travel_time(G_p0.copy(),
speed_key=speed_key,
travel_time_key=travel_time_key)
if verbose:
print("len G_p.nodes():", len(G_p.nodes()))
print("len G_p.edges():", len(G_p.edges()))
if verbose:
print("Creating proposal midpoints")
G_p_cp0, xms_p, yms_p = create_graph_midpoints(
G_p.copy(),
linestring_delta=linestring_delta,
is_curved_eps=is_curved_eps,
verbose=False)
# add travel time
G_p_cp = add_travel_time(G_p_cp0.copy(),
speed_key=speed_key,
travel_time_key=travel_time_key)
if verbose:
print("len G_p_cp.nodes():", len(G_p_cp.nodes()))
print("len G_p_cp.edges():", len(G_p_cp.edges()))
# set proposal control nodes, originally just all nodes in G_p_cp
# original method sets proposal control points as all nodes in G_p_cp
# get proposal control points
control_points_prop = []
for n in G_p_cp.nodes():
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])
# get paths
all_pairs_lengths_prop_native = dict(
nx.shortest_path_length(G_p_cp, weight=weight))
###############
# insert gt control points into proposal
if verbose:
print("Inserting", len(control_points_gt),
"control points into G_p...")
print("G_p.nodes():", G_p.nodes())
G_p_cp_prime0, 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_prime0.copy(),
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_prime0, 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)
# add travel time
G_gt_cp_prime = add_travel_time(G_gt_cp_prime0.copy(),
speed_key=speed_key,
travel_time_key=travel_time_key)
###############
# get paths
all_pairs_lengths_gt_prime = dict(
nx.shortest_path_length(G_gt_cp_prime, weight=weight))
all_pairs_lengths_prop_prime = dict(
nx.shortest_path_length(G_p_cp_prime, weight=weight))
tf = time.time()
if verbose:
print("Time to run make_graphs 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