Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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);
        }