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); }
/// <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); }