2626 THE SOFTWARE.
2727 */
2828
29+ #include " cryptominisat5/solvertypesmini.h"
30+ #include < memory>
2931#include < string>
3032#include < vector>
3133#if defined(__GNUC__) && defined(__linux__)
3234#include < cfenv>
3335#endif
3436#include < cstdint>
35- #include < complex>
3637#include < set>
3738#include < gmp.h>
3839
@@ -50,7 +51,6 @@ using std::endl;
5051using std::set;
5152using std::string;
5253using std::vector;
53- using std::complex ;
5454ApproxMC::AppMC* appmc = nullptr ;
5555argparse::ArgumentParser program = argparse::ArgumentParser(" approxmc" );
5656
@@ -69,6 +69,7 @@ uint32_t sparse = 0;
6969int dump_intermediary_cnf = 0 ;
7070int arjun_gates = 0 ;
7171bool debug = false ;
72+ std::unique_ptr<CMSat::FieldGen> fg;
7273
7374// Arjun
7475ArjunNS::SimpConf simp_conf;
@@ -99,7 +100,7 @@ void print_version() {
99100
100101void add_appmc_options ()
101102{
102- ApproxMC::AppMC tmp;
103+ ApproxMC::AppMC tmp (fg) ;
103104 epsilon = tmp.get_epsilon ();
104105 delta = tmp.get_delta ();
105106 simplify = tmp.get_simplify ();
@@ -217,18 +218,18 @@ template<class T> void read_stdin(T* myreader) {
217218 #endif
218219}
219220
220- void print_num_solutions (uint32_t cell_sol_cnt, uint32_t hash_count, const complex <mpq_class >& mult)
221- {
222- assert (mult. imag () == 0 );
221+ void print_num_solutions (uint32_t cell_sol_cnt, uint32_t hash_count, const std::unique_ptr<Field >& mult) {
222+ const CMSat::Field* ptr = mult. get ();
223+ const CMSat::FMpz* od = dynamic_cast < const CMSat::FMpz*>(ptr );
223224 cout << " c [appmc] Number of solutions is: "
224- << cell_sol_cnt << " *2**" << hash_count << " *" << mult << endl;
225+ << cell_sol_cnt << " *2**" << hash_count << " *" << od-> val << endl;
225226 if (cell_sol_cnt == 0 ) cout << " s UNSATISFIABLE" << endl;
226227 else cout << " s SATISFIABLE" << endl;
227228
228229 mpz_class num_sols (2 );
229230 mpz_pow_ui (num_sols.get_mpz_t (), num_sols.get_mpz_t (), hash_count);
230231 num_sols *= cell_sol_cnt;
231- mpq_class final = mult. real () * num_sols;
232+ mpq_class final = od-> val * num_sols;
232233
233234 cout << " s mc " << final << endl;
234235}
@@ -267,10 +268,10 @@ void set_approxmc_options()
267268template <class T > void parse_file (const std::string& filename, T* reader) {
268269 #ifndef USE_ZLIB
269270 FILE * in = fopen (filename.c_str (), " rb" );
270- DimacsParser<StreamBuffer<FILE*, CMSat::FN>, T> parser (reader, nullptr , 0 );
271+ DimacsParser<StreamBuffer<FILE*, CMSat::FN>, T> parser (reader, nullptr , 0 , fg );
271272 #else
272273 gzFile in = gzopen (filename.c_str (), " rb" );
273- DimacsParser<StreamBuffer<gzFile, CMSat::GZ>, T> parser (reader, nullptr , 0 );
274+ DimacsParser<StreamBuffer<gzFile, CMSat::GZ>, T> parser (reader, nullptr , 0 , fg );
274275 #endif
275276 if (in == nullptr ) {
276277 std::cout << " ERROR! Could not open file '" << filename
@@ -287,7 +288,7 @@ template<class T> void parse_file(const std::string& filename, T* reader) {
287288 if (!reader->get_sampl_vars_set ()) {
288289 vector<uint32_t > tmp;
289290 for (uint32_t i = 0 ; i < reader->nVars (); i++) tmp.push_back (i);
290- reader->set_sampl_vars (tmp); // will automatically set the opt_sampl_vars
291+ reader->set_sampl_vars (tmp);
291292 } else {
292293 // Check if CNF has all vars as indep. Then its's all_indep
293294 set<uint32_t > tmp;
@@ -320,7 +321,8 @@ int main(int argc, char** argv)
320321 if (i+1 < argc) command_line += " " ;
321322 }
322323
323- appmc = new ApproxMC::AppMC;
324+ fg = std::make_unique<CMSat::FGenMpz>();
325+ appmc = new ApproxMC::AppMC (fg);
324326 simp_conf.appmc = true ;
325327 simp_conf.oracle_sparsify = false ;
326328 simp_conf.iter1 = 2 ;
@@ -334,9 +336,9 @@ int main(int argc, char** argv)
334336 }
335337 set_approxmc_options ();
336338
337- ArjunNS::SimplifiedCNF cnf;
338- auto files = program.get <std::vector<std::string>>(" inputfile" );
339- string fname = files[0 ];
339+ ArjunNS::SimplifiedCNF cnf (fg) ;
340+ const auto & files = program.get <std::vector<std::string>>(" inputfile" );
341+ const string fname ( files[0 ]) ;
340342 if (do_arjun) {
341343 parse_file (fname, &cnf);
342344 const auto orig_sampl_vars = cnf.sampl_vars ;
0 commit comments