public static INewGraph KruskalMST(INewGraph graph)
        {
            LogTool.AssertIsTrue(graph.Edges.First() is IWeightedEdge);

            var ret          = graph.Factory.CreateGraph();
            var edges        = graph.Edges.OrderBy(e => (e as IWeightedEdge).Weight);
            var currentEdges = new List <IEdge>();

            foreach (var e in edges)
            {
                currentEdges.Add(e);
                if (GraphTools.HasCircle(currentEdges))
                {
                    currentEdges.RemoveAt(currentEdges.Count - 1);
                }
                else
                {
                    var nv1 = ret.AddVertex(e.Vertex.Clone() as IVertex);
                    var nv2 = ret.AddVertex(e.OtherVertex.Clone() as IVertex);
                    ret.AddEdge(nv1, nv2);
                }
            }

            return(ret);
        }
Example #2
0
        /// <summary>
        /// Gets order of calculating the functions, based on its co using.
        /// </summary>
        public static UserFunctionDefinitionSyntaxNode[] FindFunctionSolvingOrderOrThrow(this SyntaxTree syntaxTree)
        {
            var userFunctions = syntaxTree.Children.OfType <UserFunctionDefinitionSyntaxNode>().ToArray();

            if (userFunctions.Length == 0)
            {
                return(userFunctions);
            }

            var userFunctionsNames = new Dictionary <string, int>();
            int i = 0;

            foreach (var userFunction in userFunctions)
            {
                var alias = userFunction.GetFunAlias();
                if (userFunctionsNames.ContainsKey(alias))
                {
                    throw ErrorFactory.FunctionAlreadyExist(userFunction);
                }
                userFunctionsNames.Add(alias, i);
                i++;
            }

            int[][] dependenciesGraph = new int[i][];
            int     j = 0;

            foreach (var userFunction in userFunctions)
            {
                var visitor = new FindFunctionDependenciesVisitor(userFunction.GetFunAlias(), userFunctionsNames);
                if (!userFunction.ComeOver(visitor))
                {
                    throw new InvalidOperationException("User fun come over");
                }

                userFunction.IsRecursive = visitor.HasSelfRecursion;

                dependenciesGraph[j] = visitor.GetFoundDependencies();
                j++;
            }

            var sortResults = GraphTools.SortCycledTopology(dependenciesGraph);

            var functionSolveOrder = new UserFunctionDefinitionSyntaxNode[sortResults.NodeNames.Length];

            for (int k = 0; k < sortResults.NodeNames.Length; k++)
            {
                var id = sortResults.NodeNames[k];
                functionSolveOrder[k] = userFunctions[id];
            }

            if (sortResults.HasCycle)
            {
                //if functions has cycle, then function solve order is cycled
                throw ErrorFactory.ComplexRecursion(functionSolveOrder);
            }

            return(functionSolveOrder);
        }
        public void OneNodeCycle()
        {
            var graph = new[]
            {
                From(0),
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasCycle(new[] { 0 }, res);
        }
        public void TwoNodesCycle()
        {
            var graph = new[]
            {
                From(1),
                From(0),
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasCycle(new[] { 0, 1 }, res);
        }
        public void TwoNodesGraphSorting()
        {
            //1->0
            var graph = new[]
            {
                From(1),
                NoParents
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[] { 1, 0 }, res);
        }
        public void ThreeNodesInLineSorting()
        {
            //2->1->0
            var graph = new[]
            {
                From(1),
                From(2),
                NoParents
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[] { 2, 1, 0 }, res);
        }
        public void ThreeSeparatedNodesSorting()
        {
            //2,1,0
            var graph = new[]
            {
                NoParents,
                NoParents,
                NoParents
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[] { 0, 1, 2 }, res);
        }
        public void ThreeNodesInLineRevertSorting()
        {
            //0->1->2
            var graph = new[]
            {
                NoParents,
                From(0),
                From(1)
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[] { 0, 1, 2 }, res);
        }
        public void ComplexGraphSorting()
        {
            //{5,3}->|6->|
            //   {1,4} ->|0->2
            var graph = new[]
            {
                From(1, 4, 6),
                NoParents,
                From(0),
                NoParents,
                NoParents,
                NoParents,
                From(5, 3),
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[] { 1, 4, 5, 3, 6, 0, 2 }, res);
        }
        public void ComplexNodesCycle()
        {
            //         |<------|
            //0->1->2->|3->4->5|->6
            var graph = new[]
            {
                NoParents,
                From(0),
                From(1),
                From(2, 5), //cycle here
                From(3),
                From(4),
                From(5),
                From(6),
            };
            var res = GraphTools.SortTopology(graph);

            AssertHasCycle(new[] { 3, 4, 5 }, res);
        }
        public void SeveralComplexGraphSorting()
        {
            var graph = new Edge[17][];

            //{5,3}->|6->|
            //   {1,4} ->|0->2
            graph[0] = From(1, 4, 6);
            graph[1] = NoParents;
            graph[2] = From(0);
            graph[3] = NoParents;
            graph[4] = NoParents;
            graph[5] = NoParents;
            graph[6] = From(5, 3);
            //{12,8}->|10->|
            //    {9,11} ->|13->7
            graph[7]  = From(13);
            graph[8]  = NoParents;
            graph[9]  = NoParents;
            graph[10] = From(12, 8);
            graph[11] = NoParents;
            graph[12] = NoParents;
            graph[13] = From(9, 11, 10);
            //14
            graph[14] = NoParents;
            //15->16
            graph[15] = NoParents;
            graph[16] = From(15);

            var res = GraphTools.SortTopology(graph);

            AssertHasRoute(new[]
            {
                1, 4, 5, 3, 6, 0, 2,
                9, 11, 12, 8, 10, 13, 7,
                14,
                15, 16
            }, res);
        }