using System; using System.Collections.Generic; using System.IO; using System.Linq; using Graph = NetworkFlow.Graph; namespace Program { class Program { static void Main(string[] args) { List Analysii = new(); DirectoryInfo graphDir = new DirectoryInfo((args.Length > 0) ? args[0] : "graphs"); DirectoryInfo outDir = new("../../output"); outDir.Create(); if (!graphDir.Exists) { Console.WriteLine($"Failed to open {graphDir}: Graph does not exist."); System.Environment.Exit(1); } string cuts_header = $"Graph,Exact Cuts,Contract1 Cuts,Contract2 Cuts,Contract3 Cuts,Contract4 Cuts,Contract5 Cuts"; string times_header = $"Graph,Exact (ms),Contract1 (ms),Contract2 (ms),Contract3 (ms),Contract4 (ms),Contract5 (ms)"; List constant_cuts = new() { cuts_header }; List constant_times = new() { times_header }; List linear_cuts = new() { cuts_header }; List linear_times = new() { times_header }; List polynomial_cuts = new() { cuts_header }; List polynomial_times = new() { times_header }; foreach (var file in graphDir.EnumerateFiles()) { Graph graph = ReadFile(file); Analysis analysis = new(graph, 5); List results; int iter; Console.WriteLine(file.Name); iter = 10; Console.WriteLine($"\nconstant ({iter}):"); results = analysis.Analize(iter); constant_cuts.Add($"{file.Name},{String.Join(",", results.Select(r => r.MinCut))}"); constant_times.Add($"{file.Name},{String.Join(",", results.Select(r => r.Runtime.TotalMilliseconds))}"); iter = graph.Nodes.Count; Console.WriteLine($"\nlinier ({iter}):"); results = analysis.Analize(iter); linear_cuts.Add($"{file.Name},{String.Join(",", results.Select(r => r.MinCut))}"); linear_times.Add($"{file.Name},{String.Join(",", results.Select(r => r.Runtime.TotalMilliseconds))}"); iter = (int)(Math.Pow(graph.Nodes.Count, 2) * Math.Log(graph.Nodes.Count, Math.E)); Console.WriteLine($"\npolynomial ({iter}):"); results = analysis.Analize(iter); polynomial_cuts.Add($"{file.Name},{String.Join(",", results.Select(r => r.MinCut))}"); polynomial_times.Add($"{file.Name},{String.Join(",", results.Select(r => r.Runtime.TotalMilliseconds))}"); } File.WriteAllLines($"{outDir.FullName}/constant_cuts.csv", constant_cuts); File.WriteAllLines($"{outDir.FullName}/constant_times.csv", constant_times); File.WriteAllLines($"{outDir.FullName}/linear_cuts.csv", linear_cuts); File.WriteAllLines($"{outDir.FullName}/linear_times.csv", linear_times); File.WriteAllLines($"{outDir.FullName}/polynomial_cuts.csv", polynomial_cuts); File.WriteAllLines($"{outDir.FullName}/polynomial_times.csv", polynomial_times); } public static Graph ReadFile(FileInfo file) { // create default Graph object Graph graph = new Graph(undirected: true); // Read in graph file foreach (string line in File.ReadLines(file.FullName)) { // each file line is a Node with optional edges // line format: // vertex:int optional[ connected-vertex:int edge-weight:double optional[..] ] List vals = line.Split(' ').ToList(); int u, v; double weight; int.TryParse(vals[0], out u); graph.AddNode(u); for (int i = 1; i < vals.Count - 1; i += 2) { // AddEdge(int u, int v, double weight) int.TryParse(vals[i], out v); double.TryParse(vals[i + 1], out weight); if (!graph[u].Edges.ContainsKey(v)) graph.AddEdge(u, v, weight); } } // return object when done return graph; } } }