/// <summary> /// Called left before the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnBeforeContractionEvent(uint vertex, KeyValuePair <uint, CHEdgeData>[] edges) { // create a new CHRouter var router = new CHRouter(_data); // calculate all the routes between the neighbours of the contracted vertex. _pathsBeforeContraction = new Dictionary <uint, Dictionary <uint, PathSegment <long> > >(); foreach (KeyValuePair <uint, CHEdgeData> from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment <long>(from.Key)); // initalize the from dictionary. var fromDic = new Dictionary <uint, PathSegment <long> >(); _pathsBeforeContraction[from.Key] = fromDic; foreach (KeyValuePair <uint, CHEdgeData> to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment <long>(to.Key)); // calculate the route. PathSegment <long> route = router.Calculate(_data, _interpreter, OsmSharp.Routing.Vehicle.Car, fromList, toList, double.MaxValue); fromDic[to.Key] = route; } } }
/// <summary> /// Called right after the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnAfterContractionEvent(uint vertex, KeyValuePair <uint, CHEdgeData>[] edges) { // create a new CHRouter var router = new CHRouter(_data); // calculate all the routes between the neighbours of the contracted vertex. foreach (KeyValuePair <uint, CHEdgeData> from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment <long>(from.Key)); // initalize the from dictionary. Dictionary <uint, PathSegment <long> > fromDic = _pathsBeforeContraction[from.Key]; foreach (KeyValuePair <uint, CHEdgeData> to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment <long>(to.Key)); // calculate the route. PathSegment <long> route = router.Calculate(_data, _interpreter, OsmSharp.Routing.Vehicle.Car, fromList, toList, double.MaxValue); if ((fromDic[to.Key] == null && route != null) || (fromDic[to.Key] != null && route == null) || ((fromDic[to.Key] != null && route != null) && fromDic[to.Key] != route)) { // the route match! Assert.Fail("Routes are different before/after contraction!"); } } } }
/// <summary> /// Called left before the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnBeforeContractionEvent(uint vertex, List <Edge <CHEdgeData> > edges) { // create a new CHRouter var router = new CHRouter(); // calculate all the routes between the neighbours of the contracted vertex. var pathsBeforeContraction = new Dictionary <uint, Dictionary <uint, PathSegment <long> > >(); _pathsBeforeContraction.Add(vertex, pathsBeforeContraction); foreach (var from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment <long>(from.Neighbour)); // initalize the from dictionary. var fromDic = new Dictionary <uint, PathSegment <long> >(); pathsBeforeContraction[from.Neighbour] = fromDic; foreach (var to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment <long>(to.Neighbour)); // calculate the route. fromDic[to.Neighbour] = router.Calculate(_data, _interpreter, Vehicle.Car, fromList, toList, double.MaxValue, null);; } } }
/// <summary> /// Does the actual testing. /// </summary> /// <param name="embeddedString"></param> private void DoRoutingSerializationV2CHRoutingV2ComparisonTest(string embeddedString) { // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(); // serialize/deserialize. TagsCollectionBase metaData = new TagsCollection(); metaData.Add("some_key", "some_value"); byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original, metaData); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource <CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray), out metaData); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); Assert.IsTrue(deserializedVersion.SupportsProfile(Vehicle.Car)); Assert.IsFalse(deserializedVersion.SupportsProfile(Vehicle.Bicycle)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); this.TestCompareAll(original, referenceRouter, router); }
public void TestVerifiedContraction1NoWitnesses() { var graph = new MemoryDirectedGraph <CHEdgeData>(); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); preProcessor.Contract(3); // there should be no edge from 1->3 and from 2->3. Assert.IsFalse(graph.ContainsEdges(1, 3)); Assert.IsFalse(graph.ContainsEdges(2, 3)); var router = new CHRouter(); // expected: (1)-10s-(3)-10s-(2) (20s in total). var path = router.Calculate(graph, 1, 2); Assert.IsNotNull(path); Assert.AreEqual(20, path.Weight); var pathArray = path.ToArrayWithWeight(); Assert.AreEqual(3, pathArray.Length); float latitude, longitude; Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); // expected: (2)-10s-(3)-10s-(1) (20s in total). path = router.Calculate(graph, 2, 1); Assert.IsNotNull(path); Assert.AreEqual(20, path.Weight); pathArray = path.ToArrayWithWeight(); Assert.AreEqual(3, pathArray.Length); Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); }
public void RoutingSerializationV2CHRoutingComparisonTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(true); // serialize/deserialize. byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource <CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray)); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); //this.TestCompareAll(original, referenceRouter, router); }
public void TestVerifiedContraction1NoWitnesses() { var graph = new DirectedGraph<CHEdgeData>(); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreprocessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); preProcessor.Contract(3); // there should be no edge from 1->3 and from 2->3. Assert.IsFalse(graph.ContainsEdges(1, 3)); Assert.IsFalse(graph.ContainsEdges(2, 3)); var router = new CHRouter(); // expected: (1)-10s-(3)-10s-(2) (20s in total). var path = router.Calculate(graph, 1, 2); Assert.IsNotNull(path); Assert.AreEqual(20, path.Weight); var pathArray = path.ToArrayWithWeight(); Assert.AreEqual(3, pathArray.Length); float latitude, longitude; Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); // expected: (2)-10s-(3)-10s-(1) (20s in total). path = router.Calculate(graph, 2, 1); Assert.IsNotNull(path); Assert.AreEqual(20, path.Weight); pathArray = path.ToArrayWithWeight(); Assert.AreEqual(3, pathArray.Length); Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="name"></param> /// <param name="stream"></param> /// <param name="testCount"></param> public static void TestRouting(string name, Stream stream, int testCount) { var vehicle = Vehicle.Car; var tagsIndex = new TagsTableCollectionIndex(); // creates a tagged index. // read from the OSM-stream. var source = new OsmSharp.Osm.Streams.Filters.OsmStreamFilterProgress(); source.RegisterSource(new OsmSharp.Osm.PBF.Streams.PBFOsmStreamSource(stream)); var data = CHEdgeGraphOsmStreamTarget.Preprocess(source, new OsmRoutingInterpreter(), vehicle); var router = new CHRouter(); var performanceInfo = new PerformanceInfoConsumer("CHRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("CHRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("CHRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="name"></param> /// <param name="stream"></param> /// <param name="testCount"></param> public static void TestRouting(string name, Stream stream, int testCount) { var vehicle = Vehicle.Car; var tagsIndex = new TagsTableCollectionIndex(); // creates a tagged index. // read from the OSM-stream. var source = new OsmSharp.Osm.Streams.Filters.OsmStreamFilterProgress(); source.RegisterSource(new OsmSharp.Osm.PBF.Streams.PBFOsmStreamSource(stream)); var data = CHEdgeGraphOsmStreamTarget.Preprocess(source, new OsmRoutingInterpreter(), vehicle); var router = new CHRouter(); var performanceInfo = new PerformanceInfoConsumer("CHRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, from, to); if(route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("CHRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("CHRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="data"></param> /// <param name="testCount"></param> public static void Test(RouterDataSource <CHEdgeData> data, int testCount) { var router = new CHRouter(); var performanceInfo = new PerformanceInfoConsumer("CHRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("CHRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("CHRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
private void InitializeRouting(OsmSharp.UI.Map.Map map) { //var osmInterpreter = new OsmRoutingInterpreter(); //_router = Router.CreateLiveFrom(new XmlOsmStreamSource(new FileInfo(@"c:\OSM\bin\wechel.osm").OpenRead()), // osmInterpreter); // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(true); var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( new FileInfo(@"c:\OSM\bin\wechel.osm").OpenRead()), interpreter, Vehicle.Car); //byte[] byteArray; //var stream = new MemoryStream(); //using (stream) //{ // try // { // routingSerializer.Serialize(stream, original); // byteArray = stream.ToArray(); // } // catch (Exception) // { // throw; // } //} //stream = new MemoryStream(byteArray); //Stream stream = new FileInfo(@"c:\OSM\bin\test.osm.pbf.routing.3").OpenRead(); //IBasicRouterDataSource<CHEdgeData> deserializedVersion = // routingSerializer.Deserialize(stream); var basicRouter = new CHRouter(); _router = Router.CreateCHFrom( original, basicRouter, interpreter); _routeLayer = new LayerRoute(map.Projection); map.AddLayer(_routeLayer); }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="data"></param> /// <param name="testCount"></param> public static void Test(RouterDataSource<CHEdgeData> data, int testCount) { var router = new CHRouter(); var performanceInfo = new PerformanceInfoConsumer("CHRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("CHRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("CHRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Creates a new witness calculator. /// </summary> /// <param name="data"></param> public CHRouterWitnessCalculator(IDynamicGraph<CHEdgeData> data) { _router = new CHRouter(data); }
public void TestCHDataSourceTopologicalSortTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var sortedGraph = CHEdgeDataDataSourceSerializer.SortGraph(original); original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( new DynamicGraphRouterDataSource<CHEdgeData>(sortedGraph, original.TagsIndex), basicRouter, interpreter); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[original.VertexCount]; var resolved = new RouterPoint[original.VertexCount]; for (uint idx = 1; idx < original.VertexCount + 1; idx++) { // resolve each vertex. float latitude, longitude; if (original.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = router.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); //Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, // resolved[idx - 1].Location.Latitude, 0.0001); //Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, // resolved[idx - 1].Location.Longitude, 0.0001); } //// check all the routes having the same weight(s). //for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) //{ // for (int toIdx = 0; toIdx < resolved.Length; toIdx++) // { // OsmSharpRoute referenceRoute = referenceRouter.Calculate(Vehicle.Car, // resolvedReference[fromIdx], resolvedReference[toIdx]); // OsmSharpRoute route = router.Calculate(Vehicle.Car, // resolved[fromIdx], resolved[toIdx]); // Assert.IsNotNull(referenceRoute); // Assert.IsNotNull(route); // //Assert.AreEqual(referenceRoute.TotalDistance, route.TotalDistance, 0.1); // // TODO: meta data is missing in some CH routing; see issue // //Assert.AreEqual(reference_route.TotalTime, route.TotalTime, 0.0001); // } //} }
/// <summary> /// Called left before the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnBeforeContractionEvent(uint vertex, List<Edge<CHEdgeData>> edges) { // create a new CHRouter var router = new CHRouter(); // calculate all the routes between the neighbours of the contracted vertex. var pathsBeforeContraction = new Dictionary<uint, Dictionary<uint, PathSegment<long>>>(); _pathsBeforeContraction.Add(vertex, pathsBeforeContraction); foreach (var from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment<long>(from.Neighbour)); // initalize the from dictionary. var fromDic = new Dictionary<uint, PathSegment<long>>(); pathsBeforeContraction[from.Neighbour] = fromDic; foreach (var to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment<long>(to.Neighbour)); // calculate the route. fromDic[to.Neighbour] = router.Calculate(_data, _interpreter, Vehicle.Car, fromList, toList, double.MaxValue, null); ; } } }
/// <summary> /// Called right after the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnAfterContractionEvent(uint vertex, List<Edge<CHEdgeData>> edges) { // get dictionary for vertex. var pathsBeforeContraction = _pathsBeforeContraction[vertex]; // create a new CHRouter var router = new CHRouter(); // calculate all the routes between the neighbours of the contracted vertex. foreach (var from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment<long>(from.Neighbour)); // initalize the from dictionary. var fromDic = pathsBeforeContraction[from.Neighbour]; foreach (var to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment<long>(to.Neighbour)); // calculate the route. var route = router.Calculate(_data, _interpreter, Vehicle.Car, fromList, toList, double.MaxValue, null); if ((fromDic[to.Neighbour] == null && route != null) || (fromDic[to.Neighbour] != null && route == null)) { // the route match! Assert.Fail("Routes are different before/after contraction!"); } else if (fromDic[to.Neighbour] != null && route != null) { this.ComparePaths(fromDic[to.Neighbour], route); } } } if (_referenceRouter != null) { // do crazy verification! var chRouter = Router.CreateCHFrom(_data, router, new OsmRoutingInterpreter()); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[_data.VertexCount - 1]; var resolved = new RouterPoint[_data.VertexCount - 1]; for (uint idx = 1; idx < _data.VertexCount; idx++) { // resolve each vertex. float latitude, longitude; if (_data.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = _referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = chRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, resolved[idx - 1].Location.Latitude, 0.0001); Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, resolved[idx - 1].Location.Longitude, 0.0001); } // limit tests to a fixed number. int maxTestCount = 100; int testEveryOther = (resolved.Length * resolved.Length) / maxTestCount; testEveryOther = System.Math.Max(testEveryOther, 1); // check all the routes having the same weight(s). for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) { for (int toIdx = 0; toIdx < resolved.Length; toIdx++) { int testNumber = fromIdx * resolved.Length + toIdx; if (testNumber % testEveryOther == 0) { Route referenceRoute = _referenceRouter.Calculate(Vehicle.Car, resolvedReference[fromIdx], resolvedReference[toIdx]); Route route = chRouter.Calculate(Vehicle.Car, resolved[fromIdx], resolved[toIdx]); if (referenceRoute != null) { Assert.IsNotNull(referenceRoute); Assert.IsNotNull(route); this.CompareRoutes(referenceRoute, route); } } } } } _pathsBeforeContraction.Remove(vertex); }
/// <summary> /// Creates a new witness calculator. /// </summary> public CHRouterWitnessCalculator() { _router = new CHRouter(); }
/// <summary> /// Called left before the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnBeforeContractionEvent(uint vertex, KeyValuePair<uint, CHEdgeData>[] edges) { // create a new CHRouter var router = new CHRouter(); // calculate all the routes between the neighbours of the contracted vertex. _pathsBeforeContraction = new Dictionary<uint, Dictionary<uint, PathSegment<long>>>(); foreach (KeyValuePair<uint, CHEdgeData> from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment<long>(from.Key)); // initalize the from dictionary. var fromDic = new Dictionary<uint, PathSegment<long>>(); _pathsBeforeContraction[from.Key] = fromDic; foreach (KeyValuePair<uint, CHEdgeData> to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment<long>(to.Key)); // calculate the route. PathSegment<long> route = router.Calculate(_data, _interpreter, OsmSharp.Routing.Vehicle.Car, fromList, toList, double.MaxValue); fromDic[to.Key] = route; } } }
/// <summary> /// Called right after the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnAfterContractionEvent(uint vertex, KeyValuePair<uint, CHEdgeData>[] edges) { // create a new CHRouter CHRouter router = new CHRouter(_data); // calculate all the routes between the neighbours of the contracted vertex. foreach (KeyValuePair<uint, CHEdgeData> from in edges) { // initialize the from-list. PathSegmentVisitList from_list = new PathSegmentVisitList(); from_list.UpdateVertex(new PathSegment<long>(from.Key)); // initalize the from dictionary. Dictionary<uint, PathSegment<long>> from_dic = _paths_before_contraction[from.Key]; foreach (KeyValuePair<uint, CHEdgeData> to in edges) { // initialize the to-list. PathSegmentVisitList to_list = new PathSegmentVisitList(); to_list.UpdateVertex(new PathSegment<long>(to.Key)); // calculate the route. PathSegment<long> route = router.Calculate(_data, _interpreter, OsmSharp.Routing.VehicleEnum.Car, from_list, to_list, double.MaxValue); if ((from_dic[to.Key] == null && route != null) || (from_dic[to.Key] != null && route == null) || ((from_dic[to.Key] != null && route != null) && from_dic[to.Key] != route)) { // the route match! Assert.Fail("Routes are different before/after contraction!"); } } } }
public void TestVerifiedContraction3TinyOneWay() { var graph = new MemoryDirectedGraph<CHEdgeData>(); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); var vertex4 = graph.AddVertex(4, 0); var vertex5 = graph.AddVertex(5, 0); graph.AddEdge(vertex1, vertex4, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex4, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex1, vertex2, new CHEdgeData(1, true, true, false, 10)); // oneway forward graph.AddEdge(vertex2, vertex1, new CHEdgeData(1, false, false, true, 10)); // oneway backward. graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex5, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex5, vertex2, new CHEdgeData(1, false, true, true, 10)); Assert.IsFalse(graph.ContainsEdges(vertex1, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex3, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex4, vertex1)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex2)); Assert.IsFalse(graph.ContainsEdges(vertex2, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex3, vertex2)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex5, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex3)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex3)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex2, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex1, vertex5)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex5)); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); preProcessor.Start(); var router = new CHRouter(); // expected: (4)-10s-(1)-10s-(2)-10s-(3) (30s in total). var path = router.Calculate(graph, 4, 5); Assert.IsNotNull(path); Assert.AreEqual(30, path.Weight); var pathArray = path.ToArrayWithWeight(); Assert.AreEqual(4, pathArray.Length); float latitude, longitude; Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(4, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(30, pathArray[3].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[3].Item1, out latitude, out longitude)); Assert.AreEqual(5, latitude); // expected: (5)-10s-(2)-10s-(3)-10s-(1)-10s-(4) (40s in total). path = router.Calculate(graph, 5, 4); Assert.IsNotNull(path); Assert.AreEqual(40, path.Weight); pathArray = path.ToArrayWithWeight(); Assert.AreEqual(5, pathArray.Length); Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(5, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(30, pathArray[3].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[3].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(40, pathArray[4].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[4].Item1, out latitude, out longitude)); Assert.AreEqual(4, latitude); }
public void TestCHDataSourceTopologicalSortTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var sortedGraph = CHEdgeDataDataSourceSerializer.SortGraph(original); original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( new DynamicGraphRouterDataSource <CHEdgeData>(sortedGraph, original.TagsIndex), basicRouter, interpreter); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[original.VertexCount]; var resolved = new RouterPoint[original.VertexCount]; for (uint idx = 1; idx < original.VertexCount + 1; idx++) { // resolve each vertex. float latitude, longitude; if (original.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = router.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); //Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, // resolved[idx - 1].Location.Latitude, 0.0001); //Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, // resolved[idx - 1].Location.Longitude, 0.0001); } //// check all the routes having the same weight(s). //for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) //{ // for (int toIdx = 0; toIdx < resolved.Length; toIdx++) // { // OsmSharpRoute referenceRoute = referenceRouter.Calculate(Vehicle.Car, // resolvedReference[fromIdx], resolvedReference[toIdx]); // OsmSharpRoute route = router.Calculate(Vehicle.Car, // resolved[fromIdx], resolved[toIdx]); // Assert.IsNotNull(referenceRoute); // Assert.IsNotNull(route); // //Assert.AreEqual(referenceRoute.TotalDistance, route.TotalDistance, 0.1); // // TODO: meta data is missing in some CH routing; see issue // //Assert.AreEqual(reference_route.TotalTime, route.TotalTime, 0.0001); // } //} }
public void RoutingSerializationCHSortedRoutingComparisonTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(true); // serialize/deserialize. byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource <CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray)); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[original.VertexCount]; var resolved = new RouterPoint[original.VertexCount]; for (uint idx = 1; idx < original.VertexCount + 1; idx++) { // resolve each vertex. float latitude, longitude; if (original.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = router.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, resolved[idx - 1].Location.Latitude, 0.0001); Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, resolved[idx - 1].Location.Longitude, 0.0001); } // // check all the routes having the same weight(s). // for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) // { // for (int toIdx = 0; toIdx < resolved.Length; toIdx++) // { // OsmSharpRoute referenceRoute = referenceRouter.Calculate(VehicleEnum.Car, // resolvedReference[fromIdx], resolvedReference[toIdx]); // OsmSharpRoute route = router.Calculate(VehicleEnum.Car, // resolved[fromIdx], resolved[toIdx]); // Assert.IsNotNull(referenceRoute); // Assert.IsNotNull(route); // //Assert.AreEqual(referenceRoute.TotalDistance, route.TotalDistance, 0.1); // // TODO: meta data is missing in some CH routing; see issue // //Assert.AreEqual(reference_route.TotalTime, route.TotalTime, 0.0001); // } // } }
public void RoutingSerializationV2CHRoutingComparisonTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(true); // serialize/deserialize. byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource<CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray)); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); //this.TestCompareAll(original, referenceRouter, router); }
public void RoutingSerializationCHSortedRoutingComparisonTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network_real1.osm"; // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.CHEdgeDataDataSourceSerializer(true); // serialize/deserialize. TagsCollectionBase metaData = new TagsCollection(); metaData.Add("some_key", "some_value"); byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original, metaData); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource<CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray), out metaData); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); Assert.IsTrue(deserializedVersion.SupportsProfile(Vehicle.Car)); Assert.IsFalse(deserializedVersion.SupportsProfile(Vehicle.Bicycle)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[original.VertexCount]; var resolved = new RouterPoint[original.VertexCount]; for (uint idx = 1; idx < original.VertexCount + 1; idx++) { // resolve each vertex. float latitude, longitude; if (original.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = router.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, resolved[idx - 1].Location.Latitude, 0.0001); Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, resolved[idx - 1].Location.Longitude, 0.0001); } // // check all the routes having the same weight(s). // for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) // { // for (int toIdx = 0; toIdx < resolved.Length; toIdx++) // { // OsmSharpRoute referenceRoute = referenceRouter.Calculate(VehicleEnum.Car, // resolvedReference[fromIdx], resolvedReference[toIdx]); // OsmSharpRoute route = router.Calculate(VehicleEnum.Car, // resolved[fromIdx], resolved[toIdx]); // Assert.IsNotNull(referenceRoute); // Assert.IsNotNull(route); // //Assert.AreEqual(referenceRoute.TotalDistance, route.TotalDistance, 0.1); // // TODO: meta data is missing in some CH routing; see issue // //Assert.AreEqual(reference_route.TotalTime, route.TotalTime, 0.0001); // } // } }
public void TestVerifiedContraction3TinyOneWay() { var graph = new MemoryDirectedGraph <CHEdgeData>(); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); var vertex4 = graph.AddVertex(4, 0); var vertex5 = graph.AddVertex(5, 0); graph.AddEdge(vertex1, vertex4, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex4, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex1, vertex2, new CHEdgeData(1, true, true, false, 10)); // oneway forward graph.AddEdge(vertex2, vertex1, new CHEdgeData(1, false, false, true, 10)); // oneway backward. graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex5, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex5, vertex2, new CHEdgeData(1, false, true, true, 10)); Assert.IsFalse(graph.ContainsEdges(vertex1, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex3, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex4, vertex1)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex1)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex2)); Assert.IsFalse(graph.ContainsEdges(vertex2, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex3, vertex2)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex5, vertex2)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex3)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex3)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex3)); Assert.IsTrue(graph.ContainsEdges(vertex1, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex2, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex4)); Assert.IsFalse(graph.ContainsEdges(vertex1, vertex5)); Assert.IsTrue(graph.ContainsEdges(vertex2, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex3, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex4, vertex5)); Assert.IsFalse(graph.ContainsEdges(vertex5, vertex5)); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); preProcessor.Start(); var router = new CHRouter(); // expected: (4)-10s-(1)-10s-(2)-10s-(3) (30s in total). var path = router.Calculate(graph, 4, 5); Assert.IsNotNull(path); Assert.AreEqual(30, path.Weight); var pathArray = path.ToArrayWithWeight(); Assert.AreEqual(4, pathArray.Length); float latitude, longitude; Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(4, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(30, pathArray[3].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[3].Item1, out latitude, out longitude)); Assert.AreEqual(5, latitude); // expected: (5)-10s-(2)-10s-(3)-10s-(1)-10s-(4) (40s in total). path = router.Calculate(graph, 5, 4); Assert.IsNotNull(path); Assert.AreEqual(40, path.Weight); pathArray = path.ToArrayWithWeight(); Assert.AreEqual(5, pathArray.Length); Assert.AreEqual(0, pathArray[0].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[0].Item1, out latitude, out longitude)); Assert.AreEqual(5, latitude); Assert.AreEqual(10, pathArray[1].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[1].Item1, out latitude, out longitude)); Assert.AreEqual(2, latitude); Assert.AreEqual(20, pathArray[2].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[2].Item1, out latitude, out longitude)); Assert.AreEqual(3, latitude); Assert.AreEqual(30, pathArray[3].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[3].Item1, out latitude, out longitude)); Assert.AreEqual(1, latitude); Assert.AreEqual(40, pathArray[4].Item2); Assert.IsTrue(graph.GetVertex((uint)pathArray[4].Item1, out latitude, out longitude)); Assert.AreEqual(4, latitude); }
/// <summary> /// Called right after the contraction. /// </summary> /// <param name="vertex"></param> /// <param name="edges"></param> void pre_processor_OnAfterContractionEvent(uint vertex, List <Edge <CHEdgeData> > edges) { // get dictionary for vertex. var pathsBeforeContraction = _pathsBeforeContraction[vertex]; // create a new CHRouter var router = new CHRouter(); // calculate all the routes between the neighbours of the contracted vertex. foreach (var from in edges) { // initialize the from-list. var fromList = new PathSegmentVisitList(); fromList.UpdateVertex(new PathSegment <long>(from.Neighbour)); // initalize the from dictionary. var fromDic = pathsBeforeContraction[from.Neighbour]; foreach (var to in edges) { // initialize the to-list. var toList = new PathSegmentVisitList(); toList.UpdateVertex(new PathSegment <long>(to.Neighbour)); // calculate the route. var route = router.Calculate(_data, _interpreter, Vehicle.Car, fromList, toList, double.MaxValue, null); if ((fromDic[to.Neighbour] == null && route != null) || (fromDic[to.Neighbour] != null && route == null)) { // the route match! Assert.Fail("Routes are different before/after contraction!"); } else if (fromDic[to.Neighbour] != null && route != null) { this.ComparePaths(fromDic[to.Neighbour], route); } } } if (_referenceRouter != null) { // do crazy verification! var chRouter = Router.CreateCHFrom(_data, router, new OsmRoutingInterpreter()); // loop over all nodes and resolve their locations. var resolvedReference = new RouterPoint[_data.VertexCount - 1]; var resolved = new RouterPoint[_data.VertexCount - 1]; for (uint idx = 1; idx < _data.VertexCount; idx++) { // resolve each vertex. float latitude, longitude; if (_data.GetVertex(idx, out latitude, out longitude)) { resolvedReference[idx - 1] = _referenceRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); resolved[idx - 1] = chRouter.Resolve(Vehicle.Car, new GeoCoordinate(latitude, longitude)); } Assert.IsNotNull(resolvedReference[idx - 1]); Assert.IsNotNull(resolved[idx - 1]); Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude, resolved[idx - 1].Location.Latitude, 0.0001); Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude, resolved[idx - 1].Location.Longitude, 0.0001); } // limit tests to a fixed number. int maxTestCount = 100; int testEveryOther = (resolved.Length * resolved.Length) / maxTestCount; testEveryOther = System.Math.Max(testEveryOther, 1); // check all the routes having the same weight(s). for (int fromIdx = 0; fromIdx < resolved.Length; fromIdx++) { for (int toIdx = 0; toIdx < resolved.Length; toIdx++) { int testNumber = fromIdx * resolved.Length + toIdx; if (testNumber % testEveryOther == 0) { Route referenceRoute = _referenceRouter.Calculate(Vehicle.Car, resolvedReference[fromIdx], resolvedReference[toIdx]); Route route = chRouter.Calculate(Vehicle.Car, resolved[fromIdx], resolved[toIdx]); if (referenceRoute != null) { Assert.IsNotNull(referenceRoute); Assert.IsNotNull(route); this.CompareRoutes(referenceRoute, route); } } } } } _pathsBeforeContraction.Remove(vertex); }
/// <summary> /// Does the actual testing. /// </summary> /// <param name="embeddedString"></param> private void DoRoutingSerializationV2CHRoutingV2ComparisonTest(string embeddedString) { // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); // create serializer. var routingSerializer = new OsmSharp.Routing.CH.Serialization.Sorted.v2.CHEdgeDataDataSourceSerializer(true); // serialize/deserialize. TagsCollectionBase metaData = new TagsCollection(); metaData.Add("some_key", "some_value"); byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original, metaData); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } IBasicRouterDataSource<CHEdgeData> deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray), out metaData); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); Assert.IsTrue(deserializedVersion.SupportsProfile(Vehicle.Car)); Assert.IsFalse(deserializedVersion.SupportsProfile(Vehicle.Bicycle)); // create reference router. original = CHEdgeGraphOsmStreamTarget.Preprocess(new XmlOsmStreamSource( Assembly.GetExecutingAssembly() .GetManifestResourceStream(embeddedString)), interpreter, Vehicle.Car); var basicRouterOriginal = new CHRouter(); Router referenceRouter = Router.CreateCHFrom( original, basicRouterOriginal, interpreter); // try to do some routing on the deserialized version. var basicRouter = new CHRouter(); Router router = Router.CreateCHFrom( deserializedVersion, basicRouter, interpreter); this.TestCompareAll(original, referenceRouter, router); }
/// <summary> /// Creates a new witness calculator. /// </summary> /// <param name="data"></param> public CHRouterWitnessCalculator(IDynamicGraph <CHEdgeData> data) { _router = new CHRouter(data); }