/// <summary>
        /// Append the result of this dependency graph to the end of the given sorting solution
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <returns></returns>
        public TopologicalSort <T> CalculateSort(TopologicalSort <T> instance, IEqualityComparer <T> comparer = null)
        {
            var orderedProcessComparer = new OrderedProcessComprarer <T>(comparer ?? EqualityComparer <T> .Default);

            var unused = new HashSet <OrderedProcess <T> >(_processes);

            do
            {
                var set = new HashSet <OrderedProcess <T> >(
                    unused.Where(
                        p => !unused.Overlaps(
                            p.Predecessors)), //select processes which have no predecessors in the unused set, which means that all their predecessors must either be used, or not exist, either way is fine
                    orderedProcessComparer
                    );

                if (set.Count == 0)
                {
                    throw new InvalidOperationException("Cannot order this set of processes");
                }

                unused.ExceptWith(set);

                foreach (var subset in SolveResourceDependencies(set))
                {
                    instance.Append(subset);
                }
            } while (unused.Count > 0);

            return(instance);
        }
        public static List <TType> GraphAsList <TType>(TopologicalSort <TType> solution)
        {
            var results = new List <TType>();

            foreach (OrderedProcess <TType> item in solution)
            {
                results.Add(item.Value);
            }

            return(results);
        }
Exemple #3
0
        static void Main(string[] args)
        {
            string resp = "n";

            do
            {
                bool isLoop = false;
                Console.WriteLine("Enter the relation file name: ");
                string fileInName = Console.ReadLine();
                Console.WriteLine("Enter the output file name: ");
                string fileOutName = Console.ReadLine();

                #region Programmer defined parsing rules for custom objects
                // Parse file for objects
                string[,] objects = TopologicalSort.GetObjectsFromFile(fileInName);

                // create base relation list
                Parent[,] relations = new Parent[objects.GetLength(0), objects.GetLength(1)];

                //assign relations to custom classes deriving from "Parent"
                for (int i = 0; i < objects.GetLength(0); i++)
                {
                    for (int j = 0; j < objects.GetLength(1); j++)
                    {
                        // custom class
                        if (objects[0, 0].ToCharArray()[0].Equals('('))
                        {
                            // read and assign to required class
                            string[] fields = objects[i, j].Split(new string[] { "(", ", ", ",", ")" }, StringSplitOptions.RemoveEmptyEntries);

                            Parent n       = new Parent();
                            float  f_value = 0.0f;
                            int    i_value = 0;
                            if (fields[1].Contains(".") && float.TryParse(fields[1], out f_value))
                            {
                                //create new food
                                n = new Food(fields[0], f_value);
                            }
                            else if (Int32.TryParse(fields[1], out i_value))
                            {
                                //create new car
                                n = new Car(fields[0], i_value);
                            }
                            else
                            {
                                //create new person
                                n = new Person(fields[0], fields[1]);
                            }

                            relations[i, j] = n;
                        }
                        else //if basic data type
                        {
                            // check if int or name
                            Parent n;
                            int    tempInt;
                            string tempName;
                            if (Int32.TryParse(objects[i, j], out tempInt))
                            {
                                n = new IntegerType(tempInt);
                            }
                            else
                            {
                                tempName = objects[i, j];
                                n        = new NameType(tempName);
                            }

                            relations[i, j] = n;
                        }
                    }
                }
                #endregion

                // get list of unique nodes in relation list
                Parent[] table = TopologicalSort.GetUniqueNodes(relations);
                int      na    = table.Length;

                // try to sort the nodes
                Parent[] topoSortedList;
                isLoop = !TopologicalSort.TrySort(relations, table, out topoSortedList);

                string output = "";
                output += "Processed " + fileInName + "\n";
                if (isLoop)
                {
                    // output the resulting table after failed sort
                    output += "Sort cannot be completed!\n";
                    output += "Loop detected\n";
                    output += "dat: ";
                    for (int i = 0; i < topoSortedList.Length; i++)
                    {
                        output += topoSortedList[i].Print() + "\t";
                    }
                    output += "\n";
                    output += "cnt: ";
                    for (int i = 0; i < topoSortedList.Length; i++)
                    {
                        output += topoSortedList[i].cnt + "\t";
                    }
                    output += "\n";
                    output += "top: ";
                    for (int i = 0; i < topoSortedList.Length; i++)
                    {
                        if (topoSortedList[i].top.Count > 0)
                        {
                            output += topoSortedList[i].top[0].Print() + "\t";
                        }
                        else
                        {
                            output += "null\t";
                        }
                    }
                    output += "\n";
                }
                else
                {
                    // output sequence of nodes in sorted order
                    output += "Sort completed successfully!\n";
                    output += "Results:\n";

                    for (int i = 0; i < topoSortedList.Length - 1; i++)
                    {
                        output += topoSortedList[i].Identify() + " -> ";
                    }
                    output += topoSortedList[topoSortedList.Length - 1].Identify();
                    output += "\n\n";
                }

                Console.WriteLine(output);

                File.WriteAllText(fileOutName, output);

                Console.Write("Press any key to continue...");
                Console.ReadKey();

                //Run program again?
                Console.Write("Do you want to run again? [y/n]: ");
                resp = Console.ReadLine();
            } while (resp.ToUpper().Equals("Y"));
        }