15 #include <boost/range/adaptor/reversed.hpp>
28 std::size_t Module::mNumOfBranchVarsToStore = 5;
30 std::vector<Branching> Module::mLastBranches = std::vector<Branching>( mNumOfBranchVarsToStore, Branching(Poly::PolyType(), 0) );
32 std::vector<Branching> Module::mLastBranches = std::vector<Branching>(mNumOfBranchVarsToStore, Branching(
typename Poly::PolyType(), 0));
34 std::size_t Module::mFirstPosInLastBranches = 0;
35 std::vector<FormulaT> Module::mOldSplittingVariables;
36 #ifdef SMTRAT_STRAT_PARALLEL_MODE
37 std::mutex Module::mOldSplittingVarMutex;
45 mpReceivedFormula( _formula ),
47 mModuleName(std::move(module_name)),
49 mpManager( _manager ),
52 mModelComputed( false ),
55 mObjectiveVariable(
carl::Variable::NO_VARIABLE ),
58 mBackendsFoundAnswer(new std::atomic<bool>(false)),
60 mBackendsFoundAnswer(new std::atomic_bool(false)),
62 mFoundAnswer( _foundAnswer ),
66 mFirstSubformulaToPass( mpPassedFormula->end() ),
67 mConstraintsToInform(),
68 mInformedConstraints(),
69 mFirstUncheckedReceivedSubformula( mpReceivedFormula->end() ),
70 mSmallerMusesCheckCounter( 0 ),
89 SMTRAT_LOG_INFO(
"smtrat.module", __func__ << (_final ?
" final" :
" partial") << (_full ?
" full" :
" lazy" ) <<
" with module " <<
moduleName() <<
" (" <<
mId <<
")");
94 #ifdef SMTRAT_DEVOPTION_Statistics
131 (*module)->deinform( _constraint );
145 const carl::Variables&
vars = _receivedSubformula->formula().variables();
146 for( carl::Variable::Arg
var :
vars )
167 const carl::Variables&
vars = _receivedSubformula->formula().variables();
168 for( carl::Variable::Arg
var :
vars )
192 if( infsubset.find( _receivedSubformula->formula() ) != infsubset.end() )
243 backend->inform( *iter );
301 result = module->currentlySatisfied( _formula );
310 std::list<std::vector<carl::Variable>> res;
311 for(
auto& it : this->
mModel )
313 if( it.first.is_variable() )
315 carl::Variable v = it.first.asVariable();
318 for(
auto& cls: res )
321 assert(cls.size() > 0);
323 if( a == this->mModel.at(cls.front()) )
334 res.emplace_back(std::vector<carl::Variable>( {v} ));
343 std::pair<ModuleInput::iterator,bool> res =
mpPassedFormula->
add( _formula, _hasSingleOrigin, _origin, _origins, _mightBeConjunction );
361 const FormulaT& subform = fwo->formula();
363 subFormulasInRF.insert(subFormulasInRF.end(), subform.subformulas().begin(), subform.subformulas().end() );
365 subFormulasInRF.push_back( subform );
367 for(
auto& f : _origin.subformulas() )
369 if(
std::find(subFormulasInRF.begin(), subFormulasInRF.end(), f ) == subFormulasInRF.end() )
377 std::vector<FormulaT>
Module::merge(
const std::vector<FormulaT>& _vecSetA,
const std::vector<FormulaT>& _vecSetB )
const
379 std::vector<FormulaT>
result;
380 std::vector<FormulaT>::const_iterator originSetA = _vecSetA.begin();
381 while( originSetA != _vecSetA.end() )
383 std::vector<FormulaT>::const_iterator originSetB = _vecSetB.begin();
384 while( originSetB != _vecSetB.end() )
388 subformulas = originSetA->subformulas();
390 subformulas.push_back( *originSetA );
392 subformulas.insert(subformulas.end(), originSetB->begin(), originSetB->end() );
394 subformulas.push_back( *originSetB );
405 assert( !origins.empty() );
406 auto iter = origins.begin();
407 size_t size_min = (*iter).size();
409 size_t index_min = 0, i = 0;
410 while( iter != origins.end() )
412 if( (*iter).size() < size_min )
414 size_min = (*iter).size();
429 if( mpManager ==
nullptr )
return false;
430 assert( _branchingPolynomial.constant_part() == 0 );
431 auto iter = mLastBranches.begin();
432 for( ; iter != mLastBranches.end(); ++iter )
434 if( iter->mPolynomial == _branchingPolynomial )
436 if( iter->mIncreasing > 0 )
438 if( _branchingValue >= iter->mValue )
440 ++(iter->mRepetitions);
442 else if( _branchingValue <= iter->mValue )
444 iter->mIncreasing = -1;
445 iter->mRepetitions = 1;
448 else if( iter->mIncreasing < 0 )
450 if( _branchingValue <= iter->mValue )
452 ++(iter->mRepetitions);
454 else if( _branchingValue >= iter->mValue )
456 iter->mIncreasing = 1;
457 iter->mRepetitions = 1;
460 else if( _branchingValue != iter->mValue )
462 iter->mRepetitions = 1;
463 iter->mIncreasing = _branchingValue >= iter->mValue ? 1 : -1;
465 iter->mValue = _branchingValue;
466 if( iter->mRepetitions > 10 )
return true;
470 if( iter == mLastBranches.end() )
472 mLastBranches[mFirstPosInLastBranches] =
Branching( _branchingPolynomial, _branchingValue );
473 if( ++mFirstPosInLastBranches == mNumOfBranchVarsToStore ) mFirstPosInLastBranches = 0;
478 bool Module::branchAt(
const Poly& _polynomial,
bool _integral,
const Rational& _value, std::vector<FormulaT>&& _premise,
bool _leftCaseWeak,
bool _preferLeftCase,
bool _useReceivedFormulaAsPremise )
480 assert( !_useReceivedFormulaAsPremise || _premise.empty() );
481 assert( !_polynomial.has_constant_term() );
486 Rational bound = carl::floor( _value );
490 constraintA =
ConstraintT( std::move(_polynomial - bound), Relation::LEQ );
491 constraintB =
ConstraintT( std::move(_polynomial - (++bound)), Relation::GEQ );
495 constraintB =
ConstraintT( std::move(_polynomial - bound), Relation::GEQ );
496 constraintA =
ConstraintT( std::move(_polynomial - (--bound)), Relation::LEQ );
498 SMTRAT_LOG_INFO(
"smtrat.module", __func__ <<
" from " <<
moduleName() <<
" (" <<
mId <<
") at " << constraintA <<
" and " << constraintB);
503 Poly constraintLhs = _polynomial - _value;
506 constraintA =
ConstraintT( constraintLhs, Relation::LEQ );
507 constraintB =
ConstraintT( std::move(constraintLhs), Relation::GREATER );
511 constraintA =
ConstraintT( constraintLhs, Relation::LESS );
512 constraintB =
ConstraintT( std::move(constraintLhs), Relation::GEQ );
515 if( constraintA.is_consistent() == 2 )
521 s1 =
FormulaT( carl::fresh_boolean_variable() );
528 s2 =
FormulaT( carl::fresh_boolean_variable() );
537 if( _useReceivedFormulaAsPremise )
540 subformulas.push_back( fwo.formula().negated() );
544 for(
const FormulaT& premForm : _premise )
547 subformulas.push_back( premForm.negated() );
550 subformulas.push_back( s1 );
551 subformulas.push_back( s2 );
561 assert( constraintB.is_consistent() != 2 );
567 assert( _unequalConstraint.type() == CONSTRAINT );
568 assert( _unequalConstraint.constraint().relation() == Relation::NEQ );
569 const Poly& lhs = _unequalConstraint.constraint().lhs();
577 subformulas.push_back( lessConstraint );
578 subformulas.push_back( greaterConstraint );
601 if( (*backend)->solverState() ==
UNSAT )
613 auto assignment = _modelA.begin();
614 while( assignment != _modelA.end() )
616 if( _modelB.find( assignment->first ) != _modelB.end() )
620 assignment = _modelB.begin();
621 while( assignment != _modelB.end() )
623 if( _modelA.find( assignment->first ) != _modelA.end() )
635 if( (*module)->solverState() ==
SAT )
639 (*module)->updateModel();
640 return (*module)->model();
657 if ((*module)->solverState() !=
ABORTED)
661 (*module)->updateModel();
662 mModel.update((*module)->model(),
false);
674 assert( (*module)->solverState() !=
UNSAT );
675 if( (*module)->solverState() ==
SAT )
679 (*module)->updateAllModels();
695 auto smallestOrigin = _origins.begin();
696 auto origin = _origins.begin();
697 while( origin != _origins.end() )
699 if( origin->size() == 1 )
701 else if( origin->size() < smallestOrigin->size() )
702 smallestOrigin = origin;
705 assert( smallestOrigin != _origins.end() );
706 return smallestOrigin;
711 std::vector<FormulaSetT>
result;
712 const std::vector<FormulaSetT>& backendsInfsubsets = _backend.
infeasibleSubsets();
713 assert( !backendsInfsubsets.empty() );
714 for( std::vector<FormulaSetT>::const_iterator infSubSet = backendsInfsubsets.begin(); infSubSet != backendsInfsubsets.end(); ++infSubSet )
716 assert( !infSubSet->empty() );
717 #ifdef SMTRAT_DEVOPTION_Validation
721 for(
const auto& cons : *infSubSet )
738 if( numberOfUsedBackends > 0 )
743 bool assertionFailed =
false;
746 (*module)->mLemmas.clear();
747 if( !(*module)->mInfeasibleSubsets.empty() )
749 assertionFailed =
true;
752 (*module)->inform( *iter );
755 if( !(*module)->add( subformula ) )
757 assertionFailed =
true;
764 if( assertionFailed )
774 (*module)->mLemmas.clear();
778 #ifdef SMTRAT_STRAT_PARALLEL_MODE
795 result = (*module)->check( _final, _full, _objective );
797 (*module)->receivedFormulaChecked();
800 #ifdef SMTRAT_STRAT_PARALLEL_MODE
813 assert( !_subformula->hasOrigins() );
815 bool subformulaChecked =
true;
819 subformulaChecked =
false;
826 if( iter == _subformula )
828 subformulaChecked =
false;
835 if( subformulaChecked )
842 (*module)->remove( _subformula );
871 #ifdef SMTRAT_DEVOPTION_Expensive
886 if (
mModel.empty())
return;
889 carl::carlVariables variables;
890 std::set<carl::UninterpretedFunction> functions;
892 carl::variables(f.formula(),variables);
893 carl::uninterpreted_functions(f.formula(),functions);
898 if (it->first.isFunction()) {
899 if (functions.find(it->first.asFunction()) == functions.end()) {
904 if (it->first.is_variable()) v = it->first.asVariable();
905 else if (it->first.isBVVariable()) v = it->first.asBVVariable().variable();
906 else if (it->first.isUVariable()) v = it->first.asUVariable().variable();
907 if (!variables.has(v)) {
923 (*module)->updateLemmas();
924 mLemmas.insert(
mLemmas.end(), (*module)->mLemmas.begin(), (*module)->mLemmas.end() );
932 (*module)->collectTheoryPropagations();
933 #ifdef SMTRAT_DEVOPTION_Validation
934 for(
const auto& tp : (*module)->mTheoryPropagations )
940 std::move( (*module)->mTheoryPropagations.begin(), (*module)->mTheoryPropagations.end(), std::back_inserter(
mTheoryPropagations ) );
941 (*module)->mTheoryPropagations.clear();
948 return std::make_pair(
true,
FormulaT( carl::FormulaType::FALSE ) );
951 std::pair<bool,FormulaT> simplifiedPassedFormula = backend->getReceivedFormulaSimplified();
952 if( simplifiedPassedFormula.first )
954 return simplifiedPassedFormula;
957 return std::make_pair(
false,
FormulaT( carl::FormulaType::TRUE ) );
964 _origins.push_back( _formula );
969 SMTRAT_LOG_ERROR(
"smtrat",
"Formula " << _formula <<
" has type: " << _formula.type() <<
", not AND-Type");
972 for(
auto& subformula : _formula.subformulas() )
975 _origins.push_back( subformula );
984 _origins.insert( _formula );
989 SMTRAT_LOG_ERROR(
"smtrat",
"Formula " << _formula <<
" has type: " << _formula.type() <<
", not AND-Type");
992 for(
auto& subformula : _formula.subformulas() )
995 _origins.insert( subformula );
1006 for(
const auto& subFormula : infSubset )
1010 SMTRAT_LOG_DEBUG(
"smtrat.module",
"Subset " << infSubset <<
" has " << subFormula <<
" that we don't know.");
1020 carl::carlVariables
vars(carl::variable_type_filter::arithmetic());
1021 for(
auto it = _infsubset->begin(); it != _infsubset->end(); ++it ) {
1022 carl::variables(*it,
vars);
1024 std::stringstream filename;
1026 std::ofstream smtlibFile;
1027 smtlibFile.open( filename.str() );
1028 for(
size_t size = _infsubset->size() - _maxSizeDifference; size < _infsubset->size(); ++size )
1031 size_t bitvector = (1 << size) - 1;
1033 size_t limit = (1 << _infsubset->size());
1034 size_t nextbitvector;
1035 while( bitvector < limit )
1038 size_t tmp = (bitvector | (bitvector - 1)) + 1;
1039 nextbitvector = tmp | ((((tmp & -tmp) / (bitvector & -bitvector)) >> 1) - 1);
1041 smtlibFile <<
"(reset)\n";
1043 smtlibFile <<
"(set-option :interactive-mode true)\n";
1044 smtlibFile <<
"(set-info :smt-lib-version 2.0)\n";
1046 for (
auto v:
vars) {
1047 smtlibFile <<
"(declare-fun " << v <<
" () " << v.type() <<
")\n";
1049 smtlibFile <<
"(set-info :status sat)\n";
1050 smtlibFile <<
"(assert (and ";
1051 for(
auto it = _infsubset->begin(); it != _infsubset->end(); ++it )
1054 smtlibFile <<
" " << *it;
1057 smtlibFile <<
"))\n";
1058 smtlibFile <<
"(get-assertions)\n";
1059 smtlibFile <<
"(check-sat)\n";
1060 bitvector = nextbitvector;
1064 smtlibFile <<
"(exit)";
1086 #ifdef SMTRAT_LOGGING_ENABLED
1091 #ifdef SMTRAT_LOGGING_ENABLED
1092 SMTRAT_LOG_INFO(
"smtrat.module", _initiation <<
"********************************************************************************");
1101 SMTRAT_LOG_INFO(
"smtrat.module", _initiation <<
"********************************************************************************");
1110 std::stringstream ss;
1112 ss << std::setw( 45 ) << form->formula();
1113 if( form->deducted() ) ss <<
" deducted";
1123 std::stringstream ss;
1125 ss << std::setw( 45 ) << form->formula();
1126 if( form->hasOrigins() )
1128 for (
const auto& oSubformulas: form->origins()) {
1129 ss <<
" {" << oSubformulas <<
" }";
1138 SMTRAT_LOG_INFO(
"smtrat.module", _initiation <<
"Infeasible subsets:");
1141 std::stringstream ss;
1144 for (
const auto& infSubFormula: *infSubSet)
1145 ss <<
" " << infSubFormula << std::endl;
1166 _out << m << std::endl;
#define OLD_SPLITTING_VARS_UNLOCK
#define OLD_SPLITTING_VARS_LOCK
#define SMTRAT_VALIDATION_ADD(channel, name, formula, consistent)
std::vector< Module * > getBackends(Module *_requiredBy, std::atomic_bool *_foundAnswer)
Get the backends to call for the given problem instance required by the given module.
bool isLemmaLevel(LemmaLevel level)
Checks if current lemma level is greater or equal to given level.
void addInformationRelevantFormula(const FormulaT &formula)
Adds formula to InformationRelevantFormula.
std::vector< Module * > getAllBackends(Module *_module) const
Gets all backends so far instantiated according the strategy and all previous enquiries of the given ...
const std::set< FormulaT > & getInformationRelevantFormulas()
Gets all InformationRelevantFormulas.
A base class for all kind of theory solving methods.
void clearModel() const
Clears the assignment, if any was found.
const std::vector< FormulaSetT > & infeasibleSubsets() const
std::pair< ModuleInput::iterator, bool > addReceivedSubformulaToPassedFormula(ModuleInput::const_iterator _subformula)
Copies the given sub-formula of the received formula to the passed formula.
virtual void init()
Informs all backends about the so far encountered constraints, which have not yet been communicated.
std::vector< FormulaSetT > mInfeasibleSubsets
Stores the infeasible subsets.
void printReceivedFormula(const std::string &_initiation="***") const
Prints the vector of the received formula.
void splitUnequalConstraint(const FormulaT &)
Adds the following lemmas for the given constraint p!=0.
void addInformationRelevantFormula(const FormulaT &formula)
Adds a formula to the InformationRelevantFormula.
std::vector< Model > mAllModels
Stores all satisfying assignments.
const std::vector< Module * > & usedBackends() const
bool anAnswerFound() const
Checks for all antecedent modules and those which run in parallel with the same antecedent modules,...
std::vector< Module * > mAllBackends
The backends of this module which have been used.
virtual bool addCore([[maybe_unused]] ModuleInput::const_iterator formula)
The module has to take the given sub-formula of the received formula into account.
carl::FastSet< FormulaT > mConstraintsToInform
Stores the constraints which the backends must be informed about.
virtual std::string moduleName() const
ModuleInput::iterator mFirstSubformulaToPass
Stores the position of the first sub-formula in the passed formula, which has not yet been considered...
const std::set< FormulaT > & getInformationRelevantFormulas()
Gets all InformationRelevantFormulas.
const Model & backendsModel() const
Stores the model of a backend which determined satisfiability of the passed formula in the model of t...
Conditionals mFoundAnswer
Vector of Booleans: If any of them is true, we have to terminate a running check procedure.
virtual void updateModel() const
Updates the model, if the solver has detected the consistency of the received formula,...
virtual std::list< std::vector< carl::Variable > > getModelEqualities() const
Partition the variables from the current model into equivalence classes according to their assigned v...
std::vector< std::size_t > mVariableCounters
Maps variables to the number of their occurrences.
void deinform(const FormulaT &_constraint)
The inverse of informing about a constraint.
bool originInReceivedFormula(const FormulaT &_origin) const
unsigned currentlySatisfiedByBackend(const FormulaT &_formula) const
virtual Answer runBackends()
std::pair< ModuleInput::iterator, bool > addSubformulaToPassedFormula(const FormulaT &_formula)
Adds the given formula to the passed formula with no origin.
Answer foundAnswer(Answer _answer)
Sets the solver state to the given answer value.
bool probablyLooping(const typename Poly::PolyType &_branchingPolynomial, const Rational &_branchingValue) const
Checks whether given the current branching value and branching variable/polynomial it is (highly) pro...
virtual ~Module()
Destructs a module.
virtual std::pair< bool, FormulaT > getReceivedFormulaSimplified()
bool mFullCheck
false, if this module should avoid too expensive procedures and rather return unknown instead.
unsigned mSmallerMusesCheckCounter
Counter used for the generation of the smt2 files to check for smaller muses.
Manager *const mpManager
A reference to the manager.
bool inform(const FormulaT &_constraint)
Informs the module about the given constraint.
ModuleStatistics & mStatistics
void printInfeasibleSubsets(const std::string &_initiation="***") const
Prints the infeasible subsets.
virtual void updateAllModels()
Updates all satisfying models, if the solver has detected the consistency of the received formula,...
void printAllModels(std::ostream &_out=std::cout)
Prints all assignments of this module satisfying its received formula if it satisfiable and this modu...
void clearPassedFormula()
std::vector< Lemma > mLemmas
Stores the lemmas being valid formulas this module or its backends made.
const Model & model() const
void checkInfSubsetForMinimality(std::vector< FormulaSetT >::const_iterator _infsubset, const std::string &_filename="smaller_muses", unsigned _maxSizeDifference=1) const
Checks the given infeasible subset for minimality by storing all subsets of it, which have a smaller ...
bool isLemmaLevel(LemmaLevel level)
Checks if current lemma level is greater or equal to given level.
void updateLemmas()
Stores all lemmas of any backend of this module in its own lemma vector.
Model mModel
Stores the assignment of the current satisfiable result, if existent.
std::vector< FormulaT >::const_iterator findBestOrigin(const std::vector< FormulaT > &_origins) const
Answer solverState() const
virtual void removeCore([[maybe_unused]] ModuleInput::const_iterator formula)
Removes everything related to the given sub-formula of the received formula.
const FormulaT & getOrigins(ModuleInput::const_iterator _formula) const
Gets the origins of the passed formula at the given position.
void excludeNotReceivedVariablesFromModel() const
Excludes all variables from the current model, which do not occur in the received formula.
virtual void addConstraintToInform(const FormulaT &_constraint)
Adds a constraint to the collection of constraints of this module, which are informed to a freshly ge...
virtual bool informCore([[maybe_unused]] const FormulaT &_constraint)
Informs the module about the given constraint.
std::atomic< Answer > mSolverState
States whether the received formula is known to be satisfiable or unsatisfiable otherwise it is set t...
void collectOrigins(const FormulaT &_formula, FormulasT &_origins) const
Collects the formulas in the given formula, which are part of the received formula.
carl::FastSet< FormulaT > mInformedConstraints
Stores the position of the first constraint of which no backend has been informed about.
bool hasValidInfeasibleSubset() const
virtual ModuleInput::iterator eraseSubformulaFromPassedFormula(ModuleInput::iterator _subformula, bool _ignoreOrigins=false)
Removes everything related to the sub-formula to remove from the passed formula in the backends of th...
virtual Answer check(bool _final=false, bool _full=true, carl::Variable _objective=carl::Variable::NO_VARIABLE)
Checks the received formula for consistency.
unsigned checkModel() const
carl::Variable mObjectiveVariable
Objective variable to be minimized. If set to NO_VARIABLE, a normal sat check should be performed.
const ModuleInput & rReceivedFormula() const
size_t determine_smallest_origin(const std::vector< FormulaT > &origins) const
std::vector< TheoryPropagation > mTheoryPropagations
virtual Answer checkCore()
Checks the received formula for consistency.
void print(const std::string &_initiation="***") const
Prints everything relevant of the solver.
void receivedFormulaChecked()
Notifies that the received formulas has been checked.
void getBackendsModel() const
void collectTheoryPropagations()
std::atomic_bool * mBackendsFoundAnswer
This flag is passed to any backend and if it determines an answer to a prior check call,...
virtual void remove(ModuleInput::const_iterator _subformula)
Removes everything related to the given sub-formula of the received formula.
std::vector< Module * > mUsedBackends
The backends of this module which are currently used (conditions to use this module are fulfilled for...
std::size_t mId
A unique ID to identify this module instance. (Could be useful but currently nowhere used)
bool branchAt(const Poly &_polynomial, bool _integral, const Rational &_value, std::vector< FormulaT > &&_premise, bool _leftCaseWeak=true, bool _preferLeftCase=true, bool _useReceivedFormulaAsPremise=false)
Adds a lemmas which provoke a branching for the given variable at the given value,...
void printModel(std::ostream &_out=std::cout) const
Prints the assignment of this module satisfying its received formula if it satisfiable and this modul...
bool mModelComputed
True, if the model has already been computed.
std::vector< FormulaT > merge(const std::vector< FormulaT > &, const std::vector< FormulaT > &) const
Merges the two vectors of sets into the first one.
void clearLemmas()
Deletes all yet found lemmas.
bool add(ModuleInput::const_iterator _subformula)
The module has to take the given sub-formula of the received formula into account.
const ModuleInput * mpReceivedFormula
The formula passed to this module.
static std::vector< FormulaT > mOldSplittingVariables
Reusable splitting variables.
void getBackendsAllModels() const
Stores all models of a backend in the list of all models of this module.
void getInfeasibleSubsets()
Copies the infeasible subsets of the passed formula.
ModuleInput * mpPassedFormula
The formula passed to the backends of this module.
virtual void deinformCore([[maybe_unused]] const FormulaT &_constraint)
The inverse of informing about a constraint.
bool mFinalCheck
true, if the check procedure should perform a final check which especially means not to postpone spli...
static bool modelsDisjoint(const Model &_modelA, const Model &_modelB)
Checks whether there is no variable assigned by both models.
void printPassedFormula(const std::string &_initiation="***") const
Prints the vector of passed formula.
ModuleInput::const_iterator mFirstUncheckedReceivedSubformula
Stores the position of the first (by this module) unchecked sub-formula of the received formula.
static bool find(V &ts, const T &t)
bool contains(const std::vector< TagPoly > &polys, const Poly &poly)
std::vector< carl::Variable > vars(const std::pair< QuantifierType, std::vector< carl::Variable >> &p)
Class to create the formulas for axioms.
carl::ModelValue< Rational, Poly > ModelValue
carl::FormulaSet< Poly > FormulaSetT
carl::Formula< Poly > FormulaT
static const Model EMPTY_MODEL
carl::Model< Rational, Poly > Model
carl::MultivariatePolynomial< Rational > Poly
Answer
An enum with the possible answers a Module can give.
std::vector< std::atomic_bool * > Conditionals
A vector of atomic bool pointers.
carl::Constraint< Poly > ConstraintT
carl::Formulas< Poly > FormulasT
std::pair< std::size_t, std::size_t > thread_priority
#define SMTRAT_LOG_INFO(channel, msg)
#define SMTRAT_LOG_ERROR(channel, msg)
#define SMTRAT_LOG_DEBUG(channel, msg)
Stores all necessary information of an branch, which can be used to detect probable infinite loop of ...