示例#1
0
        public static bool TryMatchVarPlusConst <Variable, Expression>(this IExpressionDecoder <Variable, Expression> decoder,
                                                                       Expression exp, out Variable var, out int k)
        {
            Contract.Requires(decoder != null);

            if (decoder.IsBinaryExpression(exp) && decoder.OperatorFor(exp) == ExpressionOperator.Addition)
            {
                var left  = decoder.LeftExpressionFor(exp);
                var right = decoder.RightExpressionFor(exp);

                if (decoder.IsConstantInt(left, out k) && decoder.IsVariable(right))
                {
                    var = decoder.UnderlyingVariable(right);

                    return(true);
                }

                if (decoder.IsConstantInt(right, out k) && decoder.IsVariable(left))
                {
                    var = decoder.UnderlyingVariable(left);

                    return(true);
                }
            }

            var = default(Variable);
            k   = default(int);
            return(false);
        }
        static bool IsVariableEqConstant(Expression guard, IExpressionDecoder <Variable, Expression> decoder)
        {
            switch (decoder.OperatorFor(guard))
            {
            case ExpressionOperator.Equal:
            case ExpressionOperator.Equal_Obj:
                Expression left  = decoder.LeftExpressionFor(guard);
                Expression right = decoder.RightExpressionFor(guard);

                return((decoder.IsVariable(left) && decoder.IsConstant(right)) || (decoder.IsVariable(right) && decoder.IsConstant(right)));

            default:
                return(false);
            }
        }
示例#3
0
            public static IDictionary <TVar, Sequence <TInterval> > GreaterEqualThanZero <TEnv, TVar, TExpr, TInterval>
                (TExpr expr, IExpressionDecoder <TVar, TExpr> decoder, TEnv env)
                where TEnv : IIntervalEnvironment <TVar, TExpr, TInterval, Rational>
                where TVar : IEquatable <TVar>
                where TInterval : IntervalBase <TInterval, Rational>
            {
                var result   = new Dictionary <TVar, Sequence <TInterval> > ();
                var variable = decoder.UnderlyingVariable(expr);

                AddToResult(result, variable, env.Eval(expr).Meet(env.Context.Positive));

                if (!decoder.IsVariable(expr))
                {
                    Polynomial <TVar, TExpr> zeroPoly;                    // poly(0)
                    if (!Polynomial <TVar, TExpr> .TryToPolynomial(new[] { Monomial <TVar> .From(Rational.Zero) }, out zeroPoly))
                    {
                        throw new AbstractInterpretationException(
                                  "It can never be the case that the conversion of a list of monomials into a polynomial fails.");
                    }

                    Polynomial <TVar, TExpr> exprPoly;                    // poly(expr)
                    Polynomial <TVar, TExpr> fullPoly;                    // '0 <= poly(expr)' polynome
                    if (Polynomial <TVar, TExpr> .TryBuildFrom(expr, decoder, out exprPoly) &&
                        Polynomial <TVar, TExpr> .TryToPolynomial(ExpressionOperator.LessEqualThan, zeroPoly, exprPoly, out fullPoly) &&
                        fullPoly.IsIntervalForm)
                    {
                        var  k = fullPoly.Left[0].Coeff;                        // k != 0
                        TVar x;
                        fullPoly.Left[0].IsSingleVariable(out x);

                        Rational constraint;
                        if (Rational.TryDivide(fullPoly.Right[0].Coeff, k, out constraint))
                        {
                            TInterval interval;
                            if (k > 0L)                             // +x <= constraint
                            {
                                interval = env.Eval(x).Meet(env.Context.For(Rational.MinusInfinity, constraint));
                            }
                            else                             // -x <= -constraint ==> x >= constraint
                            {
                                interval = env.Eval(x).Meet(env.Context.For(constraint, Rational.PlusInfinity));
                            }

                            AddToResult(result, x, interval);
                        }
                    }
                }
                return(result);
            }
示例#4
0
 static public Exp <E> Box <E>(E exp, IExpressionDecoder <E> decoder)
 {
     if (decoder.IsVariable(exp))
     {
         return(new Var <E>(exp, decoder));
     }
     else
     {
         switch (decoder.OperatorFor(exp))
         {
         case ExpressionOperator.ConvertToInt32:
         case ExpressionOperator.ConvertToUInt16:
         case ExpressionOperator.ConvertToUInt32:
         case ExpressionOperator.ConvertToUInt8:
             return(Box(decoder.LeftExpressionFor(exp), decoder));
         }
         return(new Exp <E>(exp, decoder));
     }
 }
示例#5
0
        public static bool IsAtomicExpression <Variable, Expression>(this IExpressionDecoder <Variable, Expression> decoder, Expression exp)
        {
            Contract.Requires(decoder != null);

            return(decoder.IsConstant(exp) || decoder.IsVariable(exp));
        }
        /// <summary>
        /// Infer exp \in [0, +oo], and if exp is a compound expression also some other constraints
        /// </summary>
        static public List <Pair <Variable, IType> > InferConstraints_GeqZero <Variable, Expression, IType>(
            Expression exp, IExpressionDecoder <Variable, Expression> decoder,
            ISetOfNumbersAbstraction <Variable, Expression, Rational, IType> iquery)
            where IType : IntervalBase <IType, Rational>
        {
            Contract.Requires(decoder != null);
            Contract.Requires(iquery != null);

            Contract.Ensures(Contract.Result <List <Pair <Variable, IType> > >() != null);

            var result = new List <Pair <Variable, IType> >();

            var expVar = decoder.UnderlyingVariable(exp);

            result.Add(expVar, iquery.Eval(exp).Meet(iquery.Interval_Positive));

            if (!decoder.IsVariable(exp))
            {
                Polynomial <Variable, Expression> zero; // = 0

                if (!Polynomial <Variable, Expression> .TryToPolynomialForm(new Monomial <Variable>[] { new Monomial <Variable>(0) }, out zero))
                {
                    throw new AbstractInterpretationException("It can never be the case that the conversion of a list of monomials into a polynomial fails");
                }

                Polynomial <Variable, Expression> expAsPolynomial, newPolynomial;

                if (Polynomial <Variable, Expression> .TryToPolynomialForm(exp, decoder, out expAsPolynomial) &&
                    Polynomial <Variable, Expression> .TryToPolynomialForm(ExpressionOperator.LessEqualThan, zero, expAsPolynomial, out newPolynomial)) // 0 <= exp
                {
                    if (newPolynomial.IsIntervalForm)
                    { // if it is in the form of k1 * x <= k2
                        var k1 = newPolynomial.Left[0].K;
                        var x  = newPolynomial.Left[0].VariableAt(0);

                        var k2 = newPolynomial.Right[0].K;

                        Rational bound;
                        if (Rational.TryDiv(k2, k1, out bound)) //var bound = k2 / k1;
                        {
                            if (k1 > 0)
                            {
                                var intv = iquery.Eval(x).Meet(iquery.IntervalLeftOpen(bound));
                                result.Add(x, intv);
                            }
                            else if (k1 < 0)
                            {
                                var intv = iquery.Eval(x).Meet(iquery.IntervalRightOpen(bound));
                                result.Add(x, intv);
                            }
                            else
                            {
                                throw new AbstractInterpretationException("Impossible case");
                            }
                        }
                    }
                }
            }

            return(result);
        }