public static LinearDecomposition Compute(Datastructures.Graph graph, CandidateStrategy candidateStrategy, InitialVertexStrategy initialVertexStrategy) { List<BitSet> connectedComponents = DepthFirstSearch.ConnectedComponents(graph); List<int> sequence = new List<int>(); foreach (BitSet connectedComponent in connectedComponents) { switch (initialVertexStrategy) { case InitialVertexStrategy.All: { UNSequence minSequence = new UNSequence() { Value = int.MaxValue}; int max = int.MaxValue; object _lock = new object(); Parallel.ForEach(connectedComponent, vertex => { UNSequence tempSequence = ComputeSequence(graph, connectedComponent, candidateStrategy, vertex, ref max); lock (_lock) { if (tempSequence.Value < minSequence.Value) { max = minSequence.Value; minSequence = tempSequence; } } }); sequence.AddRange(minSequence.Sequence); } break; case InitialVertexStrategy.Bfs: { int init = Heuristics.Bfs(graph, connectedComponent.Last()); sequence.AddRange(ComputeSequence(graph, connectedComponent, candidateStrategy, init)); } break; case InitialVertexStrategy.DoubleBfs: { int init = Heuristics.Bfs(graph, Heuristics.Bfs(graph, connectedComponent.Last())); sequence.AddRange(ComputeSequence(graph, connectedComponent, candidateStrategy, init)); } break; } } return new LinearDecomposition(graph, sequence); }
public static LinearDecomposition Compute(Graph graph, CandidateStrategy candidateStrategy, InitialVertexStrategy initialVertexStrategy) { List<BitSet> connectedComponents = DepthFirstSearch.ConnectedComponents(graph); List<int> sequence = new List<int>(); int tempValue; foreach (BitSet connectedComponent in connectedComponents) { switch (initialVertexStrategy) { case InitialVertexStrategy.All: { List<int> minList = null; int minValue = int.MaxValue; foreach (int vertex in connectedComponent) { List<int> temp = ComputeSequence(graph, connectedComponent, candidateStrategy, vertex, out tempValue); if (tempValue < minValue) { minValue = tempValue; minList = temp; } } sequence.AddRange(minList); } break; case InitialVertexStrategy.BFS: { int init = Heuristics.BFS(graph, connectedComponent.Last()); sequence.AddRange(ComputeSequence(graph, connectedComponent, candidateStrategy, init, out tempValue)); } break; case InitialVertexStrategy.DoubleBFS: { int init = Heuristics.BFS(graph, Heuristics.BFS(graph, connectedComponent.Last())); sequence.AddRange(ComputeSequence(graph, connectedComponent, candidateStrategy, init, out tempValue)); } break; } } return new LinearDecomposition(graph, sequence); }