31#define SAT_USE_ANALYZE_FINAL
40#define L_ind sat_solver3_dl(s)*2+2,sat_solver3_dl(s)
42#define L_lit(p) lit_sign(p)?"~":"", (lit_var(p))
45static inline void check(
int expr) {
assert(expr); }
47static void printlits(
lit* begin,
lit* end)
50 for (i = 0; i < end - begin; i++)
59static inline double drand(
double* seed) {
62 q = (int)(*seed / 2147483647);
63 *seed -= (double)q * 2147483647;
64 return *seed / 2147483647; }
68static inline int irand(
double* seed,
int size) {
69 return (
int)(drand(seed) *
size); }
75static const int var0 = 1;
76static const int var1 = 0;
77static const int varX = 3;
91static inline void var_set_level (
sat_solver3* s,
int v,
int lev) { s->
levels[v] = lev; }
92static inline void var_set_value (
sat_solver3* s,
int v,
int val) { s->
assigns[v] = val; }
97static inline void var_set_tag (
sat_solver3* s,
int v,
int tag) {
98 assert( tag > 0 && tag < 16 );
99 if ( s->
tags[v] == 0 )
100 veci_push( &s->
tagged, v );
103static inline void var_add_tag (
sat_solver3* s,
int v,
int tag) {
104 assert( tag > 0 && tag < 16 );
105 if ( s->
tags[v] == 0 )
106 veci_push( &s->
tagged, v );
109static inline void solver2_clear_tags(
sat_solver3* s,
int start) {
111 for (i = start; i < veci_size(&s->
tagged); i++)
113 veci_resize(&s->
tagged,start);
118 if ( var_value(s, v) == var0 )
120 if ( var_value(s, v) == var1 )
122 if ( var_value(s, v) == varX )
137static inline void order_update(
sat_solver3* s,
int v)
143 int parent = (i - 1) / 2;
149 orderpos[
heap[i]] = i;
151 parent = (i - 1) / 2;
158static inline void order_assigned(
sat_solver3* s,
int v)
162static inline void order_unassigned(
sat_solver3* s,
int v)
165 if (orderpos[v] == -1){
166 orderpos[v] = veci_size(&s->
order);
167 veci_push(&s->
order,v);
173static inline int order_select(
sat_solver3* s,
float random_var_freq)
180 assert(next >= 0 && next < s->size);
181 if (var_value(s, next) == varX)
185 while (veci_size(&s->
order) > 0){
189 veci_resize(&s->
order,size);
194 while (child < size){
203 orderpos[
heap[i]] = i;
205 child = 2 * child + 1;
208 orderpos[
heap[i]] = i;
210 if (var_value(s, next) == varX)
220 for (i = 0; i < s->
size; i++)
223 for ( i = 0; i < nVars; i++ )
225 int iVar = pVars ? pVars[i] : i;
226 s->
activity[iVar] = Abc_Dbl2Word(nVars-i);
227 order_update( s, iVar );
234static inline void solver_init_activities(
sat_solver3* s)
245 s->
var_inc = Abc_Dbl2Word(1.0);
250 s->
var_inc = Xdbl_FromDouble(1.0);
251 s->
var_decay = Xdbl_FromDouble(1.0 / 0.950);
275 for (i = 0; i < s->
size; i++)
282 double* activity = (
double*)s->
activity;
284 for (i = 0; i < s->
size; i++)
285 activity[i] *= 1e-100;
293 for (i = 0; i < s->
size; i++)
294 activity[i] = Xdbl_Div( activity[i], 200 );
299static inline void act_var_bump(
sat_solver3* s,
int v)
304 if ((
unsigned)s->
activity[v] & 0x80000000)
328static inline void act_var_bump_global(
sat_solver3* s,
int v)
342 double act = Abc_Word2Dbl(s->
activity[v]) + Abc_Word2Dbl(s->
var_inc) * 3.0;
359static inline void act_var_bump_factor(
sat_solver3* s,
int v)
403static inline void act_clause_rescale(
sat_solver3* s)
407 unsigned* activity = (
unsigned *)veci_begin(&s->
act_clas);
409 for (i = 0; i < veci_size(&s->
act_clas); i++)
416 float* activity = (
float *)veci_begin(&s->
act_clas);
418 for (i = 0; i < veci_size(&s->
act_clas); i++)
419 activity[i] *= (
float)1e-20;
429 if ( *act & 0x80000000 )
430 act_clause_rescale(s);
437 act_clause_rescale(s);
452static inline void selectionsort(
void** array,
int size,
int(*comp)(
const void *,
const void *))
457 for (i = 0; i <
size-1; i++){
459 for (j = i+1; j <
size; j++){
460 if (comp(array[j], array[best_i]) < 0)
463 tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
467static void sortrnd(
void** array,
int size,
int(*comp)(
const void *,
const void *),
double* seed)
470 selectionsort(array, size, comp);
473 void* pivot = array[irand(seed, size)];
479 do i++;
while(comp(array[i], pivot)<0);
480 do j--;
while(comp(pivot, array[j])<0);
484 tmp = array[i]; array[i] = array[j]; array[j] = tmp;
487 sortrnd(array , i , comp, seed);
488 sortrnd(&array[i], size-i, comp, seed);
497 int i, lev, minl = 0, lbd = 0;
498 for (i = 0; i < (int)c->
size; i++)
500 lev = var_level(s, lit_var(c->
lits[i]));
501 if ( !(minl & (1 << (lev & 31))) )
503 minl |= 1 << (lev & 31);
516 int fUseBinaryClauses = 1;
522 assert(learnt >= 0 && learnt < 2);
526 if ( fUseBinaryClauses && size == 2 && !learnt )
528 veci_push(sat_solver3_read_wlist(s,lit_neg(begin[0])),(clause_from_lit(begin[1])));
529 veci_push(sat_solver3_read_wlist(s,lit_neg(begin[1])),(clause_from_lit(begin[0])));
537 h = Sat_MemAppend( &s->
Mem, begin, size, learnt, 0 );
543 c = clause_read( s, h );
544 c->
lbd = sat_clause_compute_lbd( s, c );
571 veci_push(sat_solver3_read_wlist(s,lit_neg(begin[0])),(size > 2 ? h : clause_from_lit(begin[1])));
572 veci_push(sat_solver3_read_wlist(s,lit_neg(begin[1])),(size > 2 ? h : clause_from_lit(begin[0])));
581static inline int sat_solver3_enqueue(
sat_solver3* s,
lit l,
int from)
593 if (var_value(s, v) != varX)
594 return var_value(s, v) == lit_sign(l);
621 var_set_value(s, v, lit_sign(l));
622 var_set_level(s, v, sat_solver3_dl(s));
625 order_assigned(s, v);
633 assert(var_value(s, lit_var(l)) == varX);
636 printf(
"act = %.20f\n", s->
activity[lit_var(l)] );
639 return sat_solver3_enqueue(s,l,0);
643static void sat_solver3_canceluntil(
sat_solver3* s,
int level) {
648 if (sat_solver3_dl(s) <= level)
652 bound = (veci_begin(&s->
trail_lim))[level];
661 for (c = s->
qtail-1; c >= bound; c--) {
662 int x = lit_var(s->
trail[c]);
663 var_set_value(s, x, varX);
666 var_set_polar( s, x, !lit_sign(s->
trail[c]) );
670 for (c = s->
qhead-1; c >= bound; c--)
671 order_unassigned(s,lit_var(s->
trail[c]));
677static void sat_solver3_canceluntil_rollback(
sat_solver3* s,
int NewBound) {
680 assert( sat_solver3_dl(s) == 0 );
684 for (c = s->
qtail-1; c >= NewBound; c--)
686 x = lit_var(s->
trail[c]);
687 var_set_value(s, x, varX);
691 for (c = s->
qhead-1; c >= NewBound; c--)
692 order_unassigned(s,lit_var(s->
trail[c]));
699 lit* begin = veci_begin(cls);
700 lit* end = begin + veci_size(cls);
702 sat_solver3_enqueue(s,*begin,h);
703 assert(veci_size(cls) > 0);
720 assert(sat_solver3_dl(s) == 0);
721 for ( i = 0; i < s->
size; i++ )
722 if (var_value(s, i) != varX)
731 double F = 1.0 / s->
size;
732 for (i = 0; i < s->
size; i++)
733 if (var_value(s, i) != varX)
734 progress += pow(F, var_level(s, i));
735 return progress / s->
size;
741static int sat_solver3_lit_removable(
sat_solver3* s,
int x,
int minl)
743 int top = veci_size(&s->
tagged);
746 veci_resize(&s->
stack,0);
747 veci_push(&s->
stack,x);
749 while (veci_size(&s->
stack)){
750 int v = veci_pop(&s->
stack);
752 if (clause_is_lit(s->
reasons[v])){
753 v = lit_var(clause_read_lit(s->
reasons[v]));
754 if (!var_tag(s,v) && var_level(s, v)){
755 if (s->
reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
756 veci_push(&s->
stack,v);
757 var_set_tag(s, v, 1);
759 solver2_clear_tags(s, top);
765 lit* lits = clause_begin(c);
767 for (i = 1; i < clause_size(c); i++){
768 int v = lit_var(lits[i]);
769 if (!var_tag(s,v) && var_level(s, v)){
770 if (s->
reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
771 veci_push(&s->
stack,lit_var(lits[i]));
772 var_set_tag(s, v, 1);
774 solver2_clear_tags(s, top);
834#ifdef SAT_USE_ANALYZE_FINAL
836static void sat_solver3_analyze_final(
sat_solver3* s,
int hConf,
int skip_first)
838 clause* conf = clause_read(s, hConf);
846 for (i = skip_first ? 1 : 0; i < clause_size(conf); i++)
848 int x = lit_var(clause_begin(conf)[i]);
849 if (var_level(s, x) > 0)
850 var_set_tag(s, x, 1);
854 for (i = start; i >= (veci_begin(&s->
trail_lim))[0]; i--){
855 int x = lit_var(s->
trail[i]);
858 assert(var_level(s, x) > 0);
861 if (clause_is_lit(s->
reasons[x])){
863 assert(lit_var(q) >= 0 && lit_var(q) < s->
size);
864 if (var_level(s, lit_var(q)) > 0)
865 var_set_tag(s, lit_var(q), 1);
869 int* lits = clause_begin(c);
870 for (j = 1; j < clause_size(c); j++)
871 if (var_level(s, lit_var(lits[j])) > 0)
872 var_set_tag(s, lit_var(lits[j]), 1);
877 solver2_clear_tags(s,0);
887 int ind = s->
qtail-1;
890 veci_push(learnt,lit_Undef);
893 if (clause_is_lit(h)){
894 int x = lit_var(clause_read_lit(h));
895 if (var_tag(s, x) == 0 && var_level(s, x) > 0){
896 var_set_tag(s, x, 1);
898 if (var_level(s, x) == sat_solver3_dl(s))
901 veci_push(learnt,clause_read_lit(h));
904 clause* c = clause_read(s, h);
906 if (clause_learnt(c))
907 act_clause_bump(s,c);
908 lits = clause_begin(c);
910 for (j = (
p == lit_Undef ? 0 : 1); j < clause_size(c); j++){
911 int x = lit_var(lits[j]);
912 if (var_tag(s, x) == 0 && var_level(s, x) > 0){
913 var_set_tag(s, x, 1);
918 if (var_level(s,x) == sat_solver3_dl(s))
921 veci_push(learnt,lits[j]);
926 while ( !var_tag(s, lit_var(trail[ind--])) );
934 *veci_begin(learnt) = lit_neg(
p);
936 lits = veci_begin(learnt);
938 for (i = 1; i < veci_size(learnt); i++){
939 int lev = var_level(s, lit_var(lits[i]));
940 minl |= 1 << (lev & 31);
944 for (i = j = 1; i < veci_size(learnt); i++){
945 if (s->
reasons[lit_var(lits[i])] == 0 || !sat_solver3_lit_removable(s,lit_var(lits[i]),minl))
950 veci_resize(learnt,j);
955 solver2_clear_tags(s,0);
958 for (i = 0; i < s->
size; i++)
964 for (i = 0; i < veci_size(learnt); i++) printf(
" "L_LIT,
L_lit(lits[i]));
966 if (veci_size(learnt) > 1){
968 int max = var_level(s, lit_var(lits[1]));
971 for (i = 2; i < veci_size(learnt); i++)
972 if (var_level(s, lit_var(lits[i])) > max){
973 max = var_level(s, lit_var(lits[i]));
978 lits[1] = lits[max_i];
983 int lev = veci_size(learnt) > 1 ? var_level(s, lit_var(lits[1])) : 0;
984 printf(
" } at level %d\n", lev);
998 while (hConfl == 0 && s->
qtail - s->
qhead > 0){
1007 if ( (s->
loads[v] & 1) == 0 )
1015 if ( (s->
loads[v] & 2) == 0 )
1025 veci* ws = sat_solver3_read_wlist(s,
p);
1026 int* begin = veci_begin(ws);
1027 int* end = begin + veci_size(ws);
1034 for (i = j = begin; i < end; ){
1035 if (clause_is_lit(*i)){
1037 int Lit = clause_read_lit(*i);
1038 if (var_value(s, lit_var(Lit)) == lit_sign(Lit)){
1044 if (!sat_solver3_enqueue(s,clause_read_lit(*i),clause_from_lit(
p))){
1046 (clause_begin(s->
binary))[1] = lit_neg(
p);
1047 (clause_begin(s->
binary))[0] = clause_read_lit(*i++);
1054 clause* c = clause_read(s,*i);
1055 lits = clause_begin(c);
1058 false_lit = lit_neg(
p);
1059 if (lits[0] == false_lit){
1061 lits[1] = false_lit;
1063 assert(lits[1] == false_lit);
1066 if (var_value(s, lit_var(lits[0])) == lit_sign(lits[0]))
1070 lit* stop = lits + clause_size(c);
1072 for (k = lits + 2; k < stop; k++){
1073 if (var_value(s, lit_var(*k)) != !lit_sign(*k)){
1076 veci_push(sat_solver3_read_wlist(s,lit_neg(lits[1])),*i);
1083 c->
lbd = sat_clause_compute_lbd(s, c);
1084 if (!sat_solver3_enqueue(s,lits[0], *i)){
1097 veci_resize(ws,j - veci_begin(ws));
1114 Sat_MemAlloc_(&s->
Mem, 17);
1116 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1125 veci_new(&s->
order);
1130 veci_new(&s->
stack);
1149 solver_init_activities(s);
1179 Sat_MemAlloc_(&s->
Mem, 15);
1181 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1190 veci_new(&s->
order);
1195 veci_new(&s->
stack);
1214 solver_init_activities(s);
1244 int old_cap = s->
cap;
1246 if ( s->
cap < 50000 )
1269 for (var = s->
size; var < n; var++){
1273 veci_new(&s->
wlists[2*var]);
1275 veci_new(&s->
wlists[2*var+1]);
1301 veci_push(&s->
order,var);
1302 order_update(s, var);
1311 Sat_MemFree_( &s->
Mem );
1314 veci_delete(&s->
order);
1319 veci_delete(&s->
stack);
1330 for (i = 0; i < s->
cap*2; i++)
1331 veci_delete(&s->
wlists[i]);
1355 Sat_MemRestart( &s->
Mem );
1357 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1361 veci_resize(&s->
order, 0);
1362 for ( i = 0; i < s->
size*2; i++ )
1375 solver_init_activities(s);
1401 Sat_MemRestart( &s->
Mem );
1403 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1407 veci_resize(&s->
order, 0);
1408 for ( i = 0; i < s->
size*2; i++ )
1419 solver_init_activities(s);
1446 for (i = 0; i < s->
cap*2; i++)
1449 Mem += s->
cap *
sizeof(int);
1450 Mem += s->
cap *
sizeof(char);
1451 Mem += s->
cap *
sizeof(char);
1452 Mem += s->
cap *
sizeof(char);
1453 Mem += s->
cap *
sizeof(char);
1458 Mem += s->
cap *
sizeof(double);
1459 Mem += s->
cap *
sizeof(int);
1460 Mem += s->
cap *
sizeof(int);
1461 Mem += s->
cap *
sizeof(
lit);
1462 Mem += s->
cap *
sizeof(int);
1474 Mem += Sat_MemMemoryAll( &s->
Mem );
1480 assert(sat_solver3_dl(s) == 0);
1491 int nLearnedOld = veci_size(&s->
act_clas);
1492 int * act_clas = veci_begin(&s->
act_clas);
1493 int * pPerm, * pArray, * pSortValues, nCutoffValue;
1494 int i, k, j, Id, Counter, CounterStart, nSelected;
1498 assert( nLearnedOld == Sat_MemEntryNum(pMem, 1) );
1508 pSortValues =
ABC_ALLOC(
int, nLearnedOld );
1514 pSortValues[Id] = ((7 - Abc_MinInt(c->
lbd, 7)) << 28) | (act_clas[Id] >> 4);
1516 pSortValues[Id] = ((7 - Abc_MinInt(c->
lbd, 7)) << 28);
1517 assert( pSortValues[Id] >= 0 );
1521 CounterStart = nLearnedOld - (s->
nLearntMax / 20);
1528 assert( pSortValues[pPerm[0]] <= pSortValues[pPerm[nLearnedOld-1]] );
1529 nCutoffValue = pSortValues[pPerm[nLearnedOld-nSelected]];
1538 if ( Counter++ > CounterStart || clause_size(c) < 3 || pSortValues[clause_id(c)] > nCutoffValue || s->
reasons[lit_var(c->
lits[0])] == Sat_MemHand(pMem, i, k) )
1539 act_clas[j++] = act_clas[clause_id(c)];
1548 assert( Counter == nLearnedOld );
1553 Counter = Sat_MemCompactLearned( pMem, 0 );
1557 for ( i = 0; i < s->
size; i++ )
1561 if ( clause_is_lit(s->
reasons[i]) )
1563 if ( !clause_learnt_h(pMem, s->
reasons[i]) )
1565 c = clause_read( s, s->
reasons[i] );
1571 for ( i = 0; i < s->
size*2; i++ )
1573 pArray = veci_begin(&s->
wlists[i]);
1574 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1576 if ( clause_is_lit(pArray[k]) )
1577 pArray[j++] = pArray[k];
1578 else if ( !clause_learnt_h(pMem, pArray[k]) )
1579 pArray[j++] = pArray[k];
1582 c = clause_read(s, pArray[k]);
1584 pArray[j++] = clause_id(c);
1587 veci_resize(&s->
wlists[i],j);
1591 Counter = Sat_MemCompactLearned( pMem, 1 );
1595 TimeTotal += Abc_Clock() - clk;
1598 Abc_Print(1,
"reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
1600 Abc_PrintTime( 1,
"Time", TimeTotal );
1610 static int Count = 0;
1615 sat_solver3_canceluntil_rollback( s, s->
iTrailPivot );
1624 veci_resize(&s->
order, 0);
1627 if ( var_value(s, i) != varX )
1630 veci_push(&s->
order,i);
1637 cla* pArray = veci_begin(&s->
wlists[i]);
1638 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1640 if ( clause_is_lit(pArray[k]) )
1642 if ( clause_read_lit(pArray[k]) < s->
iVarPivot*2 )
1643 pArray[j++] = pArray[k];
1645 else if ( Sat_MemClauseUsed(pMem, pArray[k]) )
1646 pArray[j++] = pArray[k];
1648 veci_resize(&s->
wlists[i],j);
1651 for ( i = 2*s->
iVarPivot; i < 2*s->size; i++ )
1658 Sat_MemRollBack( pMem );
1672 solver_init_activities(s);
1707 for ( i = begin; i < end; i++ )
1708 printf(
"%s%d ", (*i)&1 ?
"!":
"", (*i)>>1 );
1713 for ( i = begin; i < end; i++ )
1719 maxvar = lit_var(*begin);
1720 for (i = begin + 1; i < end; i++){
1722 maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
1723 for (j = i; j > begin && *(j-1) > l; j--)
1731 for (i = j = begin; i < end; i++){
1733 if (*i == lit_neg(last) || var_value(s, lit_var(*i)) == lit_sign(*i))
1735 else if (*i != last && var_value(s, lit_var(*i)) == varX)
1744 return sat_solver3_enqueue(s,*begin,0);
1751static double luby(
double y,
int x)
1754 for (size = 1, seq = 0;
size < x+1; seq++,
size = 2*
size + 1);
1755 while (size-1 != x){
1760 return pow(y, (
double)seq);
1766 for ( i = 0; i < 20; i++ )
1767 printf(
"%d ", (
int)
luby(2,i) );
1776 ABC_INT64_T conflictC = 0;
1787 veci_new(&learnt_clause);
1811#ifdef SAT_USE_ANALYZE_FINAL
1812 sat_solver3_analyze_final(s, hConfl, 0);
1814 veci_delete(&learnt_clause);
1818 veci_resize(&learnt_clause,0);
1819 sat_solver3_analyze(s, hConfl, &learnt_clause);
1820 blevel = veci_size(&learnt_clause) > 1 ? var_level(s, lit_var(veci_begin(&learnt_clause)[1])) : s->root_level;
1822 sat_solver3_canceluntil(s,blevel);
1823 sat_solver3_record(s,&learnt_clause);
1824#ifdef SAT_USE_ANALYZE_FINAL
1826 if ( learnt_clause.
size == 1 )
1827 var_set_level(s, lit_var(learnt_clause.
ptr[0]), 0);
1830 act_clause_decay(s);
1840 veci_delete(&learnt_clause);
1849 veci_delete(&learnt_clause);
1864 next = order_select(s,(
float)random_var_freq);
1869 for (i = 0; i < s->
size; i++)
1872 veci_delete(&learnt_clause);
1885 if ( var_polar(s, next) )
1886 sat_solver3_decision(s,toLit(next));
1888 sat_solver3_decision(s,lit_neg(toLit(next)));
1899 int restart_iter = 0;
1904 printf(
"==================================[MINISAT]===================================\n");
1905 printf(
"| Conflicts | ORIGINAL | LEARNT | Progress |\n");
1906 printf(
"| | Clauses Literals | Limit Clauses Literals Lit/Cl | |\n");
1907 printf(
"==============================================================================\n");
1911 ABC_INT64_T nof_conflicts;
1918 printf(
"| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %6.3f %% |\n",
1929 nof_conflicts = (ABC_INT64_T)( 100 *
luby(2, restart_iter++) );
1930 status = sat_solver3_search(s, nof_conflicts);
1940 printf(
"==============================================================================\n");
1952 if (!sat_solver3_enqueue(s,
p,0))
1957 if (clause_is_lit(h))
1959 (clause_begin(s->
binary))[1] = lit_neg(
p);
1960 (clause_begin(s->
binary))[0] = clause_read_lit(h);
1963 sat_solver3_analyze_final(s, h, 1);
1971 if (var_level(s, lit_var(
p)) > 0)
1981 sat_solver3_analyze_final(s, fConfl, 0);
1992 assert( sat_solver3_dl(s) > 0 );
2025#ifdef SAT_USE_ANALYZE_FINAL
2028 for ( i = begin; i < end; i++ )
2031 sat_solver3_canceluntil(s,0);
2038 for (i = begin; i < end; i++){
2040 switch (var_value(s, *i)) {
2044 sat_solver3_decision(s, *i);
2049 sat_solver3_canceluntil(s, 0);
2058 sat_solver3_canceluntil(s,0);
2071 int i, iLitFail = -1;
2075 sat_solver3_set_literal_polarity( s, pLits, nLits );
2083 for ( i = 0; i < nLits; i++ )
2084 if ( pLits[i] != sat_solver3_var_literal(s, Abc_Lit2Var(pLits[i])) )
2091 for ( i = 0; i <= iLitFail; i++ )
2094 if ( i < iLitFail + 1 )
2102 if ( iLitFail + 1 < nLits )
2108 assert( Abc_LitIsCompl(pLits[iLitFail]) );
2113 pLits[iLitFail] = Abc_LitNot(pLits[iLitFail]);
2115 printf(
"sat_solver3_solve_lexsat(): A satisfying assignment should exist.\n" );
2117 for ( i = iLitFail + 1; i < nLits; i++ )
2118 pLits[i] = Abc_LitNot( Abc_LitRegular(pLits[i]) );
2120 if ( iLitFail + 1 < nLits )
2126 for ( i = iLitFail; i >= 0; i-- )
2137 int i, k, nLitsL, nLitsR, nResL, nResR;
2147 return (
int)(status !=
l_False);
2151 nLitsR = nLits - nLitsL;
2153 for ( i = 0; i < nLitsL; i++ )
2156 for ( k = i; k >= 0; k-- )
2162 for ( i = 0; i < nLitsL; i++ )
2169 for ( i = 0; i < nLitsL; i++ )
2171 for ( i = 0; i < nResL; i++ )
2172 pLits[i] = pLits[nLitsL+i];
2173 for ( i = 0; i < nLitsL; i++ )
2176 for ( i = 0; i < nResL; i++ )
2179 for ( k = i; k >= 0; k-- )
2185 for ( i = 0; i < nResL; i++ )
2187 return nResL + nResR;
2196 int i, k, nLitsL, nLitsR, nResL, nResR;
2201 int RetValue = 1, LitNot = Abc_LitNot(pLits[0]);
2218 return (
int)(status !=
l_False);
2222 nLitsR = nLits - nLitsL;
2224 for ( i = 0; i < nLitsL; i++ )
2227 for ( k = i; k >= 0; k-- )
2231 for ( k = i+1; k > nLitsL; k++ )
2233 int LitNot = Abc_LitNot(pLits[i]);
2242 for ( i = 0; i < nLitsL; i++ )
2247 for ( i = 0; i < nLitsL; i++ )
2249 for ( i = 0; i < nResL; i++ )
2250 pLits[i] = pLits[nLitsL+i];
2251 for ( i = 0; i < nLitsL; i++ )
2254 for ( i = 0; i < nResL; i++ )
2257 for ( k = i; k >= 0; k-- )
2261 for ( k = i+1; k > nResL; k++ )
2263 int LitNot = Abc_LitNot(pLits[i]);
2272 for ( i = 0; i < nResL; i++ )
2274 return nResL + nResR;
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_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
unsigned __int64 word
DECLARATIONS ///.
#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_solver3_minimize_assumptions(sat_solver3 *s, int *pLits, int nLits, int nConfLimit)
int sat_solver3_nvars(sat_solver3 *s)
void sat_solver3_setnvars(sat_solver3 *s, int n)
void sat_solver3_pop(sat_solver3 *s)
int sat_solver3_simplify(sat_solver3 *s)
int sat_solver3_get_var_value(sat_solver3 *s, int v)
void sat_solver3_delete(sat_solver3 *s)
sat_solver3 * zsat_solver3_new_seed(double seed)
int sat_solver3_propagate(sat_solver3 *s)
int sat_solver3_minimize_assumptions2(sat_solver3 *s, int *pLits, int nLits, int nConfLimit)
sat_solver3 * sat_solver3_new(void)
int sat_solver3_push(sat_solver3 *s, int p)
void sat_solver3_rollback(sat_solver3 *s)
int sat_solver3_solve_internal(sat_solver3 *s)
double sat_solver3_memory(sat_solver3 *s)
void sat_solver3_set_resource_limits(sat_solver3 *s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
void sat_solver3_set_var_activity(sat_solver3 *s, int *pVars, int nVars)
int sat_solver3_nclauses(sat_solver3 *s)
int sat_solver3_clause_new(sat_solver3 *s, lit *begin, lit *end, int learnt)
void sat_solver3_reducedb(sat_solver3 *s)
void zsat_solver3_restart_seed(sat_solver3 *s, double seed)
int sat_solver3_solve(sat_solver3 *s, lit *begin, lit *end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
int sat_solver3_nconflicts(sat_solver3 *s)
void sat_solver3_restart(sat_solver3 *s)
int sat_solver3_solve_lexsat(sat_solver3 *s, int *pLits, int nLits)
int sat_solver3_addclause(sat_solver3 *s, lit *begin, lit *end)
int sat_solver3_count_assigned(sat_solver3 *s)
struct sat_solver3_t sat_solver3
double luby(double y, int x)
int(* pCnfFunc)(void *p, int)
ABC_INT64_T learnts_literals
ABC_INT64_T clauses_literals
ABC_NAMESPACE_HEADER_START typedef word xdbl
STRUCTURE DEFINITIONS ///.