Ejemplo n.º 1
0
            /// <summary>
            /// Return the rol-vars vector of the product of matrix and vector
            /// [ REFS: 'result', DEREFS: '' ]
            /// </summary>
            /// <param name="matrix">Matrix of rol * col vars</param>
            /// <param name="vector">Vector of rol vars</param>
            /// <returns></returns>
            public static CUDDNode MatrixMultiplyVector(CUDDNode matrix, CUDDNode vector, CUDDVars allRowVars, CUDDVars allColVars)
            {
                //Return matrix * vector
                CUDD.Ref(vector);
                CUDDNode temp = Variable.SwapVariables(vector, allRowVars, allColVars);

                CUDD.Ref(matrix);
                CUDDNode result = MatrixMultiply(matrix, temp, allColVars, BOULDER);

                return result;
            }
Ejemplo n.º 2
0
        public static CUDDNode NondetReachReward(CUDDNode trans, CUDDNode reach, CUDDNode stateReward, CUDDNode transReward, CUDDNode nondetMask, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVars, CUDDNode goal, CUDDNode infReward, CUDDNode maybeReward, bool min)
        {
            DateTime startTime          = DateTime.Now;
            int      numberOfIterations = 0;

            CUDDNode a, allReward, newNondetMask, sol, tmp;

            // filter out rows (goal states and infinity states) from matrix
            CUDD.Ref(trans, maybeReward);
            a = CUDD.Function.Times(trans, maybeReward);

            // also remove goal and infinity states from state rewards vector
            CUDD.Ref(stateReward, maybeReward);
            CUDDNode tempStateReward = CUDD.Function.Times(stateReward, maybeReward);

            // multiply transition rewards by transition probs and sum rows
            // (note also filters out unwanted states at the same time)
            CUDD.Ref(transReward, a);
            CUDDNode tempTransReward = CUDD.Function.Times(transReward, a);

            tempTransReward = CUDD.Abstract.SumAbstract(tempTransReward, allColVars);

            // combine state and transition rewards
            allReward = CUDD.Function.Plus(tempStateReward, tempTransReward);

            // need to change mask because rewards are not necessarily in the range 0..1
            CUDD.Ref(nondetMask);
            newNondetMask = CUDD.Function.ITE(nondetMask, CUDD.PlusInfinity(), CUDD.Constant(0));

            // initial solution is infinity in 'inf' states, zero elsewhere
            // note: ok to do this because cudd matrix-multiply (and other ops)
            // treat 0 * inf as 0, unlike in IEEE 754 rules
            CUDD.Ref(infReward);
            sol = CUDD.Function.ITE(infReward, CUDD.PlusInfinity(), CUDD.Constant(0));

            while (true)
            {
                numberOfIterations++;

                tmp = CUDD.Matrix.MatrixMultiplyVector(a, sol, allRowVars, allColVars);

                // add rewards
                CUDD.Ref(allReward);
                tmp = CUDD.Function.Plus(tmp, allReward);

                if (min)
                {
                    CUDD.Ref(newNondetMask);
                    tmp = CUDD.Function.Maximum(tmp, newNondetMask);
                    tmp = CUDD.Abstract.MinAbstract(tmp, nondetVars);
                }
                else
                {
                    tmp = CUDD.Abstract.MaxAbstract(tmp, nondetVars);
                }

                CUDD.Ref(infReward);
                tmp = CUDD.Function.ITE(infReward, CUDD.PlusInfinity(), tmp);

                if (CUDD.IsEqual(tmp, sol))
                {
                    CUDD.Deref(tmp);
                    break;
                }

                CUDD.Deref(sol);
                sol = tmp;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("NondetReachReward: " + numberOfIterations + " iterations in " + runningTime + " seconds");

            //
            CUDD.Deref(a, allReward, newNondetMask);
            return(sol);
        }
Ejemplo n.º 3
0
        public static CUDDNode NondetInstReward(CUDDNode trans, CUDDNode stateReward, CUDDNode nondetMask, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVars, int bound, bool min, CUDDNode init)
        {
            DateTime startTime = DateTime.Now;

            CUDDNode newNondetMask, sol, tmp;

            CUDD.Ref(nondetMask);
            newNondetMask = CUDD.Function.ITE(nondetMask, CUDD.PlusInfinity(), CUDD.Constant(0));

            CUDD.Ref(stateReward);
            sol = stateReward;

            for (int i = 0; i < bound; i++)
            {
                tmp = CUDD.Matrix.MatrixMultiplyVector(trans, sol, allRowVars, allColVars);

                if (min)
                {
                    CUDD.Ref(newNondetMask);
                    tmp = CUDD.Function.Maximum(tmp, newNondetMask);

                    tmp = CUDD.Abstract.MinAbstract(tmp, nondetVars);
                }
                else
                {
                    tmp = CUDD.Abstract.MaxAbstract(tmp, nondetVars);
                }

                //
                CUDD.Deref(sol);
                sol = tmp;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("NondetInstReward: " + bound + " iterations in " + runningTime + " seconds");

            //
            CUDD.Deref(newNondetMask);
            return(sol);
        }
Ejemplo n.º 4
0
 /// <summary>
 /// // sets element in 3d matrix dd
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode Set3DMatrixElement(CUDDNode dd, CUDDVars rVars, CUDDVars cVars, CUDDVars lVars, int rIndex, int cIndex, int lIndex, double value)
 {
     return(new CUDDNode(PlatformInvoke.DD_Set3DMatrixElement(manager, dd.Ptr, rVars.GetArrayPointer(), rVars.GetNumVars(), cVars.GetArrayPointer(), cVars.GetNumVars(), lVars.GetArrayPointer(), lVars.GetNumVars(), rIndex, cIndex, lIndex, value)));
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Convert ADD to 0-1 ADD based on the interval [lower, upper]
 /// [ REFS: 'result', DEREFS: dd ]
 /// </summary>
 public static CUDDNode Interval(CUDDNode dd, double lower, double upper)
 {
     return new CUDDNode(PlatformInvoke.DD_Interval(manager, dd.Ptr, lower, upper));
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Sets element in matrix dd and return value.
 /// Note that this is a function, not a procedure
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode SetMatrixElement(CUDDNode dd, CUDDVars rVars, CUDDVars cVars, int rIndex, int cIndex, double value)
 {
     return new CUDDNode(PlatformInvoke.DD_SetMatrixElement(manager, dd.Ptr, rVars.GetArrayPointer(), rVars.GetNumVars(), cVars.GetArrayPointer(), cVars.GetNumVars(), rIndex, cIndex, value));
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Returns matrix multiplication of matrices dd1 and dd2
 /// [Calculates the product of two matrices represented as ADDs.]
 /// Description [Calculates the product of two matrices, A and B,
 /// represented as ADDs. This procedure implements the quasiring multiplication
 /// algorithm.  A is assumed to depend on variables x (rows) and z
 /// (columns).  B is assumed to depend on variables z (rows) and y
 /// (columns).  The product of A and B then depends on x (rows) and y
 /// (columns).  Only the z variables have to be explicitly identified;
 /// they are the "summation" variables.  Returns a pointer to the
 /// result if successful; NULL otherwise.]
 /// [ REFS: 'result', DEREFS: 'dd1, dd2' ]
 /// </summary>
 /// <param name="dd1"></param>
 /// <param name="dd2"></param>
 /// <param name="vars">variable are shared by both dd1, dd2. Normally dd1 row + column, dd2 only column</param>
 /// <param name="method"></param>
 /// <returns></returns>
 public static CUDDNode MatrixMultiply(CUDDNode dd1, CUDDNode dd2, CUDDVars vars, int method)
 {
     return new CUDDNode(PlatformInvoke.DD_MatrixMultiply(manager, dd1.Ptr, dd2.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), method));
 }
Ejemplo n.º 8
0
 /// <summary>
 /// Returns transpose of matrix dd
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode Transpose(CUDDNode dd, CUDDVars rVars, CUDDVars cVars)
 {
     return new CUDDNode(PlatformInvoke.DD_Transpose(manager, dd.Ptr, rVars.GetArrayPointer(), cVars.GetArrayPointer(), rVars.GetNumVars()));
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Return variable values after the If statement is executed based on resultBefore
        /// [ REFS: 'result', DEREFS: 'resultBefore' ]
        /// </summary>
        public override ExpressionBDDEncoding TranslateStatementToBDD(ExpressionBDDEncoding resultBefore, Model model)
        {
            ExpressionBDDEncoding tempResult1 = new ExpressionBDDEncoding();
            ExpressionBDDEncoding tempResult2 = new ExpressionBDDEncoding();

            List <List <int> > updatedVariablesBefore = new List <List <int> >();

            for (int index = 0; index < resultBefore.Count(); index++)
            {
                updatedVariablesBefore.Add(model.GetColSupportedVars(resultBefore.GuardDDs[index]));
            }

            ExpressionBDDEncoding conditionDD = this.Condition.TranslateBoolExpToBDD(model);
            List <List <int> >    usedVariablesInCondition = new List <List <int> >();

            for (int index = 0; index < conditionDD.Count(); index++)
            {
                usedVariablesInCondition.Add(model.GetRowSupportedVars(conditionDD.GuardDDs[index]));
            }

            for (int j1 = 0; j1 < resultBefore.Count(); j1++)
            {
                for (int j2 = 0; j2 < conditionDD.Count(); j2++)
                {
                    CUDDNode condition = conditionDD.GuardDDs[j2];
                    CUDD.Ref(condition);
                    foreach (int index in usedVariablesInCondition[j2])
                    {
                        if (updatedVariablesBefore[j1].Contains(index))
                        {
                            condition = CUDD.Variable.SwapVariables(condition, model.GetRowVars(index), model.GetColVars(index));
                        }
                    }

                    CUDD.Ref(resultBefore.GuardDDs[j1]);
                    CUDDNode transition = CUDD.Function.And(resultBefore.GuardDDs[j1], condition);

                    tempResult1.AddNodeToGuard(transition);
                }
            }

            //the condition is not always false (a = 1; if(a > 1))
            if (tempResult1.Count() > 0)
            {
                tempResult1 = this.ThenPart.TranslateStatementToBDD(tempResult1, model);
            }

            //
            tempResult2 = new ExpressionBDDEncoding();
            for (int j1 = 0; j1 < resultBefore.Count(); j1++)
            {
                for (int j2 = 0; j2 < conditionDD.Count(); j2++)
                {
                    CUDDNode condition = conditionDD.GuardDDs[j2];
                    CUDD.Ref(condition);
                    condition = CUDD.Function.Not(condition);
                    foreach (int index in usedVariablesInCondition[j2])
                    {
                        if (updatedVariablesBefore[j1].Contains(index))
                        {
                            condition = CUDD.Variable.SwapVariables(condition, model.GetRowVars(index), model.GetColVars(index));
                        }
                    }

                    CUDD.Ref(resultBefore.GuardDDs[j1]);
                    CUDDNode transition = CUDD.Function.And(resultBefore.GuardDDs[j1], condition);

                    tempResult2.AddNodeToGuard(transition);
                }
            }

            if (this.ElsePart != null && tempResult2.Count() > 0)
            {
                tempResult2 = this.ElsePart.TranslateStatementToBDD(tempResult2, model);
            }

            conditionDD.DeRef();

            //Combine
            if (tempResult1.Count() == 0 && tempResult2.Count() == 0)//condition always false, no else part
            {
                return(resultBefore);
            }
            else if (tempResult1.Count() == 0 && tempResult2.Count() > 0)//condition always false, having else part
            {
                resultBefore.DeRef();
                return(tempResult2);
            }
            else
            {
                resultBefore.DeRef();
                tempResult1.AddNodeToGuard(tempResult2.GuardDDs);
                return(tempResult1);
            }
        }
Ejemplo n.º 10
0
        public static List <Tuple <CUDDNode, Tuple <Predicate, bool>[]> > GetCondEffectList(this PlanningParser.EffectContext context,
                                                                                            CUDDNode currentConditionNode, IReadOnlyDictionary <string, Predicate> predicateDict,
                                                                                            StringDictionary assignment)
        {
            var result = new List <Tuple <CUDDNode, Tuple <Predicate, bool>[]> >();

            foreach (var cEffectContext in context.cEffect())
            {
                var condEffect = cEffectContext.GetCondEffectList(currentConditionNode, predicateDict, assignment);
                result.AddRange(condEffect);
            }

            return(result);
        }
Ejemplo n.º 11
0
        public void Test1Test()
        {
            var    sb   = new StringBuilder();
            string varX = "x";
            string varY = "y";

            //Set number of action names, 2 for a, b
            Model.NUMBER_OF_EVENT             = 3;
            Model.MAX_NUMBER_EVENT_PARAMETERS = 0;

            BDDEncoder encoder = new BDDEncoder();

            encoder.model.AddGlobalVar(varX, 0, 10);
            encoder.model.AddGlobalVar(varY, 0, 10);

            SymbolicLTS lts = new SymbolicLTS();

            State state1 = lts.AddState();
            State state2 = lts.AddState();
            State state3 = lts.AddState();
            State state4 = lts.AddState();

            lts.InitialState = state1;

            var primitiveApplication1 = new Assignment(varX, new PrimitiveApplication(PrimitiveApplication.PLUS,
                                                                                      new Variable(varX),
                                                                                      new IntConstant(1)));


            var primitiveApplication2 = new Assignment(varY, new PrimitiveApplication(PrimitiveApplication.PLUS,
                                                                                      new Variable(varY),
                                                                                      new IntConstant(4)));


            /*
             *
             * for (int i = 0; i < exps.Count; i++)
             * {
             *  //Update eventParameterVariables[i] = exps[i]
             *  //Don't need to update exps because later after synchronization, not updated variable keeps the same value
             *  update = new Sequence(update, new Assignment(model.eventParameterVariables[i], exps[i]));
             * }
             */
            var primitiveApplication = new Sequence(primitiveApplication1,
                                                    primitiveApplication2);

            /*PrimitiveApplication.CombineProgramBlock(
             * primitiveApplication1,
             * primitiveApplication2);*/
            logger.Info(primitiveApplication);

            Transition trans1 = new Transition(new Event("a"), null,
                                               primitiveApplication,
                                               state1,
                                               state2);

            Expression assignment =
                new Assignment(varX, new PrimitiveApplication(PrimitiveApplication.PLUS,
                                                              new Variable(varX),
                                                              new IntConstant(2)));

            logger.Info("Assignments: " + assignment);

            var secAssignment =
                new Assignment(varY,
                               new PrimitiveApplication(PrimitiveApplication.PLUS,
                                                        new Variable(varY), new WildConstant()));



            Transition trans2 = new Transition(new Event("b"), null,
                                               primitiveApplication,
                                               state2,
                                               state3);

            Transition trans3 = new Transition(new Event("c"), null,
                                               primitiveApplication,
                                               state3,
                                               state4);

            lts.AddTransition(trans1);
            lts.AddTransition(trans2);
            lts.AddTransition(trans3);

            AutomataBDD systemBDD = lts.Encode(encoder);

            //Variable x is initialised to 1
            systemBDD.initExpression = new PrimitiveApplication(PrimitiveApplication.AND,
                                                                systemBDD.initExpression,
                                                                new PrimitiveApplication(PrimitiveApplication.EQUAL,
                                                                                         new Variable(varX), new IntConstant(1)));

            systemBDD.initExpression = new PrimitiveApplication(PrimitiveApplication.AND,
                                                                systemBDD.initExpression,
                                                                new PrimitiveApplication(PrimitiveApplication.EQUAL,
                                                                                         new Variable(varY), new IntConstant(1)));

            CUDDNode initDD = CUDD.Function.Or(systemBDD.initExpression.TranslateBoolExpToBDD(encoder.model).GuardDDs);

            logger.Info("init: " + systemBDD.initExpression);

            var u = 1;

            for (; u < 2; u++)
            {
                logger.Info($"U is {u}");
                //Define 2 goals
                Expression goal1 = new PrimitiveApplication(PrimitiveApplication.EQUAL,
                                                            new Variable(varX), new IntConstant(3));

                goal1 = new PrimitiveApplication(PrimitiveApplication.AND, goal1, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(varY), new IntConstant(9)));

                //Encode 2 goals to BDD
                CUDDNode goal1DD = CUDD.Function.Or(goal1.TranslateBoolExpToBDD(encoder.model).GuardDDs);
                logger.Info("Goal: " + goal1);

                List <CUDDNode> path = new List <CUDDNode>();

                bool reach1 = encoder.model.PathForward(initDD, goal1DD, new List <List <CUDDNode> >()
                {
                    systemBDD.transitionBDD
                }, path, true);


                if (reach1)
                {
                    sb.AppendLine("goal1 is reachable");

                    foreach (var cuddNode in path)
                    {
                        encoder.model.PrintAllVariableValue(cuddNode);
                        logger.Info("after");
                        CUDD.Print.PrintMinterm(cuddNode);
                        //     CUDD.Print.PrintBDDTree(path);
                        int valueOfX = encoder.model.GetRowVarValue(cuddNode, varX);
                        sb.AppendLine(varX + " = " + valueOfX);

                        int valueOfY = encoder.model.GetRowVarValue(cuddNode, varY);
                        sb.AppendLine(varY + " = " + valueOfY);
                    }
                }
                else
                {
                    sb.AppendLine("goal1 is unreachable");
                }

                path.Clear();
            }



            /*
             * bool reach2 = encoder.model.PathForward(initDD, goal2DD, new List<List<CUDDNode>>() { systemBDD.transitionBDD }, path, true);
             * if (reach2)
             * {
             *  sb.AppendLine("goal2 is reachable");
             *  foreach (var cuddNode in path)
             *  {
             *      int valueOfX = encoder.model.GetRowVarValue(cuddNode, varX);
             *      sb.AppendLine(varX + " = " + valueOfX);
             *  }
             * }
             * else
             * {
             *  sb.AppendLine("goal2 is unreachable");
             * }
             */
            logger.Info(sb);
            encoder.model.Close();
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Returns matrix multiplication of matrices dd1 and dd2
 ///  [ REFS: 'result', DEREFS: 'dd1, dd2' ]
 /// </summary>
 public static CUDDNode MatrixMultiply(CUDDNode dd1, CUDDNode dd2, CUDDVars vars, int method)
 {
     return(new CUDDNode(PlatformInvoke.DD_MatrixMultiply(manager, dd1.Ptr, dd2.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), method)));
 }
Ejemplo n.º 13
0
 /// <summary>
 /// Returns transpose of matrix dd
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode Transpose(CUDDNode dd, CUDDVars rVars, CUDDVars cVars)
 {
     return(new CUDDNode(PlatformInvoke.DD_Transpose(manager, dd.Ptr, rVars.GetArrayPointer(), cVars.GetArrayPointer(), rVars.GetNumVars())));
 }
Ejemplo n.º 14
0
 /// <summary>
 /// Get element in vector dd
 /// [ REFS: 'none', DEREFS: 'none' ]
 /// </summary>
 public static double GetVectorElement(CUDDNode dd, CUDDVars vars, int index)
 {
     return(PlatformInvoke.DD_GetVectorElement(manager, dd.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), index));
 }
Ejemplo n.º 15
0
        /// <summary>
        /// Return Pmax(b1 U b2) = 0
        /// </summary>
        /// <param name="trans01"></param>
        /// <param name="reach"></param>
        /// <param name="allRowVars"></param>
        /// <param name="allColVars"></param>
        /// <param name="nondetvars"></param>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        /// <returns></returns>
        public static CUDDNode Prob0A(CUDDNode trans01, CUDDNode reach, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetvars, CUDDNode b1, CUDDNode b2)
        {
            DateTime startTime          = DateTime.Now;
            int      numberOfIterations = 0;

            CUDD.Ref(b2);
            CUDDNode sol = b2;

            while (true)
            {
                numberOfIterations++;

                CUDD.Ref(sol, trans01);
                CUDDNode tmp = CUDD.Function.And(CUDD.Variable.SwapVariables(sol, allRowVars, allColVars), trans01);

                tmp = CUDD.Abstract.ThereExists(tmp, allColVars);

                tmp = CUDD.Abstract.ThereExists(tmp, nondetvars);

                CUDD.Ref(b1);
                tmp = CUDD.Function.And(b1, tmp);

                CUDD.Ref(b2);
                tmp = CUDD.Function.Or(b2, tmp);

                if (tmp.Equals(sol))
                {
                    CUDD.Deref(tmp);
                    break;
                }

                CUDD.Deref(sol);
                sol = tmp;
            }


            CUDD.Ref(reach);
            sol = CUDD.Function.And(reach, CUDD.Function.Not(sol));

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("Prob0A: " + numberOfIterations + " iterations in " + runningTime + " seconds");

            return(sol);
        }
Ejemplo n.º 16
0
 /// <summary>
 /// Set the value of i.th element in vector. i is allowed to be negative. -1 is the last element.
 /// Note that this is a function, not a procedure
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode SetVectorElement(CUDDNode dd, CUDDVars vars, int index, double value)
 {
     return new CUDDNode(PlatformInvoke.DD_SetVectorElement(manager, dd.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), index, value));
 }
Ejemplo n.º 17
0
        /// <summary>
        /// Encode this assignment in a sequence of statements. Return variable values after this assignment based on the current value in resultBefore
        /// [ REFS: 'result', DEREFS: 'resultBefore' ]
        /// </summary>
        public override ExpressionBDDEncoding TranslateStatementToBDD(ExpressionBDDEncoding resultBefore, Model model)
        {
            ExpressionBDDEncoding newUpdate = this.TranslateBoolExpToBDD(model);

            ExpressionBDDEncoding tempResult = new ExpressionBDDEncoding();

            List <List <int> > updatedVariablesInNewUpdate = new List <List <int> >();

            for (int index = 0; index < newUpdate.Count(); index++)
            {
                updatedVariablesInNewUpdate.Add(model.GetColSupportedVars(newUpdate.GuardDDs[index]));
            }

            List <List <int> > usedVariableInNewUpdate = new List <List <int> >();

            for (int index = 0; index < newUpdate.Count(); index++)
            {
                usedVariableInNewUpdate.Add(model.GetRowSupportedVars(newUpdate.GuardDDs[index]));
            }

            List <List <int> > updatedVariablesBefore = new List <List <int> >();

            for (int index = 0; index < resultBefore.Count(); index++)
            {
                updatedVariablesBefore.Add(model.GetColSupportedVars(resultBefore.GuardDDs[index]));
            }

            for (int j1 = 0; j1 < resultBefore.Count(); j1++)
            {
                for (int j2 = 0; j2 < newUpdate.Count(); j2++)
                {
                    //a variable is already updated, now is updated again and it also apprears in the value expression
                    if (Assignment.IsComplexUpdate(updatedVariablesBefore[j1], updatedVariablesInNewUpdate[j2], usedVariableInNewUpdate[j2]))
                    {
                        model.CreateTemporaryVar();
                        Expression newUpdate1;
                        Expression newUpdate2;

                        PropertyAssignment assignment = this as PropertyAssignment;
                        newUpdate1 = new Assignment(Model.TEMPORARY_VARIABLE, this.RightHandExpression);
                        newUpdate2 = new PropertyAssignment(this.RecordExpression, this.PropertyExpression, new Variable(Model.TEMPORARY_VARIABLE));

                        resultBefore.Ref();
                        ExpressionBDDEncoding tempResult1 = newUpdate1.TranslateStatementToBDD(resultBefore, model);
                        ExpressionBDDEncoding tempResult2 = newUpdate2.TranslateStatementToBDD(tempResult1, model);

                        //Remove the temporary variable from transition
                        for (int i = 0; i < tempResult2.Count(); i++)
                        {
                            tempResult2.GuardDDs[i] = CUDD.Abstract.ThereExists(tempResult2.GuardDDs[i], model.GetRowVars(model.GetVarIndex(Model.TEMPORARY_VARIABLE)));
                            tempResult2.GuardDDs[i] = CUDD.Abstract.ThereExists(tempResult2.GuardDDs[i], model.GetColVars(model.GetVarIndex(Model.TEMPORARY_VARIABLE)));

                            tempResult.AddNodeToGuard(tempResult2.GuardDDs[i]);
                        }
                    }
                    else
                    {
                        //swap row, col updated variable in result in the new update command expression
                        CUDDNode update2 = newUpdate.GuardDDs[j2];
                        CUDD.Ref(update2);
                        foreach (int index in updatedVariablesBefore[j1])
                        {
                            if (usedVariableInNewUpdate[j2].Contains(index))
                            {
                                update2 = CUDD.Variable.SwapVariables(update2, model.GetColVars(index), model.GetRowVars(index));
                            }
                        }

                        //Restrict updated variable in new update of the old update
                        CUDDNode update1 = resultBefore.GuardDDs[j1];
                        CUDD.Ref(update1);
                        foreach (int index in updatedVariablesInNewUpdate[j2])
                        {
                            if (updatedVariablesBefore[j1].Contains(index))
                            {
                                update1 = CUDD.Abstract.ThereExists(update1, model.GetColVars(index));
                            }
                        }

                        CUDDNode transition = CUDD.Function.And(update1, update2);
                        tempResult.AddNodeToGuard(transition);
                    }
                }
            }

            resultBefore.DeRef();
            newUpdate.DeRef();

            return(tempResult);
        }
Ejemplo n.º 18
0
 /// <summary>
 /// Get element in vector dd
 /// [ REFS: 'none', DEREFS: 'none' ]
 /// </summary>
 public static double GetVectorElement(CUDDNode dd, CUDDVars vars, int index)
 {
     return PlatformInvoke.DD_GetVectorElement(manager, dd.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), index);
 }
Ejemplo n.º 19
0
        /// <summary>
        /// return Pmax(b1 U b2) = 1
        /// </summary>
        /// <param name="trans01"></param>
        /// <param name="reach"></param>
        /// <param name="allRowVars"></param>
        /// <param name="allColVars"></param>
        /// <param name="nondetVars"></param>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        /// <param name="no"></param>
        /// <returns></returns>
        public static CUDDNode Prob1E(CUDDNode trans01, CUDDNode reach, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVars, CUDDNode b1, CUDDNode b2, CUDDNode no)
        {
            DateTime startTime          = DateTime.Now;
            int      numberOfIterations = 0;

            CUDD.Ref(reach, no);
            CUDDNode u = CUDD.Function.And(reach, CUDD.Function.Not(no));

            bool uDone = false;

            while (!uDone)
            {
                CUDDNode v     = CUDD.Constant(0);
                bool     vDone = false;

                while (!vDone)
                {
                    numberOfIterations++;

                    CUDD.Ref(u);
                    CUDDNode tmp = CUDD.Variable.SwapVariables(u, allRowVars, allColVars);

                    CUDD.Ref(trans01);
                    tmp = CUDD.Abstract.ForAll(CUDD.Function.Implies(trans01, tmp), allColVars);

                    CUDD.Ref(v);
                    CUDDNode tmp2 = CUDD.Variable.SwapVariables(v, allRowVars, allColVars);

                    CUDD.Ref(trans01);
                    tmp2 = CUDD.Abstract.ThereExists(CUDD.Function.And(tmp2, trans01), allColVars);

                    tmp = CUDD.Function.And(tmp, tmp2);
                    tmp = CUDD.Abstract.ThereExists(tmp, nondetVars);

                    CUDD.Ref(b1);
                    tmp = CUDD.Function.And(b1, tmp);

                    CUDD.Ref(b2);
                    tmp = CUDD.Function.Or(b2, tmp);

                    if (tmp.Equals(v))
                    {
                        vDone = true;
                    }

                    CUDD.Deref(v);
                    v = tmp;
                }

                if (v == u)
                {
                    uDone = true;
                }

                CUDD.Deref(u);
                u = v;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("Prob1E: " + numberOfIterations + " iterations in " + runningTime + " seconds");

            return(u);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Return Pmin(phi1 U phi2) = 1
        /// </summary>
        /// <param name="trans01"></param>
        /// <param name="reach"></param>
        /// <param name="nondetMask"></param>
        /// <param name="allRowVars"></param>
        /// <param name="allColVars"></param>
        /// <param name="nondetVar"></param>
        /// <param name="no"></param>
        /// <param name="b2"></param>
        /// <returns></returns>
        public static CUDDNode Prob1A(CUDDNode trans01, CUDDNode reach, CUDDNode nondetMask, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVar, CUDDNode no, CUDDNode b2)
        {
            DateTime startTime          = DateTime.Now;
            int      numberOfIterations = 0;

            CUDD.Ref(reach, no);
            CUDDNode notNo = CUDD.Function.And(reach, CUDD.Function.Not(no));

            CUDD.Ref(b2, notNo);
            CUDDNode sol = CUDD.Function.Or(b2, notNo);

            while (true)
            {
                numberOfIterations++;

                CUDD.Ref(sol);
                CUDDNode tmp = CUDD.Variable.SwapVariables(sol, allRowVars, allColVars);

                CUDD.Ref(trans01);
                tmp = CUDD.Abstract.ForAll(CUDD.Function.Implies(trans01, tmp), allColVars);

                CUDD.Ref(nondetMask);
                tmp = CUDD.Function.Or(tmp, nondetMask);
                tmp = CUDD.Abstract.ForAll(tmp, nondetVar);

                CUDD.Ref(notNo);
                tmp = CUDD.Function.And(notNo, tmp);

                CUDD.Ref(b2);
                tmp = CUDD.Function.Or(b2, tmp);

                if (tmp.Equals(sol))
                {
                    CUDD.Deref(tmp);
                    break;
                }
                CUDD.Deref(sol);
                sol = tmp;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("Prob1A: " + numberOfIterations + " iterations in " + runningTime + " seconds");

            //
            CUDD.Deref(notNo);
            return(sol);
        }
Ejemplo n.º 21
0
        public static CUDDNode NondetBoundedUntil(CUDDNode trans, CUDDNode nondetMask, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVars, CUDDNode yes, CUDDNode maybe, int bound, bool min)
        {
            DateTime startTime = DateTime.Now;

            CUDDNode a, sol, tmp;

            CUDD.Ref(trans, maybe);
            a = CUDD.Function.Times(trans, maybe);

            CUDD.Ref(yes);
            sol = yes;

            for (int i = 0; i < bound; i++)
            {
                tmp = CUDD.Matrix.MatrixMultiplyVector(a, sol, allRowVars, allColVars);

                if (min)
                {
                    CUDD.Ref(nondetMask);
                    tmp = CUDD.Function.Maximum(tmp, nondetMask);

                    tmp = CUDD.Abstract.MinAbstract(tmp, nondetVars);
                }
                else
                {
                    tmp = CUDD.Abstract.MaxAbstract(tmp, nondetVars);
                }

                CUDD.Ref(yes);
                tmp = CUDD.Function.Maximum(tmp, yes);

                CUDD.Deref(sol);
                sol = tmp;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("NondetBoundedUntil: " + bound + " iterations in " + runningTime + " seconds");

            //
            CUDD.Deref(a);

            return(sol);
        }
Ejemplo n.º 22
0
 /// <summary>
 /// Convert ADD to 0-1 ADD based on the interval (threshold, +inf)
 /// [ REFS: 'result', DEREFS: dd ]
 /// </summary>
 public static CUDDNode GreaterThan(CUDDNode dd, double threshold)
 {
     return new CUDDNode(PlatformInvoke.DD_GreaterThan(manager, dd.Ptr, threshold));
 }
Ejemplo n.º 23
0
        public static CUDDNode NondetUntil(CUDDNode trans, CUDDNode nondetMask, CUDDVars allRowVars, CUDDVars allColVars, CUDDVars nondetVars, CUDDNode yes, CUDDNode maybe, bool min)
        {
            DateTime startTime          = DateTime.Now;
            int      numberOfIterations = 0;

            CUDDNode a, sol, tmp;

            CUDD.Ref(trans, maybe);
            a = CUDD.Function.Times(trans, maybe);

            CUDD.Ref(yes);
            sol = yes;

            while (true)
            {
                numberOfIterations++;

                tmp = CUDD.Matrix.MatrixMultiplyVector(a, sol, allRowVars, allColVars);

                if (min)
                {
                    CUDD.Ref(nondetMask);
                    tmp = CUDD.Function.Maximum(tmp, nondetMask);

                    tmp = CUDD.Abstract.MinAbstract(tmp, nondetVars);
                }
                else
                {
                    tmp = CUDD.Abstract.MaxAbstract(tmp, nondetVars);
                }

                CUDD.Ref(yes);
                tmp = CUDD.Function.Maximum(tmp, yes);

                //check convergence
                if (CUDD.IsEqual(tmp, sol))
                {
                    CUDD.Deref(tmp);
                    break;
                }

                CUDD.Deref(sol);
                sol = tmp;
            }

            DateTime endTime     = DateTime.Now;
            double   runningTime = (endTime - startTime).TotalSeconds;

            Debug.WriteLine("NondetUntil: " + numberOfIterations + " iterations in " + runningTime + " seconds");

            //
            CUDD.Deref(a);

            return(sol);
        }
Ejemplo n.º 24
0
 /// <summary>
 /// Convert ADD to 0-1 ADD based on the interval (-inf, threshold]
 /// [ REFS: 'result', DEREFS: dd ]
 /// </summary>
 public static CUDDNode LessThanEquals(CUDDNode dd, double threshold)
 {
     return new CUDDNode(PlatformInvoke.DD_LessThanEquals(manager, dd.Ptr, threshold));
 }
Ejemplo n.º 25
0
 /// <summary>
 /// Set the value of i.th element in vector. i is allowed to be negative. -1 is the last element.
 /// [ REFS: 'result', DEREFS: 'dd' ]
 /// </summary>
 public static CUDDNode SetVectorElement(CUDDNode dd, CUDDVars vars, int index, double value)
 {
     return(new CUDDNode(PlatformInvoke.DD_SetVectorElement(manager, dd.Ptr, vars.GetArrayPointer(), vars.GetNumVars(), index, value)));
 }