private void DoWitnessQueue() { if (_witnessQueue.Count > 0) { #if NETSTANDARD2_0 System.Threading.Tasks.Parallel.ForEach(_witnessQueue, (v) => { WitnessCalculators.Value.Run(_graph.Graph, _witnessGraph, (uint)v, _witnessQueue); }); #elif PCL for (uint v = 0; v < _graph.VertexCount; v++) { WitnessCalculators.Run(_graph.Graph, _witnessGraph, (uint)v, null); } #else foreach (var v in _witnessQueue) { WitnessCalculators.Value.Run(_graph.Graph, _witnessGraph, (uint)v, _witnessQueue); } #endif _witnessQueue.Clear(); if (_witnessGraph.EdgeSpaceCount > _witnessGraph.EdgeCount * 8) { _witnessGraph.Compress(); _logger.Log(TraceEventType.Information, "Witnessgraph size: {0}", _witnessGraph.EdgeCount); } } }
/// <summary> /// Removes all islands that are not roots and updates all edges. /// </summary> /// <param name="islandLabels">The current labels.</param> internal long Reduce(IslandLabels islandLabels) { // remove vertices that aren't originals. var neighbours = new HashSet <uint>(); var edgeEnumerator = _graph.GetEdgeEnumerator(); var edgeEnumerator2 = _graph.GetEdgeEnumerator(); var nonNullLabels = 0; for (uint label = 0; label < _graph.VertexCount; label++) { var minimal = islandLabels[label]; if (!edgeEnumerator.MoveTo(label)) { _graph.RemoveEdges(label); continue; } neighbours.Clear(); while (edgeEnumerator.MoveNext()) { var n = edgeEnumerator.Neighbour; n = islandLabels[n]; if (n == IslandLabels.NoAccess || n == IslandLabels.NotSet || n == minimal) { continue; } // remove dead-ends. if (!edgeEnumerator2.MoveTo(n)) { // this edge has no targets. continue; } neighbours.Add(n); } _graph.RemoveEdges(label); if (neighbours.Count == 0) { continue; } nonNullLabels++; foreach (var n in neighbours) { _graph.RemoveEdge(minimal, n); _graph.AddEdge(minimal, n); } } _graph.Compress(); return(nonNullLabels); }
public void TestSerialize() { var graph = new DirectedGraph(1, 10); // add and compress. graph.AddEdge(0, 1, 1); graph.Compress(); var expectedSize = 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. 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 DirectedGraph(1, 10); // add and compress. graph.AddEdge(0, 1, 10); graph.AddEdge(1, 2, 20); graph.AddEdge(2, 3, 30); graph.AddEdge(3, 4, 40); graph.RemoveEdge(1, 2); graph.Compress(); expectedSize = 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. using (var stream = new System.IO.MemoryStream()) { Assert.AreEqual(expectedSize, graph.Serialize(stream)); Assert.AreEqual(expectedSize, stream.Position); } }
public void TestQuadrilateralOneWay() { // build graph. var graph = new DirectedGraph(ContractedEdgeDataSerializer.Size); graph.AddEdge(0, 2, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = true, Weight = 100 })); graph.AddEdge(2, 0, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = false, Weight = 100 })); graph.AddEdge(0, 3, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = false, Weight = 10 })); graph.AddEdge(3, 0, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = true, Weight = 10 })); graph.AddEdge(1, 2, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = false, Weight = 1000 })); graph.AddEdge(2, 1, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = true, Weight = 1000 })); graph.AddEdge(1, 3, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = true, Weight = 10000 })); graph.AddEdge(3, 1, ContractedEdgeDataSerializer.SerializeMeta(new ContractedEdgeData() { ContractedId = Constants.NO_VERTEX, Direction = false, Weight = 10000 })); graph.Compress(false); var witnessCalculator = new DykstraWitnessCalculator(int.MaxValue); // calculate witnesses for 0. var forwardWitnesses = new bool[1]; var backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 2, new List <uint>(new uint[] { 3 }), new List <float>(new float[] { 110 }), ref forwardWitnesses, ref backwardWitnesses, 0); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 0. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 3, new List <uint>(new uint[] { 2 }), new List <float>(new float[] { 110 }), ref forwardWitnesses, ref backwardWitnesses, 0); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 2. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 0, new List <uint>(new uint[] { 1 }), new List <float>(new float[] { 1100 }), ref forwardWitnesses, ref backwardWitnesses, 2); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 2. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 1, new List <uint>(new uint[] { 0 }), new List <float>(new float[] { 1100 }), ref forwardWitnesses, ref backwardWitnesses, 2); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 1. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 3, new List <uint>(new uint[] { 2 }), new List <float>(new float[] { 11000 }), ref forwardWitnesses, ref backwardWitnesses, 1); Assert.AreEqual(true, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 1. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 2, new List <uint>(new uint[] { 3 }), new List <float>(new float[] { 11000 }), ref forwardWitnesses, ref backwardWitnesses, 1); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(true, backwardWitnesses[0]); // calculate witnesses for 3. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 0, new List <uint>(new uint[] { 1 }), new List <float>(new float[] { 10010 }), ref forwardWitnesses, ref backwardWitnesses, 3); Assert.AreEqual(true, forwardWitnesses[0]); Assert.AreEqual(false, backwardWitnesses[0]); // calculate witnesses for 3. forwardWitnesses = new bool[1]; backwardWitnesses = new bool[1]; witnessCalculator.Calculate(graph, 1, new List <uint>(new uint[] { 0 }), new List <float>(new float[] { 10010 }), ref forwardWitnesses, ref backwardWitnesses, 3); Assert.AreEqual(false, forwardWitnesses[0]); Assert.AreEqual(true, backwardWitnesses[0]); }
public void TestCompress() { var graph = new DirectedGraph(1, 10); // add and compress. graph.AddEdge(0, 1, 1); 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 DirectedGraph(1, 10); // add and compress. graph.AddEdge(0, 1, 10); graph.AddEdge(1, 2, 20); graph.AddEdge(2, 3, 30); graph.AddEdge(3, 4, 40); 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(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(3, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[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(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(3, edges.First().Neighbour); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(40, edges.First().Data[0]); Assert.AreEqual(4, edges.First().Neighbour); }