static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Usage: graph -file=<filename>"); return; } var fileName = string.Empty; OptionSet p = new OptionSet() .Add("file=", f => fileName = f); var unparsed = p.Parse(args); var loader = new FileDataLoader(fileName); var data = loader.Load(); var allNodes = new Dictionary<string, Node>(); foreach(var relationship in data) { if (! allNodes.ContainsKey(relationship.Key)) { allNodes.Add(relationship.Key, new Node(relationship.Key)); } var parent = allNodes[relationship.Key]; if (!allNodes.ContainsKey(relationship.Value)) { allNodes.Add(relationship.Value, new Node(relationship.Value)); } var child = allNodes[relationship.Value]; parent.Children.Add(child); child.Parents.Add(parent); } var algo = new GraphConcurrencyCharacterisation(); algo.Run(allNodes); Console.WriteLine("Max concurrency: " + algo.MaxConcurrency); Console.WriteLine("Concurrent chains: " + algo.ConcurrencyChains.Count); var sortedChains = new List<string>(); algo.ConcurrencyChains.ForEach(c => sortedChains.Add(string.Join("-", c.OrderBy(n => n.Name).Select(n => n.Name)))); sortedChains.Sort(); var distinct = sortedChains.Distinct(); Console.WriteLine("Distinct chains: " + distinct.Count()); }
public void AlgorithmCanFindAllConcurrencyChains() { var A = new Node("A"); var B = new Node("B"); var C = new Node("C"); var D = new Node("D"); var E = new Node("E"); var F = new Node("F"); var G = new Node("G"); var H = new Node("H"); var I = new Node("I"); var J = new Node("J"); var K = new Node("K"); var L = new Node("L"); A.Children.Add(B); B.Parents.Add(A); A.Children.Add(C); C.Parents.Add(A); B.Children.Add(E); E.Parents.Add(B); C.Children.Add(D); D.Parents.Add(C); D.Children.Add(E); E.Parents.Add(D); F.Children.Add(C); C.Parents.Add(F); F.Children.Add(G); G.Parents.Add(F); G.Children.Add(H); H.Parents.Add(G); H.Children.Add(K); K.Parents.Add(H); I.Children.Add(G); G.Parents.Add(I); I.Children.Add(J); J.Parents.Add(I); J.Children.Add(K); K.Parents.Add(J); L.Children.Add(J); J.Parents.Add(L); var allNodes = new Dictionary<string, Node> { {"A", A}, {"B", B}, {"C", C}, {"D", D}, {"E", E}, {"F", F}, {"G", G}, {"H", H}, {"I", I}, {"J", J}, {"K", K}, {"L", L} }; var algo = new GraphConcurrencyCharacterisation(); algo.Run(allNodes); Trace.WriteLine("Max concurrency: " + algo.MaxConcurrency); Trace.WriteLine("Chains: " + algo.ConcurrencyChains.Count); }