Beispiel #1
0
        /**
         * Walk the subtree rooted at *top post-order and call visit() on each node.
         * @param tree the SafraTree
         * @param top the current subroot
         * @param visit_top if true, *top is visited too
         */
        public void walkSubTreePostOrder(SafraTree tree, SafraTreeNode top, bool visit_top)
        {
            if (top.getChildCount() > 0)
            {
                SafraTreeNode it = top.children_begin();
                //SafraTreeNode it = top._oldestChild;
                //while (it._youngestChild != null)
                while (it != top.children_end())
                {
                    SafraTreeNode cur_child = it;

                    // Increment iterator *before* recursion & visit to account
                    // for possible deletion of this child
                    //it = it.getYoungerBrother();
                    it = it.increment();
                    walkSubTreePostOrder(tree, cur_child, true);
                }
            }

            if (visit_top)
            {
                _visitor.visit(tree, top);
            }
        }
Beispiel #2
0
        /**
           * Walk the subtree rooted at *top post-order and call visit() on each node.
           * @param tree the SafraTree
           * @param top the current subroot
           * @param visit_top if true, *top is visited too
           */
        public void walkSubTreePostOrder(SafraTree tree, SafraTreeNode top, bool visit_top)
        {
            if (top.getChildCount() > 0)
            {
                SafraTreeNode it = top.children_begin();
                //SafraTreeNode it = top._oldestChild;
                //while (it._youngestChild != null)
                while (it != top.children_end())
                {
                    SafraTreeNode cur_child = it;

                    // Increment iterator *before* recursion & visit to account
                    // for possible deletion of this child
                    //it = it.getYoungerBrother();
                    it = it.increment();
                    walkSubTreePostOrder(tree, cur_child, true);
                }
            }

            if (visit_top)
            {
                _visitor.visit(tree, top);
            }
        }
Beispiel #3
0
 public void walkSubTreePostOrder(SafraTree tree, SafraTreeNode top)
 {
     walkSubTreePostOrder(tree, top, true);
 }
Beispiel #4
0
 public void walkSubTreePostOrder(SafraTree tree, SafraTreeNode top)
 {
     walkSubTreePostOrder(tree, top, true);
 }
Beispiel #5
0
        /**
         * Get the next Safra tree using the
         * transition function as described by Safra.
         * @param tree the original tree
         * @param elem the edge label
         * @return a SafraTreeTemplate containing the new tree and
         *         bookkeeping which states were created/deleted.
         */
        SafraTreeTemplate process(SafraTree tree, APElement elem)
        {
            // Make copy of original tree
            SafraTree cur = new SafraTree(tree);

            SafraTreeTemplate tree_template = new SafraTreeTemplate(cur);

            STVisitor_reset_final_flag stv_reset_flag = new STVisitor_reset_final_flag();

            cur.walkTreePostOrder(stv_reset_flag);

////#if NBA2DRA_POWERSET_FIRST
//  STVisitor_powerset stv_powerset = new STVisitor_powerset(_nba, elem);
//  cur.walkTreePostOrder(stv_powerset);

//  STVisitor_check_finalset stv_final = new STVisitor_check_finalset(_nba_analysis.getFinalStates(), tree_template);
//  cur.walkTreePostOrder(stv_final);
//#else
            /////////generate new child
            STVisitor_check_finalset stv_final = new STVisitor_check_finalset(_nba_analysis.getFinalStates(), tree_template);

            cur.walkTreePostOrder(stv_final);
            //////////change the old label to new label using powerset
            STVisitor_powerset stv_powerset = new STVisitor_powerset(_nba, elem);

            cur.walkTreePostOrder(stv_powerset);
//#endif


            /*
             * Optimization: ACCEPTING_TRUE_LOOPS
             */
            if (_options.opt_accloop)///////////how to decide the value?
            {
                if (cur.getRootNode() != null)
                {
                    SafraTreeNode root = cur.getRootNode();

                    if (_nba_analysis.getStatesWithAcceptingTrueLoops().intersects(root.getLabeling()))
                    {
                        // True Loop
                        STVisitor_remove_subtree stv_remove = new STVisitor_remove_subtree(tree_template);
                        cur.walkChildrenPostOrder(stv_remove, root);

                        root.getLabeling().clear();

                        int canonical_true_loop = _nba_analysis.getStatesWithAcceptingTrueLoops().nextSetBit(0);
                        root.getLabeling().set(canonical_true_loop);
                        root.setFinalFlag(true);

                        return(tree_template);
                    }
                }
            }

            //check if the younger child has the same labels of older ones. If so, remove the same labels from younger child
            STVisitor_check_children_horizontal stv_horizontal = new STVisitor_check_children_horizontal();/////////note sth wrong

            cur.walkTreePostOrder(stv_horizontal);
            //check if a node becomes empty. If so, remove it.
            STVisitor_check_children_horizontal.STVisitor_check_children_vertical.STVisitor_remove_empty stv_empty = new STVisitor_check_children_horizontal.STVisitor_check_children_vertical.STVisitor_remove_empty(tree_template);
            cur.walkTreePostOrder(stv_empty);
            //check if a node's children's labels union is same with itself's. If so, remove the children and mark this node.
            STVisitor_check_children_horizontal.STVisitor_check_children_vertical stv_vertical = new STVisitor_check_children_horizontal.STVisitor_check_children_vertical(tree_template);
            cur.walkTreePostOrder(stv_vertical);


            /*
             * Optimization: REORDER
             */
            if (_options.opt_reorder)////////
            {
                if (stv_reorder == null)
                {
                    stv_reorder = new STVisitor_check_children_horizontal.STVisitor_check_children_vertical.STVisitor_reorder_children(_nba_analysis.getReachability(), cur.getNodeMax());
                }

                cur.walkTreePostOrder(stv_reorder);
            }



            /*
             * Optimization: ALL SUCCESSORS ARE ACCEPTING
             */
            if (_options.opt_accsucc)////////
            {
                STVisitor_check_children_horizontal.STVisitor_check_children_vertical.STVisitor_check_for_succ_final stv_succ = new STVisitor_check_children_horizontal.STVisitor_check_children_vertical.STVisitor_check_for_succ_final(_nba_analysis.getStatesWithAllSuccAccepting(), tree_template);

                cur.walkTreePostOrder(stv_succ);
                if (stv_succ.wasSuccessful())
                {
#if NBA2DRA_MERGE
                    if (stv_succ.wasMerged())
                    {
                        SafrasAlgorithmInternal::STVisitor_remove_empty stv_empty;
                        cur.walkTreePostOrder(stv_empty);

                        SafrasAlgorithmInternal::STVisitor_check_children_vertical stv_vertical;
                        cur.walkTreePostOrder(stv_vertical);
                    }
#endif   // NBA2DRA_MERGE
                }
            }

            return(tree_template);
        }