Beispiel #1
0
        public void Assign(Expression x, Expression exp, INumericalAbstractDomainQuery <Variable, Expression> preState)
        {
            Interval intvForExp = preState.BoundsFor(exp).AsInterval;

            Variable xVar = decoder.UnderlyingVariable(x);

            AssumeInInterval(xVar, intvForExp);
        }
Beispiel #2
0
            public override Set <Expression> VisitShiftRight(Expression left, Expression right, Expression original, INumericalAbstractDomainQuery <Variable, Expression> data)
            {
                if (this.AreInfinities(left, right))
                {
                    return(new Set <Expression>());
                }

                var bounds = data.BoundsFor(right).AsInterval;
                int val;
                Polynomial <Variable, Expression> pol;

                if (bounds.IsFiniteAndInt32Singleton(out val) && val > 0 &&
                    Polynomial <Variable, Expression> .TryToPolynomialForm(left, this.Decoder, out pol) &&
                    pol.IsLinear && !pol.Relation.HasValue && pol.Left.Length <= (1 << val))
                {
                    var ub = null as IEnumerable <Expression>;

                    foreach (var m in pol.Left)
                    {
                        Variable v;
                        if (m.IsVariable(out v) && data.BoundsFor(v).LowerBound >= 0)
                        {
                            var upperbounds = data.UpperBoundsFor(v, true);
                            ub = ub == null ? upperbounds : ub.Intersect(upperbounds);

                            if (ub.Any())
                            {
                                continue;
                            }
                        }
                        return(new Set <Expression>());
                    }

                    // If we reach this point, we have meaningful constraints

                    return(new Set <Expression>(ub.ApplyToAll(exp => expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessThan, x, exp))));
                }

                return(new Set <Expression>());
            }
Beispiel #3
0
            public override Set <Expression> VisitSubtraction(Expression left, Expression right, Expression original, INumericalAbstractDomainQuery <Variable, Expression> data)
            {
                var result = new Set <Expression>();

                if (this.AreInfinities(left, right))
                {
                    return(result);
                }

                // It is x = left - right,
                if (data.BoundsFor(right).LowerBound > 0)
                {
                    result.Add(expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessThan, x, left));     // Then assume x < left
                }
                // It is x = left - (- Abs(right))
                else if (data.BoundsFor(right).UpperBound < 0)
                {
                    result.Add(expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessThan, left, x));   // Then assume left < x
                }

                return(result);
            }
Beispiel #4
0
            public override Set <Expression> VisitAddition(Expression left, Expression right, Expression original, INumericalAbstractDomainQuery <Variable, Expression> data)
            {
                var result = new Set <Expression>();

                if (data == null)
                {
                    return(result);
                }

                // x := left + right
                if (data.BoundsFor(right).LowerBound >= 0)
                {
                    result.Add(expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessEqualThan, left, x));     // Then assume left <= x
                }

                if (data.BoundsFor(left).LowerBound >= 0)
                {
                    result.Add(expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessEqualThan, right, x));     // Then assume right <= x
                }

                return(result);
            }
Beispiel #5
0
        private void Helper_Match_kY(
            Expression x, INumericalAbstractDomainQuery <Variable, Expression> oracleDomain, List <Expression> result, Expression y)
        {
            Contract.Requires(result != null);

            Expression ltExp;

            if (oracleDomain.BoundsFor(y).LowerBound >= 1)
            {
                ltExp = expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessThan, y, x);
                result.Add(ltExp);

                result.AddRange(UpperBounds(y, oracleDomain.UpperBoundsFor(x, false)));
            }
        }
Beispiel #6
0
            public override Set <Expression> VisitModulus(Expression left, Expression right, Expression original, INumericalAbstractDomainQuery <Variable, Expression> data)
            {
                var result = new Set <Expression>();

                if (this.AreInfinities(left, right))
                {
                    return(result);
                }

                if (data.BoundsFor(right).LowerBound >= 0)
                {
                    result.Add(expManager.Encoder.CompoundExpressionFor(ExpressionType.Bool, ExpressionOperator.LessThan, x, right));     // Then assume x < right
                }

                return(result);
            }