コード例 #1
0
        /**
         * Compare two subtrees to see if they match (taking into account the renameableNames
         * and the restrictedNames).
         */
        public bool matches(SafraTreeNode this_node, SafraTreeNode other_node)
        {
            Debug.Assert(this_node != null && other_node != null);

            if (this_node == null || other_node == null)
            {
                return(false);
            }

            if (!renameableNames().get(this_node.getID()))
            {
                // this is not a new node, so we require a perfect match..
                if (other_node.getID() != this_node.getID())
                {
                    return(false);
                }
            }
            else
            {
                // we are flexible with the id, as long as the id wasn't removed
                //  in the tree
                if (restrictedNames().get(other_node.getID()))
                {
                    return(false);
                }
            }

            Debug.Assert(this_node.getLabeling() == other_node.getLabeling());
            Debug.Assert(this_node.hasFinalFlag() == other_node.hasFinalFlag());

            // this node looks good, now the children
            SafraTreeNode this_child  = this_node.getOldestChild();
            SafraTreeNode other_child = other_node.getOldestChild();

            while (this_child != null && other_child != null)
            {
                if (!matches(this_child, other_child))
                {
                    return(false);
                }

                this_child  = this_child.getYoungerBrother();
                other_child = other_child.getYoungerBrother();
            }
            Debug.Assert(this_child == null && other_child == null);

            return(true);
        }
コード例 #2
0
        /** */
        public void visit(SafraTree tree, SafraTreeNode node)
        {
            if (_final_states.intersects(node.getLabeling()))//////////if this node has the state in accepting states of NBA
            {
                BitSet q_and_f = new BitSet(_final_states);
                q_and_f.Intersect(node.getLabeling());////////////////get the intersect of the label and the accepting states

                SafraTreeNode new_child = tree.newNode();
                node.addAsYoungestChild(new_child);

                _tree_template.setRenameable(new_child.getID());

                new_child.getLabeling().Assign(q_and_f);
            }
        }
コード例 #3
0
        /** Node visitor */
        public void visit(SafraTree tree, SafraTreeNode node)
        {
            int id = node.getID();

            if (_tree_template.isRenameable(id))
            {
                // this node was created recently, so we only delete it from
                // the renameableNames, but don't mark it in restrictedNames
                _tree_template.setRenameable(id, false);
            }
            else
            {
                _tree_template.setRestricted(id);
            }

            tree.remove(node);
        }
コード例 #4
0
        /**
         * Copy the subtree (the children) of *other
         * to *top, becoming the children of *top
         */
        public void copySubTree(SafraTreeNode top, SafraTreeNode other)
        {
            if (other == null)
            {
                return;
            }

            //for (SafraTreeNode::child_iterator it=other->children_begin();it!=other->children_end();++it) {
            //  SafraTreeNode *n=_nodes[(*it)->getID()], *n_o=*it;
            //  top->addAsYoungestChild(n);
            //  copySubTree(n, n_o);
            //}
            SafraTreeNode it = other.children_begin();

            while (it != other.children_end())
            {
                SafraTreeNode n = _nodes[it.getID()];
                top.addAsYoungestChild(n);
                copySubTree(n, it);

                it = it.increment();
            }
        }
コード例 #5
0
 /**
  * Remove a SafraTreeNode from the tree,
  * the node can have no children.
  */
 public void remove(SafraTreeNode node)
 {
     Debug.Assert(_nodes[node.getID()] == node);
     remove(node.getID());
 }
コード例 #6
0
ファイル: SafraTreeVisitor.cs プロジェクト: nhannhan159/PAT
        /** Node visitor */
        public void visit(SafraTree tree, SafraTreeNode node)
        {
            int id = node.getID();
            if (_tree_template.isRenameable(id))
            {
                // this node was created recently, so we only delete it from
                // the renameableNames, but don't mark it in restrictedNames
                _tree_template.setRenameable(id, false);
            }
            else
            {
                _tree_template.setRestricted(id);
            }

            tree.remove(node);
        }
コード例 #7
0
ファイル: SafraTree.cs プロジェクト: nhannhan159/PAT
 /**
  * Remove a SafraTreeNode from the tree,
  * the node can have no children.
  */
 public void remove(SafraTreeNode node)
 {
     Debug.Assert(_nodes[node.getID()] == node);
     remove(node.getID());
 }
コード例 #8
0
                /** Node visitor */
                public void visit(SafraTree tree, SafraTreeNode node)
                {
                    if (node.getChildCount() <= 1)
                    {
                        return;
                    }

                    int i = 0;
                    //for (SafraTreeNode::child_iterator it= node->children_begin(); it!=node->children_end();++it)
                    SafraTreeNode it = node.children_begin();

                    while (it != node.children_end())
                    {
                        BitSet reachable_this = _node_reachability[it.getID()];
                        reachable_this.clear();
                        _node_order[it.getID()] = i++;

                        BitSet label_this = it.getLabeling();
                        //for (BitSetIterator label_it(label_this); label_it != BitSetIterator::end(label_this); ++label_it)
                        for (int label_it = 0; label_it < label_this.Count; label_it++)
                        {
                            reachable_this.Union(_nba_reachability[label_it]);
                        }

                        //      std::cerr << "reachability_this: "<<reachable_this << std::endl;
                        it = it.increment();
                    }


                    // reorder...
                    //    std::cerr << "Sorting!" << std::endl;

                    // Bubble sort, ough!
                    bool finished = false;

                    while (!finished)
                    {
                        finished = true;

                        for (SafraTreeNode a = node.getOldestChild(); a != null && a.getYoungerBrother() != null; a = a.getYoungerBrother())
                        {
                            SafraTreeNode b = a.getYoungerBrother();

                            BitSet reach_a = _node_reachability[a.getID()];
                            BitSet reach_b = _node_reachability[b.getID()];

                            if (reach_a.intersects(reach_b))
                            {
                                // a and b are not independant...
                                // --> keep relative order...
                                System.Diagnostics.Debug.Assert(_node_order[a.getID()] < _node_order[b.getID()]);
                            }
                            else
                            {
                                // a and b are independant...
                                if (!(a.getLabeling() < b.getLabeling()))
                                {
                                    // swap
                                    node.swapChildren(a, b);
                                    a        = b;
                                    finished = false;
                                }
                            }
                        }
                    }
                }