Example #1
0
        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());
        }
Example #2
0
        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);
        }