Esempio n. 1
0
        public void TestOneHop()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            var edge1 = graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            var edge2 = graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new DirectedDykstra <float>(graph, new DefaultWeightHandler((profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }), new Itinero.Algorithms.Restrictions.RestrictionCollection((c, v) => false), new DirectedEdgeId(edge1, true), float.MaxValue, false);

            dykstra.WasFound = (p, e, w) =>
            {
                if (e.EdgeId == edge1)
                {
                    Assert.AreEqual(true, e.Forward);
                    Assert.AreEqual(0, w);
                }
                else if (e.EdgeId == edge2)
                {
                    Assert.AreEqual(true, e.Forward);
                    Assert.AreEqual(100, w);
                }
                return(false);
            };
            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
        }
Esempio n. 2
0
        public void TestSerialize()
        {
            var edgeData = new EdgeData()
            {
                Distance = 100.1f,
                Profile  = 12
            };

            var data = EdgeDataSerializer.Serialize(edgeData);

            Assert.IsNotNull(data);
            Assert.AreEqual(1, data.Length);
            Assert.AreEqual((uint)16384 * (uint)(edgeData.Distance * 10) + (uint)edgeData.Profile,
                            data[0]);

            edgeData = new EdgeData()
            {
                Distance = 0f,
                Profile  = 12
            };

            data = EdgeDataSerializer.Serialize(edgeData);
            Assert.IsNotNull(data);
            Assert.AreEqual(1, data.Length);
            Assert.AreEqual((uint)16384 * (uint)(edgeData.Distance * 10) + (uint)edgeData.Profile,
                            data[0]);

            edgeData = new EdgeData()
            {
                Distance = EdgeDataSerializer.MAX_DISTANCE,
                Profile  = EdgeDataSerializer.MAX_PROFILE_COUNT - 1
            };

            data = EdgeDataSerializer.Serialize(edgeData);
            Assert.IsNotNull(data);
            Assert.AreEqual(1, data.Length);
            Assert.AreEqual((uint)16384 * (uint)(edgeData.Distance * 10) + (uint)edgeData.Profile,
                            data[0]);

            edgeData = new EdgeData()
            {
                Distance = EdgeDataSerializer.MAX_DISTANCE + 0.1f,
                Profile  = EdgeDataSerializer.MAX_PROFILE_COUNT - 1
            };

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                EdgeDataSerializer.Serialize(edgeData);
            });
            edgeData = new EdgeData()
            {
                Distance = EdgeDataSerializer.MAX_DISTANCE,
                Profile  = EdgeDataSerializer.MAX_PROFILE_COUNT
            };
            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                EdgeDataSerializer.Serialize(edgeData);
            });
        }
        public void TestOneEdgeAugmented()
        {
            // build graph.
            var graph = new Itinero.Graphs.Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, FactorAndSpeed> getFactor = (x) =>
            {
                return(new FactorAndSpeed()
                {
                    Direction = 0,
                    SpeedFactor = 1.0f / speed,
                    Value = 1.0f / speed
                });
            };

            // convert graph.
            var directedGraph = new DirectedDynamicGraph(ContractedEdgeDataSerializer.DynamicAugmentedFixedSize);
            var algorithm     = new DirectedGraphBuilder <Weight>(graph, directedGraph, new WeightHandler(getFactor));

            algorithm.Run();

            // check result.
            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            directedGraph.Compress();
            Assert.AreEqual(2, directedGraph.VertexCount);
            Assert.AreEqual(2, directedGraph.EdgeCount);

            // verify all edges.
            var edges = directedGraph.GetEdgeEnumerator(0);

            Assert.AreEqual(1, edges.Count());
            var data = ContractedEdgeDataSerializer.SerializeDynamicAugmented(100 * getFactor(1).Value, null, 100, 100 * getFactor(1).Value);

            Assert.AreEqual(data[0], edges.First().Data[0]);
            Assert.AreEqual(data[1], edges.First().Data[1]);
            Assert.AreEqual(data[2], edges.First().Data[2]);
            Assert.AreEqual(1, edges.First().Neighbour);

            edges = directedGraph.GetEdgeEnumerator(1);
            Assert.AreEqual(1, edges.Count());
            data = ContractedEdgeDataSerializer.SerializeDynamicAugmented(100 * getFactor(1).Value, null, 100, 100 * getFactor(1).Value);
            Assert.AreEqual(data[0], edges.First().Data[0]);
            Assert.AreEqual(data[1], edges.First().Data[1]);
            Assert.AreEqual(data[2], edges.First().Data[2]);
            Assert.AreEqual(0, edges.First().Neighbour);
        }
