31#define SAT_USE_PROOF_LOGGING
40#define L_ind solver2_dlevel(s)*2+2,solver2_dlevel(s)
42#define L_lit(p) lit_sign(p)?"~":"", (lit_var(p))
43static void printlits(
lit* begin,
lit* end)
46 for (i = 0; i < end - begin; i++)
55static inline double drand(
double* seed) {
58 q = (int)(*seed / 2147483647);
59 *seed -= (double)q * 2147483647;
60 return *seed / 2147483647; }
64static inline int irand(
double* seed,
int size) {
65 return (
int)(drand(seed) *
size); }
71static const int var1 = 0;
72static const int varX = 3;
94static inline void var_set_level (
sat_solver2* s,
int v,
int lev) { s->
levels[v] = lev; }
96static inline void var_set_value (
sat_solver2* s,
int v,
int val) { s->
assigns[v] = val; }
97static inline void var_set_polar (
sat_solver2* s,
int v,
int pol) { s->
vi[v].
pol = pol; }
100static inline int solver2_lit_is_false(
sat_solver2* s,
int Lit ) {
return var_value(s, lit_var(Lit)) == !lit_sign(Lit); }
106static inline void var_set_tag (
sat_solver2* s,
int v,
int tag) {
107 assert( tag > 0 && tag < 16 );
108 if ( s->
vi[v].
tag == 0 )
109 veci_push( &s->
tagged, v );
112static inline void var_add_tag (
sat_solver2* s,
int v,
int tag) {
113 assert( tag > 0 && tag < 16 );
114 if ( s->
vi[v].
tag == 0 )
115 veci_push( &s->
tagged, v );
118static inline void solver2_clear_tags(
sat_solver2* s,
int start) {
120 for (i = start; i < veci_size(&s->
tagged); i++)
122 veci_resize(&s->
tagged,start);
126static inline int var_lev_mark (
sat_solver2* s,
int v) {
127 return (veci_begin(&s->
trail_lim)[var_level(s,v)] & 0x80000000) > 0;
129static inline void var_lev_set_mark (
sat_solver2* s,
int v) {
130 int level = var_level(s,v);
132 veci_begin(&s->
trail_lim)[level] |= 0x80000000;
135static inline void solver2_clear_marks(
sat_solver2* s) {
136 int i, * mark_levels = veci_begin(&s->
mark_levels);
138 veci_begin(&s->
trail_lim)[mark_levels[i]] &= 0x7FFFFFFF;
150static inline int lit_reason (
sat_solver2* s,
int l) {
return s->
reasons[lit_var(l)]; }
152static inline void var_set_unit_clause(
sat_solver2* s,
int v,
cla i){
156#define clause_foreach_var( p, var, i, start ) \
157 for ( i = start; (i < (int)(p)->size) && ((var) = lit_var((p)->lits[i])); i++ )
175 Prf_ManChainStart( s->
pPrf2, c );
178 int ProofId = clause2_proofid(s, c, 0);
179 assert( (ProofId >> 2) > 0 );
193 clause* c = cls ? cls : var_unit_clause( s,
Var );
198 clause* c = cls ? cls : var_unit_clause( s,
Var );
199 Prf_ManChainResolve( s->
pPrf2, c );
203 clause* c = cls ? cls : var_unit_clause( s,
Var );
205 assert( (ProofId >> 2) > 0 );
210static inline int proof_chain_stop(
sat_solver2* s )
221 Prf_ManChainStop( s->
pPrf2 );
235static inline void order_update(
sat_solver2* s,
int v)
241 int parent = (i - 1) / 2;
245 orderpos[
heap[i]] = i;
247 parent = (i - 1) / 2;
252static inline void order_assigned(
sat_solver2* s,
int v)
255static inline void order_unassigned(
sat_solver2* s,
int v)
258 if (orderpos[v] == -1){
259 orderpos[v] = veci_size(&s->
order);
260 veci_push(&s->
order,v);
264static inline int order_select(
sat_solver2* s,
float random_var_freq)
271 assert(next >= 0 && next < s->size);
272 if (var_value(s, next) == varX)
276 while (veci_size(&s->
order) > 0){
280 veci_resize(&s->
order,size);
286 while (child < size){
293 orderpos[
heap[i]] = i;
295 child = 2 * child + 1;
298 orderpos[
heap[i]] = i;
300 if (var_value(s, next) == varX)
310#ifdef USE_FLOAT_ACTIVITY2
312static inline void act_var_rescale(
sat_solver2* s) {
315 for (i = 0; i < s->
size; i++)
316 activity[i] *= 1e-100;
319static inline void act_clause2_rescale(
sat_solver2* s) {
321 float * act_clas = (
float *)veci_begin(&s->
act_clas);
324 for (i = 0; i < veci_size(&s->
act_clas); i++)
325 act_clas[i] *= (
float)1e-20;
328 Total += Abc_Clock() - clk;
330 Abc_PrintTime( 1,
"Time", Total );
332static inline void act_var_bump(
sat_solver2* s,
int v) {
340 float * act_clas = (
float *)veci_begin(&s->
act_clas);
343 if (act_clas[c->Id] > (
float)1e20)
344 act_clause2_rescale(s);
351static inline void act_var_rescale(
sat_solver2* s) {
354 for (i = 0; i < s->
size; i++)
359static inline void act_clause2_rescale(
sat_solver2* s) {
363 unsigned * act_clas = (
unsigned *)veci_begin(&s->
act_clas);
364 for (i = 0; i < veci_size(&s->
act_clas); i++)
372static inline void act_var_bump(
sat_solver2* s,
int v) {
380 unsigned * act_clas = (
unsigned *)veci_begin(&s->
act_clas);
381 int Id = clause_id(c);
384 if (act_clas[Id] & 0x80000000)
385 act_clause2_rescale(s);
397 int i, lev, minl = 0, lbd = 0;
398 for (i = 0; i < (int)c->
size; i++) {
399 lev = var_level(s, lit_var(c->
lits[i]));
400 if ( !(minl & (1 << (lev & 31))) ) {
401 minl |= 1 << (lev & 31);
408static int clause2_create_new(
sat_solver2* s,
lit* begin,
lit* end,
int learnt,
int proof_id )
411 int h,
size = end - begin;
412 assert(size < 1 || begin[0] >= 0);
413 assert(size < 2 || begin[1] >= 0);
414 assert(size < 1 || lit_var(begin[0]) < s->
size);
415 assert(size < 2 || lit_var(begin[1]) < s->
size);
417 h = Sat_MemAppend( &s->
Mem, begin, size, learnt, 1 );
419 c = clause2_read( s, h );
424 c->
lbd = sat_clause_compute_lbd( s, c );
431 act_clause2_bump( s,c );
446 veci_push(solver2_wlist(s,lit_neg(begin[0])),h);
447 veci_push(solver2_wlist(s,lit_neg(begin[1])),h);
461 if (var_value(s, v) != varX)
462 return var_value(s, v) == lit_sign(l);
468 var_set_value( s, v, lit_sign(l) );
469 var_set_level( s, v, solver2_dlevel(s) );
472 order_assigned(s, v);
480 assert(var_value(s, lit_var(l)) == varX);
483 Abc_Print(1,
"act = %.20f\n", s->
activity[lit_var(l)] );
486 return solver2_enqueue(s,l,0);
489static void solver2_canceluntil(
sat_solver2* s,
int level) {
494 if (solver2_dlevel(s) <= level)
496 assert( solver2_dlevel(s) > 0 );
498 bound = (veci_begin(&s->
trail_lim))[level];
501 for (c = s->
qtail-1; c >= bound; c--)
503 x = lit_var(s->
trail[c]);
504 var_set_value(s, x, varX);
508 var_set_polar(s, x, !lit_sign(s->
trail[c]));
511 for (c = s->
qhead-1; c >= bound; c--)
512 order_unassigned(s,lit_var(s->
trail[c]));
518static void solver2_canceluntil_rollback(
sat_solver2* s,
int NewBound) {
521 assert( solver2_dlevel(s) == 0 );
525 for (c = s->
qtail-1; c >= NewBound; c--)
527 x = lit_var(s->
trail[c]);
528 var_set_value(s, x, varX);
533 for (c = s->
qhead-1; c >= NewBound; c--)
534 order_unassigned(s,lit_var(s->
trail[c]));
542 lit* begin = veci_begin(cls);
543 lit* end = begin + veci_size(cls);
544 cla Cid = clause2_create_new(s,begin,end,1, proof_id);
545 assert(veci_size(cls) > 0);
546 if ( veci_size(cls) == 1 )
549 var_set_unit_clause(s, lit_var(begin[0]), Cid);
552 solver2_enqueue(s, begin[0], Cid);
559 double progress = 0.0, F = 1.0 / s->
size;
560 for (i = 0; i < s->
size; i++)
561 if (var_value(s, i) != varX)
562 progress += pow(F, var_level(s, i));
563 return progress / s->
size;
624 proof_chain_start( s, conf );
627 if ( var_level(s,x) )
628 var_set_tag(s, x, 1);
630 proof_chain_resolve( s, NULL, x );
635 x = lit_var(s->
trail[i]);
637 clause* c = clause2_read(s, var_reason(s,x));
639 proof_chain_resolve( s, c, x );
641 if ( var_level(s,x) )
642 var_set_tag(s, x, 1);
644 proof_chain_resolve( s, NULL, x );
652 solver2_clear_tags(s,0);
653 return proof_chain_stop( s );
656static int solver2_lit_removable_rec(
sat_solver2* s,
int v)
666 if (var_tag(s,v) & 2)
667 return (var_tag(s,v) & 4) > 0;
670 c = clause2_read(s, var_reason(s,v));
677 if (var_tag(s,x) & 1)
678 solver2_lit_removable_rec(s, x);
680 if (var_level(s,x) == 0 || var_tag(s,x) == 6)
continue;
681 if (var_tag(s,x) == 2 || !var_lev_mark(s,x) || !solver2_lit_removable_rec(s, x))
694static int solver2_lit_removable(
sat_solver2* s,
int x)
698 if ( !var_reason(s,x) )
700 if ( var_tag(s,x) & 2 )
702 assert( var_tag(s,x) & 1 );
705 top = veci_size(&s->
tagged);
706 veci_resize(&s->
stack,0);
707 veci_push(&s->
stack, x << 1);
708 while (veci_size(&s->
stack))
710 x = veci_pop(&s->
stack);
714 if ( var_tag(s,x >> 1) & 1 )
718 veci_push(&s->
stack, x ^ 1 );
721 c = clause2_read(s, var_reason(s,x));
723 if (var_tag(s,x) || !var_level(s,x))
725 if (!var_reason(s,x) || !var_lev_mark(s,x)){
726 solver2_clear_tags(s, top);
729 veci_push(&s->
stack, x << 1);
730 var_set_tag(s, x, 2);
736static void solver2_logging_order(
sat_solver2* s,
int x)
740 if ( (var_tag(s,x) & 4) )
742 var_add_tag(s, x, 4);
743 veci_resize(&s->
stack,0);
744 veci_push(&s->
stack,x << 1);
745 while (veci_size(&s->
stack))
747 x = veci_pop(&s->
stack);
752 veci_push(&s->
stack, x ^ 1 );
754 c = clause2_read(s, var_reason(s,x));
758 if ( !var_level(s,x) || (var_tag(s,x) & 1) )
760 veci_push(&s->
stack, x << 1);
761 var_add_tag(s, x, 4);
766static void solver2_logging_order_rec(
sat_solver2* s,
int x)
770 if ( (var_tag(s,x) & 8) )
772 c = clause2_read(s, var_reason(s,x));
774 if ( var_level(s,y) && (var_tag(s,y) & 1) == 0 )
775 solver2_logging_order_rec(s, y);
776 var_add_tag(s, x, 8);
777 veci_push(&s->min_step_order, x);
784 int x, ind = s->qtail-1;
786 lit* lits,* vars, i, j, k;
787 assert( veci_size(&s->tagged) == 0 );
792 proof_chain_start( s, c );
793 veci_push(learnt,lit_Undef);
797 act_clause2_bump(s,c);
799 assert(x >= 0 && x < s->size);
802 if ( var_level(s,x) == 0 )
804 proof_chain_resolve( s, NULL, x );
807 var_set_tag(s, x, 1);
809 if (var_level(s,x) == solver2_dlevel(s))
812 veci_push(learnt,c->lits[j]);
815 while (!var_tag(s, lit_var(s->trail[ind--])));
818 c = clause2_read(s, lit_reason(s,
p));
822 proof_chain_resolve( s, c, lit_var(
p) );
824 *veci_begin(learnt) = lit_neg(
p);
827 assert( veci_size(&s->mark_levels) == 0 );
828 lits = veci_begin(learnt);
829 for (i = 1; i < veci_size(learnt); i++)
830 var_lev_set_mark(s, lit_var(lits[i]));
833 veci_resize(&s->min_lit_order, 0);
834 for (i = j = 1; i < veci_size(learnt); i++){
836 if (!solver2_lit_removable_rec(s,lit_var(lits[i])))
841 if ( s->fProofLogging )
844 veci_resize(&s->min_step_order, 0);
845 vars = veci_begin(&s->min_lit_order);
846 for (i = 0; i < veci_size(&s->min_lit_order); i++)
848 solver2_logging_order_rec(s, vars[i]);
851 vars = veci_begin(&s->min_step_order);
852 for (i = veci_size(&s->min_step_order); i > 0; ) { i--;
853 c = clause2_read(s, var_reason(s,vars[i]));
854 proof_chain_resolve( s, c, vars[i] );
856 if ( var_level(s,x) == 0 )
857 proof_chain_resolve( s, NULL, x );
859 proof_id = proof_chain_stop( s );
863 solver2_clear_marks( s );
866 veci_resize(learnt,j);
867 s->stats.tot_literals += j;
870 solver2_clear_tags(s,0);
873 for (i = 0; i < s->size; i++)
879 for (i = 0; i < veci_size(learnt); i++) Abc_Print(1,
" "L_LIT,
L_lit(lits[i]));
881 if (veci_size(learnt) > 1){
884 int max = var_level(s, lit_var(lits[1]));
885 for (i = 2; i < veci_size(learnt); i++)
886 if (max < var_level(s, lit_var(lits[i]))) {
887 max = var_level(s, lit_var(lits[i]));
892 lits[1] = lits[max_i];
897 int lev = veci_size(learnt) > 1 ? var_level(s, lit_var(lits[1])) : 0;
898 Abc_Print(1,
" } at level %d\n", lev);
906 clause* c, * confl = NULL;
908 lit* lits, false_lit,
p, * stop, * k;
909 cla* begin,* end, *i, *j;
912 while (confl == 0 && s->
qtail - s->
qhead > 0){
915 ws = solver2_wlist(s,
p);
916 begin = (
cla*)veci_begin(ws);
917 end = begin + veci_size(ws);
920 for (i = j = begin; i < end; ){
921 c = clause2_read(s,*i);
925 false_lit = lit_neg(
p);
926 if (lits[0] == false_lit){
930 assert(lits[1] == false_lit);
933 if (var_value(s, lit_var(lits[0])) == lit_sign(lits[0]))
937 stop = lits + c->
size;
938 for (k = lits + 2; k < stop; k++){
939 if (var_value(s, lit_var(*k)) != !lit_sign(*k)){
942 veci_push(solver2_wlist(s,lit_neg(lits[1])),*i);
950 int k, x, proof_id, Cid,
Var = lit_var(Lit);
951 int fLitIsFalse = (var_value(s,
Var) == !lit_sign(Lit));
953 proof_chain_start( s, c );
955 assert( var_level(s, x) == 0 );
956 proof_chain_resolve( s, NULL, x );
958 proof_id = proof_chain_stop( s );
960 Cid = clause2_create_new( s, &Lit, &Lit + 1, 1, proof_id );
961 assert( (var_unit_clause(s,
Var) == NULL) != fLitIsFalse );
964 if ( var_unit_clause(s,
Var) == NULL )
965 var_set_unit_clause(s,
Var, Cid);
968 proof_chain_start( s, clause2_read(s,Cid) );
969 proof_chain_resolve( s, NULL,
Var );
970 proof_id = proof_chain_stop( s );
979 c->
lbd = sat_clause_compute_lbd(s, c);
980 if (!solver2_enqueue(s,Lit, *i)){
981 confl = clause2_read(s,*i++);
990 veci_resize(ws,j - (
int*)veci_begin(ws));
998 assert(solver2_dlevel(s) == 0);
1006 ABC_INT64_T conflictC = 0;
1015 veci_new(&learnt_clause);
1028 proof_id = solver2_analyze_final(s, confl, 0);
1032 veci_delete(&learnt_clause);
1036 veci_resize(&learnt_clause,0);
1037 proof_id = solver2_analyze(s, confl, &learnt_clause);
1038 blevel = veci_size(&learnt_clause) > 1 ? var_level(s, lit_var(veci_begin(&learnt_clause)[1])) : s->root_level;
1040 solver2_canceluntil(s,blevel);
1041 solver2_record(s,&learnt_clause, proof_id);
1044 if ( learnt_clause.
size == 1 )
1045 var_set_level( s, lit_var(learnt_clause.
ptr[0]), 0 );
1047 act_clause2_decay(s);
1057 veci_delete(&learnt_clause);
1067 veci_delete(&learnt_clause);
1081 next = order_select(s,(
float)random_var_freq);
1086 for (i = 0; i < s->
size; i++)
1088 assert( var_value(s,i) != varX );
1092 veci_delete(&learnt_clause);
1096 if ( var_polar(s, next) )
1097 solver2_assume(s,toLit(next));
1099 solver2_assume(s,lit_neg(toLit(next)));
1113#ifdef USE_FLOAT_ACTIVITY2
1116 s->var_decay = (float)(1 / 0.95 );
1117 s->cla_decay = (float)(1 / 0.999 );
1126#ifdef SAT_USE_PROOF_LOGGING
1141 veci_new(&s->
order);
1144 veci_new(&s->
stack);
1152 Sat_MemAlloc_( &s->
Mem, 14 );
1175 int old_cap = s->
cap;
1187#ifdef USE_FLOAT_ACTIVITY2
1197 for (var = s->
size; var < n; var++){
1201 veci_new(&s->
wlists[2*var]);
1203 veci_new(&s->
wlists[2*var+1]);
1204 *((
int*)s->
vi + var) = 0;
1210#ifdef USE_FLOAT_ACTIVITY2
1219 veci_push(&s->
order,var);
1220 order_update(s, var);
1232 veci_delete( pCore );
1242 veci_delete(&s->
order);
1245 veci_delete(&s->
stack);
1257 Sat_MemFree_( &s->
Mem );
1259 Vec_SetFree( s->
pPrf1 );
1260 Prf_ManStop( s->
pPrf2 );
1261 Int2_ManStop( s->
pInt2 );
1267 for (i = 0; i < s->
cap*2; i++)
1268 veci_delete(&s->
wlists[i]);
1290 lit *i,*j,*iFree = NULL;
1291 int maxvar, count, temp;
1292 assert( solver2_dlevel(s) == 0 );
1298 for ( i = begin; i < end; i++ )
1304 maxvar = lit_var(*begin);
1305 for (i = begin + 1; i < end; i++){
1307 maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
1308 for (j = i; j > begin && *(j-1) > l; j--)
1316 for (i = j = begin + 1; i < end; i++)
1318 if ( *(i-1) == lit_neg(*i) )
1319 return clause2_create_new( s, begin, end, 0, 0 );
1328 for ( i = begin; i < end; i++ )
1331 assert( i == begin || lit_var(*(i-1)) != lit_var(*i) );
1333 if ( var_value(s, lit_var(*i)) == lit_sign(*i) )
1334 return clause2_create_new( s, begin, end, 0, 0 );
1335 if ( var_value(s, lit_var(*i)) == varX )
1340 assert( count < end-begin );
1348 Cid = clause2_create_new( s, begin, end, 0, 0 );
1350 clause2_set_id( s, Cid, Id );
1353 if ( count+1 == end-begin )
1359 var_set_unit_clause( s, lit_var(begin[0]), Cid );
1360 if ( !solver2_enqueue(s,begin[0],0) )
1366 int x, k, proof_id, CidNew;
1367 clause* c = clause2_read(s, Cid);
1368 proof_chain_start( s, c );
1370 proof_chain_resolve( s, NULL, x );
1371 proof_id = proof_chain_stop( s );
1373 CidNew = clause2_create_new( s, begin, begin+1, 1, proof_id );
1374 var_set_unit_clause( s, lit_var(begin[0]), CidNew );
1375 if ( !solver2_enqueue(s,begin[0],Cid) )
1387 for (size = 1, seq = 0; size < x+1; seq++, size = 2*size + 1);
1388 while (size-1 != x){
1389 size = (size-1) >> 1;
1393 return pow(y, (
double)seq);
1399 for ( i = 0; i < 20; i++ )
1400 Abc_Print(1,
"%d ", (
int)
luby2(2,i) );
1401 Abc_Print(1,
"\n" );
1411 int nLearnedOld = veci_size(&s->
act_clas);
1412 int * act_clas = veci_begin(&s->
act_clas);
1413 int * pPerm, * pSortValues, nCutoffValue, * pClaProofs;
1414 int i, j, k, Id, nSelected;
1415 int Counter, CounterStart;
1417 static int Count = 0;
1441 CounterStart = nLearnedOld - (s->
nLearntMax / 20);
1445 pSortValues =
ABC_ALLOC(
int, nLearnedOld );
1449 pSortValues[Id] = (((7 - Abc_MinInt(c->
lbd, 7)) << 28) | (act_clas[Id] >> 4));
1451 assert( pSortValues[Id] >= 0 );
1455 assert( pSortValues[pPerm[0]] <= pSortValues[pPerm[nLearnedOld-1]] );
1456 nCutoffValue = pSortValues[pPerm[nLearnedOld-nSelected]];
1465 if ( Counter++ > CounterStart || clause_size(c) < 2 || pSortValues[clause_id(c)] >= nCutoffValue || s->
reasons[lit_var(c->
lits[0])] == Sat_MemHand(pMem, i, k) )
1470 if ( j >= nLearnedOld / 6 )
1473 if ( j < nLearnedOld / 6 )
1485 if ( Counter++ > CounterStart || clause_size(c) < 2 || pSortValues[clause_id(c)] >= nCutoffValue || s->
reasons[lit_var(c->
lits[0])] == Sat_MemHand(pMem, i, k) )
1487 pSortValues[j] = pSortValues[clause_id(c)];
1489 pClaProofs[j] = pClaProofs[clause_id(c)];
1491 Prf_ManAddSaved( s->
pPrf2, clause_id(c), j );
1503 Prf_ManCompact( s->
pPrf2, j );
1508 assert( Counter == nLearnedOld );
1514 Counter = Sat_MemCompactLearned( pMem, 0 );
1518 for ( i = 0; i < s->
size; i++ )
1522 if ( clause_is_lit(s->
reasons[i]) )
1524 if ( !clause_learnt_h(pMem, s->
reasons[i]) )
1527 c = clause2_read( s, s->
reasons[i] );
1533 for ( i = 0; i < s->
size*2; i++ )
1535 int * pArray = veci_begin(&s->
wlists[i]);
1536 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1538 if ( clause_is_lit(pArray[k]) )
1539 pArray[j++] = pArray[k];
1540 else if ( !clause_learnt_h(pMem, pArray[k]) )
1541 pArray[j++] = pArray[k];
1545 c = clause2_read(s, pArray[k]);
1547 pArray[j++] = clause_id(c);
1550 veci_resize(&s->
wlists[i],j);
1555 for ( i = 0; i < s->
size; i++ )
1556 if ( s->
units[i] && clause_learnt_h(pMem, s->
units[i]) )
1559 c = clause2_read( s, s->
units[i] );
1561 s->
units[i] = clause_id(c);
1565 Counter = Sat_MemCompactLearned( pMem, 1 );
1576 TimeTotal += Abc_Clock() - clk;
1579 Abc_Print(1,
"reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
1581 Abc_PrintTime( 1,
"Time", TimeTotal );
1590 static int Count = 0;
1596 solver2_canceluntil_rollback( s, s->
iTrailPivot );
1605 veci_resize(&s->
order, 0);
1608 if ( var_value(s, i) != varX )
1611 veci_push(&s->
order,i);
1618 cla* pArray = veci_begin(&s->
wlists[i]);
1619 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1620 if ( Sat_MemClauseUsed(pMem, pArray[k]) )
1621 pArray[j++] = pArray[k];
1622 veci_resize(&s->
wlists[i],j);
1625 for ( i = 2*s->
iVarPivot; i < 2*s->size; i++ )
1632 Sat_MemRollBack( pMem );
1656#ifdef USE_FLOAT_ACTIVITY2
1659 s->var_decay = (float)(1 / 0.95 );
1660 s->cla_decay = (float)(1 / 0.999 );
1697 for (i = 0; i < s->
cap*2; i++)
1705 Mem += s->
cap *
sizeof(int);
1706 Mem += s->
cap *
sizeof(char);
1707#ifdef USE_FLOAT_ACTIVITY2
1708 Mem += s->
cap *
sizeof(double);
1710 Mem += s->
cap *
sizeof(unsigned);
1712 Mem += s->
cap *
sizeof(unsigned);
1714 Mem += s->
cap *
sizeof(
lit);
1715 Mem += s->
cap *
sizeof(int);
1716 Mem += s->
cap *
sizeof(int);
1717 Mem += s->
cap *
sizeof(int);
1718 Mem += s->
cap *
sizeof(int);
1729 Mem += Sat_MemMemoryAll( &s->
Mem );
1737 Mem += Vec_ReportMemory( s->
pPrf1 );
1804 int claSat[2] = {0};
1806 for ( i = 0; i < s->
size*2; i++ )
1808 int * pArray = veci_begin(&s->
wlists[i]);
1809 for ( m = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1811 c = clause2_read(s, pArray[k]);
1812 for ( j = 0; j < (int)c->
size; j++ )
1813 if ( var_value(s, lit_var(c->
lits[j])) == lit_sign(c->
lits[j]) )
1815 if ( j == (
int)c->
size )
1817 pArray[m++] = pArray[k];
1822 veci_resize(&s->
wlists[i],m);
1837 int restart_iter = 0;
1838 ABC_INT64_T nof_conflicts;
1895 for ( i = begin; i < end; i++ )
1900 if (!solver2_enqueue(s,
p,0))
1902 clause* r = clause2_read(s, lit_reason(s,
p));
1906 proof_id = solver2_analyze_final(s, confl, 1);
1919 if (var_level(s, lit_var(
p)) > 0)
1923 solver2_canceluntil(s, 0);
1930 proof_id = solver2_analyze_final(s, confl, 0);
1933 solver2_canceluntil(s, 0);
1941 Abc_Print(1,
"==================================[MINISAT]===================================\n");
1942 Abc_Print(1,
"| Conflicts | ORIGINAL | LEARNT | Progress |\n");
1943 Abc_Print(1,
"| | Clauses Literals | Limit Clauses Literals Lit/Cl | |\n");
1944 Abc_Print(1,
"==============================================================================\n");
1950 Abc_Print(1,
"| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %6.3f %% |\n",
1967 nof_conflicts = (ABC_INT64_T)( 100 *
luby2(2, restart_iter++) );
1968 status = solver2_search(s, nof_conflicts);
1976 Abc_Print(1,
"==============================================================================\n");
1978 solver2_canceluntil(s,0);
1993 return Prf_ManUnsatCore( s->
pPrf2 );
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define Sat_MemForEachLearned(p, c, i, k)
#define LEARNT_MAX_RATIO_DEFAULT
#define LEARNT_MAX_START_DEFAULT
INCLUDES ///.
#define LEARNT_MAX_INCRE_DEFAULT
struct Sat_Mem_t_ Sat_Mem_t
int Sat_ProofReduce(Vec_Set_t *vProof, void *pRoots, int hProofPivot)
void Proof_ClauseSetEnts(Vec_Set_t *p, int h, int nEnts)
void * Proof_DeriveCore(Vec_Set_t *vProof, int hRoot)
double sat_solver2_memory_proof(sat_solver2 *s)
void sat_solver2_delete(sat_solver2 *s)
double sat_solver2_memory(sat_solver2 *s, int fAll)
int sat_solver2_simplify(sat_solver2 *s)
int var_is_assigned(sat_solver2 *s, int v)
clause * solver2_propagate(sat_solver2 *s)
void sat_solver2_reducedb(sat_solver2 *s)
sat_solver2 * sat_solver2_new(void)
double luby2(double y, int x)
#define clause_foreach_var(p, var, i, start)
void sat_solver2_rollback(sat_solver2 *s)
int sat_solver2_solve(sat_solver2 *s, lit *begin, lit *end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
int var_is_partA(sat_solver2 *s, int v)
void sat_solver2_setnvars(sat_solver2 *s, int n)
int sat_solver2_check_watched(sat_solver2 *s)
void * Sat_ProofCore(sat_solver2 *s)
void var_set_partA(sat_solver2 *s, int v, int partA)
int sat_solver2_addclause(sat_solver2 *s, lit *begin, lit *end, int Id)
struct sat_solver2_t sat_solver2
int Int2_ManChainStart(Int2_Man_t *p, clause *c)
struct varinfo2_t varinfo2
int Int2_ManChainResolve(Int2_Man_t *p, clause *c, int iLit, int varA)
ABC_INT64_T learnts_literals
ABC_INT64_T clauses_literals
typedefABC_NAMESPACE_HEADER_START struct Vec_Set_t_ Vec_Set_t
INCLUDES ///.