示例#1
0
        // --- private functions ----

        /** Add a transition from DA states da_from to stuttered_state to for edge elem.
         * If the state does not yet exist in the DA, create it.
         * @param da_from the from state in the DA
         * @param to the target state
         * @param elem the edge label
         */
        DA_State add_transition(DA_State da_from, TreeWithAcceptance to, APElement elem)
        {
            DA_State da_to = _state_mapper.find(to);

            if (da_to == null)
            {
                da_to = _da_result.newState();
                to.generateAcceptance(da_to.acceptance());
                if (_detailed_states)
                {
                    //    da_to.setDescription(to->toHTML());
                }

                _state_mapper.add(to, da_to);
                _unprocessed.Push(new KeyValuePair <TreeWithAcceptance, DA_State>(to, da_to));
            }

#if STUTTERED_VERBOSE
            std::cerr << da_from->getName() << " -> " << da_to->getName() << std::endl;
#endif

            da_from.edges().set(elem, da_to);

            return(da_to);
        }
        /// <summary>
        /// opens Aseessment period in slider control and selects the number of Assessment Period as passed in the function
        /// </summary>
        public void AddAssessmentPeriod(int NumberOfAssessmentPeriod)
        {
            WebDriverWait waiter = new WebDriverWait(WebContext.WebDriver, TimeSpan.FromSeconds(MarksheetConstants.Timeout));

            waiter.Until(ExpectedConditions.ElementExists(MarksheetConstants.AspectNextButton));
            WebContext.WebDriver.FindElement(MarksheetConstants.AspectNextButton).Click();

            waiter.Until(ExpectedConditions.ElementExists(MarksheetConstants.AssessmentPeriodList));
            ReadOnlyCollection <IWebElement> APElements = WebContext.WebDriver.FindElements(MarksheetConstants.AssessmentPeriodList);

            int i = 0;

            foreach (IWebElement APElement in APElements)
            {
                if (APElement.Text != "")
                {
                    APElement.Click();
                    i++;
                }

                if (i == NumberOfAssessmentPeriod)
                {
                    break;
                }
            }
        }
示例#3
0
        /** Calculate and add transitions to the successor state.
         * @param from the source stuttered_state
         * @param da_from the source DA state
         * @param elem the edge label
         */
        void calc_delta(TreeWithAcceptance from, DA_State da_from, APElement elem)
        {
            //StateMapper<SafraTree, int , ptr_hash<algo_state_t>> intermediate_state_map_t;  //, PtrComparator<algo_state_t>

            Dictionary <StateInterface, int> state_map    = new Dictionary <StateInterface, int>();
            List <StateInterface>            state_vector = new List <StateInterface>();

            StateInterface start_tree = from.getTree();

            //state_map[start_tree] = null;
            state_map.Add(start_tree, 0);
            state_vector.Add(start_tree); //push_back

#if STUTTERED_VERBOSE
            std::cerr << "Calculate from state [" << da_from->getName() << "], " << (unsigned
                                                                                     int )
                elem << ":" << std::endl;
            std::cerr << start_tree->toString() << std::endl;
#endif

            StateInterface cur_tree = start_tree;
            while (true)
            {
                StateInterface next_tree = _algo.delta(cur_tree as SafraTree, elem).getState();

                //typename intermediate_state_map_t::iterator it;
                //int it = state_map.find(next_tree);
                //if (it == state_map.end())

                if (!state_map.ContainsKey(next_tree))
                {
                    // tree doesn't yet exist...
                    // add tree
                    //state_map[next_tree] = state_vector.size();
                    state_map.Add(next_tree, state_vector.Count);
                    state_vector.Add(next_tree); //push_back

                    cur_tree = next_tree;
                    continue;
                }
                else
                {
                    // found the cycle!
                    int cycle_point = state_map[next_tree];

#if STUTTERED_VERBOSE
                    std::cerr << "-----------------------\n";
                    for (unsigned int i = 0; i < state_vector.size(); i++)
                    {
                        std::cerr << "[" << i << "] ";
                        if (cycle_point == i)
                        {
                            std::cerr << "* ";
                        }
                        std::cerr << "\n" << state_vector[i]->toString() << std::endl;
                    }
                    std::cerr << "-----------------------\n";
#endif

                    prefix_and_cycle_state_t pac = calculate_prefix_and_cycle_state(state_vector, cycle_point);

                    //DA_State da_prefix = null;
                    DA_State da_cycle = null;

                    if (pac.prefix_state != null && !(pac.prefix_state == pac.cycle_state))
                    {
                        DA_State da_prefix = add_transition(da_from, pac.prefix_state, elem);
                        da_cycle = add_transition(da_prefix, pac.cycle_state, elem);
                    }
                    else
                    {
                        da_cycle = add_transition(da_from, pac.cycle_state, elem);
                    }

                    da_cycle.edges().set(elem, da_cycle);

                    return;
                }
            }
        }