Esempio n. 4
0
        public void TestOneEdge()
        {
            // build graph.
            var graph = new Itinero.Graphs.Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // convert graph.
            var directedGraph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size,
                                                      ContractedEdgeDataSerializer.MetaSize);
            var algorithm = new DirectedGraphBuilder(graph, directedGraph, getFactor);

            algorithm.Run();

            // check result.
            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            directedGraph.Compress();
            Assert.AreEqual(2, directedGraph.VertexCount);
            Assert.AreEqual(2, directedGraph.EdgeCount);

            // verify all edges.
            var edges = directedGraph.GetEdgeEnumerator(0);

            Assert.AreEqual(1, edges.Count);
            var data = ContractedEdgeDataSerializer.Serialize(100 * getFactor(1).Value, null);

            Assert.AreEqual(data, edges.First().Data[0]);
            Assert.AreEqual(Constants.NO_VERTEX, edges.First().MetaData[0]);
            Assert.AreEqual(1, edges.First().Neighbour);

            edges = directedGraph.GetEdgeEnumerator(1);
            Assert.AreEqual(1, edges.Count);
            data = ContractedEdgeDataSerializer.Serialize(100 * getFactor(1).Value, null);
            Assert.AreEqual(data, edges.First().Data[0]);
            Assert.AreEqual(Constants.NO_VERTEX, edges.First().MetaData[0]);
            Assert.AreEqual(0, edges.First().Neighbour);
        }
Esempio n. 5
0
        public void TestLoopRestricted()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddVertex(3);
            graph.AddVertex(4);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 4, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(2, 3, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(3, 1, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, (vertex) =>
            {
                if (vertex == 0)
                {
                    return(new uint[][] { new uint[] { 0, 1, 4 } });
                }
                return(null);
            },
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(1, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(0, 50, -1, new EdgePath <float>())
            }, float.MaxValue, false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit) && visit.Weight == 50);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit) && visit.Weight == 50);
            Assert.IsFalse(dykstra.TryGetVisit(-2, out visit));
            Assert.IsTrue(dykstra.TryGetVisit(2, out visit) && visit.Weight == 450);
            Assert.IsTrue(dykstra.TryGetVisit(-3, out visit) && visit.Weight == 350);
            Assert.IsTrue(dykstra.TryGetVisit(3, out visit) && visit.Weight == 150);
            Assert.IsTrue(dykstra.TryGetVisit(-4, out visit) && visit.Weight == 250);
            Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250);
            Assert.IsTrue(dykstra.TryGetVisit(-5, out visit) && visit.Weight == 150);
            Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250);
        }
Esempio n. 6
0
        public void TestTwoHopRestricted()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddVertex(3);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(2, 3, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, (vertex) =>
            {
                if (vertex == 1)
                {
                    return(new uint[][] { new uint[] { 1, 2, 3 } });
                }
                return(null);
            },
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(0, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(1, 50, -1, new EdgePath <float>())
            }, float.MaxValue, new List <uint>(), false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit));
            Assert.AreEqual(-1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit));
            Assert.AreEqual(1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(2, out visit));
            Assert.AreEqual(2, visit.Edge);
            Assert.AreEqual(150, visit.Weight);
            Assert.IsFalse(dykstra.TryGetVisit(-2, out visit));
            Assert.IsFalse(dykstra.TryGetVisit(3, out visit));
            Assert.IsFalse(dykstra.TryGetVisit(-2, out visit));
        }
Esempio n. 7
0
        public uint AddEdge(uint vertex1, uint vertex2, OsmSharp.Routing.Network.Data.EdgeData data, ShapeBase shape)
        {
            if ((double)data.Distance > (double)this._maxEdgeDistance)
            {
                throw new ArgumentException("data.Distance too big for this network.");
            }
            uint edgeId = this._graph.AddEdge(vertex1, vertex2, EdgeDataSerializer.Serialize(data.Distance, data.Profile), shape);

            if ((long)edgeId >= this._edgeData.Length)
            {
                this.IncreaseSizeEdgeData(edgeId);
            }
            this._edgeData[(long)edgeId] = data.MetaId;
            return(edgeId);
        }
Esempio n. 8
0
        public void TestTriangle()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(2, 0, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, null,
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(0, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(1, 50, -1, new EdgePath <float>())
            }, float.MaxValue, false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit));
            Assert.AreEqual(-1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit));
            Assert.AreEqual(1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(2, out visit));
            Assert.AreEqual(2, visit.Edge);
            Assert.AreEqual(150, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(-2, out visit));
            Assert.AreEqual(-2, visit.Edge);
            Assert.AreEqual(250, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(3, out visit));
            Assert.AreEqual(3, visit.Edge);
            Assert.AreEqual(250, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(-3, out visit));
            Assert.AreEqual(-3, visit.Edge);
            Assert.AreEqual(150, visit.Weight);
        }
Esempio n. 9
0
        public void TestTwoEdges()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var sourceSearch = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) },
                                           150 * 1 / speed, false);
            var targetSearch = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(2) },
                                           150 * 1 / speed, true);
            var algorithm = new BidirectionalDykstra(sourceSearch, targetSearch, getFactor);

            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            Assert.AreEqual(1, algorithm.BestVertex);
            Assert.AreEqual(new uint[] { 0, 1, 2 }, algorithm.GetPath().ToListAsVertices().ToArray());
        }
