aboutsummaryrefslogtreecommitdiffstats
path: root/src/Program/Program.cs
blob: 05a91dc2830a4ccb987775bda568a17567afc3f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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<Analysis> 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<string> constant_cuts = new() { cuts_header };
            List<string> constant_times = new() { times_header };
            List<string> linear_cuts = new() { cuts_header };
            List<string> linear_times = new() { times_header };
            List<string> polynomial_cuts = new() { cuts_header };
            List<string> polynomial_times = new() { times_header };

            foreach (var file in graphDir.EnumerateFiles())
            {
                Graph graph = ReadFile(file);
                Analysis analysis = new(graph, 5);
                List<Result> 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<string> 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;
        }

    }
}