public static HashSet <HashSet <int> > Run(Graph.Graph graph) { // Initial conditions var adjacency = graph.CreateAdjacencyMatrix(); var invertedAdjacency = adjacency.Fill(1) - adjacency; var cover = IntializeCover(invertedAdjacency); // C var subCover = new HashSet <SubMatrix>(); // X while (true) { var nextCover = Iteration(cover, subCover); if (nextCover.SetEquals(cover)) { break; } cover = nextCover; subCover = CalculateSubCover(nextCover); } var stableSets = ExtractStableSets(cover); var result = ExtractResult(stableSets); return(result); }
static void DirectedDemo() { var graph = new Graph( new int[][] { new int [] { 1, 2 }, // 0 -> 1, 2 new int [] { 2 }, // 1 -> 2 new int [] { }, // 2 -> x new int [] { 1, 2 } // 3 -> 1, 2 } ); var adjacency = graph.CreateAdjacencyMatrix(); var incidence = graph.CreateDirectedIncidenceMatrix(); var kirchhoff = graph.CreateKirchhoffMatrix(); Console.WriteLine("Adjacency:"); Console.WriteLine(adjacency); Console.WriteLine("Directed incidence:"); Console.WriteLine(incidence); Console.WriteLine("Kirchhoff:"); Console.WriteLine(kirchhoff); Console.WriteLine("\nConversions. \n"); Console.WriteLine("Adjacency -> Kirchhoff"); Console.WriteLine(Graph.ConvertAdjacencyToKirchhoff(adjacency)); Console.WriteLine("Kirchhoff -> Adjacency"); Console.WriteLine(Graph.ConvertKirchhoffToAdjacency(kirchhoff)); Console.WriteLine("Adjacency -> Incidence"); Console.WriteLine(Graph.ConvertAdjacencyToDirectedIncidence(adjacency)); Console.WriteLine("Incidence -> Adjacency"); Console.WriteLine(Graph.ConvertDirectedIncidenceToAdjacency(incidence)); Console.WriteLine("Incidence -> Kirchhoff (only works right for a directed graph)"); Console.WriteLine(Graph.ConvertDirectedIncidenceToKirchhoff(incidence)); }