Пример #1
0
        public void BinarySerialization_CompressedGraph([NotNull] CompressedSparseRowGraph <int> graph)
        {
            CompressedSparseRowGraph <int> deserializedGraph =
                SerializeDeserialize <int, SEquatableEdge <int>, CompressedSparseRowGraph <int> >(graph);

            Assert.IsTrue(EquateGraphs.Equate(graph, deserializedGraph));
        }
Пример #2
0
        public static int[] SpectralSequence(CompressedSparseRowGraph graph)
        {
            Debug.WriteLine("Converting graph");
            var nodes      = graph.Convert();
            var edgesPairs = nodes.SelectMany(x => x.Neighbors.OrderBy(y => y.Key)).ToArray();
            var adjacency  = new int[nodes.Count + 1];
            var count      = 0;

            for (var i = 0; i < nodes.Count; i++)
            {
                count           += nodes[i].Neighbors.Count;
                adjacency[i + 1] = count;
            }

            var edges       = new int[edgesPairs.Length + 1];
            var edgeWeights = new float[edgesPairs.Length + 1];

            Debug.WriteLine("edgePairs.Length: " + edgesPairs.Length);
            for (var i = 0; i < edgesPairs.Length; i++)
            {
                var pair = edgesPairs[i];
                edges[i]       = pair.Key;
                edgeWeights[i] = Math.Max(pair.Value, 1.0f);
            }

            edges[^ 1]       = -1;
        public void GraphMLSerialization_CompressedGraph([NotNull] CompressedSparseRowGraph <int> graph)
        {
            AdjacencyGraph <int, SEquatableEdge <int> > deserializedGraph =
                SerializeDeserialize_SEdge <CompressedSparseRowGraph <int>, AdjacencyGraph <int, SEquatableEdge <int> > >(graph);

            Assert.IsTrue(EquateGraphs.Equate(graph, deserializedGraph));
        }
        public void ContainsVertex_Throws()
        {
            var wrappedGraph = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();
            var graph        = CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph);

            ContainsVertex_Throws_Test(graph);
        }
        public void TryGetOutEdges_Throws()
        {
            var wrappedGraph = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();
            var graph        = CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph);

            TryGetOutEdges_Throws_Test(graph);
        }
Пример #6
0
        private static NewNode[] ConvertToNewNodes(CompressedSparseRowGraph graph)
        {
            var nodes = new NewNode[graph.FirstChildEdgeIndex.Length - 1];

            for (var i = 0; i < nodes.Length; i++)
            {
                nodes[i] = new NewNode(i);
            }

            for (var i = 1; i <= nodes.Length; i++)
            {
                var first  = graph.FirstChildEdgeIndex[i - 1];
                var last   = graph.FirstChildEdgeIndex[i];
                var parent = nodes[i - 1];
                for (var j = first; j < last; j++)
                {
                    var index = graph.EdgeToNodeIndex[j];
                    var child = nodes[Math.Abs(index)];

                    /*if (index < 0)
                     * {
                     *  child.Terminal = true;
                     * }*/

                    parent.Children.Add(child);
                    child.Parents.Add(parent);
                }
            }

            return(nodes);
        }
