public void TestTwoNeighbours() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(0, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 0, 100, null, Constants.NO_VERTEX); // create a witness calculator and the priority calculator. var priorityCalculator = new EdgeDifferencePriorityCalculator(graph, new WitnessCalculatorMock()); var priority = priorityCalculator.Calculate(new BitArray32(graph.VertexCount), 0); Assert.AreEqual(0, priority); }
public void TestUncontractedWitnessed() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 3, 10, null, Constants.NO_VERTEX); graph.AddEdge(3, 1, 10, null, Constants.NO_VERTEX); graph.AddEdge(3, 2, 10, null, Constants.NO_VERTEX); graph.AddEdge(2, 3, 10, null, Constants.NO_VERTEX); graph.Compress(); // contract graph. var hierarchyBuilder = new Itinero.Algorithms.Contracted.Dual.HierarchyBuilder(graph, new DykstraWitnessCalculator(graph.Graph, int.MaxValue)); hierarchyBuilder.ContractedFactor = 0; hierarchyBuilder.DepthFactor = 0; hierarchyBuilder.Run(); var edge = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edge); var edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(100, edgeData.Weight); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(100, edgeData.Weight); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(10, edgeData.Weight); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(10, edgeData.Weight); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); }
public void TestTwoEdgesLeftHighest() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 1, 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.IsFalse(algorithm.TryGetVisit(1, out visit)); Assert.IsFalse(algorithm.TryGetVisit(2, out visit)); // 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.IsFalse(algorithm.TryGetVisit(1, out visit)); Assert.IsFalse(algorithm.TryGetVisit(2, out visit)); }
public void TestOneNeighboursContracted() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, true, Constants.NO_VERTEX); graph.AddEdge(1, 0, 100, false, Constants.NO_VERTEX); // create a witness calculator and the priority calculator. var contractedFlags = new BitArray32(graph.VertexCount); contractedFlags[1] = true; var priorityCalculator = new EdgeDifferencePriorityCalculator(graph, new WitnessCalculatorMock()); var priority = priorityCalculator.Calculate(contractedFlags, 0); Assert.AreEqual(-2, priority); }
public void TestDeserialize() { var graph = new DirectedMetaGraph(1, 1, 10); graph.AddEdge(0, 1, 1, 100); // serialize. using (var stream = new System.IO.MemoryStream()) { var size = graph.Serialize(stream); stream.Seek(0, System.IO.SeekOrigin.Begin); var deserializedGraph = DirectedMetaGraph.Deserialize(stream, DirectedMetaGraphProfile.Aggressive40); Assert.AreEqual(size, stream.Position); Assert.AreEqual(2, deserializedGraph.VertexCount); Assert.AreEqual(1, deserializedGraph.EdgeCount); // verify all edges. var edges = deserializedGraph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(1, edges.First().Data[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = deserializedGraph.GetEdgeEnumerator(1); Assert.AreEqual(0, edges.Count()); } graph = new DirectedMetaGraph(1, 1, 10); graph.AddEdge(0, 1, 1, 100); graph.AddEdge(0, 2, 2, 200); graph.AddEdge(0, 3, 3, 300); graph.AddEdge(0, 4, 4, 400); graph.AddEdge(5, 1, 5, 500); graph.AddEdge(5, 2, 6, 600); graph.AddEdge(5, 3, 7, 700); graph.AddEdge(5, 4, 8, 800); // serialize. using (var stream = new System.IO.MemoryStream()) { var size = graph.Serialize(stream); stream.Seek(0, System.IO.SeekOrigin.Begin); var deserializedGraph = DirectedMetaGraph.Deserialize(stream, DirectedMetaGraphProfile.Aggressive40); Assert.AreEqual(size, stream.Position); Assert.AreEqual(6, deserializedGraph.VertexCount); Assert.AreEqual(8, deserializedGraph.EdgeCount); } }
public void TestTwoEdgesLeftMiddleHighest() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(1, 0, 100, false, Constants.NO_VERTEX); graph.AddEdge(2, 1, 100, false, Constants.NO_VERTEX); // create algorithm and run. var algorithm = new Itinero.Algorithms.Contracted.BidirectionalDykstra(graph, new EdgePath <float>[] { new EdgePath <float>(0) }, new EdgePath <float>[] { new EdgePath <float>(2) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.AreEqual(0, algorithm.Best); EdgePath <float> visit; Assert.IsTrue(algorithm.TryGetForwardVisit(0, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.IsTrue(algorithm.TryGetBackwardVisit(2, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(2, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.IsTrue(algorithm.TryGetBackwardVisit(1, out visit)); Assert.AreEqual(100, visit.Weight); Assert.AreEqual(1, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(2, visit.From.Vertex); Assert.IsTrue(algorithm.TryGetBackwardVisit(0, out visit)); Assert.AreEqual(200, visit.Weight); Assert.AreEqual(0, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(1, visit.From.Vertex); Assert.AreEqual(new List <uint>(new uint[] { 0, 1, 2 }), algorithm.GetPath()); }
public void TestRemoveEdge() { var graph = new DirectedMetaGraph(1, 1, 10); // add and remove edge. graph.AddEdge(0, 1, 10, 100); Assert.AreEqual(0, graph.RemoveEdge(1, 0)); Assert.AreEqual(1, graph.RemoveEdge(0, 1)); graph = new DirectedMetaGraph(1, 1, 10); // add and remove edge. graph.AddEdge(0, 1, 10, 100); graph.AddEdge(0, 1, 20, 200); Assert.AreEqual(2, graph.GetEdgeEnumerator(0).Count); Assert.AreEqual(0, graph.RemoveEdge(1, 0)); Assert.AreEqual(2, graph.RemoveEdge(0, 1)); Assert.AreEqual(0, graph.GetEdgeEnumerator(0).Count); graph = new DirectedMetaGraph(1, 1, 10); // add and remove edge. graph.AddEdge(0, 1, 10, 100); graph.AddEdge(0, 1, 20, 200); Assert.AreEqual(2, graph.GetEdgeEnumerator(0).Count); Assert.AreEqual(0, graph.RemoveEdge(1, 0)); Assert.AreEqual(2, graph.RemoveEdge(0, 1)); Assert.AreEqual(0, graph.GetEdgeEnumerator(0).Count); graph = new DirectedMetaGraph(1, 1, 10); // add and remove edge. graph.AddEdge(0, 1, 10, 100); graph.AddEdge(0, 2, 20, 200); graph.RemoveEdge(0, 1); var edges = graph.GetEdgeEnumerator(0); Assert.IsNotNull(edges); Assert.AreEqual(2, edges.First().Neighbour); }
public void TestDoubleContraction() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(0, 3, 100, null, Constants.NO_VERTEX); graph.AddEdge(3, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 200, null, Constants.NO_VERTEX); graph.AddEdge(2, 1, 200, null, Constants.NO_VERTEX); graph.AddEdge(1, 3, 200, null, Constants.NO_VERTEX); graph.AddEdge(3, 1, 200, null, Constants.NO_VERTEX); graph.Compress(); // contract graph. var priorityCalculator = new EdgeDifferencePriorityCalculator(graph, new DykstraWitnessCalculator(int.MaxValue)); priorityCalculator.DepthFactor = 0; priorityCalculator.ContractedFactor = 0; var hierarchyBuilder = new HierarchyBuilder(graph, priorityCalculator, new DykstraWitnessCalculator(int.MaxValue)); hierarchyBuilder.Run(); // check edges. var edge = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNotNull(edge); edge = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNotNull(edge); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNotNull(edge); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edge); }
public void TestExpandNonExistingEdge() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // expand edge. Assert.Catch <System.Exception>(() => { graph.ExpandEdge(1, 2, new List <uint>(), true, true); }); }
public void TestEdgeCount() { var graph = new DirectedMetaGraph(1, 1, 10); // add edge. graph.AddEdge(0, 1, 1, 100); Assert.AreEqual(1, graph.EdgeCount); graph = new DirectedMetaGraph(1, 1, 10); // add edge. graph.AddEdge(0, 1, 1, 100); graph.AddEdge(0, 11001, 1, 100); Assert.AreEqual(2, graph.EdgeCount); graph.AddEdge(0, 11001, 2, 200); Assert.AreEqual(3, graph.EdgeCount); graph.RemoveEdge(0, 11001); Assert.AreEqual(1, graph.EdgeCount); graph.RemoveEdge(0, 1); Assert.AreEqual(0, graph.EdgeCount); }
public void Test2Vertices() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.Compress(); // contract graph. var hierarchyBuilder = new HierarchyBuilder(graph, new EdgeDifferencePriorityCalculator(graph, new DykstraWitnessCalculator(int.MaxValue)), new DykstraWitnessCalculator(int.MaxValue)); hierarchyBuilder.Run(); // check edges. var edges01 = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges01); var edge10 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edge10); }
public void TestExpandEdgeNotContracted() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // expand edge. var vertices = new List <uint>(); graph.ExpandEdge(0, 1, vertices, true, true); // check result. Assert.AreEqual(0, vertices.Count); }
public void TestSerialize() { var graph = new DirectedMetaGraph(1, 1, 10); // add and compress. graph.AddEdge(0, 1, 1, 100); graph.Compress(); var expectedSize = 1 + 1 + 8 + 8 + 4 + 4 + // the header: two longs representing vertex and edge count and one int for edge size and one for vertex size. graph.VertexCount * 2 * 4 + // the bytes for the vertex-index: 2 uint's. graph.EdgeCount * 2 * 4 + // the bytes for the edges: one edge 1 uint. 4 + 4 + // the header for the meta-data: 2 uint for sizes. graph.EdgeCount * 4; // the bytes for the edges: one edge 1 uint. using (var stream = new System.IO.MemoryStream()) { Assert.AreEqual(expectedSize, graph.Serialize(stream)); Assert.AreEqual(expectedSize, stream.Position); } // verify all edges. var edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(1, edges.First().Data[0]); Assert.AreEqual(1, edges.First().Neighbour); graph = new DirectedMetaGraph(1, 1, 10); // add and compress. graph.AddEdge(0, 1, 10, 100); graph.AddEdge(1, 2, 20, 200); graph.AddEdge(2, 3, 30, 300); graph.AddEdge(3, 4, 40, 400); graph.RemoveEdge(1, 2); graph.Compress(); expectedSize = 1 + 1 + 8 + 8 + 4 + 4 + // the header: two longs representing vertex and edge count and one int for edge size and one for vertex size. graph.VertexCount * 2 * 4 + // the bytes for the vertex-index: 2 uint's. graph.EdgeCount * 2 * 4 + // the bytes for the edges: one edge 1 uint. 4 + 4 + // the header for the meta-data: 2 uint for sizes. graph.EdgeCount * 4; // the bytes for the edges: one edge 1 uint. using (var stream = new System.IO.MemoryStream()) { Assert.AreEqual(expectedSize, graph.Serialize(stream)); Assert.AreEqual(expectedSize, stream.Position); } }
public void TestOneEdge() { var weightHandler = new DefaultWeightHandler(null); var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, weightHandler.MetaSize); graph.AddEdge(0, 1, 100, true, Constants.NO_VERTEX); var bidirectionalDykstra = new Itinero.Algorithms.Contracted.Dual.BidirectionalDykstra <float>(graph, weightHandler, 0, 1); bidirectionalDykstra.Run(); Assert.AreEqual(true, bidirectionalDykstra.HasRun); Assert.AreEqual(true, bidirectionalDykstra.HasSucceeded); EdgePath <float> path; if (bidirectionalDykstra.TryGetForwardVisit(0, out path)) { Assert.AreEqual(0, path.Vertex); Assert.AreEqual(0, path.Weight); Assert.AreEqual(null, path.From); } if (bidirectionalDykstra.TryGetForwardVisit(1, out path)) { Assert.AreEqual(1, path.Vertex); Assert.AreEqual(100, path.Weight); Assert.IsNotNull(path.From); Assert.AreEqual(0, path.From.Vertex); } if (bidirectionalDykstra.TryGetBackwardVisit(1, out path)) { Assert.AreEqual(1, path.Vertex); Assert.AreEqual(0, path.Weight); Assert.AreEqual(null, path.From); } if (bidirectionalDykstra.TryGetBackwardVisit(0, out path)) { Assert.AreEqual(0, path.Vertex); Assert.AreEqual(100, path.Weight); Assert.IsNotNull(path.From); Assert.AreEqual(1, path.From.Vertex); } }
public void TestMultipleLevelHiearchy3() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 4, 400, null, 2); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 0, 200, null, 1); graph.AddEdge(2, 4, 200, null, 3); graph.AddEdge(3, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(3, 4, 100, null, Constants.NO_VERTEX); // create algorithm and run. var algorithm = new Itinero.Algorithms.Contracted.BidirectionalDykstra(graph, new EdgePath <float>[] { new EdgePath <float>(0) }, new EdgePath <float>[] { new EdgePath <float>(4) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.AreEqual(4, algorithm.Best); EdgePath <float> visit; Assert.IsTrue(algorithm.TryGetForwardVisit(0, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.IsTrue(algorithm.TryGetForwardVisit(4, out visit)); Assert.AreEqual(400, visit.Weight); Assert.AreEqual(4, visit.Vertex); Assert.IsNotNull(visit.From); Assert.AreEqual(0, visit.From.Vertex); Assert.IsTrue(algorithm.TryGetBackwardVisit(4, out visit)); Assert.AreEqual(0, visit.Weight); Assert.AreEqual(4, visit.Vertex); Assert.AreEqual(null, visit.From); Assert.AreEqual(new List <uint>(new uint[] { 0, 1, 2, 3, 4 }), algorithm.GetPath()); }
public void TestShorterEdgeOpposite() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(1, 0, 100, false, Constants.NO_VERTEX); graph.AddEdge(1, 0, 10, true, 3); graph.AddEdge(3, 0, 5, true, Constants.NO_VERTEX); graph.AddEdge(3, 1, 5, false, Constants.NO_VERTEX); graph.AddEdge(1, 2, 10, null, Constants.NO_VERTEX); graph.AddEdge(0, 2, 110, true, 1); graph.AddEdge(0, 2, 20, false, 1); // create algorithm and run. var algorithm = new Itinero.Algorithms.Contracted.BidirectionalDykstra(graph, new EdgePath <float>[] { new EdgePath <float>(0) }, new EdgePath <float>[] { new EdgePath <float>(2) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.AreEqual(2, algorithm.Best); Assert.AreEqual(new List <uint>(new uint[] { 0, 1, 2 }), algorithm.GetPath()); // create algorithm and run. algorithm = new Itinero.Algorithms.Contracted.BidirectionalDykstra(graph, new EdgePath <float>[] { new EdgePath <float>(2) }, new EdgePath <float>[] { new EdgePath <float>(0) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.AreEqual(2, algorithm.Best); Assert.AreEqual(new List <uint>(new uint[] { 2, 1, 3, 0 }), algorithm.GetPath()); }
public void Test3VerticesComplete() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 1, 100, null, Constants.NO_VERTEX); graph.AddEdge(0, 2, 100, null, Constants.NO_VERTEX); graph.AddEdge(2, 0, 100, null, Constants.NO_VERTEX); graph.Compress(); // contract graph. var hierarchyBuilder = new Itinero.Algorithms.Contracted.Dual.HierarchyBuilder(graph, new DykstraWitnessCalculator(graph.Graph, int.MaxValue)); hierarchyBuilder.Run(); // check edges. var edges01 = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges01); var edges02 = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNotNull(edges02); var edge10 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edge10); var edge12 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edge12); var edges20 = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edges20); var edges21 = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges21); }
public static void AddOrUpdateEdge(this DirectedMetaGraph graph, uint vertex1, uint vertex2, float weight, bool?direction, uint contractedId) { uint data1 = ContractedEdgeDataSerializer.Serialize(weight, direction); bool hasExistingEdge = false; bool hasExistingEdgeOnlySameDirection = true; if ((int)graph.UpdateEdge(vertex1, vertex2, (Func <uint[], bool>)(data => { hasExistingEdge = true; if (ContractedEdgeDataSerializer.HasDirection(data[0], direction)) { return((double)weight < (double)ContractedEdgeDataSerializer.DeserializeWeight(data[0])); } hasExistingEdgeOnlySameDirection = false; return(false); }), new uint[1] { data1 }, contractedId) != -1) { return; } if (!hasExistingEdge) { int num1 = (int)graph.AddEdge(vertex1, vertex2, data1, contractedId); } else { if (hasExistingEdgeOnlySameDirection) { return; } bool flag1 = false; float weight1 = float.MaxValue; uint metaData1 = uint.MaxValue; bool flag2 = false; float weight2 = float.MaxValue; uint metaData2 = uint.MaxValue; if (!direction.HasValue || direction.Value) { flag1 = true; weight1 = weight; metaData1 = contractedId; } if (!direction.HasValue || !direction.Value) { flag2 = true; weight2 = weight; metaData2 = contractedId; } DirectedMetaGraph.EdgeEnumerator edgeEnumerator = graph.GetEdgeEnumerator(vertex1); while (edgeEnumerator.MoveNext()) { if ((int)edgeEnumerator.Neighbour == (int)vertex2) { float weight3; bool? direction1; uint contractedId1; ContractedEdgeDataSerializer.Deserialize(edgeEnumerator.Data0, edgeEnumerator.MetaData0, out weight3, out direction1, out contractedId1); if ((!direction1.HasValue || direction1.Value) && (double)weight3 < (double)weight1) { weight1 = weight3; flag1 = true; metaData1 = contractedId1; } if ((!direction1.HasValue || !direction1.Value) && (double)weight3 < (double)weight2) { weight2 = weight3; flag2 = true; metaData2 = contractedId1; } } } graph.RemoveEdge(vertex1, vertex2); if (flag1 & flag2 && (double)weight1 == (double)weight2 && (int)metaData1 == (int)metaData2) { int num2 = (int)graph.AddEdge(vertex1, vertex2, ContractedEdgeDataSerializer.Serialize(weight1, new bool?()), metaData1); } else { if (flag1) { int num3 = (int)graph.AddEdge(vertex1, vertex2, ContractedEdgeDataSerializer.Serialize(weight1, new bool?(true)), metaData1); } if (!flag2) { return; } int num4 = (int)graph.AddEdge(vertex1, vertex2, ContractedEdgeDataSerializer.Serialize(weight2, new bool?(false)), metaData2); } } }
public static void AddEdge(this DirectedMetaGraph graph, uint vertex1, uint vertex2, float weight, bool?direction, uint contractedId) { int num = (int)graph.AddEdge(vertex1, vertex2, ContractedEdgeDataSerializer.Serialize(weight, direction), contractedId); }
public void TestTwoEdgesRightHighest() { // build graph. var routerDb = new RouterDb(); routerDb.AddSupportedVehicle(VehicleMock.Car()); routerDb.Network.AddVertex(0, 0, 0); routerDb.Network.AddVertex(1, 1, 1); routerDb.Network.AddVertex(2, 2, 2); routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(1, 2, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, null, Constants.NO_VERTEX); graph.AddEdge(1, 2, 100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, null, Constants.NO_VERTEX); routerDb.AddContracted(VehicleMock.Car().Fastest(), new ContractedDb(graph)); // create algorithm and run. var algorithm = new ManyToManyWeightsBidirectionalDykstra(new Router(routerDb), VehicleMock.Car().Fastest(), new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2) }, new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsNotNull(algorithm.Weights); Assert.AreEqual(3, algorithm.Weights.Length); Assert.AreEqual(3, algorithm.Weights[0].Length); Assert.AreEqual(3, algorithm.Weights[1].Length); Assert.AreEqual(3, algorithm.Weights[2].Length); Assert.AreEqual(000 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[0][0], 0.1); Assert.AreEqual(100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[0][1], 0.1); Assert.AreEqual(200 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[0][2], 0.1); Assert.AreEqual(100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[1][0], 0.1); Assert.AreEqual(000 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[1][1], 0.1); Assert.AreEqual(100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[1][2], 0.1); Assert.AreEqual(200 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[2][0], 0.1); Assert.AreEqual(100 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[2][1], 0.1); Assert.AreEqual(000 * VehicleMock.Car().Fastest().FactorAndSpeed(null).Value, algorithm.Weights[2][2], 0.1); }
public void TestDoubleContractionOneway() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 2, 100, true, Constants.NO_VERTEX); graph.AddEdge(2, 0, 100, false, Constants.NO_VERTEX); graph.AddEdge(0, 3, 10, false, Constants.NO_VERTEX); graph.AddEdge(3, 0, 10, true, Constants.NO_VERTEX); graph.AddEdge(1, 2, 1000, false, Constants.NO_VERTEX); graph.AddEdge(2, 1, 1000, true, Constants.NO_VERTEX); graph.AddEdge(1, 3, 10000, true, Constants.NO_VERTEX); graph.AddEdge(3, 1, 10000, false, Constants.NO_VERTEX); graph.Compress(); // contract graph. var priorityCalculator = new EdgeDifferencePriorityCalculator(graph, new DykstraWitnessCalculator(int.MaxValue)); priorityCalculator.ContractedFactor = 0; priorityCalculator.DepthFactor = 0; var hierarchyBuilder = new HierarchyBuilder(graph, priorityCalculator, new DykstraWitnessCalculator(int.MaxValue)); hierarchyBuilder.Run(); // check edges. var edge = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNotNull(edge); var edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(100, edgeData.Weight); Assert.AreEqual(true, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(10, edgeData.Weight); Assert.AreEqual(false, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(110, edgeData.Weight); Assert.AreEqual(false, edgeData.Direction); Assert.AreEqual(0, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(1000, edgeData.Weight); Assert.AreEqual(true, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edge); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == true); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(1110, edgeData.Weight); Assert.AreEqual(2, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == false); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(10000, edgeData.Weight); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); edge = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNull(edge); }
public void TestCompress() { var graph = new DirectedMetaGraph(1, 1, 10); // add and compress. graph.AddEdge(0, 1, 1, 100); graph.Compress(); // verify all edges. var edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(1, edges.First().Data[0]); Assert.AreEqual(1, edges.First().Neighbour); graph = new DirectedMetaGraph(1, 1, 10); // add and compress. graph.AddEdge(0, 1, 10, 100); graph.AddEdge(1, 2, 20, 200); graph.AddEdge(2, 3, 30, 300); graph.AddEdge(3, 4, 40, 400); graph.RemoveEdge(1, 2); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(3, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(4, edges.First().Neighbour); // compress. graph.Compress(); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(3, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(4, edges.First().Neighbour); }
public void TestPentagonAugmented() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.DynamicAugmentedFixedSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(1, 0, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(1, 2, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(2, 1, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(2, 3, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(3, 2, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(3, 4, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(4, 3, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(4, 0, 100, null, Constants.NO_VERTEX, 50, 1000); graph.AddEdge(0, 4, 100, null, Constants.NO_VERTEX, 50, 1000); graph.Compress(); // contract graph. var priorityCalculator = new EdgeDifferencePriorityCalculator(graph, new DykstraWitnessCalculator(int.MaxValue)); priorityCalculator.ContractedFactor = 0; priorityCalculator.DepthFactor = 0; var hierarchyBuilder = new HierarchyBuilder <Weight>(graph, priorityCalculator, new DykstraWitnessCalculator(int.MaxValue), new WeightHandler(null)); hierarchyBuilder.Run(); // check edges. var edges01 = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges01); var edges10 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edges10); var edges12 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edges12); var edges21 = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges21); var edges23 = graph.GetEdgeEnumerator(2).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edges23); var edges32 = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 2); Assert.IsNull(edges32); var edges34 = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 4); Assert.IsNull(edges34); var edges43 = graph.GetEdgeEnumerator(4).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNotNull(edges43); var edges40 = graph.GetEdgeEnumerator(4).FirstOrDefault(x => x.Neighbour == 0); Assert.IsNull(edges40); var edges04 = graph.GetEdgeEnumerator(0).FirstOrDefault(x => x.Neighbour == 4); Assert.IsNotNull(edges04); var edges41 = graph.GetEdgeEnumerator(4).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges41); var edges14 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 4); Assert.IsNull(edges14); var edges31 = graph.GetEdgeEnumerator(3).FirstOrDefault(x => x.Neighbour == 1); Assert.IsNotNull(edges31); var edges13 = graph.GetEdgeEnumerator(1).FirstOrDefault(x => x.Neighbour == 3); Assert.IsNull(edges13); }
/// <summary> /// Add edge. /// </summary> /// <returns></returns> public static void AddEdge(this DirectedMetaGraph graph, uint vertex1, uint vertex2, float weight, bool?direction, uint contractedId, float distance, float time) { graph.AddEdge(vertex1, vertex2, new uint[] { ContractedEdgeDataSerializer.Serialize( weight, direction) }, ContractedEdgeDataSerializer.SerializeMetaAugmented(contractedId, distance, time)); }
public void TestAddEdge() { var graph = new DirectedMetaGraph(1, 1, 10); // add edge. graph.AddEdge(0, 1, 10, 100); // verify all edges. var edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(0, edges.Count()); // add another edge. graph.AddEdge(1, 2, 20, 200); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(20, edges.First().Data[0]); Assert.AreEqual(200, edges.First().MetaData[0]); Assert.AreEqual(2, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); // add another edge. graph.AddEdge(1, 3, 30, 300); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(2, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(0, edges.Count()); // add another edge but in reverse. graph.AddEdge(3, 1, 30, 300); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(2, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); // add another edge and start a new island. graph.AddEdge(4, 5, 40, 400); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(2, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(5, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(5); Assert.AreEqual(0, edges.Count()); // connect the islands. graph.AddEdge(5, 3, 50, 500); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(2, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(5, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(5); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(50, edges.First().Data[0]); Assert.AreEqual(500, edges.First().MetaData[0]); Assert.AreEqual(3, edges.First().Neighbour); graph.AddEdge(1, 6, 60, 600); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(3, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 6)); Assert.AreEqual(60, edges.First(x => x.Neighbour == 6).Data[0]); Assert.AreEqual(600, edges.First(x => x.Neighbour == 6).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(5, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(5); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(50, edges.First().Data[0]); Assert.AreEqual(500, edges.First().MetaData[0]); Assert.AreEqual(3, edges.First().Neighbour); graph.AddEdge(1, 7, 70, 700); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(10, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(4, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(20, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(30, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 6)); Assert.AreEqual(60, edges.First(x => x.Neighbour == 6).Data[0]); Assert.AreEqual(600, edges.First(x => x.Neighbour == 6).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 7)); Assert.AreEqual(70, edges.First(x => x.Neighbour == 7).Data[0]); Assert.AreEqual(700, edges.First(x => x.Neighbour == 7).MetaData[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(0, edges.Count()); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(30, edges.First().Data[0]); Assert.AreEqual(300, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(400, edges.First().MetaData[0]); Assert.AreEqual(5, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(5); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(50, edges.First().Data[0]); Assert.AreEqual(500, edges.First().MetaData[0]); Assert.AreEqual(3, edges.First().Neighbour); }
public void TestGetEdgeEnumerator() { var graph = new DirectedMetaGraph(1, 1, 10); // add edges. graph.AddEdge(0, 1, 1, 100); graph.AddEdge(1, 2, 2, 200); graph.AddEdge(1, 3, 3, 300); graph.AddEdge(3, 4, 4, 400); graph.AddEdge(4, 1, 5, 500); graph.AddEdge(5, 1, 6, 600); // get empty edge enumerator. var edges = graph.GetEdgeEnumerator(); // move to vertices and test result. Assert.IsTrue(edges.MoveTo(0)); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(1, edges.First().Data[0]); Assert.AreEqual(100, edges.First().MetaData[0]); Assert.AreEqual(1, edges.First().Neighbour); Assert.IsTrue(edges.MoveTo(1)); Assert.AreEqual(2, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 2)); Assert.AreEqual(2, edges.First(x => x.Neighbour == 2).Data[0]); Assert.AreEqual(200, edges.First(x => x.Neighbour == 2).MetaData[0]); Assert.IsTrue(edges.Any(x => x.Neighbour == 3)); Assert.AreEqual(3, edges.First(x => x.Neighbour == 3).Data[0]); Assert.AreEqual(300, edges.First(x => x.Neighbour == 3).MetaData[0]); Assert.IsFalse(edges.MoveTo(2)); Assert.IsTrue(edges.MoveTo(3)); Assert.AreEqual(1, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 4)); Assert.AreEqual(4, edges.First(x => x.Neighbour == 4).Data[0]); Assert.AreEqual(400, edges.First(x => x.Neighbour == 4).MetaData[0]); Assert.IsTrue(edges.MoveTo(4)); Assert.AreEqual(1, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 1)); Assert.AreEqual(5, edges.First(x => x.Neighbour == 1).Data[0]); Assert.AreEqual(500, edges.First(x => x.Neighbour == 1).MetaData[0]); Assert.IsTrue(edges.MoveTo(5)); Assert.AreEqual(1, edges.Count()); Assert.IsTrue(edges.Any(x => x.Neighbour == 1)); Assert.AreEqual(6, edges.First(x => x.Neighbour == 1).Data[0]); Assert.AreEqual(600, edges.First(x => x.Neighbour == 1).MetaData[0]); graph = new DirectedMetaGraph(1, 1, 10); // add edge. graph.AddEdge(0, 1, 1, 100); graph.AddEdge(0, 11001, 1, 100); graph.AddEdge(0, 11001, 2, 200); edges = graph.GetEdgeEnumerator(); // move to vertices and test result. Assert.IsTrue(edges.MoveTo(0)); Assert.AreEqual(3, edges.Count()); }
/// <summary> /// Add or update edge. /// </summary> /// <returns></returns> public static void AddOrUpdateEdge(this DirectedMetaGraph graph, uint vertex1, uint vertex2, float weight, bool?direction, uint contractedId, float distance, float time) { var current = ContractedEdgeDataSerializer.Serialize(weight, direction); var hasExistingEdge = false; var hasExistingEdgeOnlySameDirection = true; if (graph.UpdateEdge(vertex1, vertex2, (data) => { hasExistingEdge = true; if (ContractedEdgeDataSerializer.HasDirection(data[0], direction)) { // has the same direction. if (weight < ContractedEdgeDataSerializer.DeserializeWeight(data[0])) { // the weight is better, just update. return(true); } return(false); } hasExistingEdgeOnlySameDirection = false; return(false); }, new uint[] { current }, ContractedEdgeDataSerializer.SerializeMetaAugmented(contractedId, distance, time)) != Constants.NO_EDGE) { // updating the edge succeeded. return; } if (!hasExistingEdge) { // no edge exists yet. graph.AddEdge(vertex1, vertex2, new uint[] { current }, ContractedEdgeDataSerializer.SerializeMetaAugmented( contractedId, distance, time)); return; } else if (hasExistingEdgeOnlySameDirection) { // there is an edge already but it has a better weight. return; } else { // see what's there and update if needed. var forward = false; var forwardWeight = float.MaxValue; var forwardContractedId = uint.MaxValue; var forwardTime = float.MaxValue; var forwardDistance = float.MaxValue; var backward = false; var backwardWeight = float.MaxValue; var backwardContractedId = uint.MaxValue; var backwardTime = float.MaxValue; var backwardDistance = float.MaxValue; if (direction == null || direction.Value) { forward = true; forwardWeight = weight; forwardContractedId = contractedId; forwardTime = time; forwardDistance = distance; } if (direction == null || !direction.Value) { backward = true; backwardWeight = weight; backwardContractedId = contractedId; backwardTime = time; backwardDistance = distance; } var edgeEnumerator = graph.GetEdgeEnumerator(vertex1); while (edgeEnumerator.MoveNext()) { if (edgeEnumerator.Neighbour == vertex2) { float localWeight; bool? localDirection; ContractedEdgeDataSerializer.Deserialize(edgeEnumerator.Data0, out localWeight, out localDirection); uint localContractedId; float localTime; float localDistance; ContractedEdgeDataSerializer.DeserializeMetaAgumented(edgeEnumerator.MetaData, out localContractedId, out localDistance, out localTime); if (localDirection == null || localDirection.Value) { if (localWeight < forwardWeight) { forwardWeight = localWeight; forward = true; forwardContractedId = localContractedId; forwardTime = localTime; forwardDistance = localDistance; } } if (localDirection == null || !localDirection.Value) { if (localWeight < backwardWeight) { backwardWeight = localWeight; backward = true; backwardContractedId = localContractedId; backwardDistance = localDistance; backwardTime = localTime; } } } } graph.RemoveEdge(vertex1, vertex2); if (forward && backward && forwardWeight == backwardWeight && forwardContractedId == backwardContractedId) { // add one bidirectional edge. graph.AddEdge(vertex1, vertex2, forwardWeight, null, forwardContractedId, forwardDistance, forwardTime); //graph.AddEdge(vertex1, vertex2, // ContractedEdgeDataSerializer.Serialize(forwardWeight, null), forwardContractedId); } else { // add two unidirectional edges if needed. if (forward) { // there is a forward edge. graph.AddEdge(vertex1, vertex2, forwardWeight, true, forwardContractedId, forwardDistance, forwardTime); //graph.AddEdge(vertex1, vertex2, // ContractedEdgeDataSerializer.Serialize(forwardWeight, true), forwardContractedId); } if (backward) { // there is a backward edge. graph.AddEdge(vertex1, vertex2, backwardWeight, false, backwardContractedId, backwardDistance, backwardTime); } } } }
public void TestTwoEdgesLeftMiddleHighest() { // build graph. var oneway = MockProfile.CarMock(t => new Speed() { Value = MockProfile.CarMock().Speed(null).Value, Direction = 1 }); var routerDb = new RouterDb(); routerDb.AddSupportedProfile(oneway); routerDb.Network.AddVertex(0, 0, 0); routerDb.Network.AddVertex(1, 1, 1); routerDb.Network.AddVertex(2, 2, 2); routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(1, 2, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(1, 0, 100 * MockProfile.CarMock().Factor(null).Value, false, Constants.NO_VERTEX); graph.AddEdge(2, 1, 100 * MockProfile.CarMock().Factor(null).Value, false, Constants.NO_VERTEX); routerDb.AddContracted(MockProfile.CarMock(), new ContractedDb(graph)); // create algorithm and run. var algorithm = new ManyToManyBidirectionalDykstra(new Router(routerDb), oneway, new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2) }, new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsNotNull(algorithm.Weights); Assert.AreEqual(3, algorithm.Weights.Length); Assert.AreEqual(3, algorithm.Weights[0].Length); Assert.AreEqual(3, algorithm.Weights[1].Length); Assert.AreEqual(3, algorithm.Weights[2].Length); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][0], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][1], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][2], 0.1); Assert.AreEqual(float.MaxValue, algorithm.Weights[1][0]); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][1], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][2], 0.1); Assert.AreEqual(float.MaxValue, algorithm.Weights[2][0]); Assert.AreEqual(float.MaxValue, algorithm.Weights[2][1]); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][2], 0.1); }
public void TestAddOrUpdateEdge() { // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 99, null, Constants.NO_VERTEX); // check result. var edges = new List <MetaEdge>(graph.GetEdgeEnumerator(0).Where(x => x.Neighbour == 1)); Assert.AreEqual(1, edges.Count); Assert.AreEqual(1, edges[0].Neighbour); var edgeData = ContractedEdgeDataSerializer.Deserialize(edges[0].Data[0], edges[0].MetaData[0]); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 101, null, Constants.NO_VERTEX); // check result. edges = new List <MetaEdge>(graph.GetEdgeEnumerator(0).Where(x => x.Neighbour == 1)); Assert.AreEqual(1, edges.Count); Assert.AreEqual(1, edges[0].Neighbour); edgeData = ContractedEdgeDataSerializer.Deserialize(edges[0].Data[0], edges[0].MetaData[0]); Assert.AreEqual(null, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(100, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, true, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 99, true, Constants.NO_VERTEX); // check result. edges = new List <MetaEdge>(graph.GetEdgeEnumerator(0).Where(x => x.Neighbour == 1)); Assert.AreEqual(1, edges.Count); Assert.AreEqual(1, edges[0].Neighbour); edgeData = ContractedEdgeDataSerializer.Deserialize(edges[0].Data[0], edges[0].MetaData[0]); Assert.AreEqual(true, edgeData.Direction); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 99, true, Constants.NO_VERTEX); // check result. var edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == false); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(100, edgeData.Weight); edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == true); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, false, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 99, true, Constants.NO_VERTEX); // check result. edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == false); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(100, edgeData.Weight); edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == true); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, false, Constants.NO_VERTEX); graph.AddEdge(0, 1, 99, true, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 98, null, Constants.NO_VERTEX); // check result. edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == null); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(98, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, false, Constants.NO_VERTEX); graph.AddEdge(0, 1, 98, true, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 1, 99, null, Constants.NO_VERTEX); // check result. edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == false); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 1 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == true); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(98, edgeData.Weight); // build graph. graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100, null, Constants.NO_VERTEX); // update. graph.AddOrUpdateEdge(0, 2, 99, null, Constants.NO_VERTEX); // check result. edge = graph.GetEdgeEnumerator(0).First(x => x.Neighbour == 2 && ContractedEdgeDataSerializer.Deserialize(x.Data[0], x.MetaData[0]).Direction == null); Assert.IsNotNull(edge); edgeData = ContractedEdgeDataSerializer.Deserialize(edge.Data[0], edge.MetaData[0]); Assert.AreEqual(Constants.NO_VERTEX, edgeData.ContractedId); Assert.AreEqual(99, edgeData.Weight); }
public void TestPentagon() { var routerDb = new RouterDb(); routerDb.AddSupportedProfile(MockProfile.CarMock()); routerDb.Network.AddVertex(0, 0, 0); routerDb.Network.AddVertex(1, 1, 1); routerDb.Network.AddVertex(2, 2, 2); routerDb.Network.AddVertex(3, 3, 3); routerDb.Network.AddVertex(4, 4, 4); routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(1, 2, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(2, 3, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(3, 4, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); routerDb.Network.AddEdge(4, 0, new Itinero.Data.Network.Edges.EdgeData() { Distance = 100, Profile = 0, MetaId = 0 }); // build graph. var graph = new DirectedMetaGraph(ContractedEdgeDataSerializer.Size, ContractedEdgeDataSerializer.MetaSize); graph.AddEdge(0, 1, 100 * MockProfile.CarMock().Factor(null).Value, null, Constants.NO_VERTEX); graph.AddEdge(0, 4, 100 * MockProfile.CarMock().Factor(null).Value, null, Constants.NO_VERTEX); graph.AddEdge(2, 1, 100 * MockProfile.CarMock().Factor(null).Value, null, Constants.NO_VERTEX); graph.AddEdge(2, 3, 100 * MockProfile.CarMock().Factor(null).Value, null, Constants.NO_VERTEX); graph.AddEdge(3, 1, 200 * MockProfile.CarMock().Factor(null).Value, null, 2); graph.AddEdge(4, 1, 200 * MockProfile.CarMock().Factor(null).Value, null, 0); graph.AddEdge(4, 3, 100 * MockProfile.CarMock().Factor(null).Value, null, Constants.NO_VERTEX); routerDb.AddContracted(MockProfile.CarMock(), new ContractedDb(graph)); // create algorithm and run. var algorithm = new ManyToManyBidirectionalDykstra(new Router(routerDb), MockProfile.CarMock(), new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2), routerDb.Network.CreateRouterPointForVertex(3), routerDb.Network.CreateRouterPointForVertex(4) }, new RouterPoint[] { routerDb.Network.CreateRouterPointForVertex(0), routerDb.Network.CreateRouterPointForVertex(1), routerDb.Network.CreateRouterPointForVertex(2), routerDb.Network.CreateRouterPointForVertex(3), routerDb.Network.CreateRouterPointForVertex(4) }); algorithm.Run(); // check results. Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsNotNull(algorithm.Weights); Assert.AreEqual(5, algorithm.Weights.Length); Assert.AreEqual(5, algorithm.Weights[0].Length); Assert.AreEqual(5, algorithm.Weights[1].Length); Assert.AreEqual(5, algorithm.Weights[2].Length); Assert.AreEqual(5, algorithm.Weights[3].Length); Assert.AreEqual(5, algorithm.Weights[4].Length); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][0], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][1], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][2], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][3], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[0][4], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][0], 0.1); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][1], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][2], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][3], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[1][4], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][0], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][1], 0.1); Assert.AreEqual(000 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][2], 0.1); Assert.AreEqual(100 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][3], 0.1); Assert.AreEqual(200 * MockProfile.CarMock().Factor(null).Value, algorithm.Weights[2][4], 0.1); }