Esempio n. 10
0
        public void TestOneEdge()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                return(new Itinero.Profiles.Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) },
                                        float.MaxValue, false);

            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            EdgePath <float> visit;

            Assert.IsTrue(algorithm.TryGetVisit(0, out visit));
            Assert.AreEqual(null, visit.From);
            Assert.AreEqual(0, visit.Vertex);
            Assert.AreEqual(0, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(1, out visit));
            Assert.AreEqual(0, visit.From.Vertex);
            Assert.AreEqual(1, visit.Vertex);
            Assert.AreEqual(100 / speed, visit.Weight);
        }
Esempio n. 11
0
        public void TestEdgeVisits()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            var e01 = graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;
            var e12 = graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;
            var e02 = graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var reportedEdges = new HashSet <long>();
            var algorithm     = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, float.MaxValue, false);

            algorithm.WasEdgeFound += (v1, v2, w1, w2, e, l) =>
            {
                if (v1 == 0 && v2 == 1)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e01, e);
                    Assert.AreEqual(0, w1);
                    Assert.AreEqual(100 / speed, w2);
                    reportedEdges.Add(e01);
                }
                else if (v1 == 1 && v2 == 0)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e01, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e01);
                }
                else if (v1 == 0 && v2 == 2)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e02, e);
                    Assert.AreEqual(0, w1);
                    Assert.AreEqual(100 / speed, w2);
                    reportedEdges.Add(e02);
                }
                else if (v1 == 2 && v2 == 0)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e02, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e02);
                }
                else if (v1 == 1 && v2 == 2)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e12, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(e12);
                }
                else if (v1 == 2 && v2 == 1)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e12, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e12);
                }
                return(false);
            };
            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            Assert.IsTrue(reportedEdges.Contains(e01));
            Assert.IsTrue(reportedEdges.Contains(-e01));
            Assert.IsTrue(reportedEdges.Contains(e02));
            Assert.IsTrue(reportedEdges.Contains(-e02));
            Assert.IsTrue(reportedEdges.Contains(e12));
            Assert.IsTrue(reportedEdges.Contains(-e12));
        }
Esempio n. 12
0
        public void TestEdgeVisits()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            var e01 = graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;
            var e12 = graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;
            var e02 = graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            })) + 1;

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var reportedEdges = new HashSet <long>();
            var algorithm     = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, float.MaxValue, false);

            algorithm.Visit += (path) =>
            {
                if (path.From == null)
                {
                    return(false);
                }

                var    v1   = path.From.Vertex;
                var    v2   = path.Vertex;
                var    w1   = path.From.Weight;
                var    w2   = path.Weight;
                var    e    = path.Edge;
                var    edge = graph.GetEdge(e);
                float  l;
                ushort p;
                Itinero.Data.Edges.EdgeDataSerializer.Deserialize(edge.Data[0], out l, out p);

                if (v1 == 0 && v2 == 1)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e01, e);
                    Assert.AreEqual(0, w1);
                    Assert.AreEqual(100 / speed, w2);
                    reportedEdges.Add(e01);
                }
                else if (v1 == 1 && v2 == 0)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e01, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e01);
                }
                else if (v1 == 0 && v2 == 2)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e02, e);
                    Assert.AreEqual(0, w1);
                    Assert.AreEqual(100 / speed, w2);
                    reportedEdges.Add(e02);
                }
                else if (v1 == 2 && v2 == 0)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e02, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e02);
                }
                else if (v1 == 1 && v2 == 2)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(e12, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(e12);
                }
                else if (v1 == 2 && v2 == 1)
                {
                    Assert.AreEqual(100, l);
                    Assert.AreEqual(-e12, e);
                    Assert.AreEqual(100 / speed, w1);
                    Assert.AreEqual(200 / speed, w2);
                    reportedEdges.Add(-e12);
                }
                return(false);
            };
            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            Assert.IsTrue(reportedEdges.Contains(e01));
            Assert.IsTrue(reportedEdges.Contains(e02));
        }
Esempio n. 13
0
        public void TestSourceBetween()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));
            graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 1,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] {
                new EdgePath <float>(0, 10 / speed, new EdgePath <float>(uint.MaxValue)),
                new EdgePath <float>(1, 90 / speed, new EdgePath <float>(uint.MaxValue))
            },
                                        float.MaxValue, new List <uint>(), false);

            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            EdgePath <float> visit;

            Assert.IsTrue(algorithm.TryGetVisit(0, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(uint.MaxValue, visit.From.Vertex);
            Assert.AreEqual(0, visit.Vertex);
            Assert.AreEqual(10 / speed, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(1, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(uint.MaxValue, visit.From.Vertex);
            Assert.AreEqual(1, visit.Vertex);
            Assert.AreEqual(90 / speed, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(2, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(0, visit.From.Vertex);
            Assert.AreEqual(2, visit.Vertex);
            Assert.AreEqual(110 / speed, visit.Weight);
        }