PageRenderTime 121ms CodeModel.GetById 36ms RepoModel.GetById 5ms app.codeStats 0ms

/src/sat/bsat/satSolver.c

https://bitbucket.org/alanmi/abc/
C | 2043 lines | 1504 code | 236 blank | 303 comment | 378 complexity | 4a8eda7cf59a8867715e777ee1598ca1 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. /**************************************************************************************************
  2. MiniSat -- Copyright (c) 2005, Niklas Sorensson
  3. http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/
  4. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
  5. associated documentation files (the "Software"), to deal in the Software without restriction,
  6. including without limitation the rights to use, copy, modify, merge, publish, distribute,
  7. sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in all copies or
  10. substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
  12. NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  13. NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  14. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
  15. OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  16. **************************************************************************************************/
  17. // Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko
  18. #include <stdio.h>
  19. #include <assert.h>
  20. #include <string.h>
  21. #include <math.h>
  22. #include "satSolver.h"
  23. #include "satStore.h"
  24. ABC_NAMESPACE_IMPL_START
  25. #define SAT_USE_ANALYZE_FINAL
  26. //=================================================================================================
  27. // Debug:
  28. //#define VERBOSEDEBUG
  29. // For derivation output (verbosity level 2)
  30. #define L_IND "%-*d"
  31. #define L_ind sat_solver_dl(s)*2+2,sat_solver_dl(s)
  32. #define L_LIT "%sx%d"
  33. #define L_lit(p) lit_sign(p)?"~":"", (lit_var(p))
  34. // Just like 'assert()' but expression will be evaluated in the release version as well.
  35. static inline void check(int expr) { assert(expr); }
  36. static void printlits(lit* begin, lit* end)
  37. {
  38. int i;
  39. for (i = 0; i < end - begin; i++)
  40. printf(L_LIT" ",L_lit(begin[i]));
  41. }
  42. //=================================================================================================
  43. // Random numbers:
  44. // Returns a random float 0 <= x < 1. Seed must never be 0.
  45. static inline double drand(double* seed) {
  46. int q;
  47. *seed *= 1389796;
  48. q = (int)(*seed / 2147483647);
  49. *seed -= (double)q * 2147483647;
  50. return *seed / 2147483647; }
  51. // Returns a random integer 0 <= x < size. Seed must never be 0.
  52. static inline int irand(double* seed, int size) {
  53. return (int)(drand(seed) * size); }
  54. //=================================================================================================
  55. // Variable datatype + minor functions:
  56. static const int var0 = 1;
  57. static const int var1 = 0;
  58. static const int varX = 3;
  59. struct varinfo_t
  60. {
  61. unsigned val : 2; // variable value
  62. unsigned pol : 1; // last polarity
  63. unsigned tag : 1; // conflict analysis tag
  64. unsigned lev : 28; // variable level
  65. };
  66. static inline int var_level (sat_solver* s, int v) { return s->levels[v]; }
  67. static inline int var_value (sat_solver* s, int v) { return s->assigns[v]; }
  68. static inline int var_polar (sat_solver* s, int v) { return s->polarity[v]; }
  69. static inline void var_set_level (sat_solver* s, int v, int lev) { s->levels[v] = lev; }
  70. static inline void var_set_value (sat_solver* s, int v, int val) { s->assigns[v] = val; }
  71. static inline void var_set_polar (sat_solver* s, int v, int pol) { s->polarity[v] = pol; }
  72. // variable tags
  73. static inline int var_tag (sat_solver* s, int v) { return s->tags[v]; }
  74. static inline void var_set_tag (sat_solver* s, int v, int tag) {
  75. assert( tag > 0 && tag < 16 );
  76. if ( s->tags[v] == 0 )
  77. veci_push( &s->tagged, v );
  78. s->tags[v] = tag;
  79. }
  80. static inline void var_add_tag (sat_solver* s, int v, int tag) {
  81. assert( tag > 0 && tag < 16 );
  82. if ( s->tags[v] == 0 )
  83. veci_push( &s->tagged, v );
  84. s->tags[v] |= tag;
  85. }
  86. static inline void solver2_clear_tags(sat_solver* s, int start) {
  87. int i, * tagged = veci_begin(&s->tagged);
  88. for (i = start; i < veci_size(&s->tagged); i++)
  89. s->tags[tagged[i]] = 0;
  90. veci_resize(&s->tagged,start);
  91. }
  92. int sat_solver_get_var_value(sat_solver* s, int v)
  93. {
  94. if ( var_value(s, v) == var0 )
  95. return l_False;
  96. if ( var_value(s, v) == var1 )
  97. return l_True;
  98. if ( var_value(s, v) == varX )
  99. return l_Undef;
  100. assert( 0 );
  101. return 0;
  102. }
  103. //=================================================================================================
  104. // Simple helpers:
  105. static inline int sat_solver_dl(sat_solver* s) { return veci_size(&s->trail_lim); }
  106. static inline veci* sat_solver_read_wlist(sat_solver* s, lit l) { return &s->wlists[l]; }
  107. //=================================================================================================
  108. // Variable order functions:
  109. static inline void order_update(sat_solver* s, int v) // updateorder
  110. {
  111. int* orderpos = s->orderpos;
  112. int* heap = veci_begin(&s->order);
  113. int i = orderpos[v];
  114. int x = heap[i];
  115. int parent = (i - 1) / 2;
  116. assert(s->orderpos[v] != -1);
  117. while (i != 0 && s->activity[x] > s->activity[heap[parent]]){
  118. heap[i] = heap[parent];
  119. orderpos[heap[i]] = i;
  120. i = parent;
  121. parent = (i - 1) / 2;
  122. }
  123. heap[i] = x;
  124. orderpos[x] = i;
  125. }
  126. static inline void order_assigned(sat_solver* s, int v)
  127. {
  128. }
  129. static inline void order_unassigned(sat_solver* s, int v) // undoorder
  130. {
  131. int* orderpos = s->orderpos;
  132. if (orderpos[v] == -1){
  133. orderpos[v] = veci_size(&s->order);
  134. veci_push(&s->order,v);
  135. order_update(s,v);
  136. //printf( "+%d ", v );
  137. }
  138. }
  139. static inline int order_select(sat_solver* s, float random_var_freq) // selectvar
  140. {
  141. int* heap = veci_begin(&s->order);
  142. int* orderpos = s->orderpos;
  143. // Random decision:
  144. if (drand(&s->random_seed) < random_var_freq){
  145. int next = irand(&s->random_seed,s->size);
  146. assert(next >= 0 && next < s->size);
  147. if (var_value(s, next) == varX)
  148. return next;
  149. }
  150. // Activity based decision:
  151. while (veci_size(&s->order) > 0){
  152. int next = heap[0];
  153. int size = veci_size(&s->order)-1;
  154. int x = heap[size];
  155. veci_resize(&s->order,size);
  156. orderpos[next] = -1;
  157. if (size > 0){
  158. int i = 0;
  159. int child = 1;
  160. while (child < size){
  161. if (child+1 < size && s->activity[heap[child]] < s->activity[heap[child+1]])
  162. child++;
  163. assert(child < size);
  164. if (s->activity[x] >= s->activity[heap[child]])
  165. break;
  166. heap[i] = heap[child];
  167. orderpos[heap[i]] = i;
  168. i = child;
  169. child = 2 * child + 1;
  170. }
  171. heap[i] = x;
  172. orderpos[heap[i]] = i;
  173. }
  174. if (var_value(s, next) == varX)
  175. return next;
  176. }
  177. return var_Undef;
  178. }
  179. void sat_solver_set_var_activity(sat_solver* s, int * pVars, int nVars)
  180. {
  181. int i;
  182. for (i = 0; i < s->size; i++)
  183. s->activity[i] = 0;
  184. s->var_inc = 1;
  185. for ( i = 0; i < nVars; i++ )
  186. {
  187. int iVar = pVars ? pVars[i] : i;
  188. s->activity[iVar] = nVars-i;
  189. order_update( s, iVar );
  190. }
  191. }
  192. //=================================================================================================
  193. // Activity functions:
  194. #ifdef USE_FLOAT_ACTIVITY
  195. static inline void act_var_rescale(sat_solver* s) {
  196. double* activity = s->activity;
  197. int i;
  198. for (i = 0; i < s->size; i++)
  199. activity[i] *= 1e-100;
  200. s->var_inc *= 1e-100;
  201. }
  202. static inline void act_clause_rescale(sat_solver* s) {
  203. // static abctime Total = 0;
  204. clause** cs = (clause**)veci_begin(&s->learnts);
  205. int i;//, clk = Abc_Clock();
  206. for (i = 0; i < veci_size(&s->learnts); i++){
  207. float a = clause_activity(cs[i]);
  208. clause_setactivity(cs[i], a * (float)1e-20);
  209. }
  210. s->cla_inc *= (float)1e-20;
  211. Total += Abc_Clock() - clk;
  212. // printf( "Rescaling... Cla inc = %10.3f Conf = %10d ", s->cla_inc, s->stats.conflicts );
  213. // Abc_PrintTime( 1, "Time", Total );
  214. }
  215. static inline void act_var_bump(sat_solver* s, int v) {
  216. s->activity[v] += s->var_inc;
  217. if (s->activity[v] > 1e100)
  218. act_var_rescale(s);
  219. if (s->orderpos[v] != -1)
  220. order_update(s,v);
  221. }
  222. static inline void act_var_bump_global(sat_solver* s, int v) {
  223. if ( !s->pGlobalVars )
  224. return;
  225. s->activity[v] += (s->var_inc * 3.0 * s->pGlobalVars[v]);
  226. if (s->activity[v] > 1e100)
  227. act_var_rescale(s);
  228. if (s->orderpos[v] != -1)
  229. order_update(s,v);
  230. }
  231. static inline void act_var_bump_factor(sat_solver* s, int v) {
  232. if ( !s->factors )
  233. return;
  234. s->activity[v] += (s->var_inc * s->factors[v]);
  235. if (s->activity[v] > 1e100)
  236. act_var_rescale(s);
  237. if (s->orderpos[v] != -1)
  238. order_update(s,v);
  239. }
  240. static inline void act_clause_bump(sat_solver* s, clause *c) {
  241. float a = clause_activity(c) + s->cla_inc;
  242. clause_setactivity(c,a);
  243. if (a > 1e20) act_clause_rescale(s);
  244. }
  245. static inline void act_var_decay(sat_solver* s) { s->var_inc *= s->var_decay; }
  246. static inline void act_clause_decay(sat_solver* s) { s->cla_inc *= s->cla_decay; }
  247. #else
  248. static inline void act_var_rescale(sat_solver* s) {
  249. unsigned* activity = s->activity;
  250. int i;
  251. for (i = 0; i < s->size; i++)
  252. activity[i] >>= 19;
  253. s->var_inc >>= 19;
  254. s->var_inc = Abc_MaxInt( s->var_inc, (1<<4) );
  255. }
  256. static inline void act_clause_rescale(sat_solver* s) {
  257. static abctime Total = 0;
  258. abctime clk = Abc_Clock();
  259. unsigned* activity = (unsigned *)veci_begin(&s->act_clas);
  260. int i;
  261. for (i = 0; i < veci_size(&s->act_clas); i++)
  262. activity[i] >>= 14;
  263. s->cla_inc >>= 14;
  264. s->cla_inc = Abc_MaxInt( s->cla_inc, (1<<10) );
  265. Total += Abc_Clock() - clk;
  266. // printf( "Rescaling... Cla inc = %5d Conf = %10d ", s->cla_inc, s->stats.conflicts );
  267. // Abc_PrintTime( 1, "Time", Total );
  268. }
  269. static inline void act_var_bump(sat_solver* s, int v) {
  270. s->activity[v] += s->var_inc;
  271. if (s->activity[v] & 0x80000000)
  272. act_var_rescale(s);
  273. if (s->orderpos[v] != -1)
  274. order_update(s,v);
  275. }
  276. static inline void act_var_bump_global(sat_solver* s, int v) {
  277. if ( !s->pGlobalVars )
  278. return;
  279. s->activity[v] += (int)(s->var_inc * 3 * s->pGlobalVars[v]);
  280. if (s->activity[v] & 0x80000000)
  281. act_var_rescale(s);
  282. if (s->orderpos[v] != -1)
  283. order_update(s,v);
  284. }
  285. static inline void act_var_bump_factor(sat_solver* s, int v) {
  286. if ( !s->factors )
  287. return;
  288. s->activity[v] += (int)(s->var_inc * s->factors[v]);
  289. if (s->activity[v] & 0x80000000)
  290. act_var_rescale(s);
  291. if (s->orderpos[v] != -1)
  292. order_update(s,v);
  293. }
  294. static inline void act_clause_bump(sat_solver* s, clause*c) {
  295. unsigned* act = (unsigned *)veci_begin(&s->act_clas) + c->lits[c->size];
  296. *act += s->cla_inc;
  297. if ( *act & 0x80000000 )
  298. act_clause_rescale(s);
  299. }
  300. static inline void act_var_decay(sat_solver* s) { s->var_inc += (s->var_inc >> 4); }
  301. static inline void act_clause_decay(sat_solver* s) { s->cla_inc += (s->cla_inc >> 10); }
  302. #endif
  303. //=================================================================================================
  304. // Sorting functions (sigh):
  305. static inline void selectionsort(void** array, int size, int(*comp)(const void *, const void *))
  306. {
  307. int i, j, best_i;
  308. void* tmp;
  309. for (i = 0; i < size-1; i++){
  310. best_i = i;
  311. for (j = i+1; j < size; j++){
  312. if (comp(array[j], array[best_i]) < 0)
  313. best_i = j;
  314. }
  315. tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
  316. }
  317. }
  318. static void sortrnd(void** array, int size, int(*comp)(const void *, const void *), double* seed)
  319. {
  320. if (size <= 15)
  321. selectionsort(array, size, comp);
  322. else{
  323. void* pivot = array[irand(seed, size)];
  324. void* tmp;
  325. int i = -1;
  326. int j = size;
  327. for(;;){
  328. do i++; while(comp(array[i], pivot)<0);
  329. do j--; while(comp(pivot, array[j])<0);
  330. if (i >= j) break;
  331. tmp = array[i]; array[i] = array[j]; array[j] = tmp;
  332. }
  333. sortrnd(array , i , comp, seed);
  334. sortrnd(&array[i], size-i, comp, seed);
  335. }
  336. }
  337. //=================================================================================================
  338. // Clause functions:
  339. static inline int sat_clause_compute_lbd( sat_solver* s, clause* c )
  340. {
  341. int i, lev, minl = 0, lbd = 0;
  342. for (i = 0; i < (int)c->size; i++)
  343. {
  344. lev = var_level(s, lit_var(c->lits[i]));
  345. if ( !(minl & (1 << (lev & 31))) )
  346. {
  347. minl |= 1 << (lev & 31);
  348. lbd++;
  349. // printf( "%d ", lev );
  350. }
  351. }
  352. // printf( " -> %d\n", lbd );
  353. return lbd;
  354. }
  355. /* pre: size > 1 && no variable occurs twice
  356. */
  357. int sat_solver_clause_new(sat_solver* s, lit* begin, lit* end, int learnt)
  358. {
  359. int fUseBinaryClauses = 1;
  360. int size;
  361. clause* c;
  362. int h;
  363. assert(end - begin > 1);
  364. assert(learnt >= 0 && learnt < 2);
  365. size = end - begin;
  366. // do not allocate memory for the two-literal problem clause
  367. if ( fUseBinaryClauses && size == 2 && !learnt )
  368. {
  369. veci_push(sat_solver_read_wlist(s,lit_neg(begin[0])),(clause_from_lit(begin[1])));
  370. veci_push(sat_solver_read_wlist(s,lit_neg(begin[1])),(clause_from_lit(begin[0])));
  371. s->stats.clauses++;
  372. s->stats.clauses_literals += size;
  373. return 0;
  374. }
  375. // create new clause
  376. // h = Vec_SetAppend( &s->Mem, NULL, size + learnt + 1 + 1 ) << 1;
  377. h = Sat_MemAppend( &s->Mem, begin, size, learnt, 0 );
  378. assert( !(h & 1) );
  379. if ( s->hLearnts == -1 && learnt )
  380. s->hLearnts = h;
  381. if (learnt)
  382. {
  383. c = clause_read( s, h );
  384. c->lbd = sat_clause_compute_lbd( s, c );
  385. assert( clause_id(c) == veci_size(&s->act_clas) );
  386. // veci_push(&s->learned, h);
  387. // act_clause_bump(s,clause_read(s, h));
  388. veci_push(&s->act_clas, (1<<10));
  389. s->stats.learnts++;
  390. s->stats.learnts_literals += size;
  391. }
  392. else
  393. {
  394. s->stats.clauses++;
  395. s->stats.clauses_literals += size;
  396. }
  397. assert(begin[0] >= 0);
  398. assert(begin[0] < s->size*2);
  399. assert(begin[1] >= 0);
  400. assert(begin[1] < s->size*2);
  401. assert(lit_neg(begin[0]) < s->size*2);
  402. assert(lit_neg(begin[1]) < s->size*2);
  403. //veci_push(sat_solver_read_wlist(s,lit_neg(begin[0])),c);
  404. //veci_push(sat_solver_read_wlist(s,lit_neg(begin[1])),c);
  405. veci_push(sat_solver_read_wlist(s,lit_neg(begin[0])),(size > 2 ? h : clause_from_lit(begin[1])));
  406. veci_push(sat_solver_read_wlist(s,lit_neg(begin[1])),(size > 2 ? h : clause_from_lit(begin[0])));
  407. return h;
  408. }
  409. //=================================================================================================
  410. // Minor (solver) functions:
  411. static inline int sat_solver_enqueue(sat_solver* s, lit l, int from)
  412. {
  413. int v = lit_var(l);
  414. if ( s->pFreqs[v] == 0 )
  415. // {
  416. s->pFreqs[v] = 1;
  417. // s->nVarUsed++;
  418. // }
  419. #ifdef VERBOSEDEBUG
  420. printf(L_IND"enqueue("L_LIT")\n", L_ind, L_lit(l));
  421. #endif
  422. if (var_value(s, v) != varX)
  423. return var_value(s, v) == lit_sign(l);
  424. else{
  425. /*
  426. if ( s->pCnfFunc )
  427. {
  428. if ( lit_sign(l) )
  429. {
  430. if ( (s->loads[v] & 1) == 0 )
  431. {
  432. s->loads[v] ^= 1;
  433. s->pCnfFunc( s->pCnfMan, l );
  434. }
  435. }
  436. else
  437. {
  438. if ( (s->loads[v] & 2) == 0 )
  439. {
  440. s->loads[v] ^= 2;
  441. s->pCnfFunc( s->pCnfMan, l );
  442. }
  443. }
  444. }
  445. */
  446. // New fact -- store it.
  447. #ifdef VERBOSEDEBUG
  448. printf(L_IND"bind("L_LIT")\n", L_ind, L_lit(l));
  449. #endif
  450. var_set_value(s, v, lit_sign(l));
  451. var_set_level(s, v, sat_solver_dl(s));
  452. s->reasons[v] = from;
  453. s->trail[s->qtail++] = l;
  454. order_assigned(s, v);
  455. return true;
  456. }
  457. }
  458. static inline int sat_solver_decision(sat_solver* s, lit l){
  459. assert(s->qtail == s->qhead);
  460. assert(var_value(s, lit_var(l)) == varX);
  461. #ifdef VERBOSEDEBUG
  462. printf(L_IND"assume("L_LIT") ", L_ind, L_lit(l));
  463. printf( "act = %.20f\n", s->activity[lit_var(l)] );
  464. #endif
  465. veci_push(&s->trail_lim,s->qtail);
  466. return sat_solver_enqueue(s,l,0);
  467. }
  468. static void sat_solver_canceluntil(sat_solver* s, int level) {
  469. int bound;
  470. int lastLev;
  471. int c;
  472. if (sat_solver_dl(s) <= level)
  473. return;
  474. assert( veci_size(&s->trail_lim) > 0 );
  475. bound = (veci_begin(&s->trail_lim))[level];
  476. lastLev = (veci_begin(&s->trail_lim))[veci_size(&s->trail_lim)-1];
  477. ////////////////////////////////////////
  478. // added to cancel all assignments
  479. // if ( level == -1 )
  480. // bound = 0;
  481. ////////////////////////////////////////
  482. for (c = s->qtail-1; c >= bound; c--) {
  483. int x = lit_var(s->trail[c]);
  484. var_set_value(s, x, varX);
  485. s->reasons[x] = 0;
  486. if ( c < lastLev )
  487. var_set_polar( s, x, !lit_sign(s->trail[c]) );
  488. }
  489. //printf( "\n" );
  490. for (c = s->qhead-1; c >= bound; c--)
  491. order_unassigned(s,lit_var(s->trail[c]));
  492. s->qhead = s->qtail = bound;
  493. veci_resize(&s->trail_lim,level);
  494. }
  495. static void sat_solver_canceluntil_rollback(sat_solver* s, int NewBound) {
  496. int c, x;
  497. assert( sat_solver_dl(s) == 0 );
  498. assert( s->qtail == s->qhead );
  499. assert( s->qtail >= NewBound );
  500. for (c = s->qtail-1; c >= NewBound; c--)
  501. {
  502. x = lit_var(s->trail[c]);
  503. var_set_value(s, x, varX);
  504. s->reasons[x] = 0;
  505. }
  506. for (c = s->qhead-1; c >= NewBound; c--)
  507. order_unassigned(s,lit_var(s->trail[c]));
  508. s->qhead = s->qtail = NewBound;
  509. }
  510. static void sat_solver_record(sat_solver* s, veci* cls)
  511. {
  512. lit* begin = veci_begin(cls);
  513. lit* end = begin + veci_size(cls);
  514. int h = (veci_size(cls) > 1) ? sat_solver_clause_new(s,begin,end,1) : 0;
  515. sat_solver_enqueue(s,*begin,h);
  516. assert(veci_size(cls) > 0);
  517. if ( h == 0 )
  518. veci_push( &s->unit_lits, *begin );
  519. ///////////////////////////////////
  520. // add clause to internal storage
  521. if ( s->pStore )
  522. {
  523. int RetValue = Sto_ManAddClause( (Sto_Man_t *)s->pStore, begin, end );
  524. assert( RetValue );
  525. (void) RetValue;
  526. }
  527. ///////////////////////////////////
  528. /*
  529. if (h != 0) {
  530. act_clause_bump(s,clause_read(s, h));
  531. s->stats.learnts++;
  532. s->stats.learnts_literals += veci_size(cls);
  533. }
  534. */
  535. }
  536. int sat_solver_count_assigned(sat_solver* s)
  537. {
  538. // count top-level assignments
  539. int i, Count = 0;
  540. assert(sat_solver_dl(s) == 0);
  541. for ( i = 0; i < s->size; i++ )
  542. if (var_value(s, i) != varX)
  543. Count++;
  544. return Count;
  545. }
  546. static double sat_solver_progress(sat_solver* s)
  547. {
  548. int i;
  549. double progress = 0;
  550. double F = 1.0 / s->size;
  551. for (i = 0; i < s->size; i++)
  552. if (var_value(s, i) != varX)
  553. progress += pow(F, var_level(s, i));
  554. return progress / s->size;
  555. }
  556. //=================================================================================================
  557. // Major methods:
  558. static int sat_solver_lit_removable(sat_solver* s, int x, int minl)
  559. {
  560. int top = veci_size(&s->tagged);
  561. assert(s->reasons[x] != 0);
  562. veci_resize(&s->stack,0);
  563. veci_push(&s->stack,x);
  564. while (veci_size(&s->stack)){
  565. int v = veci_pop(&s->stack);
  566. assert(s->reasons[v] != 0);
  567. if (clause_is_lit(s->reasons[v])){
  568. v = lit_var(clause_read_lit(s->reasons[v]));
  569. if (!var_tag(s,v) && var_level(s, v)){
  570. if (s->reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
  571. veci_push(&s->stack,v);
  572. var_set_tag(s, v, 1);
  573. }else{
  574. solver2_clear_tags(s, top);
  575. return 0;
  576. }
  577. }
  578. }else{
  579. clause* c = clause_read(s, s->reasons[v]);
  580. lit* lits = clause_begin(c);
  581. int i;
  582. for (i = 1; i < clause_size(c); i++){
  583. int v = lit_var(lits[i]);
  584. if (!var_tag(s,v) && var_level(s, v)){
  585. if (s->reasons[v] != 0 && ((1 << (var_level(s, v) & 31)) & minl)){
  586. veci_push(&s->stack,lit_var(lits[i]));
  587. var_set_tag(s, v, 1);
  588. }else{
  589. solver2_clear_tags(s, top);
  590. return 0;
  591. }
  592. }
  593. }
  594. }
  595. }
  596. return 1;
  597. }
  598. /*_________________________________________________________________________________________________
  599. |
  600. | analyzeFinal : (p : Lit) -> [void]
  601. |
  602. | Description:
  603. | Specialized analysis procedure to express the final conflict in terms of assumptions.
  604. | Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and
  605. | stores the result in 'out_conflict'.
  606. |________________________________________________________________________________________________@*/
  607. /*
  608. void Solver::analyzeFinal(Clause* confl, bool skip_first)
  609. {
  610. // -- NOTE! This code is relatively untested. Please report bugs!
  611. conflict.clear();
  612. if (root_level == 0) return;
  613. vec<char>& seen = analyze_seen;
  614. for (int i = skip_first ? 1 : 0; i < confl->size(); i++){
  615. Var x = var((*confl)[i]);
  616. if (level[x] > 0)
  617. seen[x] = 1;
  618. }
  619. int start = (root_level >= trail_lim.size()) ? trail.size()-1 : trail_lim[root_level];
  620. for (int i = start; i >= trail_lim[0]; i--){
  621. Var x = var(trail[i]);
  622. if (seen[x]){
  623. GClause r = reason[x];
  624. if (r == GClause_NULL){
  625. assert(level[x] > 0);
  626. conflict.push(~trail[i]);
  627. }else{
  628. if (r.isLit()){
  629. Lit p = r.lit();
  630. if (level[var(p)] > 0)
  631. seen[var(p)] = 1;
  632. }else{
  633. Clause& c = *r.clause();
  634. for (int j = 1; j < c.size(); j++)
  635. if (level[var(c[j])] > 0)
  636. seen[var(c[j])] = 1;
  637. }
  638. }
  639. seen[x] = 0;
  640. }
  641. }
  642. }
  643. */
  644. #ifdef SAT_USE_ANALYZE_FINAL
  645. static void sat_solver_analyze_final(sat_solver* s, int hConf, int skip_first)
  646. {
  647. clause* conf = clause_read(s, hConf);
  648. int i, j, start;
  649. veci_resize(&s->conf_final,0);
  650. if ( s->root_level == 0 )
  651. return;
  652. assert( veci_size(&s->tagged) == 0 );
  653. // assert( s->tags[lit_var(p)] == l_Undef );
  654. // s->tags[lit_var(p)] = l_True;
  655. for (i = skip_first ? 1 : 0; i < clause_size(conf); i++)
  656. {
  657. int x = lit_var(clause_begin(conf)[i]);
  658. if (var_level(s, x) > 0)
  659. var_set_tag(s, x, 1);
  660. }
  661. start = (s->root_level >= veci_size(&s->trail_lim))? s->qtail-1 : (veci_begin(&s->trail_lim))[s->root_level];
  662. for (i = start; i >= (veci_begin(&s->trail_lim))[0]; i--){
  663. int x = lit_var(s->trail[i]);
  664. if (var_tag(s,x)){
  665. if (s->reasons[x] == 0){
  666. assert(var_level(s, x) > 0);
  667. veci_push(&s->conf_final,lit_neg(s->trail[i]));
  668. }else{
  669. if (clause_is_lit(s->reasons[x])){
  670. lit q = clause_read_lit(s->reasons[x]);
  671. assert(lit_var(q) >= 0 && lit_var(q) < s->size);
  672. if (var_level(s, lit_var(q)) > 0)
  673. var_set_tag(s, lit_var(q), 1);
  674. }
  675. else{
  676. clause* c = clause_read(s, s->reasons[x]);
  677. int* lits = clause_begin(c);
  678. for (j = 1; j < clause_size(c); j++)
  679. if (var_level(s, lit_var(lits[j])) > 0)
  680. var_set_tag(s, lit_var(lits[j]), 1);
  681. }
  682. }
  683. }
  684. }
  685. solver2_clear_tags(s,0);
  686. }
  687. #endif
  688. static void sat_solver_analyze(sat_solver* s, int h, veci* learnt)
  689. {
  690. lit* trail = s->trail;
  691. int cnt = 0;
  692. lit p = lit_Undef;
  693. int ind = s->qtail-1;
  694. lit* lits;
  695. int i, j, minl;
  696. veci_push(learnt,lit_Undef);
  697. do{
  698. assert(h != 0);
  699. if (clause_is_lit(h)){
  700. int x = lit_var(clause_read_lit(h));
  701. if (var_tag(s, x) == 0 && var_level(s, x) > 0){
  702. var_set_tag(s, x, 1);
  703. act_var_bump(s,x);
  704. if (var_level(s, x) == sat_solver_dl(s))
  705. cnt++;
  706. else
  707. veci_push(learnt,clause_read_lit(h));
  708. }
  709. }else{
  710. clause* c = clause_read(s, h);
  711. if (clause_learnt(c))
  712. act_clause_bump(s,c);
  713. lits = clause_begin(c);
  714. //printlits(lits,lits+clause_size(c)); printf("\n");
  715. for (j = (p == lit_Undef ? 0 : 1); j < clause_size(c); j++){
  716. int x = lit_var(lits[j]);
  717. if (var_tag(s, x) == 0 && var_level(s, x) > 0){
  718. var_set_tag(s, x, 1);
  719. act_var_bump(s,x);
  720. // bump variables propaged by the LBD=2 clause
  721. // if ( s->reasons[x] && clause_read(s, s->reasons[x])->lbd <= 2 )
  722. // act_var_bump(s,x);
  723. if (var_level(s,x) == sat_solver_dl(s))
  724. cnt++;
  725. else
  726. veci_push(learnt,lits[j]);
  727. }
  728. }
  729. }
  730. while ( !var_tag(s, lit_var(trail[ind--])) );
  731. p = trail[ind+1];
  732. h = s->reasons[lit_var(p)];
  733. cnt--;
  734. }while (cnt > 0);
  735. *veci_begin(learnt) = lit_neg(p);
  736. lits = veci_begin(learnt);
  737. minl = 0;
  738. for (i = 1; i < veci_size(learnt); i++){
  739. int lev = var_level(s, lit_var(lits[i]));
  740. minl |= 1 << (lev & 31);
  741. }
  742. // simplify (full)
  743. for (i = j = 1; i < veci_size(learnt); i++){
  744. if (s->reasons[lit_var(lits[i])] == 0 || !sat_solver_lit_removable(s,lit_var(lits[i]),minl))
  745. lits[j++] = lits[i];
  746. }
  747. // update size of learnt + statistics
  748. veci_resize(learnt,j);
  749. s->stats.tot_literals += j;
  750. // clear tags
  751. solver2_clear_tags(s,0);
  752. #ifdef DEBUG
  753. for (i = 0; i < s->size; i++)
  754. assert(!var_tag(s, i));
  755. #endif
  756. #ifdef VERBOSEDEBUG
  757. printf(L_IND"Learnt {", L_ind);
  758. for (i = 0; i < veci_size(learnt); i++) printf(" "L_LIT, L_lit(lits[i]));
  759. #endif
  760. if (veci_size(learnt) > 1){
  761. int max_i = 1;
  762. int max = var_level(s, lit_var(lits[1]));
  763. lit tmp;
  764. for (i = 2; i < veci_size(learnt); i++)
  765. if (var_level(s, lit_var(lits[i])) > max){
  766. max = var_level(s, lit_var(lits[i]));
  767. max_i = i;
  768. }
  769. tmp = lits[1];
  770. lits[1] = lits[max_i];
  771. lits[max_i] = tmp;
  772. }
  773. #ifdef VERBOSEDEBUG
  774. {
  775. int lev = veci_size(learnt) > 1 ? var_level(s, lit_var(lits[1])) : 0;
  776. printf(" } at level %d\n", lev);
  777. }
  778. #endif
  779. }
  780. //#define TEST_CNF_LOAD
  781. int sat_solver_propagate(sat_solver* s)
  782. {
  783. int hConfl = 0;
  784. lit* lits;
  785. lit false_lit;
  786. //printf("sat_solver_propagate\n");
  787. while (hConfl == 0 && s->qtail - s->qhead > 0){
  788. lit p = s->trail[s->qhead++];
  789. #ifdef TEST_CNF_LOAD
  790. int v = lit_var(p);
  791. if ( s->pCnfFunc )
  792. {
  793. if ( lit_sign(p) )
  794. {
  795. if ( (s->loads[v] & 1) == 0 )
  796. {
  797. s->loads[v] ^= 1;
  798. s->pCnfFunc( s->pCnfMan, p );
  799. }
  800. }
  801. else
  802. {
  803. if ( (s->loads[v] & 2) == 0 )
  804. {
  805. s->loads[v] ^= 2;
  806. s->pCnfFunc( s->pCnfMan, p );
  807. }
  808. }
  809. }
  810. {
  811. #endif
  812. veci* ws = sat_solver_read_wlist(s,p);
  813. int* begin = veci_begin(ws);
  814. int* end = begin + veci_size(ws);
  815. int*i, *j;
  816. s->stats.propagations++;
  817. // s->simpdb_props--;
  818. //printf("checking lit %d: "L_LIT"\n", veci_size(ws), L_lit(p));
  819. for (i = j = begin; i < end; ){
  820. if (clause_is_lit(*i)){
  821. int Lit = clause_read_lit(*i);
  822. if (var_value(s, lit_var(Lit)) == lit_sign(Lit)){
  823. *j++ = *i++;
  824. continue;
  825. }
  826. *j++ = *i;
  827. if (!sat_solver_enqueue(s,clause_read_lit(*i),clause_from_lit(p))){
  828. hConfl = s->hBinary;
  829. (clause_begin(s->binary))[1] = lit_neg(p);
  830. (clause_begin(s->binary))[0] = clause_read_lit(*i++);
  831. // Copy the remaining watches:
  832. while (i < end)
  833. *j++ = *i++;
  834. }
  835. }else{
  836. clause* c = clause_read(s,*i);
  837. lits = clause_begin(c);
  838. // Make sure the false literal is data[1]:
  839. false_lit = lit_neg(p);
  840. if (lits[0] == false_lit){
  841. lits[0] = lits[1];
  842. lits[1] = false_lit;
  843. }
  844. assert(lits[1] == false_lit);
  845. // If 0th watch is true, then clause is already satisfied.
  846. if (var_value(s, lit_var(lits[0])) == lit_sign(lits[0]))
  847. *j++ = *i;
  848. else{
  849. // Look for new watch:
  850. lit* stop = lits + clause_size(c);
  851. lit* k;
  852. for (k = lits + 2; k < stop; k++){
  853. if (var_value(s, lit_var(*k)) != !lit_sign(*k)){
  854. lits[1] = *k;
  855. *k = false_lit;
  856. veci_push(sat_solver_read_wlist(s,lit_neg(lits[1])),*i);
  857. goto next; }
  858. }
  859. *j++ = *i;
  860. // Clause is unit under assignment:
  861. if ( c->lrn )
  862. c->lbd = sat_clause_compute_lbd(s, c);
  863. if (!sat_solver_enqueue(s,lits[0], *i)){
  864. hConfl = *i++;
  865. // Copy the remaining watches:
  866. while (i < end)
  867. *j++ = *i++;
  868. }
  869. }
  870. }
  871. next:
  872. i++;
  873. }
  874. s->stats.inspects += j - veci_begin(ws);
  875. veci_resize(ws,j - veci_begin(ws));
  876. #ifdef TEST_CNF_LOAD
  877. }
  878. #endif
  879. }
  880. return hConfl;
  881. }
  882. //=================================================================================================
  883. // External solver functions:
  884. sat_solver* sat_solver_new(void)
  885. {
  886. sat_solver* s = (sat_solver*)ABC_CALLOC( char, sizeof(sat_solver));
  887. // Vec_SetAlloc_(&s->Mem, 15);
  888. Sat_MemAlloc_(&s->Mem, 17);
  889. s->hLearnts = -1;
  890. s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
  891. s->binary = clause_read( s, s->hBinary );
  892. s->nLearntStart = LEARNT_MAX_START_DEFAULT; // starting learned clause limit
  893. s->nLearntDelta = LEARNT_MAX_INCRE_DEFAULT; // delta of learned clause limit
  894. s->nLearntRatio = LEARNT_MAX_RATIO_DEFAULT; // ratio of learned clause limit
  895. s->nLearntMax = s->nLearntStart;
  896. // initialize vectors
  897. veci_new(&s->order);
  898. veci_new(&s->trail_lim);
  899. veci_new(&s->tagged);
  900. // veci_new(&s->learned);
  901. veci_new(&s->act_clas);
  902. veci_new(&s->stack);
  903. // veci_new(&s->model);
  904. veci_new(&s->act_vars);
  905. veci_new(&s->unit_lits);
  906. veci_new(&s->temp_clause);
  907. veci_new(&s->conf_final);
  908. // initialize arrays
  909. s->wlists = 0;
  910. s->activity = 0;
  911. s->orderpos = 0;
  912. s->reasons = 0;
  913. s->trail = 0;
  914. // initialize other vars
  915. s->size = 0;
  916. s->cap = 0;
  917. s->qhead = 0;
  918. s->qtail = 0;
  919. #ifdef USE_FLOAT_ACTIVITY
  920. s->var_inc = 1;
  921. s->cla_inc = 1;
  922. s->var_decay = (float)(1 / 0.95 );
  923. s->cla_decay = (float)(1 / 0.999);
  924. #else
  925. s->var_inc = (1 << 5);
  926. s->cla_inc = (1 << 11);
  927. #endif
  928. s->root_level = 0;
  929. // s->simpdb_assigns = 0;
  930. // s->simpdb_props = 0;
  931. s->random_seed = 91648253;
  932. s->progress_estimate = 0;
  933. // s->binary = (clause*)ABC_ALLOC( char, sizeof(clause) + sizeof(lit)*2);
  934. // s->binary->size_learnt = (2 << 1);
  935. s->verbosity = 0;
  936. s->stats.starts = 0;
  937. s->stats.decisions = 0;
  938. s->stats.propagations = 0;
  939. s->stats.inspects = 0;
  940. s->stats.conflicts = 0;
  941. s->stats.clauses = 0;
  942. s->stats.clauses_literals = 0;
  943. s->stats.learnts = 0;
  944. s->stats.learnts_literals = 0;
  945. s->stats.tot_literals = 0;
  946. return s;
  947. }
  948. void sat_solver_setnvars(sat_solver* s,int n)
  949. {
  950. int var;
  951. if (s->cap < n){
  952. int old_cap = s->cap;
  953. while (s->cap < n) s->cap = s->cap*2+1;
  954. if ( s->cap < 50000 )
  955. s->cap = 50000;
  956. s->wlists = ABC_REALLOC(veci, s->wlists, s->cap*2);
  957. // s->vi = ABC_REALLOC(varinfo,s->vi, s->cap);
  958. s->levels = ABC_REALLOC(int, s->levels, s->cap);
  959. s->assigns = ABC_REALLOC(char, s->assigns, s->cap);
  960. s->polarity = ABC_REALLOC(char, s->polarity, s->cap);
  961. s->tags = ABC_REALLOC(char, s->tags, s->cap);
  962. s->loads = ABC_REALLOC(char, s->loads, s->cap);
  963. #ifdef USE_FLOAT_ACTIVITY
  964. s->activity = ABC_REALLOC(double, s->activity, s->cap);
  965. #else
  966. s->activity = ABC_REALLOC(unsigned, s->activity, s->cap);
  967. s->activity2 = ABC_REALLOC(unsigned, s->activity2,s->cap);
  968. #endif
  969. s->pFreqs = ABC_REALLOC(char, s->pFreqs, s->cap);
  970. if ( s->factors )
  971. s->factors = ABC_REALLOC(double, s->factors, s->cap);
  972. s->orderpos = ABC_REALLOC(int, s->orderpos, s->cap);
  973. s->reasons = ABC_REALLOC(int, s->reasons, s->cap);
  974. s->trail = ABC_REALLOC(lit, s->trail, s->cap);
  975. s->model = ABC_REALLOC(int, s->model, s->cap);
  976. memset( s->wlists + 2*old_cap, 0, 2*(s->cap-old_cap)*sizeof(veci) );
  977. }
  978. for (var = s->size; var < n; var++){
  979. assert(!s->wlists[2*var].size);
  980. assert(!s->wlists[2*var+1].size);
  981. if ( s->wlists[2*var].ptr == NULL )
  982. veci_new(&s->wlists[2*var]);
  983. if ( s->wlists[2*var+1].ptr == NULL )
  984. veci_new(&s->wlists[2*var+1]);
  985. #ifdef USE_FLOAT_ACTIVITY
  986. s->activity[var] = 0;
  987. #else
  988. s->activity[var] = (1<<10);
  989. #endif
  990. s->pFreqs[var] = 0;
  991. if ( s->factors )
  992. s->factors [var] = 0;
  993. // *((int*)s->vi + var) = 0; s->vi[var].val = varX;
  994. s->levels [var] = 0;
  995. s->assigns [var] = varX;
  996. s->polarity[var] = 0;
  997. s->tags [var] = 0;
  998. s->loads [var] = 0;
  999. s->orderpos[var] = veci_size(&s->order);
  1000. s->reasons [var] = 0;
  1001. s->model [var] = 0;
  1002. /* does not hold because variables enqueued at top level will not be reinserted in the heap
  1003. assert(veci_size(&s->order) == var);
  1004. */
  1005. veci_push(&s->order,var);
  1006. order_update(s, var);
  1007. }
  1008. s->size = n > s->size ? n : s->size;
  1009. }
  1010. void sat_solver_delete(sat_solver* s)
  1011. {
  1012. // Vec_SetFree_( &s->Mem );
  1013. Sat_MemFree_( &s->Mem );
  1014. // delete vectors
  1015. veci_delete(&s->order);
  1016. veci_delete(&s->trail_lim);
  1017. veci_delete(&s->tagged);
  1018. // veci_delete(&s->learned);
  1019. veci_delete(&s->act_clas);
  1020. veci_delete(&s->stack);
  1021. // veci_delete(&s->model);
  1022. veci_delete(&s->act_vars);
  1023. veci_delete(&s->unit_lits);
  1024. veci_delete(&s->pivot_vars);
  1025. veci_delete(&s->temp_clause);
  1026. veci_delete(&s->conf_final);
  1027. // delete arrays
  1028. if (s->reasons != 0){
  1029. int i;
  1030. for (i = 0; i < s->cap*2; i++)
  1031. veci_delete(&s->wlists[i]);
  1032. ABC_FREE(s->wlists );
  1033. // ABC_FREE(s->vi );
  1034. ABC_FREE(s->levels );
  1035. ABC_FREE(s->assigns );
  1036. ABC_FREE(s->polarity );
  1037. ABC_FREE(s->tags );
  1038. ABC_FREE(s->loads );
  1039. ABC_FREE(s->activity );
  1040. ABC_FREE(s->activity2);
  1041. ABC_FREE(s->pFreqs );
  1042. ABC_FREE(s->factors );
  1043. ABC_FREE(s->orderpos );
  1044. ABC_FREE(s->reasons );
  1045. ABC_FREE(s->trail );
  1046. ABC_FREE(s->model );
  1047. }
  1048. sat_solver_store_free(s);
  1049. ABC_FREE(s);
  1050. }
  1051. void sat_solver_restart( sat_solver* s )
  1052. {
  1053. int i;
  1054. Sat_MemRestart( &s->Mem );
  1055. s->hLearnts = -1;
  1056. s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
  1057. s->binary = clause_read( s, s->hBinary );
  1058. veci_resize(&s->act_clas, 0);
  1059. veci_resize(&s->trail_lim, 0);
  1060. veci_resize(&s->order, 0);
  1061. for ( i = 0; i < s->size*2; i++ )
  1062. s->wlists[i].size = 0;
  1063. s->nDBreduces = 0;
  1064. // initialize other vars
  1065. s->size = 0;
  1066. // s->cap = 0;
  1067. s->qhead = 0;
  1068. s->qtail = 0;
  1069. #ifdef USE_FLOAT_ACTIVITY
  1070. s->var_inc = 1;
  1071. s->cla_inc = 1;
  1072. s->var_decay = (float)(1 / 0.95 );
  1073. s->cla_decay = (float)(1 / 0.999 );
  1074. #else
  1075. s->var_inc = (1 << 5);
  1076. s->cla_inc = (1 << 11);
  1077. #endif
  1078. s->root_level = 0;
  1079. // s->simpdb_assigns = 0;
  1080. // s->simpdb_props = 0;
  1081. s->random_seed = 91648253;
  1082. s->progress_estimate = 0;
  1083. s->verbosity = 0;
  1084. s->stats.starts = 0;
  1085. s->stats.decisions = 0;
  1086. s->stats.propagations = 0;
  1087. s->stats.inspects = 0;
  1088. s->stats.conflicts = 0;
  1089. s->stats.clauses = 0;
  1090. s->stats.clauses_literals = 0;
  1091. s->stats.learnts = 0;
  1092. s->stats.learnts_literals = 0;
  1093. s->stats.tot_literals = 0;
  1094. }
  1095. // returns memory in bytes used by the SAT solver
  1096. double sat_solver_memory( sat_solver* s )
  1097. {
  1098. int i;
  1099. double Mem = sizeof(sat_solver);
  1100. for (i = 0; i < s->cap*2; i++)
  1101. Mem += s->wlists[i].cap * sizeof(int);
  1102. Mem += s->cap * sizeof(veci); // ABC_FREE(s->wlists );
  1103. Mem += s->cap * sizeof(int); // ABC_FREE(s->levels );
  1104. Mem += s->cap * sizeof(char); // ABC_FREE(s->assigns );
  1105. Mem += s->cap * sizeof(char); // ABC_FREE(s->polarity );
  1106. Mem += s->cap * sizeof(char); // ABC_FREE(s->tags );
  1107. Mem += s->cap * sizeof(char); // ABC_FREE(s->loads );
  1108. #ifdef USE_FLOAT_ACTIVITY
  1109. Mem += s->cap * sizeof(double); // ABC_FREE(s->activity );
  1110. #else
  1111. Mem += s->cap * sizeof(unsigned); // ABC_FREE(s->activity );
  1112. if ( s->activity2 )
  1113. Mem += s->cap * sizeof(unsigned); // ABC_FREE(s->activity2);
  1114. #endif
  1115. if ( s->factors )
  1116. Mem += s->cap * sizeof(double); // ABC_FREE(s->factors );
  1117. Mem += s->cap * sizeof(int); // ABC_FREE(s->orderpos );
  1118. Mem += s->cap * sizeof(int); // ABC_FREE(s->reasons );
  1119. Mem += s->cap * sizeof(lit); // ABC_FREE(s->trail );
  1120. Mem += s->cap * sizeof(int); // ABC_FREE(s->model );
  1121. Mem += s->order.cap * sizeof(int);
  1122. Mem += s->trail_lim.cap * sizeof(int);
  1123. Mem += s->tagged.cap * sizeof(int);
  1124. // Mem += s->learned.cap * sizeof(int);
  1125. Mem += s->stack.cap * sizeof(int);
  1126. Mem += s->act_vars.cap * sizeof(int);
  1127. Mem += s->unit_lits.cap * sizeof(int);
  1128. Mem += s->act_clas.cap * sizeof(int);
  1129. Mem += s->temp_clause.cap * sizeof(int);
  1130. Mem += s->conf_final.cap * sizeof(int);
  1131. Mem += Sat_MemMemoryAll( &s->Mem );
  1132. return Mem;
  1133. }
  1134. int sat_solver_simplify(sat_solver* s)
  1135. {
  1136. assert(sat_solver_dl(s) == 0);
  1137. if (sat_solver_propagate(s) != 0)
  1138. return false;
  1139. return true;
  1140. }
  1141. void sat_solver_reducedb(sat_solver* s)
  1142. {
  1143. static abctime TimeTotal = 0;
  1144. abctime clk = Abc_Clock();
  1145. Sat_Mem_t * pMem = &s->Mem;
  1146. int nLearnedOld = veci_size(&s->act_clas);
  1147. int * act_clas = veci_begin(&s->act_clas);
  1148. int * pPerm, * pArray, * pSortValues, nCutoffValue;
  1149. int i, k, j, Id, Counter, CounterStart, nSelected;
  1150. clause * c;
  1151. assert( s->nLearntMax > 0 );
  1152. assert( nLearnedOld == Sat_MemEntryNum(pMem, 1) );
  1153. assert( nLearnedOld == (int)s->stats.learnts );
  1154. s->nDBreduces++;
  1155. // printf( "Calling reduceDB with %d learned clause limit.\n", s->nLearntMax );
  1156. s->nLearntMax = s->nLearntStart + s->nLearntDelta * s->nDBreduces;
  1157. // return;
  1158. // create sorting values
  1159. pSortValues = ABC_ALLOC( int, nLearnedOld );
  1160. Sat_MemForEachLearned( pMem, c, i, k )
  1161. {
  1162. Id = clause_id(c);
  1163. pSortValues[Id] = (((7 - Abc_MinInt(c->lbd, 7)) << 28) | (act_clas[Id] >> 4));
  1164. // pSortValues[Id] = act[Id];
  1165. assert( pSortValues[Id] >= 0 );
  1166. }
  1167. // preserve 1/20 of last clauses
  1168. CounterStart = nLearnedOld - (s->nLearntMax / 20);
  1169. // preserve 3/4 of most active clauses
  1170. nSelected = nLearnedOld*s->nLearntRatio/100;
  1171. // find non-decreasing permutation
  1172. pPerm = Abc_MergeSortCost( pSortValues, nLearnedOld );
  1173. assert( pSortValues[pPerm[0]] <= pSortValues[pPerm[nLearnedOld-1]] );
  1174. nCutoffValue = pSortValues[pPerm[nLearnedOld-nSelected]];
  1175. ABC_FREE( pPerm );
  1176. // ActCutOff = ABC_INFINITY;
  1177. // mark learned clauses to remove
  1178. Counter = j = 0;
  1179. Sat_MemForEachLearned( pMem, c, i, k )
  1180. {
  1181. assert( c->mark == 0 );
  1182. if ( Counter++ > CounterStart || clause_size(c) < 3 || pSortValues[clause_id(c)] > nCutoffValue || s->reasons[lit_var(c->lits[0])] == Sat_MemHand(pMem, i, k) )
  1183. act_clas[j++] = act_clas[clause_id(c)];
  1184. else // delete
  1185. {
  1186. c->mark = 1;
  1187. s->stats.learnts_literals -= clause_size(c);
  1188. s->stats.learnts--;
  1189. }
  1190. }
  1191. assert( s->stats.learnts == (unsigned)j );
  1192. assert( Counter == nLearnedOld );
  1193. veci_resize(&s->act_clas,j);
  1194. ABC_FREE( pSortValues );
  1195. // update ID of each clause to be its new handle
  1196. Counter = Sat_MemCompactLearned( pMem, 0 );
  1197. assert( Counter == (int)s->stats.learnts );
  1198. // update reasons
  1199. for ( i = 0; i < s->size; i++ )
  1200. {
  1201. if ( !s->reasons[i] ) // no reason
  1202. continue;
  1203. if ( clause_is_lit(s->reasons[i]) ) // 2-lit clause
  1204. continue;
  1205. if ( !clause_learnt_h(pMem, s->reasons[i]) ) // problem clause
  1206. continue;
  1207. c = clause_read( s, s->reasons[i] );
  1208. assert( c->mark == 0 );
  1209. s->reasons[i] = clause_id(c); // updating handle here!!!
  1210. }
  1211. // update watches
  1212. for ( i = 0; i < s->size*2; i++ )
  1213. {
  1214. pArray = veci_begin(&s->wlists[i]);
  1215. for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
  1216. {
  1217. if ( clause_is_lit(pArray[k]) ) // 2-lit clause
  1218. pArray[j++] = pArray[k];
  1219. else if ( !clause_learnt_h(pMem, pArray[k]) ) // problem clause
  1220. pArray[j++] = pArray[k];
  1221. else
  1222. {
  1223. c = clause_read(s, pArray[k]);
  1224. if ( !c->mark ) // useful learned clause
  1225. pArray[j++] = clause_id(c); // updating handle here!!!
  1226. }
  1227. }
  1228. veci_resize(&s->wlists[i],j);
  1229. }
  1230. // perform final move of the clauses
  1231. Counter = Sat_MemCompactLearned( pMem, 1 );
  1232. assert( Counter == (int)s->stats.learnts );
  1233. // report the results
  1234. TimeTotal += Abc_Clock() - clk;
  1235. if ( s->fVerbose )
  1236. {
  1237. Abc_Print(1, "reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
  1238. s->stats.learnts, nLearnedOld, 100.0 * s->stats.learnts / nLearnedOld );
  1239. Abc_PrintTime( 1, "Time", TimeTotal );
  1240. }
  1241. }
  1242. // reverses to the previously bookmarked point
  1243. void sat_solver_rollback( sat_solver* s )
  1244. {
  1245. Sat_Mem_t * pMem = &s->Mem;
  1246. int i, k, j;
  1247. static int Count = 0;
  1248. Count++;
  1249. assert( s->iVarPivot >= 0 && s->iVarPivot <= s->size );
  1250. assert( s->iTrailPivot >= 0 && s->iTrailPivot <= s->qtail );
  1251. // reset implication queue
  1252. sat_solver_canceluntil_rollback( s, s->iTrailPivot );
  1253. // update order
  1254. if ( s->iVarPivot < s->size )
  1255. {
  1256. if ( s->activity2 )
  1257. {
  1258. s->var_inc = s->var_inc2;
  1259. memcpy( s->activity, s->activity2, sizeof(unsigned) * s->iVarPivot );
  1260. }
  1261. veci_resize(&s->order, 0);
  1262. for ( i = 0; i < s->iVarPivot; i++ )
  1263. {
  1264. if ( var_value(s, i) != varX )
  1265. continue;
  1266. s->orderpos[i] = veci_size(&s->order);
  1267. veci_push(&s->order,i);
  1268. order_update(s, i);
  1269. }
  1270. }
  1271. // compact watches
  1272. for ( i = 0; i < s->iVarPivot*2; i++ )
  1273. {
  1274. cla* pArray = veci_begin(&s->wlists[i]);
  1275. for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
  1276. {
  1277. if ( clause_is_lit(pArray[k]) )
  1278. {
  1279. if ( clause_read_lit(pArray[k]) < s->iVarPivot*2 )
  1280. pArray[j++] = pArray[k];
  1281. }
  1282. else if ( Sat_MemClauseUsed(pMem, pArray[k]) )
  1283. pArray[j++] = pArray[k];
  1284. }
  1285. veci_resize(&s->wlists[i],j);
  1286. }
  1287. // reset watcher lists
  1288. for ( i = 2*s->iVarPivot; i < 2*s->size; i++ )
  1289. s->wlists[i].size = 0;
  1290. // reset clause counts
  1291. s->stats.clauses = pMem->BookMarkE[0];
  1292. s->stats.learnts = pMem->BookMarkE[1];
  1293. // rollback clauses
  1294. Sat_MemRollBack( pMem );
  1295. // resize learned arrays
  1296. veci_resize(&s->act_clas, s->stats.learnts);
  1297. // initialize other vars
  1298. s->size = s->iVarPivot;
  1299. if ( s->size == 0 )
  1300. {
  1301. // s->size = 0;
  1302. // s->cap = 0;
  1303. s->qhead = 0;
  1304. s->qtail = 0;
  1305. #ifdef USE_FLOAT_ACTIVITY
  1306. s->var_inc = 1;
  1307. s->cla_inc = 1;
  1308. s->var_decay = (float)(1 / 0.95 );
  1309. s->cla_decay = (float)(1 / 0.999 );
  1310. #else
  1311. s->var_inc = (1 << 5);
  1312. s->cla_inc = (1 << 11);
  1313. #endif
  1314. s->root_level = 0;
  1315. s->random_seed = 91648253;
  1316. s->progress_estimate = 0;
  1317. s->verbosity = 0;
  1318. s->stats.starts = 0;
  1319. s->stats.decisions = 0;
  1320. s->stats.propagations = 0;
  1321. s->stats.inspects = 0;
  1322. s->stats.conflicts = 0;
  1323. s->stats.clauses = 0;
  1324. s->stats.clauses_literals = 0;
  1325. s->stats.learnts = 0;
  1326. s->stats.learnts_literals = 0;
  1327. s->stats.tot_literals = 0;
  1328. // initialize rollback
  1329. s->iVarPivot = 0; // the pivot for variables
  1330. s->iTrailPivot = 0; // the pivot for trail
  1331. s->hProofPivot = 1; // the pivot for proof records
  1332. }
  1333. }
  1334. int sat_solver_addclause(sat_solver* s, lit* begin, lit* end)
  1335. {
  1336. int fVerbose = 0;
  1337. lit *i,*j;
  1338. int maxvar;
  1339. lit last;
  1340. assert( begin < end );
  1341. if ( fVerbose )
  1342. {
  1343. for ( i = begin; i < end; i++ )
  1344. printf( "%s%d ", (*i)&1 ? "!":"", (*i)>>1 );
  1345. printf( "\n" );
  1346. }
  1347. veci_resize( &s->temp_clause, 0 );
  1348. for ( i = begin; i < end; i++ )
  1349. veci_push( &s->temp_clause, *i );
  1350. begin = veci_begin( &s->temp_clause );
  1351. end = begin + veci_size( &s->temp_clause );
  1352. // insertion sort
  1353. maxvar = lit_var(*begin);
  1354. for (i = begin + 1; i < end; i++){
  1355. lit l = *i;
  1356. maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
  1357. for (j = i; j > begin && *(j-1) > l; j--)
  1358. *j = *(j-1);
  1359. *j = l;
  1360. }
  1361. sat_solver_setnvars(s,maxvar+1);
  1362. ///////////////////////////////////
  1363. // add clause to internal storage
  1364. if ( s->pStore )
  1365. {
  1366. int RetValue = Sto_ManAddClause( (Sto_Man_t *)s->pStore, begin, end );
  1367. assert( RetValue );
  1368. (void) RetValue;
  1369. }
  1370. ///////////////////////////////////
  1371. // delete duplicates
  1372. last = lit_Undef;
  1373. for (i = j = begin; i < end; i++){
  1374. //printf("lit: "L_LIT", value = %d\n", L_lit(*i), (lit_sign(*i) ? -s->assignss[lit_var(*i)] : s->assignss[lit_var(*i)]));
  1375. if (*i == lit_neg(last) || var_value(s, lit_var(*i)) == lit_sign(*i))
  1376. return true; // tautology
  1377. else if (*i != last && var_value(s, lit_var(*i)) == varX)
  1378. last = *j++ = *i;
  1379. }
  1380. // j = i;
  1381. if (j == begin) // empty clause
  1382. return false;
  1383. if (j - begin == 1) // unit clause
  1384. return sat_solver_enqueue(s,*begin,0);
  1385. // create new clause
  1386. sat_solver_clause_new(s,begin,j,0);
  1387. return true;
  1388. }
  1389. double luby(double y, int x)
  1390. {
  1391. int size, seq;
  1392. for (size = 1, seq = 0; size < x+1; seq++, size = 2*size + 1);
  1393. while (size-1 != x){
  1394. size = (size-1) >> 1;
  1395. seq--;
  1396. x = x % size;
  1397. }
  1398. return pow(y, (double)seq);
  1399. }
  1400. void luby_test()
  1401. {
  1402. int i;
  1403. for ( i = 0; i < 20; i++ )
  1404. printf( "%d ", (int)luby(2,i) );
  1405. printf( "\n" );
  1406. }
  1407. static lbool sat_solver_search(sat_solver* s, ABC_INT64_T nof_conflicts)
  1408. {
  1409. // double var_decay = 0.95;
  1410. // double clause_decay = 0.999;
  1411. double random_var_freq = s->fNotUseRandom ? 0.0 : 0.02;
  1412. ABC_INT64_T conflictC = 0;
  1413. veci learnt_clause;
  1414. int i;
  1415. assert(s->root_level == sat_solver_dl(s));
  1416. s->nRestarts++;
  1417. s->stats.starts++;
  1418. // s->var_decay = (float)(1 / var_decay ); // move this to sat_solver_new()
  1419. // s->cla_decay = (float)(1 / clause_decay); // move this to sat_solver_new()
  1420. // veci_resize(&s->model,0);
  1421. veci_new(&learnt_clause);
  1422. // use activity factors in every even restart
  1423. if ( (s->nRestarts & 1) && veci_size(&s->act_vars) > 0 )
  1424. // if ( veci_size(&s->act_vars) > 0 )
  1425. for ( i = 0; i < s->act_vars.size; i++ )
  1426. act_var_bump_factor(s, s->act_vars.ptr[i]);
  1427. // use activity factors in every restart
  1428. if ( s->pGlobalVars && veci_size(&s->act_vars) > 0 )
  1429. for ( i = 0; i < s->act_vars.size; i++ )
  1430. act_var_bump_global(s, s->act_vars.ptr[i]);
  1431. for (;;){
  1432. int hConfl = sat_solver_propagate(s);
  1433. if (hConfl != 0){
  1434. // CONFLICT
  1435. int blevel;
  1436. #ifdef VERBOSEDEBUG
  1437. printf(L_IND"**CONFLICT**\n", L_ind);
  1438. #endif
  1439. s->stats.conflicts++; conflictC++;
  1440. if (sat_solver_dl(s) == s->root_level){
  1441. #ifdef SAT_USE_ANALYZE_FINAL
  1442. sat_solver_analyze_final(s, hConfl, 0);
  1443. #endif
  1444. veci_delete(&learnt_clause);
  1445. return l_False;
  1446. }
  1447. veci_resize(&learnt_clause,0);
  1448. sat_solver_analyze(s, hConfl, &learnt_clause);
  1449. blevel = veci_size(&learnt_clause) > 1 ? var_level(s, lit_var(veci_begin(&learnt_clause)[1])) : s->root_level;
  1450. blevel = s->root_level > blevel ? s->root_level : blevel;
  1451. sat_solver_canceluntil(s,blevel);
  1452. sat_solver_record(s,&learnt_clause);
  1453. #ifdef SAT_USE_ANALYZE_FINAL
  1454. // if (learnt_clause.size() == 1) level[var(learnt_clause[0])] = 0; // (this is ugly (but needed for 'analyzeFinal()') -- in future versions, we will backtrack past the 'root_level' and redo the assumptions)
  1455. if ( learnt_clause.size == 1 )
  1456. var_set_level(s, lit_var(learnt_clause.ptr[0]), 0);
  1457. #endif
  1458. act_var_decay(s);
  1459. act_clause_decay(s);
  1460. }else{
  1461. // NO CONFLICT
  1462. int next;
  1463. // Reached bound on number of conflicts:
  1464. if ( (!s->fNoRestarts && nof_conflicts >= 0 && conflictC >= nof_conflicts) || (s->nRuntimeLimit && (s->stats.conflicts & 63) == 0 && Abc_Clock() > s->nRuntimeLimit)){
  1465. s->progress_estimate = sat_solver_progress(s);
  1466. sat_solver_canceluntil(s,s->root_level);
  1467. veci_delete(&learnt_clause);
  1468. return l_Undef; }
  1469. // Reached bound on number of conflicts:
  1470. if ( (s->nConfLimit && s->stats.conflicts > s->nConfLimit) ||
  1471. (s->nInsLimit && s->stats.propagations > s->nInsLimit) )
  1472. {
  1473. s->progress_estimate = sat_solver_progress(s);
  1474. sat_solver_canceluntil(s,s->root_level);
  1475. veci_delete(&learnt_clause);
  1476. return l_Undef;
  1477. }
  1478. // Simplify the set of problem clauses:
  1479. if (sat_solver_dl(s) == 0 && !s->fSkipSimplify)
  1480. sat_solver_simplify(s);
  1481. // Reduce the set of learnt clauses:
  1482. // if (s->nLearntMax && veci_size(&s->learned) - s->qtail >= s->nLearntMax)
  1483. if (s->nLearntMax && veci_size(&s->act_clas) >= s->nLearntMax)
  1484. sat_solver_reducedb(s);
  1485. // New variable decision:
  1486. s->stats.decisions++;
  1487. next = order_select(s,(float)random_var_freq);
  1488. if (next == var_Undef){
  1489. // Model found:
  1490. int i;
  1491. for (i = 0; i < s->size; i++)
  1492. s->model[i] = (var_value(s,i)==var1 ? l_True : l_False);
  1493. sat_solver_canceluntil(s,s->root_level);
  1494. veci_delete(&learnt_clause);
  1495. /*
  1496. veci apa; veci_new(&apa);
  1497. for (i = 0; i < s->size; i++)
  1498. veci_push(&apa,(int)(s->model.ptr[i] == l_True ? toLit(i) : lit_neg(toLit(i))));
  1499. printf("model: "); printlits((lit*)apa.ptr, (lit*)apa.ptr + veci_size(&apa)); printf("\n");
  1500. veci_delete(&apa);
  1501. */
  1502. return l_True;
  1503. }
  1504. if ( var_polar(s, next) ) // positive polarity
  1505. sat_solver_decision(s,toLit(next));
  1506. else
  1507. sat_solver_decision(s,lit_neg(toLit(next)));
  1508. }
  1509. }
  1510. return l_Undef; // cannot happen
  1511. }
  1512. // internal call to the SAT solver
  1513. int sat_solver_solve_internal(sat_solver* s)
  1514. {
  1515. lbool status = l_Undef;
  1516. int restart_iter = 0;
  1517. veci_resize(&s->unit_lits, 0);
  1518. s->nCalls++;
  1519. if (s->verbosity >= 1){
  1520. printf("==================================[MINISAT]===================================\n");
  1521. printf("| Conflicts | ORIGINAL | LEARNT | Progress |\n");
  1522. printf("| | Clauses Literals | Limit Clauses Literals Lit/Cl | |\n");
  1523. printf("==============================================================================\n");
  1524. }
  1525. while (status == l_Undef){
  1526. ABC_INT64_T nof_conflicts;
  1527. double Ratio = (s->stats.learnts == 0)? 0.0 :
  1528. s->stats.learnts_literals / (double)s->stats.learnts;
  1529. if ( s->nRuntimeLimit && Abc_Clock() > s->nRuntimeLimit )
  1530. break;
  1531. if (s->verbosity >= 1)
  1532. {
  1533. printf("| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %6.3f %% |\n",
  1534. (double)s->stats.conflicts,
  1535. (double)s->stats.clauses,
  1536. (double)s->stats.clauses_literals,
  1537. (double)0,
  1538. (double)s->stats.learnts,
  1539. (double)s->stats.learnts_literals,
  1540. Ratio,
  1541. s->progress_estimate*100);
  1542. fflush(stdout);
  1543. }
  1544. nof_conflicts = (ABC_INT64_T)( 100 * luby(2, restart_iter++) );
  1545. status = sat_solver_search(s, nof_conflicts);
  1546. // quit the loop if reached an external limit
  1547. if ( s->nConfLimit && s->stats.conflicts > s->nConfLimit )
  1548. break;
  1549. if ( s->nInsLimit && s->stats.propagations > s->nInsLimit )
  1550. break;
  1551. if ( s->nRuntimeLimit && Abc_Clock() > s->nRuntimeLimit )
  1552. break;
  1553. }
  1554. if (s->verbosity >= 1)
  1555. printf("==============================================================================\n");
  1556. sat_solver_canceluntil(s,s->root_level);
  1557. return status;
  1558. }
  1559. // pushing one assumption to the stack of assumptions
  1560. int sat_solver_push(sat_solver* s, int p)
  1561. {
  1562. assert(lit_var(p) < s->size);
  1563. veci_push(&s->trail_lim,s->qtail);
  1564. s->root_level++;
  1565. if (!sat_solver_enqueue(s,p,0))
  1566. {
  1567. int h = s->reasons[lit_var(p)];
  1568. if (h)
  1569. {
  1570. if (clause_is_lit(h))
  1571. {
  1572. (clause_begin(s->binary))[1] = lit_neg(p);
  1573. (clause_begin(s->binary))[0] = clause_read_lit(h);
  1574. h = s->hBinary;
  1575. }
  1576. sat_solver_analyze_final(s, h, 1);
  1577. veci_push(&s->conf_final, lit_neg(p));
  1578. }
  1579. else
  1580. {
  1581. veci_resize(&s->conf_final,0);
  1582. veci_push(&s->conf_final, lit_neg(p));
  1583. // the two lines below are a bug fix by Siert Wieringa
  1584. if (var_level(s, lit_var(p)) > 0)
  1585. veci_push(&s->conf_final, p);
  1586. }
  1587. //sat_solver_canceluntil(s, 0);
  1588. return false;
  1589. }
  1590. else
  1591. {
  1592. int fConfl = sat_solver_propagate(s);
  1593. if (fConfl){
  1594. sat_solver_analyze_final(s, fConfl, 0);
  1595. //assert(s->conf_final.size > 0);
  1596. //sat_solver_canceluntil(s, 0);
  1597. return false; }
  1598. }
  1599. return true;
  1600. }
  1601. // removing one assumption from the stack of assumptions
  1602. void sat_solver_pop(sat_solver* s)
  1603. {
  1604. assert( sat_solver_dl(s) > 0 );
  1605. sat_solver_canceluntil(s, --s->root_level);
  1606. }
  1607. 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)
  1608. {
  1609. // set the external limits
  1610. s->nRestarts = 0;
  1611. s->nConfLimit = 0;
  1612. s->nInsLimit = 0;
  1613. if ( nConfLimit )
  1614. s->nConfLimit = s->stats.conflicts + nConfLimit;
  1615. if ( nInsLimit )
  1616. // s->nInsLimit = s->stats.inspects + nInsLimit;
  1617. s->nInsLimit = s->stats.propagations + nInsLimit;
  1618. if ( nConfLimitGlobal && (s->nConfLimit == 0 || s->nConfLimit > nConfLimitGlobal) )
  1619. s->nConfLimit = nConfLimitGlobal;
  1620. if ( nInsLimitGlobal && (s->nInsLimit == 0 || s->nInsLimit > nInsLimitGlobal) )
  1621. s->nInsLimit = nInsLimitGlobal;
  1622. }
  1623. int sat_solver_solve(sat_solver* s, lit* begin, lit* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
  1624. {
  1625. lbool status;
  1626. lit * i;
  1627. ////////////////////////////////////////////////
  1628. if ( s->fSolved )
  1629. {
  1630. if ( s->pStore )
  1631. {
  1632. int RetValue = Sto_ManAddClause( (Sto_Man_t *)s->pStore, NULL, NULL );
  1633. assert( RetValue );
  1634. (void) RetValue;
  1635. }
  1636. return l_False;
  1637. }
  1638. ////////////////////////////////////////////////
  1639. if ( s->fVerbose )
  1640. printf( "Running SAT solver with parameters %d and %d and %d.\n", s->nLearntStart, s->nLearntDelta, s->nLearntRatio );
  1641. sat_solver_set_resource_limits( s, nConfLimit, nInsLimit, nConfLimitGlobal, nInsLimitGlobal );
  1642. #ifdef SAT_USE_ANALYZE_FINAL
  1643. // Perform assumptions:
  1644. s->root_level = 0;
  1645. for ( i = begin; i < end; i++ )
  1646. if ( !sat_solver_push(s, *i) )
  1647. {
  1648. sat_solver_canceluntil(s,0);
  1649. s->root_level = 0;
  1650. return l_False;
  1651. }
  1652. assert(s->root_level == sat_solver_dl(s));
  1653. #else
  1654. //printf("solve: "); printlits(begin, end); printf("\n");
  1655. for (i = begin; i < end; i++){
  1656. // switch (lit_sign(*i) ? -s->assignss[lit_var(*i)] : s->assignss[lit_var(*i)]){
  1657. switch (var_value(s, *i)) {
  1658. case var1: // l_True:
  1659. break;
  1660. case varX: // l_Undef
  1661. sat_solver_decision(s, *i);
  1662. if (sat_solver_propagate(s) == 0)
  1663. break;
  1664. // fallthrough
  1665. case var0: // l_False
  1666. sat_solver_canceluntil(s, 0);
  1667. return l_False;
  1668. }
  1669. }
  1670. s->root_level = sat_solver_dl(s);
  1671. #endif
  1672. status = sat_solver_solve_internal(s);
  1673. sat_solver_canceluntil(s,0);
  1674. s->root_level = 0;
  1675. ////////////////////////////////////////////////
  1676. if ( status == l_False && s->pStore )
  1677. {
  1678. int RetValue = Sto_ManAddClause( (Sto_Man_t *)s->pStore, NULL, NULL );
  1679. assert( RetValue );
  1680. (void) RetValue;
  1681. }
  1682. ////////////////////////////////////////////////
  1683. return status;
  1684. }
  1685. // This LEXSAT procedure should be called with a set of literals (pLits, nLits),
  1686. // which defines both (1) variable order, and (2) assignment to begin search from.
  1687. // It retuns the LEXSAT assigment that is the same or larger than the given one.
  1688. // (It assumes that there is no smaller assignment than the one given!)
  1689. // The resulting assignment is returned in the same set of literals (pLits, nLits).
  1690. // It pushes/pops assumptions internally and will undo them before terminating.
  1691. int sat_solver_solve_lexsat( sat_solver* s, int * pLits, int nLits )
  1692. {
  1693. int i, iLitFail = -1;
  1694. lbool status;
  1695. assert( nLits > 0 );
  1696. // help the SAT solver by setting desirable polarity
  1697. sat_solver_set_literal_polarity( s, pLits, nLits );
  1698. // check if there exists a satisfying assignment
  1699. status = sat_solver_solve_internal( s );
  1700. if ( status != l_True ) // no assignment
  1701. return status;
  1702. // there is at least one satisfying assignment
  1703. assert( status == l_True );
  1704. // find the first mismatching literal
  1705. for ( i = 0; i < nLits; i++ )
  1706. if ( pLits[i] != sat_solver_var_literal(s, Abc_Lit2Var(pLits[i])) )
  1707. break;
  1708. if ( i == nLits ) // no mismatch - the current assignment is the minimum one!
  1709. return l_True;
  1710. // mismatch happens in literal i
  1711. iLitFail = i;
  1712. // create assumptions up to this literal (as in pLits) - including this literal!
  1713. for ( i = 0; i <= iLitFail; i++ )
  1714. if ( !sat_solver_push(s, pLits[i]) ) // can become UNSAT while adding the last assumption
  1715. break;
  1716. if ( i < iLitFail + 1 ) // the solver became UNSAT while adding assumptions
  1717. status = l_False;
  1718. else // solve under the assumptions
  1719. status = sat_solver_solve_internal( s );
  1720. if ( status == l_True )
  1721. {
  1722. // we proved that there is a sat assignment with literal (iLitFail) having polarity as in pLits
  1723. // continue solving recursively
  1724. if ( iLitFail + 1 < nLits )
  1725. status = sat_solver_solve_lexsat( s, pLits + iLitFail + 1, nLits - iLitFail - 1 );
  1726. }
  1727. else if ( status == l_False )
  1728. {
  1729. // we proved that there is no assignment with iLitFail having polarity as in pLits
  1730. assert( Abc_LitIsCompl(pLits[iLitFail]) ); // literal is 0
  1731. // (this assert may fail only if there is a sat assignment smaller than one originally given in pLits)
  1732. // now we flip this literal (make it 1), change the last assumption
  1733. // and contiue looking for the 000...0-assignment of other literals
  1734. sat_solver_pop( s );
  1735. pLits[iLitFail] = Abc_LitNot(pLits[iLitFail]);
  1736. if ( !sat_solver_push(s, pLits[iLitFail]) )
  1737. printf( "sat_solver_solve_lexsat(): A satisfying assignment should exist.\n" ); // because we know that the problem is satisfiable
  1738. // update other literals to be 000...0
  1739. for ( i = iLitFail + 1; i < nLits; i++ )
  1740. pLits[i] = Abc_LitNot( Abc_LitRegular(pLits[i]) );
  1741. // continue solving recursively
  1742. if ( iLitFail + 1 < nLits )
  1743. status = sat_solver_solve_lexsat( s, pLits + iLitFail + 1, nLits - iLitFail - 1 );
  1744. else
  1745. status = l_True;
  1746. }
  1747. // undo the assumptions
  1748. for ( i = iLitFail; i >= 0; i-- )
  1749. sat_solver_pop( s );
  1750. return status;
  1751. }
  1752. int sat_solver_nvars(sat_solver* s)
  1753. {
  1754. return s->size;
  1755. }
  1756. int sat_solver_nclauses(sat_solver* s)
  1757. {
  1758. return s->stats.clauses;
  1759. }
  1760. int sat_solver_nconflicts(sat_solver* s)
  1761. {
  1762. return (int)s->stats.conflicts;
  1763. }
  1764. //=================================================================================================
  1765. // Clause storage functions:
  1766. void sat_solver_store_alloc( sat_solver * s )
  1767. {
  1768. assert( s->pStore == NULL );
  1769. s->pStore = Sto_ManAlloc();
  1770. }
  1771. void sat_solver_store_write( sat_solver * s, char * pFileName )
  1772. {
  1773. if ( s->pStore ) Sto_ManDumpClauses( (Sto_Man_t *)s->pStore, pFileName );
  1774. }
  1775. void sat_solver_store_free( sat_solver * s )
  1776. {
  1777. if ( s->pStore ) Sto_ManFree( (Sto_Man_t *)s->pStore );
  1778. s->pStore = NULL;
  1779. }
  1780. int sat_solver_store_change_last( sat_solver * s )
  1781. {
  1782. if ( s->pStore ) return Sto_ManChangeLastClause( (Sto_Man_t *)s->pStore );
  1783. return -1;
  1784. }
  1785. void sat_solver_store_mark_roots( sat_solver * s )
  1786. {
  1787. if ( s->pStore ) Sto_ManMarkRoots( (Sto_Man_t *)s->pStore );
  1788. }
  1789. void sat_solver_store_mark_clauses_a( sat_solver * s )
  1790. {
  1791. if ( s->pStore ) Sto_ManMarkClausesA( (Sto_Man_t *)s->pStore );
  1792. }
  1793. void * sat_solver_store_release( sat_solver * s )
  1794. {
  1795. void * pTemp;
  1796. if ( s->pStore == NULL )
  1797. return NULL;
  1798. pTemp = s->pStore;
  1799. s->pStore = NULL;
  1800. return pTemp;
  1801. }
  1802. ABC_NAMESPACE_IMPL_END