Source code for aequilibrae.paths.multi_threaded_aon
import numpy as np
[docs]
class MultiThreadedAoN:
def __init__(self):
# The predecessors for each node in the graph
self.predecessors = np.array([])
# holds the skims for all nodes in the network (during path finding)
self.temporary_skims = np.array([])
# Keeps the order in which the nodes were reached for the cascading network loading
self.reached_first = np.array([])
# The previous link for each node in the tree
self.connectors = np.array([])
# Temporary results for assignment. Necessary for parallelization
self.temp_link_loads = np.array([])
# Temporary nodes for assignment. Necessary for cascading
self.temp_node_loads = np.array([])
# holds the b_nodes in case of flows through centroid connectors are blocked
self.temp_b_nodes = np.array([])
# Temporary array which stores whether a link is accessed in a path for Select Link Analysis functionality
self.has_flow_mask = np.array([])
# Stores all selected link sets in one array
self.select_links = np.array([])
# Stores all select link OD matrices
self.temp_sl_od_matrix = np.array([])
# Stores all link loading matrices
self.temp_sl_link_loading = np.array([])
# Maps the names of the SL link sets to array indices
self.sl_idx = {}
# In case we want to do by hand, we can prepare each method individually
[docs]
def prepare(self, graph, results):
itype = graph.default_types("int")
ftype = graph.default_types("float")
self.predecessors = np.zeros((results.cores, results.compact_nodes), dtype=itype)
if results._selected_links:
self.has_flow_mask = np.zeros((results.cores, graph.compact_num_links), dtype=bool)
# Copying the select link matrices from results
self.select_links = results.select_links
self.temp_sl_od_matrix = np.zeros(
(
results.cores,
len(results._selected_links),
graph.num_zones,
graph.num_zones,
results.classes["number"],
),
dtype=graph.default_types("float"),
)
self.temp_sl_link_loading = np.zeros(
(results.cores, len(results._selected_links), graph.compact_num_links, results.classes["number"]),
dtype=graph.default_types("float"),
)
if results.num_skims > 0:
self.temporary_skims = np.zeros((results.cores, results.compact_nodes, results.num_skims), dtype=ftype)
else:
self.temporary_skims = np.zeros((results.cores, 1, 1), dtype=ftype)
self.reached_first = np.zeros((results.cores, results.compact_nodes), dtype=itype)
self.connectors = np.zeros((results.cores, results.compact_nodes), dtype=itype)
self.temp_link_loads = np.zeros((results.cores, results.links + 1, results.classes["number"]), dtype=ftype)
self.temp_node_loads = np.zeros((results.cores, results.compact_nodes, results.classes["number"]), dtype=ftype)
self.temp_b_nodes = np.zeros((results.cores, graph.compact_graph.b_node.shape[0]), dtype=itype)
for i in range(results.cores):
self.temp_b_nodes[i, :] = graph.compact_graph.b_node.values[:]