dlinear  0.0.1
Delta-complete SMT solver for linear programming
Loading...
Searching...
No Matches
dlinear::NNSoplexTheorySolver Class Reference

Specialised theory solver for neural networks using SoPlex. More...

#include <NNSoplexTheorySolver.h>

Inheritance diagram for dlinear::NNSoplexTheorySolver:
dlinear::SoplexTheorySolver dlinear::TheorySolver

Classes

struct  PlConstraint
 

Public Member Functions

void AddLiteral (const Variable &formula_var, const Formula &formula) override
 Add a Literal to the theory solver.
 
Explanations EnableLiteral (const Literal &lit) override
 Activate the literal that had previously been added to the theory solver.
 
SatResult CheckSatCore (mpq_class *actual_precision, std::set< LiteralSet > &explanations) override
 Check the satisfiability of the theory.
 
void Reset () override
 Reset the linear problem.
 
- Public Member Functions inherited from dlinear::SoplexTheorySolver
void AddVariable (const Variable &var) override
 Add a variable (column) to the theory solver.
 
void AddLiterals () override
 Add a vector of literals to the theory solver.
 
void Consolidate (const Box &box) override
 Consolidate the solver.
 
void Reset () override
 Reset the linear problem.
 
- Public Member Functions inherited from dlinear::TheorySolver
 TheorySolver (const PredicateAbstractor &predicate_abstractor, const std::string &class_name="TheorySolver")
 Construct a new Theory Solver object.
 
virtual Explanations PreprocessFixedLiterals (const LiteralSet &fixed_literals)
 Add the fixed literals to the theory solver.
 
Explanations EnableLiterals (std::span< const Literal > theory_literals)
 Activate the literals that have previously been added to the theory solver.
 
const Boxmodel () const
 Get read-only access to the model that satisfies all the constraints of the TheorySolver.
 
const Configconfig () const
 Get read-only access to the configuration of the TheorySolver.
 
const PredicateAbstractorpredicate_abstractor () const
 Get read-only access to the predicate abstractor of the TheorySolver.
 
const std::map< Variable::Id, int > & var_to_theory_col () const
 Get read-only access to the map of variables to the theory columns of the TheorySolver.
 
const std::vector< Variable > & theory_col_to_var () const
 Get read-only access to the map of theory columns to the variables of the TheorySolver.
 
const std::map< Variable::Id, int > & lit_to_theory_row () const
 Get read-only access to the map of literals to the theory rows of the TheorySolver.
 
const std::vector< Literal > & theory_row_to_lit () const
 Get read-only access to the map of theory rows to the literals of the TheorySolver.
 
const BoundVectorMap & theory_bounds () const
 Get read-only access to the bounds of each theory variable of the TheorySolver.
 
const BoundVectorMap & fixed_theory_bounds () const
 Get read-only access to the fixed bounds of each theory variable of the TheorySolver.
 
const BoundPreprocessorpreprocessor () const
 Get read-only access to the bound preprocessor of the TheorySolver.
 
BoundPreprocessorm_preprocessor ()
 Get read-write access to the bound preprocessor of the TheorySolver.
 
const BoundPreprocessorfixed_preprocessor () const
 Get read-only access to the fixed bound preprocessor of the TheorySolver.
 
BoundPreprocessorm_fixed_preprocessor ()
 Get read-write access to the fixed bound preprocessor of the TheorySolver.
 
std::size_t theory_row_count () const
 Get read-only access to the number of rows of the TheorySolver.
 
std::size_t theory_col_count () const
 Get read-only access to the number of columns of the TheorySolver.
 
std::set< Literalenabled_literals () const
 Get read-only access to the vector of enabled literals of the TheorySolver.
 
SatResult CheckSat (const Box &box, mpq_class *actual_precision, std::set< LiteralSet > &explanations)
 Check the satisfiability of the theory.
 
const IterationStatsstats () const
 Get the statistics of the theory solver.
 

Private Member Functions

void EnableSpxRow (int spx_row, bool truth) override
 Enable the spx_row row for the LP solver.
 
void Consolidate (const Box &box) override
 Consolidate the solver.
 
void SoiToObjFunction ()
 Convert the soi_ expression to an objective function inside soplex.
 
bool InvertGreatestViolation ()
 Invert the greatest violation found in the objective function.
 

Additional Inherited Members