示例#4
0
        //typedef typename DA_t::state_type da_state_t;
        //typedef typename Algorithm_t::state_t algo_state_t;
        //typedef typename Algorithm_t::result_t algo_result_t;
        //typedef TreeWithAcceptance<algo_state_t, typename Acceptance::signature_type> stuttered_state_t;
        //typedef typename stuttered_state_t::ptr stuttered_state_ptr_t;

        //typedef std::pair<stuttered_state_ptr_t, da_state_t*> unprocessed_value_t;
        //typedef std::stack<unprocessed_value_t> unprocessed_stack_t;

        /** Convert the NBA to the DA */
        public void convert()
        {
            APSet ap_set = _da_result.getAPSet();

            if (_algo.checkEmpty())
            {
                _da_result.constructEmpty();
                return;
            }

            _algo.prepareAcceptance(_da_result.acceptance());

            TreeWithAcceptance s_start     = new TreeWithAcceptance(_algo.getStartState());
            DA_State           start_state = _da_result.newState();

            s_start.generateAcceptance(start_state.acceptance());
            if (_detailed_states)
            {
                //start_state->setDescription(s_start->toHTML());
                start_state.setDescription("hahahahah");
            }

            _state_mapper.add(s_start, start_state);
            _da_result.setStartState(start_state);

            Stack <KeyValuePair <TreeWithAcceptance, DA_State> > unprocessed;

            _unprocessed.Push(new KeyValuePair <TreeWithAcceptance, DA_State>(s_start, start_state));

            bool   all_insensitive     = _stutter_information.isCompletelyInsensitive();
            BitSet partial_insensitive = _stutter_information.getPartiallyInsensitiveSymbols();

            while (_unprocessed.Count > 0)
            {
                KeyValuePair <TreeWithAcceptance, DA_State> top = _unprocessed.Pop();
                //_unprocessed.pop();

                TreeWithAcceptance from    = top.Key;
                DA_State           da_from = top.Value;

                //for (APSet::element_iterator it_elem=ap_set.all_elements_begin();it_elem!=ap_set.all_elements_end();++it_elem)
                for (int it_elem = ap_set.all_elements_begin(); it_elem != ap_set.all_elements_end(); ++it_elem)
                {
                    APElement elem = new APElement(it_elem);

                    if (da_from.edges().get(elem) == null)
                    {
                        // the edge was not yet calculated...

                        if (!all_insensitive && partial_insensitive.get(it_elem) == null)
                        {
                            // can't stutter for this symbol, do normal step
                            SafraTree          next_tree  = _algo.delta(from.getTree() as SafraTree, elem).getState();
                            TreeWithAcceptance next_state = new TreeWithAcceptance(next_tree);
                            add_transition(da_from, next_state, elem);

                            continue;
                        }

                        // normal stuttering...

                        calc_delta(from, da_from, elem);

                        if (_limit != 0 && _da_result.size() > _limit)
                        {
                            //THROW_EXCEPTION(LimitReachedException, "");
                            throw new Exception("LimitReachedException");
                        }
                    }
                }
            }
        }
示例#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);
        }
示例#6
0
        // typedef SafraTreeTemplate_ptr result_t;
        //  typedef SafraTree state_t;

        public ResultStateInterface <SafraTree> delta(SafraTree tree, APElement elem)
        {
            return(process(tree, elem));
        }