Пример #7
0
        public void BinarySerialization_CompressedGraph_Complex([NotNull] CompressedSparseRowGraph <EquatableTestVertex> graph)
        {
            CompressedSparseRowGraph <EquatableTestVertex> deserializedGraph =
                SerializeDeserialize <EquatableTestVertex, SEquatableEdge <EquatableTestVertex>, CompressedSparseRowGraph <EquatableTestVertex> >(graph);

            Assert.IsTrue(EquateGraphs.Equate(graph, deserializedGraph));
        }
        public static void WriteD3JsonFormat(this CompressedSparseRowGraph graph, string filename)
        {
            using var file = new StreamWriter(File.OpenWrite(filename));
            file.Write(@"
{
    ""nodes"":
    [ ");
            file.Write(
                @"
        {
            ""x"":0,
            ""y"":0
        }");
            for (var i = 1; i < graph.FirstChildEdgeIndex.Length - 1; i++)
            {
                file.Write(
                    @",
        {
            ""x"":" + i + @",
            ""y"":" + i + @"
        }");
            }

            file.Write(
                @"
    ],
    ""links"":[  ");
            var useComma = false;

            for (var i = 1; i < graph.FirstChildEdgeIndex.Length - 1; i++)
            {
                var node  = i - 1;
                var first = graph.FirstChildEdgeIndex[node];
                var last  = graph.FirstChildEdgeIndex[i];
                for (var j = first; j < last; j++)
                {
                    var target = Math.Abs(graph.EdgeToNodeIndex[j]);
                    if (useComma)
                    {
                        file.Write(",");
                    }
                    else
                    {
                        useComma = true;
                    }

                    file.Write(
                        @"
        {
            ""source"":" + node + @",
            ""target"":" + target + @"
        }");
                }
            }

            file.Write(
                @"
    ]
}");
        }
        public void ContainsEdge_Throws()
        {
            var wrappedGraph = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();
            var graph        = CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph);

            ContainsEdge_DefaultNullThrows_Test(graph);
            ContainsEdge_SourceTarget_Throws_Test(graph);
        }
        public void ContainsEdge_SourceTarget()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();

            ContainsEdge_SourceTarget_ImmutableGraph_Test(
                wrappedGraph,
                () => CompressedSparseRowGraph <int> .FromGraph(wrappedGraph));
        }
        public void ContainsVertex()
        {
            var wrappedGraph = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();

            ContainsVertex_ImmutableGraph_Test(
                wrappedGraph,
                () => CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph));
        }
        public void TryGetOutEdges()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();

            TryGetOutEdges_ImmutableGraph_Test(
                wrappedGraph,
                () => CompressedSparseRowGraph <int> .FromGraph(wrappedGraph));
        }
        public void Clone()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();
            var graph        = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertEmptyGraph(graph);

            var clonedGraph = graph.Clone();

            Assert.IsNotNull(clonedGraph);
            AssertEmptyGraph(clonedGraph);

            clonedGraph = (CompressedSparseRowGraph <int>)((ICloneable)graph).Clone();
            Assert.IsNotNull(clonedGraph);
            AssertEmptyGraph(clonedGraph);

            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 3);
            var edge3 = new Edge <int>(2, 3);

            wrappedGraph.AddVerticesAndEdgeRange(new[] { edge1, edge2, edge3 });
            graph = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertHasVertices(graph, new[] { 1, 2, 3 });
            AssertHasEdges(
                graph,
                new[]
            {
                new SEquatableEdge <int>(1, 2),
                new SEquatableEdge <int>(1, 3),
                new SEquatableEdge <int>(2, 3)
            });

            clonedGraph = graph.Clone();
            Assert.IsNotNull(clonedGraph);
            AssertHasVertices(clonedGraph, new[] { 1, 2, 3 });
            AssertHasEdges(
                clonedGraph,
                new[]
            {
                new SEquatableEdge <int>(1, 2),
                new SEquatableEdge <int>(1, 3),
                new SEquatableEdge <int>(2, 3)
            });

            clonedGraph = (CompressedSparseRowGraph <int>)((ICloneable)graph).Clone();
            Assert.IsNotNull(clonedGraph);
            AssertHasVertices(clonedGraph, new[] { 1, 2, 3 });
            AssertHasEdges(
                clonedGraph,
                new[]
            {
                new SEquatableEdge <int>(1, 2),
                new SEquatableEdge <int>(1, 3),
                new SEquatableEdge <int>(2, 3)
            });
        }
        public void OutEdges_Throws()
        {
            var wrappedGraph1 = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();
            var graph1        = CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph1);

            OutEdges_NullThrows_Test(graph1);

            var wrappedGraph2 = new AdjacencyGraph <EquatableTestVertex, Edge <EquatableTestVertex> >();
            var graph2        = CompressedSparseRowGraph <EquatableTestVertex> .FromGraph(wrappedGraph2);

            OutEdges_Throws_Test(graph2);
        }
        public void OutEdge_Throws()
        {
            var wrappedGraph1 = new AdjacencyGraph <TestVertex, Edge <TestVertex> >();
            var graph1        = CompressedSparseRowGraph <TestVertex> .FromGraph(wrappedGraph1);

            OutEdge_NullThrows_Test(graph1);

            var wrappedGraph2 = new AdjacencyGraph <int, Edge <int> >();

            OutEdge_Throws_ImmutableGraph_Test(
                wrappedGraph2,
                () => CompressedSparseRowGraph <int> .FromGraph(wrappedGraph2));
        }