- Public Types inherited from dlinear::TheorySolver
using Bound = std::tuple<const Variable &, LpColBound, const mpq_class &>
 Bound on the variable.
 
using Violation = BoundIterator
 Bound iterator over some violated bounds.
 
using Explanations = std::set<LiteralSet>
 Set of explanations of the conflict.
 
- Protected Types inherited from dlinear::TheorySolver
enum class  BoundViolationType { NO_BOUND_VIOLATION , LOWER_BOUND_VIOLATION , UPPER_BOUND_VIOLATION }
 Enum used to describe how the bounds on a variable participate in the infeasibility result of an LP problem. More...
 
- Protected Member Functions inherited from dlinear::SoplexTheorySolver
void UpdateModelBounds () override
 Update each variable in the model with the bounds passed to the theory solver.
 
void UpdateModelSolution () override
 Update the model with the solution obtained from the LP solver.
 
void UpdateExplanation (LiteralSet &explanation) override
 Use the result from the theory solver to update the explanation with the conflict that has been detected.
 
virtual void EnableSpxVarBound ()
 Set the bounds of the variables in the LP solver.
 
void EnableSpxRow (int spx_row)
 Enable the spx_row row for the LP solver.
 
void DisableSpxRows ()
 Disable all disabled spx rows from the LP solver.
 
soplex::DSVectorRational ParseRowCoeff (const Formula &formula)
 Parse a formula and return the vector of coefficients to apply to the decisional variables.
 
void SetSPXVarCoeff (soplex::DSVectorRational &coeffs, const Variable &var, const mpq_class &value) const
 Set the coefficients to apply to var on a specific row.
 
void GetSpxInfeasibilityRay (soplex::VectorRational &farkas_ray)
 Get the infeasibility ray of the LP problem.
 
void GetSpxInfeasibilityRay (soplex::VectorRational &farkas_ray, std::vector< BoundViolationType > &bounds_ray)
 Get the infeasibility rays of the LP problem.
 
std::vector< std::pair< int, soplex::Rational > > GetActiveRows ()
 Get all active rows in the current solution.
 
std::vector< std::pair< int, soplex::Rational > > GetActiveRows (const std::vector< int > &spx_rows)
 Get active rows in the current solution among the rows in spx_rows.
 
std::optional< soplex::Rational > IsRowActive (int spx_row)
 Check if the spx_row is active.
 
bool IsRowActive (int spx_row, const soplex::Rational &value)
 Check if the spx_row is active with value value.
 
- Protected Member Functions inherited from dlinear::TheorySolver
void UpdateExplanations (Explanations &explanations)
 Use the result from the theory solver to update the explanations with the conflict that has been detected.
 
- Protected Attributes inherited from dlinear::SoplexTheorySolver
soplex::SoPlex spx_
 SoPlex exact LP solver.
 
soplex::LPColSetRational spx_cols_
 Columns of the LP problem.
 
soplex::LPRowSetRational spx_rows_
 Rows of the LP problem.
 
std::vector< mpq_class > spx_rhs_
 Right-hand side of the rows.
 
std::vector< LpRowSensespx_sense_
 Sense of the rows.
 
- Protected Attributes inherited from dlinear::TheorySolver
const Configconfig_
 Configuration of the theory solver.
 
bool is_consolidated_
 Whether the solver has been consolidated.
 
const PredicateAbstractorpredicate_abstractor_
 Predicate abstractor used to create the theory solver.
 
std::map< Variable::Id, int > var_to_theory_col_
 Variable ⇔ theory column.
 
std::vector< Variabletheory_col_to_var_
 Theory column ⇔ Variable.
 
std::map< Variable::Id, int > lit_to_theory_row_
 Literal ⇔ theory row.
 
std::vector< Literaltheory_row_to_lit_
 Theory row ⇔ Literal The row is the constraint used by the theory solver.
 
std::vector< bool > theory_rows_state_
 Whether each theory row is enabled or not.
 
BoundPreprocessor fixed_preprocessor_
 Preprocessor for the bounds. Only computed on fixed literal theories.
 
BoundPreprocessor preprocessor_
 Preprocessor for the bounds.
 
Box model_
 Model produced by the theory solver.
 
IterationStats stats_
 Statistics of the theory solver.
 
- Static Protected Attributes inherited from dlinear::SoplexTheorySolver
static mpq_class infinity_ {soplex::infinity}
 Positive infinity.
 
static mpq_class ninfinity_ {-soplex::infinity}
 Negative infinity.
 

