#ifndef MultiSolvers_h
#define MultiSolvers_h
#include "parallel/ParallelSolver.h"
namespace Glucose {
class SolverConfiguration;
class MultiSolvers {
friend class SolverConfiguration;
public:
MultiSolvers(ParallelSolver *s);
MultiSolvers();
~MultiSolvers();
void printFinalStats();
void setVerbosity(int i);
int verbosity();
void setVerbEveryConflicts(int i);
void setShowModel(int i) {showModel = i;}
int getShowModel() {return showModel;}
Var newVar (bool polarity = true, bool dvar = true); bool addClause (const vec<Lit>& ps); bool addClause_( vec<Lit>& ps);
bool simplify ();
int nVars () const; int nClauses () const; ParallelSolver *getPrimarySolver();
void generateAllSolvers();
lbool solve (); bool eliminate(); void adjustParameters();
void adjustNumberOfCores();
void interrupt() {}
vec<lbool> model; inline bool okay() {
if(!ok) return ok;
for(int i = 0;i<solvers.size();i++) {
if(!((SimpSolver*)solvers[i])->okay()) {
ok = false;
return false;
}
}
return true;
}
bool use_simplification;
protected:
friend class ParallelSolver;
friend class SolverCompanion;
struct Stats {
uint64_t min, max, avg, std, med;
Stats(uint64_t _min = 0,uint64_t _max = 0,uint64_t _avg = 0,uint64_t _std = 0,uint64_t _med = 0) :
min(_min), max(_max), avg(_avg), std(_std), med(_med) {}
};
void printStats();
int ok;
lbool result;
int maxnbthreads; int nbthreads; int nbsolvers; int nbcompanions; int nbcompbysolver; bool immediateSharingGlue ;
int allClonesAreBuilt;
bool showModel;
int winner;
vec<Lit> add_tmp;
double var_decay; double clause_decay; double cla_inc; double var_inc; double random_var_freq; int restart_first; double restart_inc; double learntsize_factor; double learntsize_inc; bool expensive_ccmin; int polarity_mode; unsigned int maxmemory;
unsigned int maxnbsolvers;
int verb;
int verbEveryConflicts;
int numvar; int numclauses;
enum { polarity_true = 0, polarity_false = 1, polarity_user = 2, polarity_rnd = 3 };
SharedCompanion * sharedcomp;
void informEnd(lbool res);
ParallelSolver* retrieveSolver(int i);
pthread_mutex_t m; pthread_mutex_t mfinished; pthread_cond_t cfinished;
vec<ParallelSolver*> solvers; vec<SolverCompanion*> solvercompanions; vec<pthread_t*> threads; vec<int> threadIndexOfSolver; vec<int> threadIndexOfSolverCompanion; };
inline bool MultiSolvers::addClause (const vec<Lit>& ps) { ps.copyTo(add_tmp); return addClause_(add_tmp); }
inline void MultiSolvers::setVerbosity(int i) {verb = i;}
inline void MultiSolvers::setVerbEveryConflicts(int i) {verbEveryConflicts=i;}
inline int MultiSolvers::nVars () const { return numvar; }
inline int MultiSolvers::nClauses () const { return numclauses; }
inline int MultiSolvers::verbosity() {return verb;}
inline ParallelSolver* MultiSolvers::getPrimarySolver() {return solvers[0];}
}
#endif