32#define SAT_USE_ANALYZE_FINAL
41#define L_ind sat_solver_dl(s)*2+2,sat_solver_dl(s)
43#define L_lit(p) lit_sign(p)?"~":"", (lit_var(p))
46static inline void check(
int expr) {
assert(expr); }
48static void printlits(
lit* begin,
lit* end)
51 for (i = 0; i < end - begin; i++)
60static inline double drand(
double* seed) {
63 q = (int)(*seed * 4.6566128752457969e-10);
64 *seed -= (double)q * 2147483647;
65 return *seed * 4.6566128752457969e-10;
70static inline int irand(
double* seed,
int size) {
71 return (
int)(drand(seed) *
size); }
77static const int var0 = 1;
78static const int var1 = 0;
79static const int varX = 3;
93static inline void var_set_level (
sat_solver* s,
int v,
int lev) { s->
levels[v] = lev; }
94static inline void var_set_value (
sat_solver* s,
int v,
int val) { s->
assigns[v] = val; }
95static inline void var_set_polar (
sat_solver* s,
int v,
int pol) { s->
polarity[v] = pol; }
98static inline int var_tag (
sat_solver* s,
int v) {
return s->
tags[v]; }
99static inline void var_set_tag (
sat_solver* s,
int v,
int tag) {
100 assert( tag > 0 && tag < 16 );
101 if ( s->
tags[v] == 0 )
102 veci_push( &s->
tagged, v );
105static inline void var_add_tag (
sat_solver* s,
int v,
int tag) {
106 assert( tag > 0 && tag < 16 );
107 if ( s->
tags[v] == 0 )
108 veci_push( &s->
tagged, v );
111static inline void solver2_clear_tags(
sat_solver* s,
int start) {
113 for (i = start; i < veci_size(&s->
tagged); i++)
115 veci_resize(&s->
tagged,start);
120 if ( var_value(s, v) == var0 )
122 if ( var_value(s, v) == var1 )
124 if ( var_value(s, v) == varX )
139static inline void order_update(
sat_solver* s,
int v)
145 int parent = (i - 1) / 2;
151 orderpos[
heap[i]] = i;
153 parent = (i - 1) / 2;
160static inline void order_assigned(
sat_solver* s,
int v)
164static inline void order_unassigned(
sat_solver* s,
int v)
167 if (orderpos[v] == -1){
168 orderpos[v] = veci_size(&s->
order);
169 veci_push(&s->
order,v);
175static inline int order_select(
sat_solver* s,
float random_var_freq)
182 assert(next >= 0 && next < s->size);
183 if (var_value(s, next) == varX)
187 while (veci_size(&s->
order) > 0){
191 veci_resize(&s->
order,size);
196 while (child < size){
205 orderpos[
heap[i]] = i;
207 child = 2 * child + 1;
210 orderpos[
heap[i]] = i;
212 if (var_value(s, next) == varX)
221 for (i = 0; i < s->
size; i++)
227 for ( i = 0; i < nVars; i++ )
229 int iVar = pVars ? pVars[i] : i;
232 order_update( s, iVar );
238 for ( i = 0; i < nVars; i++ )
240 int iVar = pVars ? pVars[i] : i;
241 s->
activity[iVar] = Abc_Dbl2Word(nVars-i);
243 order_update( s, iVar );
252static inline void solver_init_activities(
sat_solver* s)
263 s->
var_inc = Abc_Dbl2Word(1.0);
268 s->
var_inc = Xdbl_FromDouble(1.0);
269 s->
var_decay = Xdbl_FromDouble(1.0 / 0.950);
287static inline void act_var_rescale(
sat_solver* s)
293 for (i = 0; i < s->
size; i++)
300 double* activity = (
double*)s->
activity;
302 for (i = 0; i < s->
size; i++)
303 activity[i] *= 1e-100;
311 for (i = 0; i < s->
size; i++)
312 activity[i] = Xdbl_Div( activity[i], 200 );
317static inline void act_var_bump(
sat_solver* s,
int v)
322 if ((
unsigned)s->
activity[v] & 0x80000000)
346static inline void act_var_bump_global(
sat_solver* s,
int v)
360 double act = Abc_Word2Dbl(s->
activity[v]) + Abc_Word2Dbl(s->
var_inc) * 3.0;
377static inline void act_var_bump_factor(
sat_solver* s,
int v)
409static inline void act_var_decay(
sat_solver* s)
421static inline void act_clause_rescale(
sat_solver* s)
425 unsigned* activity = (
unsigned *)veci_begin(&s->
act_clas);
427 for (i = 0; i < veci_size(&s->
act_clas); i++)
434 float* activity = (
float *)veci_begin(&s->
act_clas);
436 for (i = 0; i < veci_size(&s->
act_clas); i++)
437 activity[i] *= (
float)1e-20;
447 if ( *act & 0x80000000 )
448 act_clause_rescale(s);
455 act_clause_rescale(s);
458static inline void act_clause_decay(
sat_solver* s)
470static inline void selectionsort(
void** array,
int size,
int(*comp)(
const void *,
const void *))
475 for (i = 0; i <
size-1; i++){
477 for (j = i+1; j <
size; j++){
478 if (comp(array[j], array[best_i]) < 0)
481 tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
485static void sortrnd(
void** array,
int size,
int(*comp)(
const void *,
const void *),
double* seed)
488 selectionsort(array, size, comp);
491 void* pivot = array[irand(seed, size)];
497 do i++;
while(comp(array[i], pivot)<0);
498 do j--;
while(comp(pivot, array[j])<0);
502 tmp = array[i]; array[i] = array[j]; array[j] = tmp;
505 sortrnd(array , i , comp, seed);
506 sortrnd(&array[i], size-i, comp, seed);
515 unsigned int i, lev, minl = 0;
517 for (i = 0; i < c->
size; i++)
519 lev = var_level(s, lit_var(c->
lits[i]));
520 if ( !(minl & (1U << (lev & 31))) )
522 minl |= 1U << (lev & 31);
535 int fUseBinaryClauses = 1;
541 assert(learnt >= 0 && learnt < 2);
545 if ( fUseBinaryClauses && size == 2 && !learnt )
547 veci_push(sat_solver_read_wlist(s,lit_neg(begin[0])),(clause_from_lit(begin[1])));
548 veci_push(sat_solver_read_wlist(s,lit_neg(begin[1])),(clause_from_lit(begin[0])));
556 h = Sat_MemAppend( &s->
Mem, begin, size, learnt, 0 );
562 c = clause_read( s, h );
563 c->
lbd = sat_clause_compute_lbd( s, c );
590 veci_push(sat_solver_read_wlist(s,lit_neg(begin[0])),(size > 2 ? h : clause_from_lit(begin[1])));
591 veci_push(sat_solver_read_wlist(s,lit_neg(begin[1])),(size > 2 ? h : clause_from_lit(begin[0])));
600static inline int sat_solver_enqueue(
sat_solver* s,
lit l,
int from)
612 if (var_value(s, v) != varX)
613 return var_value(s, v) == lit_sign(l);
640 var_set_value(s, v, lit_sign(l));
641 var_set_level(s, v, sat_solver_dl(s));
644 order_assigned(s, v);
652 assert(var_value(s, lit_var(l)) == varX);
655 printf(
"act = %.20f\n", s->
activity[lit_var(l)] );
658 return sat_solver_enqueue(s,l,0);
662static void sat_solver_canceluntil(
sat_solver* s,
int level) {
667 if (sat_solver_dl(s) <= level)
671 bound = (veci_begin(&s->
trail_lim))[level];
680 for (c = s->
qtail-1; c >= bound; c--) {
681 int x = lit_var(s->
trail[c]);
682 var_set_value(s, x, varX);
685 var_set_polar( s, x, !lit_sign(s->
trail[c]) );
689 for (c = s->
qhead-1; c >= bound; c--)
690 order_unassigned(s,lit_var(s->
trail[c]));
696static void sat_solver_canceluntil_rollback(
sat_solver* s,
int NewBound) {
699 assert( sat_solver_dl(s) == 0 );
703 for (c = s->
qtail-1; c >= NewBound; c--)
705 x = lit_var(s->
trail[c]);
706 var_set_value(s, x, varX);
710 for (c = s->
qhead-1; c >= NewBound; c--)
711 order_unassigned(s,lit_var(s->
trail[c]));
718 lit* begin = veci_begin(cls);
719 lit* end = begin + veci_size(cls);
721 sat_solver_enqueue(s,*begin,h);
722 assert(veci_size(cls) > 0);
748 assert(sat_solver_dl(s) == 0);
749 for ( i = 0; i < s->
size; i++ )
750 if (var_value(s, i) != varX)
755static double sat_solver_progress(
sat_solver* s)
759 double F = 1.0 / s->
size;
760 for (i = 0; i < s->
size; i++)
761 if (var_value(s, i) != varX)
762 progress += pow(F, var_level(s, i));
763 return progress / s->
size;
769static int sat_solver_lit_removable(
sat_solver* s,
int x,
int minl)
771 int top = veci_size(&s->
tagged);
774 veci_resize(&s->
stack,0);
775 veci_push(&s->
stack,x);
777 while (veci_size(&s->
stack)){
778 int v = veci_pop(&s->
stack);
780 if (clause_is_lit(s->
reasons[v])){
781 v = lit_var(clause_read_lit(s->
reasons[v]));
782 if (!var_tag(s,v) && var_level(s, v)){
783 if (s->
reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
784 veci_push(&s->
stack,v);
785 var_set_tag(s, v, 1);
787 solver2_clear_tags(s, top);
793 lit* lits = clause_begin(c);
795 for (i = 1; i < clause_size(c); i++){
796 int v = lit_var(lits[i]);
797 if (!var_tag(s,v) && var_level(s, v)){
798 if (s->
reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
799 veci_push(&s->
stack,lit_var(lits[i]));
800 var_set_tag(s, v, 1);
802 solver2_clear_tags(s, top);
862#ifdef SAT_USE_ANALYZE_FINAL
864static void sat_solver_analyze_final(
sat_solver* s,
int hConf,
int skip_first)
866 clause* conf = clause_read(s, hConf);
874 for (i = skip_first ? 1 : 0; i < clause_size(conf); i++)
876 int x = lit_var(clause_begin(conf)[i]);
877 if (var_level(s, x) > 0)
878 var_set_tag(s, x, 1);
882 for (i = start; i >= (veci_begin(&s->
trail_lim))[0]; i--){
883 int x = lit_var(s->
trail[i]);
886 assert(var_level(s, x) > 0);
889 if (clause_is_lit(s->
reasons[x])){
891 assert(lit_var(q) >= 0 && lit_var(q) < s->
size);
892 if (var_level(s, lit_var(q)) > 0)
893 var_set_tag(s, lit_var(q), 1);
897 int* lits = clause_begin(c);
898 for (j = 1; j < clause_size(c); j++)
899 if (var_level(s, lit_var(lits[j])) > 0)
900 var_set_tag(s, lit_var(lits[j]), 1);
905 solver2_clear_tags(s,0);
915 int ind = s->
qtail-1;
918 veci_push(learnt,lit_Undef);
921 if (clause_is_lit(h)){
922 int x = lit_var(clause_read_lit(h));
923 if (var_tag(s, x) == 0 && var_level(s, x) > 0){
924 var_set_tag(s, x, 1);
926 if (var_level(s, x) == sat_solver_dl(s))
929 veci_push(learnt,clause_read_lit(h));
932 clause* c = clause_read(s, h);
934 if (clause_learnt(c))
935 act_clause_bump(s,c);
936 lits = clause_begin(c);
938 for (j = (
p == lit_Undef ? 0 : 1); j < clause_size(c); j++){
939 int x = lit_var(lits[j]);
940 if (var_tag(s, x) == 0 && var_level(s, x) > 0){
941 var_set_tag(s, x, 1);
946 if (var_level(s,x) == sat_solver_dl(s))
949 veci_push(learnt,lits[j]);
954 while ( !var_tag(s, lit_var(trail[ind--])) );
962 *veci_begin(learnt) = lit_neg(
p);
964 lits = veci_begin(learnt);
966 for (i = 1; i < veci_size(learnt); i++){
967 int lev = var_level(s, lit_var(lits[i]));
968 minl |= 1 << (lev & 31);
972 for (i = j = 1; i < veci_size(learnt); i++){
973 if (s->
reasons[lit_var(lits[i])] == 0 || !sat_solver_lit_removable(s,lit_var(lits[i]),minl))
978 veci_resize(learnt,j);
983 solver2_clear_tags(s,0);
986 for (i = 0; i < s->
size; i++)
992 for (i = 0; i < veci_size(learnt); i++) printf(
" "L_LIT,
L_lit(lits[i]));
994 if (veci_size(learnt) > 1){
996 int max = var_level(s, lit_var(lits[1]));
999 for (i = 2; i < veci_size(learnt); i++)
1000 if (var_level(s, lit_var(lits[i])) > max){
1001 max = var_level(s, lit_var(lits[i]));
1006 lits[1] = lits[max_i];
1011 int lev = veci_size(learnt) > 1 ? var_level(s, lit_var(lits[1])) : 0;
1012 printf(
" } at level %d\n", lev);
1026 while (hConfl == 0 && s->
qtail - s->
qhead > 0){
1035 if ( (s->
loads[v] & 1) == 0 )
1043 if ( (s->
loads[v] & 2) == 0 )
1053 veci* ws = sat_solver_read_wlist(s,
p);
1054 int* begin = veci_begin(ws);
1055 int* end = begin + veci_size(ws);
1062 for (i = j = begin; i < end; ){
1063 if (clause_is_lit(*i)){
1065 int Lit = clause_read_lit(*i);
1066 if (var_value(s, lit_var(Lit)) == lit_sign(Lit)){
1072 if (!sat_solver_enqueue(s,clause_read_lit(*i),clause_from_lit(
p))){
1074 (clause_begin(s->
binary))[1] = lit_neg(
p);
1075 (clause_begin(s->
binary))[0] = clause_read_lit(*i++);
1082 clause* c = clause_read(s,*i);
1083 lits = clause_begin(c);
1086 false_lit = lit_neg(
p);
1087 if (lits[0] == false_lit){
1089 lits[1] = false_lit;
1091 assert(lits[1] == false_lit);
1094 if (var_value(s, lit_var(lits[0])) == lit_sign(lits[0]))
1098 lit* stop = lits + clause_size(c);
1100 for (k = lits + 2; k < stop; k++){
1101 if (var_value(s, lit_var(*k)) != !lit_sign(*k)){
1104 veci_push(sat_solver_read_wlist(s,lit_neg(lits[1])),*i);
1111 c->
lbd = sat_clause_compute_lbd(s, c);
1112 if (!sat_solver_enqueue(s,lits[0], *i)){
1125 veci_resize(ws,j - veci_begin(ws));
1142 Sat_MemAlloc_(&s->
Mem, 17);
1144 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1153 veci_new(&s->
order);
1158 veci_new(&s->
stack);
1177 solver_init_activities(s);
1207 Sat_MemAlloc_(&s->
Mem, 15);
1209 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1218 veci_new(&s->
order);
1223 veci_new(&s->
stack);
1242 solver_init_activities(s);
1277 int old_cap = s->
cap;
1279 if ( s->
cap < 50000 )
1302 for (var = s->
size; var < n; var++){
1306 veci_new(&s->
wlists[2*var]);
1308 veci_new(&s->
wlists[2*var+1]);
1334 veci_push(&s->
order,var);
1335 order_update(s, var);
1344 Sat_MemFree_( &s->
Mem );
1347 veci_delete(&s->
order);
1352 veci_delete(&s->
stack);
1366 for (i = 0; i < s->
cap*2; i++)
1367 veci_delete(&s->
wlists[i]);
1392 Sat_MemRestart( &s->
Mem );
1394 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1398 veci_resize(&s->
order, 0);
1399 for ( i = 0; i < s->
size*2; i++ )
1412 solver_init_activities(s);
1438 Sat_MemRestart( &s->
Mem );
1440 s->
hBinary = Sat_MemAppend( &s->
Mem, NULL, 2, 0, 0 );
1444 veci_resize(&s->
order, 0);
1445 for ( i = 0; i < s->
size*2; i++ )
1456 solver_init_activities(s);
1483 for (i = 0; i < s->
cap*2; i++)
1486 Mem += s->
cap *
sizeof(int);
1487 Mem += s->
cap *
sizeof(char);
1488 Mem += s->
cap *
sizeof(char);
1489 Mem += s->
cap *
sizeof(char);
1490 Mem += s->
cap *
sizeof(char);
1495 Mem += s->
cap *
sizeof(double);
1496 Mem += s->
cap *
sizeof(int);
1497 Mem += s->
cap *
sizeof(int);
1498 Mem += s->
cap *
sizeof(
lit);
1499 Mem += s->
cap *
sizeof(int);
1511 Mem += Sat_MemMemoryAll( &s->
Mem );
1517 assert(sat_solver_dl(s) == 0);
1528 int nLearnedOld = veci_size(&s->
act_clas);
1529 int * act_clas = veci_begin(&s->
act_clas);
1530 int * pPerm, * pArray, * pSortValues, nCutoffValue;
1531 int i, k, j, Id, Counter, CounterStart, nSelected;
1535 assert( nLearnedOld == Sat_MemEntryNum(pMem, 1) );
1545 pSortValues =
ABC_ALLOC(
int, nLearnedOld );
1551 pSortValues[Id] = ((7 - Abc_MinInt(c->
lbd, 7)) << 28) | (act_clas[Id] >> 4);
1553 pSortValues[Id] = ((7 - Abc_MinInt(c->
lbd, 7)) << 28);
1554 assert( pSortValues[Id] >= 0 );
1558 CounterStart = nLearnedOld - (s->
nLearntMax / 20);
1565 assert( pSortValues[pPerm[0]] <= pSortValues[pPerm[nLearnedOld-1]] );
1566 nCutoffValue = pSortValues[pPerm[nLearnedOld-nSelected]];
1575 if ( Counter++ > CounterStart || clause_size(c) < 3 || pSortValues[clause_id(c)] > nCutoffValue || s->
reasons[lit_var(c->
lits[0])] == Sat_MemHand(pMem, i, k) )
1576 act_clas[j++] = act_clas[clause_id(c)];
1585 assert( Counter == nLearnedOld );
1590 Counter = Sat_MemCompactLearned( pMem, 0 );
1594 for ( i = 0; i < s->
size; i++ )
1598 if ( clause_is_lit(s->
reasons[i]) )
1600 if ( !clause_learnt_h(pMem, s->
reasons[i]) )
1602 c = clause_read( s, s->
reasons[i] );
1608 for ( i = 0; i < s->
size*2; i++ )
1610 pArray = veci_begin(&s->
wlists[i]);
1611 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1613 if ( clause_is_lit(pArray[k]) )
1614 pArray[j++] = pArray[k];
1615 else if ( !clause_learnt_h(pMem, pArray[k]) )
1616 pArray[j++] = pArray[k];
1619 c = clause_read(s, pArray[k]);
1621 pArray[j++] = clause_id(c);
1624 veci_resize(&s->
wlists[i],j);
1628 Counter = Sat_MemCompactLearned( pMem, 1 );
1632 TimeTotal += Abc_Clock() - clk;
1635 Abc_Print(1,
"reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
1637 Abc_PrintTime( 1,
"Time", TimeTotal );
1647 static int Count = 0;
1652 sat_solver_canceluntil_rollback( s, s->
iTrailPivot );
1661 veci_resize(&s->
order, 0);
1664 if ( var_value(s, i) != varX )
1667 veci_push(&s->
order,i);
1674 cla* pArray = veci_begin(&s->
wlists[i]);
1675 for ( j = k = 0; k < veci_size(&s->
wlists[i]); k++ )
1677 if ( clause_is_lit(pArray[k]) )
1679 if ( clause_read_lit(pArray[k]) < s->
iVarPivot*2 )
1680 pArray[j++] = pArray[k];
1682 else if ( Sat_MemClauseUsed(pMem, pArray[k]) )
1683 pArray[j++] = pArray[k];
1685 veci_resize(&s->
wlists[i],j);
1688 for ( i = 2*s->
iVarPivot; i < 2*s->size; i++ )
1695 Sat_MemRollBack( pMem );
1709 solver_init_activities(s);
1743 for ( i = begin; i < end; i++ )
1744 printf(
"%s%d ", (*i)&1 ?
"!":
"", (*i)>>1 );
1749 for ( i = begin; i < end; i++ )
1755 maxvar = lit_var(*begin);
1756 for (i = begin + 1; i < end; i++){
1758 maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
1759 for (j = i; j > begin && *(j-1) > l; j--)
1777 for (i = j = begin; i < end; i++){
1779 if (*i == lit_neg(last) || var_value(s, lit_var(*i)) == lit_sign(*i))
1781 else if (*i != last && var_value(s, lit_var(*i)) == varX)
1790 return sat_solver_enqueue(s,*begin,0);
1800 for (size = 1, seq = 0; size < x+1; seq++, size = 2*size + 1);
1801 while (size-1 != x){
1802 size = (size-1) >> 1;
1806 return pow(y, (
double)seq);
1812 for ( i = 0; i < 20; i++ )
1813 printf(
"%d ", (
int)
luby(2,i) );
1817static lbool sat_solver_search(
sat_solver* s, ABC_INT64_T nof_conflicts)
1822 ABC_INT64_T conflictC = 0;
1833 veci_new(&learnt_clause);
1857#ifdef SAT_USE_ANALYZE_FINAL
1858 sat_solver_analyze_final(s, hConfl, 0);
1860 veci_delete(&learnt_clause);
1864 veci_resize(&learnt_clause,0);
1865 sat_solver_analyze(s, hConfl, &learnt_clause);
1866 blevel = veci_size(&learnt_clause) > 1 ? var_level(s, lit_var(veci_begin(&learnt_clause)[1])) : s->root_level;
1868 sat_solver_canceluntil(s,blevel);
1869 sat_solver_record(s,&learnt_clause);
1870#ifdef SAT_USE_ANALYZE_FINAL
1872 if ( learnt_clause.
size == 1 )
1873 var_set_level(s, lit_var(learnt_clause.
ptr[0]), 0);
1876 act_clause_decay(s);
1886 veci_delete(&learnt_clause);
1895 veci_delete(&learnt_clause);
1910 next = order_select(s,(
float)random_var_freq);
1915 for (i = 0; i < s->
size; i++)
1918 veci_delete(&learnt_clause);
1931 if ( var_polar(s, next) )
1932 sat_solver_decision(s,toLit(next));
1934 sat_solver_decision(s,lit_neg(toLit(next)));
1945 int restart_iter = 0;
1950 printf(
"==================================[MINISAT]===================================\n");
1951 printf(
"| Conflicts | ORIGINAL | LEARNT | Progress |\n");
1952 printf(
"| | Clauses Literals | Limit Clauses Literals Lit/Cl | |\n");
1953 printf(
"==============================================================================\n");
1957 ABC_INT64_T nof_conflicts;
1964 printf(
"| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %6.3f %% |\n",
1975 nof_conflicts = (ABC_INT64_T)( 100 *
luby(2, restart_iter++) );
1976 status = sat_solver_search(s, nof_conflicts);
1988 printf(
"==============================================================================\n");
2007 if (!sat_solver_enqueue(s,
p,0))
2012 if (clause_is_lit(h))
2014 (clause_begin(s->
binary))[1] = lit_neg(
p);
2015 (clause_begin(s->
binary))[0] = clause_read_lit(h);
2018 sat_solver_analyze_final(s, h, 1);
2026 if (var_level(s, lit_var(
p)) > 0)
2036 sat_solver_analyze_final(s, fConfl, 0);
2047 assert( sat_solver_dl(s) > 0 );
2090#ifdef SAT_USE_ANALYZE_FINAL
2093 for ( i = begin; i < end; i++ )
2096 sat_solver_canceluntil(s,0);
2103 for (i = begin; i < end; i++){
2105 switch (var_value(s, *i)) {
2109 sat_solver_decision(s, *i);
2114 sat_solver_canceluntil(s, 0);
2123 sat_solver_canceluntil(s,0);
2145 int i, iLitFail = -1;
2149 sat_solver_set_literal_polarity( s, pLits, nLits );
2157 for ( i = 0; i < nLits; i++ )
2158 if ( pLits[i] != sat_solver_var_literal(s, Abc_Lit2Var(pLits[i])) )
2165 for ( i = 0; i <= iLitFail; i++ )
2168 if ( i < iLitFail + 1 )
2176 if ( iLitFail + 1 < nLits )
2182 assert( Abc_LitIsCompl(pLits[iLitFail]) );
2187 pLits[iLitFail] = Abc_LitNot(pLits[iLitFail]);
2189 printf(
"sat_solver_solve_lexsat(): A satisfying assignment should exist.\n" );
2191 for ( i = iLitFail + 1; i < nLits; i++ )
2192 pLits[i] = Abc_LitNot( Abc_LitRegular(pLits[i]) );
2194 if ( iLitFail + 1 < nLits )
2200 for ( i = iLitFail; i >= 0; i-- )
2211 int i, k, nLitsL, nLitsR, nResL, nResR, status;
2219 return (
int)(status !=
l_False);
2223 nLitsR = nLits - nLitsL;
2225 for ( i = 0; i < nLitsL; i++ )
2228 for ( k = i; k >= 0; k-- )
2237 for ( i = 0; i < nLitsL; i++ )
2243 for ( i = 0; i < nLitsL; i++ )
2250 for ( i = 0; i < nLitsL; i++ )
2252 for ( i = 0; i < nResL; i++ )
2253 pLits[i] = pLits[nLitsL+i];
2254 for ( i = 0; i < nLitsL; i++ )
2257 for ( i = 0; i < nResL; i++ )
2260 for ( k = i; k >= 0; k-- )
2269 for ( i = 0; i < nResL; i++ )
2275 for ( i = 0; i < nResL; i++ )
2277 return nResL + nResR;
2286 int i, k, nLitsL, nLitsR, nResL, nResR;
2291 int RetValue = 1, LitNot = Abc_LitNot(pLits[0]);
2308 return (
int)(status !=
l_False);
2312 nLitsR = nLits - nLitsL;
2314 for ( i = 0; i < nLitsL; i++ )
2317 for ( k = i; k >= 0; k-- )
2321 for ( k = i+1; k > nLitsL; k++ )
2323 int LitNot = Abc_LitNot(pLits[i]);
2332 for ( i = 0; i < nLitsL; i++ )
2337 for ( i = 0; i < nLitsL; i++ )
2339 for ( i = 0; i < nResL; i++ )
2340 pLits[i] = pLits[nLitsL+i];
2341 for ( i = 0; i < nLitsL; i++ )
2344 for ( i = 0; i < nResL; i++ )
2347 for ( k = i; k >= 0; k-- )
2351 for ( k = i+1; k > nResL; k++ )
2353 int LitNot = Abc_LitNot(pLits[i]);
2362 for ( i = 0; i < nResL; i++ )
2364 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
#define sat_solver_addclause
#define sat_solver_addvar
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
sat_solver * sat_solver_new(void)
int sat_solver_get_var_value(sat_solver *s, int v)
int sat_solver_store_change_last(sat_solver *s)
int sat_solver_solve_internal(sat_solver *s)
void sat_solver_store_mark_clauses_a(sat_solver *s)
int sat_solver_simplify(sat_solver *s)
void sat_solver_restart(sat_solver *s)
int sat_solver_nconflicts(sat_solver *s)
void sat_solver_store_free(sat_solver *s)
int sat_solver_nclauses(sat_solver *s)
void zsat_solver_restart_seed(sat_solver *s, double seed)
void sat_solver_store_write(sat_solver *s, char *pFileName)
void sat_solver_set_var_activity(sat_solver *s, int *pVars, int nVars)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_store_alloc(sat_solver *s)
int sat_solver_nvars(sat_solver *s)
void sat_solver_rollback(sat_solver *s)
sat_solver * zsat_solver_new_seed(double seed)
int sat_solver_push(sat_solver *s, int p)
int sat_solver_clause_new(sat_solver *s, lit *begin, lit *end, int learnt)
int sat_solver_propagate(sat_solver *s)
void sat_solver_store_mark_roots(sat_solver *s)
int sat_solver_count_assigned(sat_solver *s)
void sat_solver_pop(sat_solver *s)
double luby(double y, int x)
void * sat_solver_store_release(sat_solver *s)
int sat_solver_minimize_assumptions2(sat_solver *s, int *pLits, int nLits, int nConfLimit)
void sat_solver_set_resource_limits(sat_solver *s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
void sat_solver_reducedb(sat_solver *s)
void sat_solver_delete(sat_solver *s)
int sat_solver_solve_lexsat(sat_solver *s, int *pLits, int nLits)
int sat_solver_minimize_assumptions(sat_solver *s, int *pLits, int nLits, int nConfLimit)
double sat_solver_memory(sat_solver *s)
void Sto_ManMarkClausesA(Sto_Man_t *p)
Sto_Man_t * Sto_ManAlloc()
MACRO DEFINITIONS ///.
void Sto_ManDumpClauses(Sto_Man_t *p, char *pFileName)
int Sto_ManAddClause(Sto_Man_t *p, lit *pBeg, lit *pEnd)
int Sto_ManChangeLastClause(Sto_Man_t *p)
void Sto_ManFree(Sto_Man_t *p)
void Sto_ManMarkRoots(Sto_Man_t *p)
struct Sto_Man_t_ Sto_Man_t
int(* pCnfFunc)(void *p, int)
ABC_INT64_T learnts_literals
ABC_INT64_T clauses_literals
ABC_NAMESPACE_HEADER_START typedef word xdbl
STRUCTURE DEFINITIONS ///.