public void Process(PetriNet petriNet)
        {
            if (this.Status != MarkingNodeStatus.Boundary)
                return;

            // Marking is dublicate
            if (this.Graph.GetVertex(v =>
                    this.Compare(v as MarkingTreeNode) == 0 &&
                    this.Value != v.Value &&
                    (v as MarkingTreeNode).Status != MarkingNodeStatus.Boundary) != null
            )
            {
                this.Status = MarkingNodeStatus.Dublicate;
                return;
            }

            // Marking is terminal
            Transition[] availableTransitions = petriNet.GetAvailableTransitions(this.Marking);
            if (availableTransitions.Length == 0)
            {
                this.Status = MarkingNodeStatus.Terminal;
                return;
            }

            foreach (MarkedTransition transition in availableTransitions)
            {
                (this.Tree as MarkingTree).AddMarking(petriNet.GetStateAfterExecute(this.Marking, transition), this.Value.ToString(), transition.Value.ToString());
            }
        }