public void TestTwoEdgesRightHighest() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 100, null, Constants.NO_VERTEX); // create algorithm and run. var algorithm = new Itinero.Algorithms.Contracted.Dykstra(graph, new EdgePath <float>[] { new EdgePath <float>(0) }, true); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(algorithm.TryGetVisit(0, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.IsTrue(algorithm.TryGetVisit(1, out visit)); Assert.AreEqual(100, visit.Weight); Assert.AreEqual(1, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(0, visit.From.Vertex); Assert.IsTrue(algorithm.TryGetVisit(2, out visit)); Assert.AreEqual(200, visit.Weight); Assert.AreEqual(2, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(1, visit.From.Vertex); // create algorithm and run. algorithm = new Itinero.Algorithms.Contracted.Dykstra(graph, new EdgePath <float>[] { new EdgePath <float>(0) }, false); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsTrue(algorithm.TryGetVisit(0, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.IsTrue(algorithm.TryGetVisit(1, out visit)); Assert.AreEqual(100, visit.Weight); Assert.AreEqual(1, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(0, visit.From.Vertex); Assert.IsTrue(algorithm.TryGetVisit(2, out visit)); Assert.AreEqual(200, visit.Weight); Assert.AreEqual(2, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(1, visit.From.Vertex); }
/// <summary> /// Executes the actual run. /// </summary> protected override void DoRun(CancellationToken cancellationToken) { // put in default weights and weights for one-edge-paths. _paths = new Solution[_sources.Length][]; for (var i = 0; i < _sources.Length; i++) { var source = _sources[i]; _paths[i] = new Solution[_targets.Length]; for (var j = 0; j < _targets.Length; j++) { var target = _targets[j]; if (target.EdgeId == source.EdgeId) { var path = source.EdgePathTo(_routerDb, _weightHandler, target); if (path != null) { _paths[i][j] = new Solution() { Path = path }; } } } } // do forward searches into buckets. for (var i = 0; i < _sources.Length; i++) { var forward = new Dykstra <T>(_graph, _weightHandler, _sources[i].ToEdgePaths(_routerDb, _weightHandler, true), false, _max); forward.WasFound += (path) => { return(this.ForwardVertexFound(i, path)); }; forward.Run(cancellationToken); } // do backward searches into buckets. for (var i = 0; i < _targets.Length; i++) { var backward = new Dykstra <T>(_graph, _weightHandler, _targets[i].ToEdgePaths(_routerDb, _weightHandler, false), true, _max); backward.WasFound += (path) => { return(this.BackwardVertexFound(i, path)); }; backward.Run(cancellationToken); } this.HasSucceeded = true; }
/// <summary> /// Executes the actual run. /// </summary> protected override void DoRun() { // put in default weights and weights for one-edge-paths. _weights = new T[_sources.Length][]; for (var i = 0; i < _sources.Length; i++) { var source = _sources[i]; _weights[i] = new T[_targets.Length]; for (var j = 0; j < _targets.Length; j++) { var target = _targets[j]; _weights[i][j] = _weightHandler.Infinite; if (target.EdgeId == source.EdgeId) { var path = source.EdgePathTo(_routerDb, _weightHandler, target); if (path != null) { _weights[i][j] = path.Weight; } } } } // do forward searches into buckets. for (var i = 0; i < _sources.Length; i++) { var forward = new Dykstra <T>(_graph, _weightHandler, _sources[i].ToEdgePaths(_routerDb, _weightHandler, true), false); forward.WasFound += (vertex, weight) => { return(this.ForwardVertexFound(i, vertex, weight)); }; forward.Run(); } // do backward searches into buckets. for (var i = 0; i < _targets.Length; i++) { var backward = new Dykstra <T>(_graph, _weightHandler, _targets[i].ToEdgePaths(_routerDb, _weightHandler, false), true); backward.WasFound += (vertex, weight) => { return(this.BackwardVertexFound(i, vertex, weight)); }; backward.Run(); } this.HasSucceeded = true; }