/*private*/ void ScaledNoder::rescale(SegmentString::NonConstVect& segStrings) const { ReScaler rescaler(*this); for (SegmentString::NonConstVect::const_iterator i0=segStrings.begin(), i0End=segStrings.end(); i0!=i0End; ++i0) { SegmentString* ss=*i0; ss->getCoordinates()->apply_rw(&rescaler); } }
void OpenSMTContext::staticCheckSAT( ) { if ( config.verbosity > 1 ) cerr << "# OpenSMTContext::Statically Checking" << endl; // Retrieve the formula Enode * formula = egraph.getUncheckedAssertions( ); if ( config.dump_formula != 0 ) egraph.dumpToFile( "original.smt2", formula ); if ( formula == NULL ) opensmt_error( "formula undefined" ); if ( config.logic == UNDEF ) opensmt_error( "unable to determine logic" ); // Removes ITEs if there is any if ( egraph.hasItes( ) ) { ExpandITEs expander( egraph, config ); formula = expander.doit( formula ); if ( config.dump_formula != 0 ) egraph.dumpToFile( "ite_expanded.smt2", formula ); } // Gather interface terms for DTC if ( ( config.logic == QF_UFIDL || config.logic == QF_UFLRA ) // Don't use with DTC of course && config.sat_lazy_dtc == 1 // Don't use when dumping interpolants && config.sat_dump_rnd_inter == 0 ) { Purify purifier( egraph, config ); purifier.doit( formula ); } // Ackermanize away functional symbols if ( ( config.logic == QF_UFIDL || config.logic == QF_UFLRA ) // Don't use with DTC of course && config.sat_lazy_dtc == 0 // Don't use when dumping interpolants && config.sat_dump_rnd_inter == 0 ) { Ackermanize ackermanizer( egraph, config ); formula = ackermanizer.doit( formula ); if ( config.dump_formula != 0 ) egraph.dumpToFile( "ackermanized.smt2", formula ); } // Artificially create a boolean // abstraction, if necessary if ( config.logic == QF_BV ) { BVBooleanize booleanizer( egraph, config ); formula = booleanizer.doit( formula ); } if ( config.dump_formula != 0 ) egraph.dumpToFile( "prepropagated.smt2", formula ); // Top-Level Propagator. It also canonize atoms TopLevelProp propagator( egraph, config ); // Only if sat_dump_rnd_inter is not set if ( config.sat_dump_rnd_inter == 0 ) formula = propagator.doit( formula ); if ( config.dump_formula != 0 ) egraph.dumpToFile( "propagated.smt2", formula ); AXDiffPreproc2 axdiffpreproc( egraph, sstore, config ); if ( config.logic == QF_AX || config.logic == QF_AXDIFF ) { formula = axdiffpreproc.doit( formula ); if ( config.dump_formula != 0 ) egraph.dumpToFile( "axdiffpreproc.smt2", formula ); } // Convert RDL into IDL, also compute if GMP is needed if ( config.logic == QF_RDL ) { DLRescale rescaler( egraph, config ); rescaler.doit( formula ); } // For static checking, make sure that if DTC is used // then incrementality is enabled if ( ( config.logic == QF_UFIDL || config.logic == QF_UFLRA ) && config.sat_lazy_dtc != 0 ) { config.incremental = 1; config.sat_polarity_mode = 4; } if ( config.dump_formula != 0 ) egraph.dumpToFile( "presolve.smt2", formula ); // Solve only if not simplified already if ( formula->isTrue( ) ) { state = l_True; } else if ( formula->isFalse( ) ) { state = l_False; } else { assert(egraph.isInitialized()); // Initialize theory solvers // egraph.initializeTheorySolvers( &solver ); // Compute polarities egraph.computePolarities( formula ); // CNFize the input formula and feed clauses to the solver state = cnfizer.cnfizeAndGiveToSolver( formula ); // Solve if ( state == l_Undef ) { state = solver.smtSolve( config.sat_preprocess_booleans != 0 || config.sat_preprocess_theory != 0 ); } // If computation has been stopped, return undef if ( opensmt::stop ) state = l_Undef; } }