/// <summary>
        ///     Build a List of Columns from a PetriNet
        /// </summary>
        /// <param name="petriNet"></param>
        /// <returns></returns>
        /// <author>Jannik Arndt</author>
        public static List<Column> Build(PetriNet petriNet)
        {
            // Initialize
            GlobalColumnList.Clear();

            Column firstColumn = new Column(0);
            Place startPlace = (Place) petriNet.GetSources()[0];

            firstColumn.HashSetOfNodes.Add(startPlace);
            GlobalColumnList.Add(firstColumn);

            // Recursively add all columns
            AddPlace(startPlace, 1);

            // Correct the end-place
            Place endPlace = (Place) petriNet.GetSinks()[0];
            Column temp = FindNode(endPlace);
            if (temp != null && temp.ColumnNumber < GlobalColumnList.Count)
            {
                temp.HashSetOfNodes.Remove(endPlace);
                TrimGlobalColumnList();
                GetOrCreateColumn(GlobalColumnList.Count).HashSetOfNodes.Add(endPlace);
            }

            return GlobalColumnList;
        }
        /// <summary>
        /// Remove old "End"-Places, combine sinks and add new "End"-Place
        /// </summary>
        /// <param name="petriNet">The petrinet to work on</param>
        /// <author>Jannik Arndt</author>
        public void FixEnding(PetriNet petriNet)
        {
            foreach (Place endPlace in petriNet.Places.Where(place => place.Name.Equals("End")))
                endPlace.Name = "";

            List<Place> endPlaces = (from sink in petriNet.GetSinks() where sink.GetType() == typeof(Place) select sink as Place).ToList();

            if (endPlaces.Count > 1)
                foreach (Place endPlace in endPlaces.Skip(1))
                {
                    foreach (Transition incomingTransition in endPlace.IncomingTransitions)
                    {
                        endPlaces[0].IncomingTransitions.Add(incomingTransition);
                        incomingTransition.OutgoingPlaces.Clear();
                        incomingTransition.OutgoingPlaces.Add(endPlaces[0]);
                    }
                    petriNet.Places.Remove(endPlace);
                }
            endPlaces[0].Name = "End";
        }