39#include <unordered_map>
76 return !
lower.is_null();
81 return !
upper.is_null();
91 return {SymEngine::null, SymEngine::null};
115 bool use_tight_assumptions,
117 bool project_constraints =
true
130 static constexpr size_t MAX_DEPTH = 100;
131 static constexpr size_t MAX_GENERATORS = 16;
138 bool project_constraints_;
151 size_t cycle_hits_ = 0;
154 size_t limit_hits_ = 0;
162 size_t operator()(
const Expression& e)
const noexcept {
168 return a.get() == b.get() || SymEngine::eq(*a, *b);
171 std::unordered_map<Expression, Interval, BasicHash, BasicEq> cache_;
173 Interval visit(
const Expression& expr,
size_t depth);
174 Interval visit_uncached(
const Expression& expr,
size_t depth);
176 Interval visit_symbol(
const SymEngine::RCP<const SymEngine::Symbol>& sym,
size_t depth);
177 Interval visit_function(
const SymEngine::RCP<const SymEngine::FunctionSymbol>& func,
size_t depth);
178 Interval visit_pow(
const SymEngine::RCP<const SymEngine::Pow>& pow_expr,
size_t depth);
179 Interval visit_mul(
const SymEngine::RCP<const SymEngine::Mul>& mul_expr,
size_t depth);
180 Interval visit_add(
const SymEngine::RCP<const SymEngine::Add>& add_expr,
size_t depth);
181 Interval visit_max(
const Expression& expr,
size_t depth);
182 Interval visit_min(
const Expression& expr,
size_t depth);
186 Interval visit_add_polynomial(
const Polynomial& poly,
const SymbolVec& gens,
size_t depth);
187 Interval visit_add_argwise(
const SymEngine::vec_basic& args,
size_t depth);
206 Interval visit_add_coupled_constraints(
const AffineCoeffs& coeffs,
const SymbolVec& gens,
size_t depth);
384 std::shared_ptr<const DelinearizeResult>,
385 SymEngine::RCPBasicHash,
386 SymEngine::RCPBasicKeyEq>&
388 return delinearize_memo_;
397 const Assumptions& assums_;
398 BoundAnalysis loose_;
399 BoundAnalysis tight_;
404 std::unordered_map<Expression, bool, SymEngine::RCPBasicHash, SymEngine::RCPBasicKeyEq>>
409 std::shared_ptr<const DelinearizeResult>,
410 SymEngine::RCPBasicHash,
411 SymEngine::RCPBasicKeyEq>
Symbol assumptions for reasoning about bounds, constness, and evolution.
bool is_nonneg(const Expression &expr, const SymbolSet ¶meters)
Memoized loose-mode is_nonneg(expr, parameters, assums(), false).
BoundAnalysis & tight()
Definition extreme_values.h:372
bool is_positive(const Expression &expr, const SymbolSet ¶meters)
Memoized loose-mode is_positive(expr, parameters, assums(), false).
AssumptionsBounds(const Assumptions &assums)
Definition extreme_values.h:361
std::unordered_map< Expression, std::shared_ptr< const DelinearizeResult >, SymEngine::RCPBasicHash, SymEngine::RCPBasicKeyEq > & delinearize_memo()
Memo for delinearize(expr, *this), which is pure in (expr, assums()).
Definition extreme_values.h:387
const Assumptions & assums() const
Definition extreme_values.h:366
BoundAnalysis & loose()
Definition extreme_values.h:369
Map from symbols to their assumptions.
Definition assumptions.h:313
Computes bounds of symbolic expressions using assumptions.
Definition extreme_values.h:110
Expression lower_bound(const Expression &expr)
Convenience: compute only the lower bound.
BoundAnalysis(const SymbolSet ¶meters, const Assumptions &assumptions, bool use_tight_assumptions, int64_t budget=DEFAULT_BOUND_BUDGET, bool project_constraints=true)
Interval bound(const Expression &expr)
Compute both lower and upper bounds of an expression.
Expression upper_bound(const Expression &expr)
Convenience: compute only the upper bound.
SymEngine::RCP< const SymEngine::Basic > Expression
Reference-counted pointer to a symbolic expression (SymEngine Basic).
Definition symbolic.h:83
std::set< Symbol, SymEngine::RCPBasicKeyLess > SymbolSet
Ordered set of symbols.
Definition symbolic.h:95
std::vector< Symbol > SymbolVec
Vector of symbols.
Definition symbolic.h:92
Definition assumptions.h:55
Expression maximum(const Expression expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight)
Compute the maximum of an expression.
constexpr OptionKey< int64_t > BOUND_BUDGET
Definition extreme_values.h:57
bool is_ge(const Expression &a, const Expression &b, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove a >= b.
bool is_gt(const Expression &a, const Expression &b, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove a > b.
bool is_nonneg(const Expression &expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove expr >= 0.
std::unordered_map< Symbol, Expression, SymEngine::RCPBasicHash, SymEngine::RCPBasicKeyEq > AffineCoeffs
Map from symbols to their coefficients in an affine expression.
Definition polynomials.h:48
constexpr int64_t DEFAULT_BOUND_BUDGET
Definition extreme_values.h:49
bool is_eq(const Expression &a, const Expression &b, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove a == b (both a >= b and a <= b).
bool is_lt(const Expression &a, const Expression &b, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove a < b.
bool is_le(const Expression &a, const Expression &b, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove a <= b.
constexpr int64_t DELINEARIZATION_PROOF_BUDGET
Definition extreme_values.h:53
Expression minimum(const Expression expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight)
Compute the minimum of an expression.
SymEngine::RCP< const SymEngine::MExprPoly > Polynomial
Type representing a SymEngine polynomial expression.
Definition polynomials.h:45
bool is_nonpos(const Expression &expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove expr <= 0.
bool is_positive(const Expression &expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove expr > 0.
bool is_negative(const Expression &expr, const SymbolSet ¶meters, const Assumptions &assumptions, bool tight=false)
Prove expr < 0.
Polynomial representation and manipulation.
Definition delinearization.h:12
Result of bounding an expression: an interval [lower, upper].
Definition extreme_values.h:65
bool failed() const
Returns true if both bounds failed.
Definition extreme_values.h:70
static Interval exact(const Expression &expr)
Creates an exact interval [expr, expr] for a constant or parameter.
Definition extreme_values.h:85
bool has_lower() const
Returns true if the lower bound was computed.
Definition extreme_values.h:75
Expression upper
Definition extreme_values.h:67
bool has_upper() const
Returns true if the upper bound was computed.
Definition extreme_values.h:80
Expression lower
Definition extreme_values.h:66
static Interval failure()
Creates a failure result.
Definition extreme_values.h:90
Symbolic system for integer-based symbol analysis.