/// <summary> /// Calculates a many-to-many weight matrix using a dual edge-based graph. /// </summary> internal static Result <T[][]> CalculateManyToMany <T>(this ContractedDb contractedDb, RouterDb routerDb, Profile profile, WeightHandler <T> weightHandler, RouterPoint[] sources, RouterPoint[] targets, T max, CancellationToken cancellationToken) where T : struct { if (!(contractedDb.HasNodeBasedGraph && contractedDb.NodeBasedIsEdgedBased)) { throw new ArgumentOutOfRangeException("No dual edge-based graph was found!"); } var dykstraSources = new DykstraSource <T> [sources.Length]; for (var i = 0; i < sources.Length; i++) { dykstraSources[i] = sources[i].ToDualDykstraSource(routerDb, weightHandler, true); } var dykstraTargets = new DykstraSource <T> [targets.Length]; for (var i = 0; i < targets.Length; i++) { dykstraTargets[i] = targets[i].ToDualDykstraSource(routerDb, weightHandler, true); } // calculate weights. var algorithm = new ManyToMany.VertexToVertexWeightAlgorithm <T>(contractedDb.NodeBasedGraph, weightHandler, dykstraSources, dykstraTargets, weightHandler.Infinite); algorithm.Run(cancellationToken); // extract the best weight for each edge pair. return(new Result <T[][]>(algorithm.Weights)); }
/// <summary> /// Creates a new contracted bidirectional router. /// </summary> public BidirectionalDykstra(DirectedMetaGraph graph, WeightHandler <T> weightHandler, DykstraSource <T> source, DykstraSource <T> target) { weightHandler.CheckCanUse(graph); _graph = graph; _source = source; _target = target; _weightHandler = weightHandler; }
/// <summary> /// Creates a new routing algorithm instance. /// </summary> public Dykstra(DirectedMetaGraph graph, WeightHandler <T> weightHandler, DykstraSource <T> source, bool backward, T max) { weightHandler.CheckCanUse(graph); _graph = graph; _source = source; _backward = backward; _weightHandler = weightHandler; _max = max; }
/// <summary> /// Converts all the router points to vertex and weights with vertex id being the directed edge id. This results in one dykstra source of this routerpoint. /// </summary> public static DykstraSource <T>[] ToDualDykstraSources <T>(this RouterPoint[] points, RouterDb routerDb, WeightHandler <T> weightHandler, bool asSource) where T : struct { var results = new DykstraSource <T> [points.Length]; for (var i = 0; i < points.Length; i++) // TODO: this only reads stuff, perfect to parallelise { results[i] = points[i].ToDualDykstraSource(routerDb, weightHandler, asSource); } return(results); }
/// <summary> /// Converts directed edge id's into an array of dykstra sources. /// </summary> public static DykstraSource <T>[] ToDykstraSources <T>(this List <DirectedEdgeId> edges) where T : struct { var result = new DykstraSource <T> [edges.Count]; for (var i = 0; i < result.Length; i++) { result[i] = new DykstraSource <T>(edges[i].Raw); } return(result); }