6#include "ReluConstraint.h"
10#include "dlinear/symbolic/LinearFormulaFlattener.h"
11#include "dlinear/util/Infinity.h"
12#include "dlinear/util/exception.h"
23 &zero, nullptr,
std::move(active_var),
std::move(inactive_var), relu_var,
std::move(active_soi), relu_var} {}
40void ReluConstraint::EnableLiteral(
const Variable&) {
45 std::set<LiteralSet> explanations;
48 if (!explanations.empty()) {
49 DLINEAR_DEV_FMT(
"Failed active because {}", explanations);
53 if (!explanations.empty())
return explanations;
61 DLINEAR_ASSERT(!
fixed(),
"ReluConstraint::Assumptions() should not be called on a fixed constraint");
This class uses some basic algebraic operations to preprocess the constraints and identify violations...
const BoundVectorMap & theory_bounds() const
Get read-only access to the bounds of the variables in the LP solver of the BoundPreprocessor.
std::set< LiteralSet > EnableLiteral(const Literal &lit)
Enable the literal lit.
bool PropagateBoundsPolynomial(const Literal &lit, const Variable &var_to_propagate, Explanations &explanations)
Propagate the bounds of the variables in the given formula.
A piecewise linear constraint is a constraint that assumes different linear functions depending on th...
virtual void UpdateLowerBound(const mpq_class *lb)
Update the lower bounds of the constraint.
virtual void UpdateUpperBound(const mpq_class *ub)
Update the upper bounds of the constraint.
bool fixed() const
Check whether the constraint is fixed.
const mpq_class * lower_bound_
Lower bound of the constraint.
const Variable theory_var_
Theory variable .
const Variable active_var_
Boolean variable associated with the theory literal.
PiecewiseConstraintState state_
State of the constraint.
const mpq_class & lower_bound() const
Get read-only access to the lower bound of the constraint.
const mpq_class * upper_bound_
Upper bound of the constraint.
const Variable inactive_var_
Boolean variable associated with the theory literal.
const mpq_class & upper_bound() const
Get read-only access to the upper bound of the constraint.
Predicate abstraction is a method to convert a first-order logic formula into a Boolean formula.
A ReLU constraint is a kind of piecewise linear constraint.
ReluConstraint(const Variable &relu_var, const Expression &e, const PredicateAbstractor &pa)
Construct a new Relu Constraint object.
void UpdateUpperBound(const mpq_class *upper_bound) override
Update the upper bounds of the constraint.
LiteralSet Assumptions() const override
The assumptions used to guide the SAT solver towards the most promising sub-problems.
LiteralSet LearnedClauses() const override
Produce some learned clauses the SAT solver will use to prune the sub-problems this piecewise constra...
std::ostream & Print(std::ostream &os) const override
Print the constraint on the standard output.
std::set< LiteralSet > TightenBounds(BoundPreprocessor &preprocessor) override
Use the preprocessor to tighten the bounds of the constraint and hopefully fix its state to either ac...
void UpdateLowerBound(const mpq_class *lower_bound) override
Update the lower bounds of the constraint.
static const mpq_class zero
Zero constant all the pointers to the default lower bound will point to.
Represents a symbolic form of an expression.
Represents a symbolic variable.
Global namespace for the dlinear library.
@ ACTIVE
The constraint is active.
@ INACTIVE
The constraint is inactive.
std::set< Literal > LiteralSet
A set of literals.