34static const char* _cat =
"CORE";
36static DoubleOption opt_var_decay (_cat,
"var-decay",
"The variable activity decay factor", 0.95,
DoubleRange(0,
false, 1,
false));
37static DoubleOption opt_clause_decay (_cat,
"cla-decay",
"The clause activity decay factor", 0.999,
DoubleRange(0,
false, 1,
false));
38static DoubleOption opt_random_var_freq (_cat,
"rnd-freq",
"The frequency with which the decision heuristic tries to choose a random variable", 0,
DoubleRange(0,
true, 1,
true));
40static IntOption opt_ccmin_mode (_cat,
"ccmin-mode",
"Controls conflict clause minimization (0=none, 1=basic, 2=deep)", 2,
IntRange(0, 2));
41static IntOption opt_phase_saving (_cat,
"phase-saving",
"Controls the level of phase saving (0=none, 1=limited, 2=full)", 2,
IntRange(0, 2));
42static BoolOption opt_rnd_init_act (_cat,
"rnd-init",
"Randomize the initial activity",
false);
43static BoolOption opt_luby_restart (_cat,
"luby",
"Use the Luby restart sequence",
true);
46static DoubleOption opt_garbage_frac (_cat,
"gc-frac",
"The fraction of wasted memory allowed before a garbage collection is triggered", 0.20,
DoubleRange(0,
false,
HUGE_VAL,
false));
128 trail .capacity(v+1);
137 if (!
ok)
return false;
151 else if (ps.
size() == 1){
155 CRef cr =
ca.alloc(ps,
false);
201 for (
int i = 0; i < c.
size(); i++)
274 int index =
trail.size() - 1;
312 for (i = 1; i < out_learnt.
size(); i++)
315 for (i = j = 1; i < out_learnt.
size(); i++)
317 out_learnt[j++] = out_learnt[i];
320 for (i = j = 1; i < out_learnt.
size(); i++){
321 Var x =
var(out_learnt[i]);
324 out_learnt[j++] = out_learnt[i];
327 for (
int k = 1; k < c.
size(); k++)
329 out_learnt[j++] = out_learnt[i];
334 i = j = out_learnt.
size();
342 if (out_learnt.
size() == 1)
347 for (
int i = 2; i < out_learnt.
size(); i++)
351 Lit p = out_learnt[max_i];
352 out_learnt[max_i] = out_learnt[1];
371 for (
int i = 1; i < c.
size(); i++){
403 out_conflict.
clear();
404 out_conflict.
push(
p);
419 for (
int j = 1; j < c.
size(); j++)
463 for (i = j = (
Watcher*)ws, end = i + ws.
size(); i != end;){
467 *j++ = *i++;
continue; }
473 if (c[0] == false_lit)
474 c[0] = c[1], c[1] = false_lit;
475 assert(c[1] == false_lit);
482 *j++ = w;
continue; }
485 for (
int k = 2; k < c.
size(); k++)
487 c[1] = c[k]; c[k] = false_lit;
525 return ca[x].size() > 2 && (
ca[y].size() == 2 ||
ca[x].activity() <
ca[y].activity()); }
535 for (i = j = 0; i <
learnts.size(); i++){
550 for (i = j = 0; i < cs.
size(); i++){
631 learnt_clause.
clear();
632 analyze(confl, learnt_clause, backtrack_level);
635 if (learnt_clause.
size() == 1){
638 CRef cr =
ca.alloc(learnt_clause,
true);
654 printf(
"| %9d | %7d %8d %8d | %8d %8d %6.0f | %6.3f %% |\n",
662 if ( (nof_conflicts >= 0 && conflictC >= nof_conflicts) || !
withinBudget()){
713 double F = 1.0 /
nVars();
718 progress += pow(F, i) * (end - beg);
721 return progress /
nVars();
736static double luby(
double y,
int x){
741 for (size = 1, seq = 0; size < x+1; seq++, size = 2*size+1);
767 printf(
"============================[ Search Statistics ]==============================\n");
768 printf(
"| Conflicts | ORIGINAL | LEARNT | Progress |\n");
769 printf(
"| | Vars Clauses Literals | Limit Clauses Lit/Cl | |\n");
770 printf(
"===============================================================================\n");
774 int curr_restarts = 0;
783 printf(
"===============================================================================\n");
804 if (
map.size() <= x ||
map[x] == -1){
816 for (
int i = 0; i < c.
size(); i++)
818 fprintf(f,
"%s%d ",
sign(c[i]) ?
"-" :
"", mapVar(
var(c[i]),
map, max)+1);
825 FILE* f = fopen(
file,
"wb");
827 fprintf(stderr,
"could not open file %s\n",
file),
exit(1);
837 fprintf(f,
"p cnf 1 2\n1 0\n-1 0\n");
845 for (i = 0; i <
clauses.size(); i++)
849 for (i = 0; i <
clauses.size(); i++)
852 for (
int j = 0; j < c.
size(); j++)
854 mapVar(
var(c[j]),
map, max);
860 fprintf(f,
"p cnf %d %d\n", max, cnt);
867 for (i = 0; i <
clauses.size(); i++)
871 printf(
"Wrote %d clauses with %d variables.\n", cnt, max);
884 for (
int v = 0; v <
nVars(); v++)
885 for (
int s = 0; s < 2; s++){
889 for (
int j = 0; j < ws.
size(); j++)
890 ca.reloc(ws[j].cref, to);
896 for (i = 0; i <
trail.size(); i++){
905 for (i = 0; i <
learnts.size(); i++)
910 for (i = 0; i <
clauses.size(); i++)
923 printf(
"| Garbage collection: %12d bytes => %12d bytes |\n",
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef signed char value
void moveTo(ClauseAllocator &to)
bool addClause_(vec< Lit > &ps)
uint64_t clauses_literals
lbool search(int nof_conflicts)
void toDimacs(FILE *f, const vec< Lit > &assumps)
void cancelUntil(int level)
bool litRedundant(Lit p, uint32_t abstract_levels)
void claBumpActivity(Clause &c)
virtual void garbageCollect()
double progressEstimate() const
void relocAll(ClauseAllocator &to)
int64_t propagation_budget
bool locked(const Clause &c) const
void removeClause(CRef cr)
void detachClause(CRef cr, bool strict=false)
void analyze(CRef confl, vec< Lit > &out_learnt, int &out_btlevel)
void attachClause(CRef cr)
void removeSatisfied(vec< CRef > &cs)
static double drand(double &seed)
void analyzeFinal(Lit p, vec< Lit > &out_conflict)
void insertVarOrder(Var x)
uint64_t learnts_literals
int learntsize_adjust_cnt
bool withinBudget() const
uint32_t abstractLevel(Var x) const
OccLists< Lit, vec< Watcher >, WatcherDeleted > watches
static int irand(double &seed, int size)
static VarData mkVarData(CRef cr, int l)
void varBumpActivity(Var v, double inc)
vec< Lit > analyze_toclear
int decisionLevel() const
Var newVar(bool polarity=true, bool dvar=true)
void setDecisionVar(Var v, bool b)
double learntsize_adjust_inc
double learntsize_adjust_confl
void uncheckedEnqueue(Lit p, CRef from=CRef_Undef)
Heap< VarOrderLt > order_heap
int learntsize_adjust_start_confl
bool satisfied(const Clause &c) const
void copyTo(vec< T > ©) const
void clear(bool dealloc=false)
RegionAllocator< uint32_t >::Ref CRef
void sort(T *array, int size, LessThan lt)
RegionAllocator< uint32_t >::Ref CRef
Lit mkLit(Var var, bool sign=false)
double luby(double y, int x)
reduceDB_lt(ClauseAllocator &ca_)