Пример #16
0
        public OrderingInstance(CompressedSparseRowGraph graph)
        {
            _graph                    = graph;
            _convertedGraph           = graph.Convert();
            _arrangementToDawgPointer = new int[_convertedGraph.Count];
            _dawgToArrangementPointer = new int[_convertedGraph.Count];
            for (var i = 0; i < _convertedGraph.Count; i++)
            {
                _arrangementToDawgPointer[i] = i;
                _dawgToArrangementPointer[i] = i;
            }

            CalculateFullCost();
        }
        public static CompressedSparseRowGraph Arrange(this CompressedSparseRowGraph graph, int[] arrangement)
        {
            var nodeCount = graph.FirstChildEdgeIndex.Length - 1;

            if (nodeCount != arrangement.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(arrangement));
            }

            //#if DEBUG
            var set = new HashSet <int>();

            for (var i = 0; i < arrangement.Length; i++)
            {
                Debug.Assert(0 <= arrangement[i], "0 <= arrangement[i]");
                if (!set.Add(arrangement[i]))
                {
                    var errorMessage = "Duplicate in arrangement at index " + i + " with value " + arrangement[i];
                    throw new InvalidOperationException(errorMessage);
                }
            }
            //#endif

            var reverse = new int[arrangement.Length];

            for (var i = 0; i < arrangement.Length; i++)
            {
                reverse[arrangement[i]] = i;
            }

            //#if DEBUG
            set.Clear();
            for (var i = 0; i < reverse.Length; i++)
            {
                Debug.Assert(0 <= reverse[i], "0 <= reverse[i]");
                if (!set.Add(reverse[i]))
                {
                    var errorMessage = "Duplicate in reverse at index " + i + " with value " + reverse[i];
                    throw new InvalidOperationException(errorMessage);
                }
            }
            //#endif

            // We skip node index 0 if it is terminal in the new graph.
            // It would be indistinguishable because there's no negative 0.
            var zeroIndexOffset            = reverse[0] < 0 ? 1 : 0;
            var newFirstChildEdgeIndex     = new uint[nodeCount + 1 + zeroIndexOffset];
            var newReachableTerminalCounts = new ushort[nodeCount + zeroIndexOffset];

            var newEdgeToNodeIndex = new int[graph.EdgeToNodeIndex.Length];
            var newEdgeCharacters  = new char[graph.EdgeCharacters.Length];

            var edgeCount = 0u;

            for (var i = 0; i < nodeCount; i++)
            {
                var oldNode = arrangement[i];

                newFirstChildEdgeIndex[i + zeroIndexOffset]     = edgeCount;
                newReachableTerminalCounts[i + zeroIndexOffset] = graph.ReachableTerminalNodes[oldNode];

                var first = graph.FirstChildEdgeIndex[oldNode];
                var last  = graph.FirstChildEdgeIndex[oldNode + 1];
                var edges = graph.EdgeToNodeIndex.Skip((int)first).Take((int)(last - first)).Select((x, index) => new { x = x, index = index });//.OrderBy(x => x.x);

                foreach (var edge in edges)
                {
                    var targetNodeOldGraph = graph.EdgeToNodeIndex[first + edge.index];
                    Debug.Assert(targetNodeOldGraph == edge.x);
                    if (targetNodeOldGraph != edge.x)
                    {
                        throw new InvalidOperationException("");
                    }
                    var terminal = targetNodeOldGraph < 0;
                    newEdgeToNodeIndex[edgeCount] = (reverse[Math.Abs(targetNodeOldGraph)] + zeroIndexOffset) * (terminal ? -1 : 1);
                    newEdgeCharacters[edgeCount]  = graph.EdgeCharacters[first + edge.index];
                    edgeCount++;
                }

                /*
                 * for (var j = graph.FirstChildEdgeIndex[oldNode]; j < graph.FirstChildEdgeIndex[oldNode + 1]; j++)
                 * {
                 *  var targetNodeOldGraph = graph.EdgeToNodeIndex[j];
                 *  var terminal = targetNodeOldGraph < 0;
                 *  newEdgeToNodeIndex[edgeCount] = (reverse[Math.Abs(targetNodeOldGraph)] + zeroIndexOffset) * (terminal ? -1 : 1);
                 *  newEdgeCharacters[edgeCount] = graph.EdgeCharacters[j];
                 *  edgeCount++;
                 * }*/
            }

            newFirstChildEdgeIndex[^ 1] = (uint)newEdgeToNodeIndex.Length;
 public void Construction_Throws()
 {
     // ReSharper disable once AssignNullToNotNullAttribute
     Assert.Throws <ArgumentNullException>(
         () => CompressedSparseRowGraph <int> .FromGraph <Edge <int> >(null));
 }