Detailed Description

Specialised theory solver for neural networks using SoPlex.

The solver will use special care when dealing with piecewise linear constraints. Instead of encoding them as a set of linear constraints, they will create a new objective function representing the sum of infeasibilities to minimise. If the problem is feasible, but the objective value is not 0, the solver will try to invert the greatest violation to attempt making the problem feasible.

Definition at line 29 of file NNSoplexTheorySolver.h.

Member Function Documentation

◆ AddLiteral()

void dlinear::NNSoplexTheorySolver::AddLiteral ( const Variable & formula_var,
const Formula & formula )
overridevirtual

Add a Literal to the theory solver.

A Literal is formed by a variable that corresponds to a theory formula inside the PredicateAbstractor and the formula itself

Parameters
formula_varboolean variable that corresponds to the theory formula
formulasymbolic formula that represents the theory formula

Implements dlinear::TheorySolver.

Definition at line 35 of file NNSoplexTheorySolver.cpp.

◆ CheckSatCore()

SatResult dlinear::NNSoplexTheorySolver::CheckSatCore ( mpq_class * actual_precision,
std::set< LiteralSet > & explanations )
overridevirtual

Check the satisfiability of the theory.

Called by CheckSat. Run the internal LP solver to check whether the underlying linear programming problem is feasible. If it is, SAT will be returned, along with the actual precision required to obtain that result. Otherwise, UNSAT will be returned, along with an explanation of the conflict. In that case, the precision will remain the same as the one passed as input.

Parameters
[in,out]actual_precisiondesired precision. It will be updated with the actual precision if SAT is returned
[out]explanationsset of sets of literals that explain the conflict if UNSAT is returned
Returns
SAT if the problem is feasible, along with the actual precision required to obtain that result and the model
UNSAT if the problem is infeasible, along with an explanation of the conflict

Implements dlinear::TheorySolver.

Definition at line 114 of file NNSoplexTheorySolver.cpp.

◆ Consolidate()

void dlinear::NNSoplexTheorySolver::Consolidate ( const Box & box)
overrideprivatevirtual

Consolidate the solver.

This method must be called after all the literals have been added to the solver and before calling any other method. Once the solver has been consolidated, no more literals can be added to it. A previously added literal can be enabled using the EnableLiteral method and disabled with Reset.

Note
A solver can be consolidated only once. If you need to change the variables or constraints, you must create a new theory solver.
Parameters
boxbox with the bounds for the variables

Reimplemented from dlinear::TheorySolver.

Definition at line 285 of file NNSoplexTheorySolver.cpp.

◆ EnableLiteral()

TheorySolver::Explanations dlinear::NNSoplexTheorySolver::EnableLiteral ( const Literal & lit)
overridevirtual

Activate the literal that had previously been added to the theory solver.

If the literal is a row inside the TheorySolver, then the the corresponding constraint is activated by giving it the proper values.

If the literal is a simple bound on the variable (column), some additional checks are made. Theory solvers struggle to handle problems with inverted bounds. It is convenient to have a method that checks them beforehand. If at least a bound is inverted, the problem is UNSAT, since it is impossible to satisfy the constraint. An explanation is produced and returned to the SAT solver.

Parameters
litliteral to activate
Returns
an explanation with the literals that correspond to the conflicting bounds
an empty optional if no conflicts are detected at this step

Implements dlinear::TheorySolver.

Definition at line 67 of file NNSoplexTheorySolver.cpp.

◆ EnableSpxRow()

void dlinear::NNSoplexTheorySolver::EnableSpxRow ( int spx_row,
bool truth )
overrideprivatevirtual

Enable the spx_row row for the LP solver.

Precondition
The row's coefficients must have been set correctly before calling this function
Parameters
spx_rowindex of the row to enable
truthtruth value of the row

Implements dlinear::SoplexTheorySolver.

Definition at line 291 of file NNSoplexTheorySolver.cpp.

◆ Reset()

void dlinear::NNSoplexTheorySolver::Reset ( )
overridevirtual

Reset the linear problem.

All constraints' state will be set to disabled and the bounds for each variable will be cleared.

Note
The variables and constraints themselves will not be modified. If you need to change them, you must create a new theory solver.

Reimplemented from dlinear::TheorySolver.

Definition at line 279 of file NNSoplexTheorySolver.cpp.


The documentation for this class was generated from the following files: