/// <summary> /// Builds the data. /// </summary> /// <param name="interpreter"></param> /// <param name="embeddedString"></param> /// <returns></returns> public override IBasicRouterDataSource <CHEdgeData> BuildData(IOsmRoutingInterpreter interpreter, string embeddedString) { var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( memoryData, interpreter, tagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. var preProcessor = new CHPreProcessor(memoryData, new SparseOrdering(memoryData), new DykstraWitnessCalculator()); preProcessor.Start(); return(memoryData); }
/// <summary> /// Creates a router. /// </summary> /// <param name="interpreter"></param> /// <param name="manifestResourceName"></param> /// <returns></returns> protected override Router CreateRouter(IOsmRoutingInterpreter interpreter, string manifestResourceName) { SimpleTagsIndex tagsIndex = new SimpleTagsIndex(); // do the data processing. var data = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( data, interpreter, tagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(manifestResourceName)); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(data, new EdgeDifference(data, witnessCalculator), witnessCalculator); preProcessor.Start(); //IBasicRouter<LiveEdge> basicRouter = new DykstraRoutingLive(memoryData.TagsIndex); return(Router.CreateCHFrom(data, new CHRouter(), interpreter)); }
/// <summary> /// Returns a new router. /// </summary> /// <param name="interpreter"></param> /// <param name="embeddedName"></param> /// <param name="contract"></param> /// <returns></returns> public override Router BuildRouter(IOsmRoutingInterpreter interpreter, string embeddedName, bool contract) { if (_data == null) { _data = new Dictionary <string, DynamicGraphRouterDataSource <CHEdgeData> >(); } DynamicGraphRouterDataSource <CHEdgeData> data = null; if (!_data.TryGetValue(embeddedName, out data)) { var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. data = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( data, interpreter, tagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format( "OsmSharp.Test.Unittests.{0}", embeddedName))); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. var preProcessor = new CHPreProcessor(data, new SparseOrdering(data), new DykstraWitnessCalculator()); preProcessor.Start(); _data[embeddedName] = data; } return(Router.CreateCHFrom(data, new CHRouter(), interpreter)); }
/// <summary> /// Preprocesses the data from the given OsmStreamReader and converts it directly to a routable data source. /// </summary> /// <param name="reader"></param> /// <param name="tagsIndex"></param> /// <param name="interpreter"></param> /// <param name="vehicle"></param> /// <param name="leaveReverseEdges"></param> /// <returns></returns> public static DynamicGraphRouterDataSource <CHEdgeData> Preprocess(OsmStreamSource reader, ITagsIndex tagsIndex, IOsmRoutingInterpreter interpreter, Vehicle vehicle, bool leaveReverseEdges) { // pull in the data. var dynamicGraphRouterDataSource = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( dynamicGraphRouterDataSource, interpreter, tagsIndex, vehicle); targetData.RegisterSource(reader); targetData.Pull(); // compress the graph. INodeWitnessCalculator witnessCalculator = new DykstraWitnessCalculator(); var edgeDifference = new EdgeDifference( dynamicGraphRouterDataSource, witnessCalculator); var preProcessor = new CHPreProcessor( dynamicGraphRouterDataSource, edgeDifference, witnessCalculator); preProcessor.Start(); return(dynamicGraphRouterDataSource); }
/// <summary> /// Builds the data. /// </summary> /// <param name="interpreter"></param> /// <param name="embeddedString"></param> /// <returns></returns> public override IBasicRouterDataSource <CHEdgeData> BuildData(IOsmRoutingInterpreter interpreter, string embeddedString) { string key = string.Format("CHEdgeDifference.Routing.IBasicRouterDataSource<CHEdgeData>.OSM.{0}", embeddedString); var data = StaticDictionary.Get <IBasicRouterDataSource <CHEdgeData> >( key); if (data == null) { var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( memoryData, interpreter, tagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(memoryData, new EdgeDifference(memoryData, witnessCalculator), witnessCalculator); preProcessor.Start(); data = memoryData; StaticDictionary.Add <IBasicRouterDataSource <CHEdgeData> >(key, data); } return(data); }
/// <summary> /// Executes the CH contractions while verifying each step. /// </summary> /// <param name="stream"></param> public void DoTestCHSparseVerifiedContraction(Stream stream) { _interpreter = new OsmRoutingInterpreter(); var tagsIndex = new SimpleTagsIndex(); // do the data processing. _data = new DynamicGraphRouterDataSource <CHEdgeData>(tagsIndex); var targetData = new CHEdgeGraphOsmStreamWriter( _data, _interpreter, _data.TagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource(stream); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. //INodeWitnessCalculator witness_calculator = new CHRouterWitnessCalculator(_data); INodeWitnessCalculator witnessCalculator = new DykstraWitnessCalculator(_data); var preProcessor = new CHPreProcessor(_data, new EdgeDifferenceContractedSearchSpace(_data, witnessCalculator), witnessCalculator); preProcessor.OnBeforeContractionEvent += new CHPreProcessor.VertexDelegate(pre_processor_OnBeforeContractionEvent); preProcessor.OnAfterContractionEvent += new CHPreProcessor.VertexDelegate(pre_processor_OnAfterContractionEvent); preProcessor.Start(); }
/// <summary> /// Executes the CH contractions while verifying each step. /// </summary> /// <param name="stream"></param> public void DoTestCHSparseVerifiedContraction(Stream stream) { _pathsBeforeContraction = new Dictionary <uint, Dictionary <uint, Dictionary <uint, PathSegment <long> > > >(); _interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. _data = new DynamicGraphRouterDataSource <CHEdgeData>(new MemoryDirectedGraph <CHEdgeData>(), tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( _data, _interpreter, tagsIndex, Vehicle.Car); var dataProcessorSource = new XmlOsmStreamSource(stream); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); // do the pre-processing part. var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(_data, new EdgeDifferenceContractedSearchSpace(_data, witnessCalculator), witnessCalculator); preProcessor.OnBeforeContractionEvent += new CHPreProcessor.VertexDelegate(pre_processor_OnBeforeContractionEvent); preProcessor.OnAfterContractionEvent += new CHPreProcessor.VertexDelegate(pre_processor_OnAfterContractionEvent); preProcessor.Start(); }
/// <summary> /// Flushes all data. /// </summary> public override void Flush() { base.Flush(); // compress the graph. INodeWitnessCalculator witnessCalculator = new DykstraWitnessCalculator(); var edgeDifference = new EdgeDifference( _graph, witnessCalculator); var preProcessor = new CHPreProcessor( _graph, edgeDifference, witnessCalculator); preProcessor.Start(); // create serializer. var routingSerializer = new CHEdgeDataDataSourceSerializer(true); routingSerializer.Serialize(_graphStream, _graph); _graphStream.Flush(); }
/// <summary> /// Preprocesses the data from the given OsmStreamReader and converts it directly to a routable data source. /// </summary> /// <param name="reader"></param> /// <param name="tagsIndex"></param> /// <param name="interpreter"></param> /// <param name="vehicle"></param> /// <returns></returns> public static DynamicGraphRouterDataSource <CHEdgeData> Preprocess(OsmStreamSource reader, ITagsCollectionIndex tagsIndex, IOsmRoutingInterpreter interpreter, Vehicle vehicle) { // pull in the data. var graph = new DynamicGraphRouterDataSource <CHEdgeData>(new MemoryDirectedGraph <CHEdgeData>(), tagsIndex); var targetData = new CHEdgeGraphOsmStreamTarget( graph, interpreter, tagsIndex, vehicle); targetData.RegisterSource(reader); targetData.Pull(); // compress the graph. var witnessCalculator = new DykstraWitnessCalculator(); var edgeDifference = new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator); var preProcessor = new CHPreProcessor(graph, edgeDifference, witnessCalculator); preProcessor.Start(); return(graph); }
/// <summary> /// Flushes all data. /// </summary> public override void Flush() { base.Flush(); // compress the graph. INodeWitnessCalculator witnessCalculator = new DykstraWitnessCalculator(); var edgeDifference = new EdgeDifferenceContractedSearchSpace( _graph, witnessCalculator); var preProcessor = new CHPreProcessor( _graph, edgeDifference, witnessCalculator); preProcessor.Start(); // create tags. TagsCollectionBase metaTags = new TagsCollection(); // create serializer. var routingSerializer = new CHEdgeDataDataSourceSerializer(); routingSerializer.Serialize(_graphStream, _graph, metaTags); _graphStream.Flush(); }
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); }