Пример #19
0
 public static void AssertEmptyGraph <TVertex>(
     CompressedSparseRowGraph <TVertex> graph)
 {
     AssertNoVertex(graph);
     AssertNoEdge(graph);
 }
        public void Construction()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();
            var graph        = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertGraphProperties(graph);
            AssertEmptyGraph(graph);

            wrappedGraph.AddVertexRange(new[] { 1, 2, 3 });
            graph = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertGraphProperties(graph);
            AssertHasVertices(graph, new[] { 1, 2, 3 });
            AssertNoEdge(graph);

            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 3);
            var edge3 = new Edge <int>(2, 1);
            var edge4 = new Edge <int>(2, 2);
            var edge5 = new Edge <int>(2, 3);

            wrappedGraph.AddEdgeRange(new[] { edge1, edge2, edge3, edge4, edge5 });
            graph = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertGraphProperties(graph);
            AssertHasVertices(graph, new[] { 1, 2, 3 });
            AssertHasEdges(
                graph,
                new[]
            {
                new SEquatableEdge <int>(1, 2),
                new SEquatableEdge <int>(1, 3),
                new SEquatableEdge <int>(2, 1),
                new SEquatableEdge <int>(2, 2),
                new SEquatableEdge <int>(2, 3)
            });

            var edge6 = new Edge <int>(3, 1);
            var edge7 = new Edge <int>(3, 2);

            wrappedGraph.Clear();
            wrappedGraph.AddVertexRange(new[] { 1, 2, 3, 4 });
            wrappedGraph.AddEdgeRange(new[] { edge1, edge2, edge6, edge7 });
            graph = CompressedSparseRowGraph <int> .FromGraph(wrappedGraph);

            AssertGraphProperties(graph);
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(
                graph,
                new[]
            {
                new SEquatableEdge <int>(1, 2),
                new SEquatableEdge <int>(1, 3),
                new SEquatableEdge <int>(3, 1),
                new SEquatableEdge <int>(3, 2)
            });

            #region Local function

            void AssertGraphProperties <TVertex>(
                // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
                CompressedSparseRowGraph <TVertex> g)
            {
                Assert.IsTrue(g.IsDirected);
                Assert.IsFalse(g.AllowParallelEdges);
            }

            #endregion
        }