ch-router
A router based on Contraction Hierarchies with optional path unfolding and "hot groups".
CH creation
To create the Contraction Hierarchies you need to provide a list of nodes and edges:
let nodes = ;
let edges = ;
let max_speed = 30.0; // pass f32::MAX if unknown
let ch = new;
Routing
Basic routing is done with the route method:
let Route = router.route.unwrap;
If you don't need the actual path, you can use the distance method (it is recommended to disable the path-unfolding feature in this case):
let distance = router.distance.unwrap;
Both methods are also available on the Router struct, which will reuse allocations, so it may be faster for multiple queries:
let mut router = new;
let distance = router.distance.unwrap;
let route = router.route.unwrap;
Hot groups
Hot groups are a way to greatly accelerate routing queries for a subset of nodes. This comes at a much larger memory cost per node, because it caches the bidirectional dijkstra results, but will yield about 100x faster queries. Hot groups can be created with the create_hot_group method by passing the desired subset of nodes:
let hot_group = ch.create_hot_group;
Distance can then be queried within the group:
let distance = hot_group.distance.unwrap;
Path routing is not supported for hot groups for now.
[!IMPORTANT] The node indices passed to
hot_group.distancerefer to the nodes' indices within the slice passed tocreate_hot_group, not the indices of the nodes in the original contraction hierarchy.
Saving and loading
Contraction hierarchies can be saved and loaded from disk:
let ch = new;
ch.save.unwrap;
let ch = load.unwrap;