Answer MCBModule<Settings>::checkCore() { mRemaining.clear(); mChoices.clear(); carl::FormulaVisitor<FormulaT> visitor; auto receivedFormula = firstUncheckedReceivedSubformula(); while (receivedFormula != rReceivedFormula().end()) { visitor.visit(receivedFormula->formula(), collectChoicesFunction); receivedFormula++; } FormulaT newFormula = applyReplacements(FormulaT(rReceivedFormula())); clearPassedFormula(); addSubformulaToPassedFormula(newFormula); Answer ans = runBackends(); if (ans == UNSAT) { generateTrivialInfeasibleSubset(); } return ans; }
Answer EMModule<Settings>::checkCore() { auto receivedFormula = firstUncheckedReceivedSubformula(); while (receivedFormula != rReceivedFormula().end()) { FormulaT formula = receivedFormula->formula(); if (receivedFormula->formula().propertyHolds(carl::PROP_CONTAINS_NONLINEAR_POLYNOMIAL)) { formula = mVisitor.visitResult(receivedFormula->formula(), eliminateEquationFunction); } if (formula.isFalse()) { receivedFormulasAsInfeasibleSubset(receivedFormula); return UNSAT; } if (!formula.isTrue()) { addSubformulaToPassedFormula(formula, receivedFormula->formula()); } ++receivedFormula; } Answer ans = runBackends(); if (ans == UNSAT) getInfeasibleSubsets(); return ans; }
Answer CNFerModule::checkCore() { auto receivedSubformula = firstUncheckedReceivedSubformula(); while( receivedSubformula != rReceivedFormula().end() ) { /* * Add the currently considered formula of the received constraint as clauses * to the passed formula. */ FormulaT formulaToAssertInCnf = receivedSubformula->formula().toCNF( true, true, true ); if( formulaToAssertInCnf.getType() == TRUE ) { // No need to add it. } else if( formulaToAssertInCnf.getType() == FALSE ) { receivedFormulasAsInfeasibleSubset( receivedSubformula ); return UNSAT; } else { if( formulaToAssertInCnf.getType() == AND ) { for( const FormulaT& subFormula : formulaToAssertInCnf.subformulas() ) { #ifdef SMTRAT_DEVOPTION_Statistics mpStatistics->addClauseOfSize( subFormula.size() ); #endif addSubformulaToPassedFormula( subFormula, receivedSubformula->formula() ); } } else { #ifdef SMTRAT_DEVOPTION_Statistics mpStatistics->addClauseOfSize( receivedSubformula->formula().size() ); #endif addSubformulaToPassedFormula( formulaToAssertInCnf, receivedSubformula->formula() ); } } ++receivedSubformula; } //No given formulas is SAT but only if no other run was before if( rPassedFormula().empty() && solverState() == UNKNOWN ) { return SAT; } else { #ifdef SMTRAT_DEVOPTION_Statistics carl::Variables avars; rPassedFormula().arithmeticVars( avars ); mpStatistics->nrOfArithVariables() = avars.size(); carl::Variables bvars; rPassedFormula().booleanVars( bvars ); mpStatistics->nrOfBoolVariables() = bvars.size(); #endif Answer a = runBackends(); if( a == UNSAT ) { getInfeasibleSubsets(); } return a; } }