Source code for aequilibrae.transit.functions.path_storage

from collections import OrderedDict


[docs] class PathStorage: """ This class is designed to store path-computation objects to take advantage of the fact that AequilibraE preserves the entire shortest path tree when computing a path between two nodes and can re-trace the same tree for a path from the same origin to a different destination. Since this caching in memory can take too much memory, the *threshold* parameter exists to limit the number of path objects kept in memory. If you have a large amount of memory in your system, you can set the threshold class variable accordingly. """ def __init__(self): self.graphs = {} self.storage = OrderedDict() self.uses = 0 self.total_paths = 0 self.threshold = 50
[docs] def add_graph(self, graph, mode_id): if mode_id in self.graphs: return self.graphs[mode_id] = graph self.storage[mode_id] = OrderedDict()
[docs] def get_path_results(self, origin, mode_id): from aequilibrae.paths import PathResults self.uses += 1 if origin in self.storage[mode_id]: # We move the last used element from the list to the most recent position self.storage[mode_id].move_to_end(origin, last=True) return self.storage[mode_id][origin] # We check if our cache is getting too large stored_values = [len(data) for data in self.storage.values()] if sum(stored_values) > self.threshold: # If we reached the maximum number of paths to store, we remove the element that has not been used # in the longest time from the mode ID with the biggest cache mode_to_clean = list(self.storage.keys())[stored_values.index(max(stored_values))] self.storage[mode_to_clean].clear() graph = self.graphs[mode_id] res = PathResults() res.prepare(graph) d = graph.centroids[0] if origin != graph.centroids[0] else graph.centroids[1] res.compute_path(origin, d) self.storage[mode_id][origin] = res self.total_paths += 1 return res
[docs] def clear(self): self.storage.clear() self.graphs.clear() self.uses = 0 self.total_paths = 0