ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
satSolver3.c
Go to the documentation of this file.
1/**************************************************************************************************
2MiniSat -- Copyright (c) 2005, Niklas Sorensson
3http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/
4
5Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
6associated documentation files (the "Software"), to deal in the Software without restriction,
7including without limitation the rights to use, copy, modify, merge, publish, distribute,
8sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
9furnished to do so, subject to the following conditions:
10
11The above copyright notice and this permission notice shall be included in all copies or
12substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
15NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
18OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19**************************************************************************************************/
20// Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko
21
22#include <stdio.h>
23#include <assert.h>
24#include <string.h>
25#include <math.h>
26
27#include "satSolver3.h"
28
30
31#define SAT_USE_ANALYZE_FINAL
32
33//=================================================================================================
34// Debug:
35
36//#define VERBOSEDEBUG
37
38// For derivation output (verbosity level 2)
39#define L_IND "%-*d"
40#define L_ind sat_solver3_dl(s)*2+2,sat_solver3_dl(s)
41#define L_LIT "%sx%d"
42#define L_lit(p) lit_sign(p)?"~":"", (lit_var(p))
43
44// Just like 'assert()' but expression will be evaluated in the release version as well.
45static inline void check(int expr) { assert(expr); }
46
47static void printlits(lit* begin, lit* end)
48{
49 int i;
50 for (i = 0; i < end - begin; i++)
51 printf(L_LIT" ",L_lit(begin[i]));
52}
53
54//=================================================================================================
55// Random numbers:
56
57
58// Returns a random float 0 <= x < 1. Seed must never be 0.
59static inline double drand(double* seed) {
60 int q;
61 *seed *= 1389796;
62 q = (int)(*seed / 2147483647);
63 *seed -= (double)q * 2147483647;
64 return *seed / 2147483647; }
65
66
67// Returns a random integer 0 <= x < size. Seed must never be 0.
68static inline int irand(double* seed, int size) {
69 return (int)(drand(seed) * size); }
70
71
72//=================================================================================================
73// Variable datatype + minor functions:
74
75static const int var0 = 1;
76static const int var1 = 0;
77static const int varX = 3;
78
79struct varinfo_t
80{
81 unsigned val : 2; // variable value
82 unsigned pol : 1; // last polarity
83 unsigned tag : 1; // conflict analysis tag
84 unsigned lev : 28; // variable level
85};
86
87static inline int var_level (sat_solver3* s, int v) { return s->levels[v]; }
88static inline int var_value (sat_solver3* s, int v) { return s->assigns[v]; }
89static inline int var_polar (sat_solver3* s, int v) { return s->polarity[v]; }
90
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; }
93static inline void var_set_polar (sat_solver3* s, int v, int pol) { s->polarity[v] = pol; }
94
95// variable tags
96static inline int var_tag (sat_solver3* s, int v) { return s->tags[v]; }
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 );
101 s->tags[v] = tag;
102}
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 );
107 s->tags[v] |= tag;
108}
109static inline void solver2_clear_tags(sat_solver3* s, int start) {
110 int i, * tagged = veci_begin(&s->tagged);
111 for (i = start; i < veci_size(&s->tagged); i++)
112 s->tags[tagged[i]] = 0;
113 veci_resize(&s->tagged,start);
114}
115
117{
118 if ( var_value(s, v) == var0 )
119 return l_False;
120 if ( var_value(s, v) == var1 )
121 return l_True;
122 if ( var_value(s, v) == varX )
123 return l_Undef;
124 assert( 0 );
125 return 0;
126}
127
128//=================================================================================================
129// Simple helpers:
130
131static inline int sat_solver3_dl(sat_solver3* s) { return veci_size(&s->trail_lim); }
132static inline veci* sat_solver3_read_wlist(sat_solver3* s, lit l) { return &s->wlists[l]; }
133
134//=================================================================================================
135// Variable order functions:
136
137static inline void order_update(sat_solver3* s, int v) // updateorder
138{
139 int* orderpos = s->orderpos;
140 int* heap = veci_begin(&s->order);
141 int i = orderpos[v];
142 int x = heap[i];
143 int parent = (i - 1) / 2;
144
145 assert(s->orderpos[v] != -1);
146
147 while (i != 0 && s->activity[x] > s->activity[heap[parent]]){
148 heap[i] = heap[parent];
149 orderpos[heap[i]] = i;
150 i = parent;
151 parent = (i - 1) / 2;
152 }
153
154 heap[i] = x;
155 orderpos[x] = i;
156}
157
158static inline void order_assigned(sat_solver3* s, int v)
159{
160}
161
162static inline void order_unassigned(sat_solver3* s, int v) // undoorder
163{
164 int* orderpos = s->orderpos;
165 if (orderpos[v] == -1){
166 orderpos[v] = veci_size(&s->order);
167 veci_push(&s->order,v);
168 order_update(s,v);
169//printf( "+%d ", v );
170 }
171}
172
173static inline int order_select(sat_solver3* s, float random_var_freq) // selectvar
174{
175 int* heap = veci_begin(&s->order);
176 int* orderpos = s->orderpos;
177 // Random decision:
178 if (drand(&s->random_seed) < random_var_freq){
179 int next = irand(&s->random_seed,s->size);
180 assert(next >= 0 && next < s->size);
181 if (var_value(s, next) == varX)
182 return next;
183 }
184 // Activity based decision:
185 while (veci_size(&s->order) > 0){
186 int next = heap[0];
187 int size = veci_size(&s->order)-1;
188 int x = heap[size];
189 veci_resize(&s->order,size);
190 orderpos[next] = -1;
191 if (size > 0){
192 int i = 0;
193 int child = 1;
194 while (child < size){
195
196 if (child+1 < size && s->activity[heap[child]] < s->activity[heap[child+1]])
197 child++;
198 assert(child < size);
199 if (s->activity[x] >= s->activity[heap[child]])
200 break;
201
202 heap[i] = heap[child];
203 orderpos[heap[i]] = i;
204 i = child;
205 child = 2 * child + 1;
206 }
207 heap[i] = x;
208 orderpos[heap[i]] = i;
209 }
210 if (var_value(s, next) == varX)
211 return next;
212 }
213 return var_Undef;
214}
215
216void sat_solver3_set_var_activity(sat_solver3* s, int * pVars, int nVars)
217{
218 int i;
219 assert( s->VarActType == 1 );
220 for (i = 0; i < s->size; i++)
221 s->activity[i] = 0;
222 s->var_inc = Abc_Dbl2Word(1);
223 for ( i = 0; i < nVars; i++ )
224 {
225 int iVar = pVars ? pVars[i] : i;
226 s->activity[iVar] = Abc_Dbl2Word(nVars-i);
227 order_update( s, iVar );
228 }
229}
230
231//=================================================================================================
232// variable activities
233
234static inline void solver_init_activities(sat_solver3* s)
235{
236 // variable activities
237 s->VarActType = 0;
238 if ( s->VarActType == 0 )
239 {
240 s->var_inc = (1 << 5);
241 s->var_decay = -1;
242 }
243 else if ( s->VarActType == 1 )
244 {
245 s->var_inc = Abc_Dbl2Word(1.0);
246 s->var_decay = Abc_Dbl2Word(1.0 / 0.95);
247 }
248 else if ( s->VarActType == 2 )
249 {
250 s->var_inc = Xdbl_FromDouble(1.0);
251 s->var_decay = Xdbl_FromDouble(1.0 / 0.950);
252 }
253 else assert(0);
254
255 // clause activities
256 s->ClaActType = 0;
257 if ( s->ClaActType == 0 )
258 {
259 s->cla_inc = (1 << 11);
260 s->cla_decay = -1;
261 }
262 else
263 {
264 s->cla_inc = 1;
265 s->cla_decay = (float)(1 / 0.999);
266 }
267}
268
269static inline void act_var_rescale(sat_solver3* s)
270{
271 if ( s->VarActType == 0 )
272 {
273 word* activity = s->activity;
274 int i;
275 for (i = 0; i < s->size; i++)
276 activity[i] >>= 19;
277 s->var_inc >>= 19;
278 s->var_inc = Abc_MaxInt( (unsigned)s->var_inc, (1<<4) );
279 }
280 else if ( s->VarActType == 1 )
281 {
282 double* activity = (double*)s->activity;
283 int i;
284 for (i = 0; i < s->size; i++)
285 activity[i] *= 1e-100;
286 s->var_inc = Abc_Dbl2Word( Abc_Word2Dbl(s->var_inc) * 1e-100 );
287 //printf( "Rescaling var activity...\n" );
288 }
289 else if ( s->VarActType == 2 )
290 {
291 xdbl * activity = s->activity;
292 int i;
293 for (i = 0; i < s->size; i++)
294 activity[i] = Xdbl_Div( activity[i], 200 ); // activity[i] / 2^200
295 s->var_inc = Xdbl_Div( s->var_inc, 200 );
296 }
297 else assert(0);
298}
299static inline void act_var_bump(sat_solver3* s, int v)
300{
301 if ( s->VarActType == 0 )
302 {
303 s->activity[v] += s->var_inc;
304 if ((unsigned)s->activity[v] & 0x80000000)
305 act_var_rescale(s);
306 if (s->orderpos[v] != -1)
307 order_update(s,v);
308 }
309 else if ( s->VarActType == 1 )
310 {
311 double act = Abc_Word2Dbl(s->activity[v]) + Abc_Word2Dbl(s->var_inc);
312 s->activity[v] = Abc_Dbl2Word(act);
313 if (act > 1e100)
314 act_var_rescale(s);
315 if (s->orderpos[v] != -1)
316 order_update(s,v);
317 }
318 else if ( s->VarActType == 2 )
319 {
320 s->activity[v] = Xdbl_Add( s->activity[v], s->var_inc );
321 if (s->activity[v] > ABC_CONST(0x014c924d692ca61b))
322 act_var_rescale(s);
323 if (s->orderpos[v] != -1)
324 order_update(s,v);
325 }
326 else assert(0);
327}
328static inline void act_var_bump_global(sat_solver3* s, int v)
329{
330 if ( !s->pGlobalVars || !s->pGlobalVars[v] )
331 return;
332 if ( s->VarActType == 0 )
333 {
334 s->activity[v] += (int)((unsigned)s->var_inc * 3);
335 if (s->activity[v] & 0x80000000)
336 act_var_rescale(s);
337 if (s->orderpos[v] != -1)
338 order_update(s,v);
339 }
340 else if ( s->VarActType == 1 )
341 {
342 double act = Abc_Word2Dbl(s->activity[v]) + Abc_Word2Dbl(s->var_inc) * 3.0;
343 s->activity[v] = Abc_Dbl2Word(act);
344 if ( act > 1e100)
345 act_var_rescale(s);
346 if (s->orderpos[v] != -1)
347 order_update(s,v);
348 }
349 else if ( s->VarActType == 2 )
350 {
351 s->activity[v] = Xdbl_Add( s->activity[v], Xdbl_Mul(s->var_inc, Xdbl_FromDouble(3.0)) );
352 if (s->activity[v] > ABC_CONST(0x014c924d692ca61b))
353 act_var_rescale(s);
354 if (s->orderpos[v] != -1)
355 order_update(s,v);
356 }
357 else assert( 0 );
358}
359static inline void act_var_bump_factor(sat_solver3* s, int v)
360{
361 if ( !s->factors )
362 return;
363 if ( s->VarActType == 0 )
364 {
365 s->activity[v] += (int)((unsigned)s->var_inc * (float)s->factors[v]);
366 if (s->activity[v] & 0x80000000)
367 act_var_rescale(s);
368 if (s->orderpos[v] != -1)
369 order_update(s,v);
370 }
371 else if ( s->VarActType == 1 )
372 {
373 double act = Abc_Word2Dbl(s->activity[v]) + Abc_Word2Dbl(s->var_inc) * s->factors[v];
374 s->activity[v] = Abc_Dbl2Word(act);
375 if ( act > 1e100)
376 act_var_rescale(s);
377 if (s->orderpos[v] != -1)
378 order_update(s,v);
379 }
380 else if ( s->VarActType == 2 )
381 {
382 s->activity[v] = Xdbl_Add( s->activity[v], Xdbl_Mul(s->var_inc, Xdbl_FromDouble(s->factors[v])) );
383 if (s->activity[v] > ABC_CONST(0x014c924d692ca61b))
384 act_var_rescale(s);
385 if (s->orderpos[v] != -1)
386 order_update(s,v);
387 }
388 else assert( 0 );
389}
390
391static inline void act_var_decay(sat_solver3* s)
392{
393 if ( s->VarActType == 0 )
394 s->var_inc += (s->var_inc >> 4);
395 else if ( s->VarActType == 1 )
396 s->var_inc = Abc_Dbl2Word( Abc_Word2Dbl(s->var_inc) * Abc_Word2Dbl(s->var_decay) );
397 else if ( s->VarActType == 2 )
398 s->var_inc = Xdbl_Mul(s->var_inc, s->var_decay);
399 else assert(0);
400}
401
402// clause activities
403static inline void act_clause_rescale(sat_solver3* s)
404{
405 if ( s->ClaActType == 0 )
406 {
407 unsigned* activity = (unsigned *)veci_begin(&s->act_clas);
408 int i;
409 for (i = 0; i < veci_size(&s->act_clas); i++)
410 activity[i] >>= 14;
411 s->cla_inc >>= 14;
412 s->cla_inc = Abc_MaxInt( s->cla_inc, (1<<10) );
413 }
414 else
415 {
416 float* activity = (float *)veci_begin(&s->act_clas);
417 int i;
418 for (i = 0; i < veci_size(&s->act_clas); i++)
419 activity[i] *= (float)1e-20;
420 s->cla_inc *= (float)1e-20;
421 }
422}
423static inline void act_clause_bump(sat_solver3* s, clause *c)
424{
425 if ( s->ClaActType == 0 )
426 {
427 unsigned* act = (unsigned *)veci_begin(&s->act_clas) + c->lits[c->size];
428 *act += s->cla_inc;
429 if ( *act & 0x80000000 )
430 act_clause_rescale(s);
431 }
432 else
433 {
434 float* act = (float *)veci_begin(&s->act_clas) + c->lits[c->size];
435 *act += s->cla_inc;
436 if (*act > 1e20)
437 act_clause_rescale(s);
438 }
439}
440static inline void act_clause_decay(sat_solver3* s)
441{
442 if ( s->ClaActType == 0 )
443 s->cla_inc += (s->cla_inc >> 10);
444 else
445 s->cla_inc *= s->cla_decay;
446}
447
448
449//=================================================================================================
450// Sorting functions (sigh):
451
452static inline void selectionsort(void** array, int size, int(*comp)(const void *, const void *))
453{
454 int i, j, best_i;
455 void* tmp;
456
457 for (i = 0; i < size-1; i++){
458 best_i = i;
459 for (j = i+1; j < size; j++){
460 if (comp(array[j], array[best_i]) < 0)
461 best_i = j;
462 }
463 tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
464 }
465}
466
467static void sortrnd(void** array, int size, int(*comp)(const void *, const void *), double* seed)
468{
469 if (size <= 15)
470 selectionsort(array, size, comp);
471
472 else{
473 void* pivot = array[irand(seed, size)];
474 void* tmp;
475 int i = -1;
476 int j = size;
477
478 for(;;){
479 do i++; while(comp(array[i], pivot)<0);
480 do j--; while(comp(pivot, array[j])<0);
481
482 if (i >= j) break;
483
484 tmp = array[i]; array[i] = array[j]; array[j] = tmp;
485 }
486
487 sortrnd(array , i , comp, seed);
488 sortrnd(&array[i], size-i, comp, seed);
489 }
490}
491
492//=================================================================================================
493// Clause functions:
494
495static inline int sat_clause_compute_lbd( sat_solver3* s, clause* c )
496{
497 int i, lev, minl = 0, lbd = 0;
498 for (i = 0; i < (int)c->size; i++)
499 {
500 lev = var_level(s, lit_var(c->lits[i]));
501 if ( !(minl & (1 << (lev & 31))) )
502 {
503 minl |= 1 << (lev & 31);
504 lbd++;
505// printf( "%d ", lev );
506 }
507 }
508// printf( " -> %d\n", lbd );
509 return lbd;
510}
511
512/* pre: size > 1 && no variable occurs twice
513 */
514int sat_solver3_clause_new(sat_solver3* s, lit* begin, lit* end, int learnt)
515{
516 int fUseBinaryClauses = 1;
517 int size;
518 clause* c;
519 int h;
520
521 assert(end - begin > 1);
522 assert(learnt >= 0 && learnt < 2);
523 size = end - begin;
524
525 // do not allocate memory for the two-literal problem clause
526 if ( fUseBinaryClauses && size == 2 && !learnt )
527 {
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])));
530 s->stats.clauses++;
531 s->stats.clauses_literals += size;
532 return 0;
533 }
534
535 // create new clause
536// h = Vec_SetAppend( &s->Mem, NULL, size + learnt + 1 + 1 ) << 1;
537 h = Sat_MemAppend( &s->Mem, begin, size, learnt, 0 );
538 assert( !(h & 1) );
539 if ( s->hLearnts == -1 && learnt )
540 s->hLearnts = h;
541 if (learnt)
542 {
543 c = clause_read( s, h );
544 c->lbd = sat_clause_compute_lbd( s, c );
545 assert( clause_id(c) == veci_size(&s->act_clas) );
546// veci_push(&s->learned, h);
547// act_clause_bump(s,clause_read(s, h));
548 if ( s->ClaActType == 0 )
549 veci_push(&s->act_clas, (1<<10));
550 else
551 veci_push(&s->act_clas, s->cla_inc);
552 s->stats.learnts++;
553 s->stats.learnts_literals += size;
554 }
555 else
556 {
557 s->stats.clauses++;
558 s->stats.clauses_literals += size;
559 }
560
561 assert(begin[0] >= 0);
562 assert(begin[0] < s->size*2);
563 assert(begin[1] >= 0);
564 assert(begin[1] < s->size*2);
565
566 assert(lit_neg(begin[0]) < s->size*2);
567 assert(lit_neg(begin[1]) < s->size*2);
568
569 //veci_push(sat_solver3_read_wlist(s,lit_neg(begin[0])),c);
570 //veci_push(sat_solver3_read_wlist(s,lit_neg(begin[1])),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])));
573
574 return h;
575}
576
577
578//=================================================================================================
579// Minor (solver) functions:
580
581static inline int sat_solver3_enqueue(sat_solver3* s, lit l, int from)
582{
583 int v = lit_var(l);
584 if ( s->pFreqs[v] == 0 )
585// {
586 s->pFreqs[v] = 1;
587// s->nVarUsed++;
588// }
589
590#ifdef VERBOSEDEBUG
591 printf(L_IND"enqueue("L_LIT")\n", L_ind, L_lit(l));
592#endif
593 if (var_value(s, v) != varX)
594 return var_value(s, v) == lit_sign(l);
595 else{
596/*
597 if ( s->pCnfFunc )
598 {
599 if ( lit_sign(l) )
600 {
601 if ( (s->loads[v] & 1) == 0 )
602 {
603 s->loads[v] ^= 1;
604 s->pCnfFunc( s->pCnfMan, l );
605 }
606 }
607 else
608 {
609 if ( (s->loads[v] & 2) == 0 )
610 {
611 s->loads[v] ^= 2;
612 s->pCnfFunc( s->pCnfMan, l );
613 }
614 }
615 }
616*/
617 // New fact -- store it.
618#ifdef VERBOSEDEBUG
619 printf(L_IND"bind("L_LIT")\n", L_ind, L_lit(l));
620#endif
621 var_set_value(s, v, lit_sign(l));
622 var_set_level(s, v, sat_solver3_dl(s));
623 s->reasons[v] = from;
624 s->trail[s->qtail++] = l;
625 order_assigned(s, v);
626 return true;
627 }
628}
629
630
631static inline int sat_solver3_decision(sat_solver3* s, lit l){
632 assert(s->qtail == s->qhead);
633 assert(var_value(s, lit_var(l)) == varX);
634#ifdef VERBOSEDEBUG
635 printf(L_IND"assume("L_LIT") ", L_ind, L_lit(l));
636 printf( "act = %.20f\n", s->activity[lit_var(l)] );
637#endif
638 veci_push(&s->trail_lim,s->qtail);
639 return sat_solver3_enqueue(s,l,0);
640}
641
642
643static void sat_solver3_canceluntil(sat_solver3* s, int level) {
644 int bound;
645 int lastLev;
646 int c;
647
648 if (sat_solver3_dl(s) <= level)
649 return;
650
651 assert( veci_size(&s->trail_lim) > 0 );
652 bound = (veci_begin(&s->trail_lim))[level];
653 lastLev = (veci_begin(&s->trail_lim))[veci_size(&s->trail_lim)-1];
654
656 // added to cancel all assignments
657// if ( level == -1 )
658// bound = 0;
660
661 for (c = s->qtail-1; c >= bound; c--) {
662 int x = lit_var(s->trail[c]);
663 var_set_value(s, x, varX);
664 s->reasons[x] = 0;
665 if ( c < lastLev )
666 var_set_polar( s, x, !lit_sign(s->trail[c]) );
667 }
668 //printf( "\n" );
669
670 for (c = s->qhead-1; c >= bound; c--)
671 order_unassigned(s,lit_var(s->trail[c]));
672
673 s->qhead = s->qtail = bound;
674 veci_resize(&s->trail_lim,level);
675}
676
677static void sat_solver3_canceluntil_rollback(sat_solver3* s, int NewBound) {
678 int c, x;
679
680 assert( sat_solver3_dl(s) == 0 );
681 assert( s->qtail == s->qhead );
682 assert( s->qtail >= NewBound );
683
684 for (c = s->qtail-1; c >= NewBound; c--)
685 {
686 x = lit_var(s->trail[c]);
687 var_set_value(s, x, varX);
688 s->reasons[x] = 0;
689 }
690
691 for (c = s->qhead-1; c >= NewBound; c--)
692 order_unassigned(s,lit_var(s->trail[c]));
693
694 s->qhead = s->qtail = NewBound;
695}
696
697static void sat_solver3_record(sat_solver3* s, veci* cls)
698{
699 lit* begin = veci_begin(cls);
700 lit* end = begin + veci_size(cls);
701 int h = (veci_size(cls) > 1) ? sat_solver3_clause_new(s,begin,end,1) : 0;
702 sat_solver3_enqueue(s,*begin,h);
703 assert(veci_size(cls) > 0);
704 if ( h == 0 )
705 veci_push( &s->unit_lits, *begin );
706
707/*
708 if (h != 0) {
709 act_clause_bump(s,clause_read(s, h));
710 s->stats.learnts++;
711 s->stats.learnts_literals += veci_size(cls);
712 }
713*/
714}
715
717{
718 // count top-level assignments
719 int i, Count = 0;
720 assert(sat_solver3_dl(s) == 0);
721 for ( i = 0; i < s->size; i++ )
722 if (var_value(s, i) != varX)
723 Count++;
724 return Count;
725}
726
727static double sat_solver3_progress(sat_solver3* s)
728{
729 int i;
730 double progress = 0;
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;
736}
737
738//=================================================================================================
739// Major methods:
740
741static int sat_solver3_lit_removable(sat_solver3* s, int x, int minl)
742{
743 int top = veci_size(&s->tagged);
744
745 assert(s->reasons[x] != 0);
746 veci_resize(&s->stack,0);
747 veci_push(&s->stack,x);
748
749 while (veci_size(&s->stack)){
750 int v = veci_pop(&s->stack);
751 assert(s->reasons[v] != 0);
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);
758 }else{
759 solver2_clear_tags(s, top);
760 return 0;
761 }
762 }
763 }else{
764 clause* c = clause_read(s, s->reasons[v]);
765 lit* lits = clause_begin(c);
766 int i;
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);
773 }else{
774 solver2_clear_tags(s, top);
775 return 0;
776 }
777 }
778 }
779 }
780 }
781 return 1;
782}
783
784
785/*_________________________________________________________________________________________________
786|
787| analyzeFinal : (p : Lit) -> [void]
788|
789| Description:
790| Specialized analysis procedure to express the final conflict in terms of assumptions.
791| Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and
792| stores the result in 'out_conflict'.
793|________________________________________________________________________________________________@*/
794/*
795void Solver::analyzeFinal(Clause* confl, bool skip_first)
796{
797 // -- NOTE! This code is relatively untested. Please report bugs!
798 conflict.clear();
799 if (root_level == 0) return;
800
801 vec<char>& seen = analyze_seen;
802 for (int i = skip_first ? 1 : 0; i < confl->size(); i++){
803 Var x = var((*confl)[i]);
804 if (level[x] > 0)
805 seen[x] = 1;
806 }
807
808 int start = (root_level >= trail_lim.size()) ? trail.size()-1 : trail_lim[root_level];
809 for (int i = start; i >= trail_lim[0]; i--){
810 Var x = var(trail[i]);
811 if (seen[x]){
812 GClause r = reason[x];
813 if (r == GClause_NULL){
814 assert(level[x] > 0);
815 conflict.push(~trail[i]);
816 }else{
817 if (r.isLit()){
818 Lit p = r.lit();
819 if (level[var(p)] > 0)
820 seen[var(p)] = 1;
821 }else{
822 Clause& c = *r.clause();
823 for (int j = 1; j < c.size(); j++)
824 if (level[var(c[j])] > 0)
825 seen[var(c[j])] = 1;
826 }
827 }
828 seen[x] = 0;
829 }
830 }
831}
832*/
833
834#ifdef SAT_USE_ANALYZE_FINAL
835
836static void sat_solver3_analyze_final(sat_solver3* s, int hConf, int skip_first)
837{
838 clause* conf = clause_read(s, hConf);
839 int i, j, start;
840 veci_resize(&s->conf_final,0);
841 if ( s->root_level == 0 )
842 return;
843 assert( veci_size(&s->tagged) == 0 );
844// assert( s->tags[lit_var(p)] == l_Undef );
845// s->tags[lit_var(p)] = l_True;
846 for (i = skip_first ? 1 : 0; i < clause_size(conf); i++)
847 {
848 int x = lit_var(clause_begin(conf)[i]);
849 if (var_level(s, x) > 0)
850 var_set_tag(s, x, 1);
851 }
852
853 start = (s->root_level >= veci_size(&s->trail_lim))? s->qtail-1 : (veci_begin(&s->trail_lim))[s->root_level];
854 for (i = start; i >= (veci_begin(&s->trail_lim))[0]; i--){
855 int x = lit_var(s->trail[i]);
856 if (var_tag(s,x)){
857 if (s->reasons[x] == 0){
858 assert(var_level(s, x) > 0);
859 veci_push(&s->conf_final,lit_neg(s->trail[i]));
860 }else{
861 if (clause_is_lit(s->reasons[x])){
862 lit q = clause_read_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);
866 }
867 else{
868 clause* c = clause_read(s, s->reasons[x]);
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);
873 }
874 }
875 }
876 }
877 solver2_clear_tags(s,0);
878}
879
880#endif
881
882static void sat_solver3_analyze(sat_solver3* s, int h, veci* learnt)
883{
884 lit* trail = s->trail;
885 int cnt = 0;
886 lit p = lit_Undef;
887 int ind = s->qtail-1;
888 lit* lits;
889 int i, j, minl;
890 veci_push(learnt,lit_Undef);
891 do{
892 assert(h != 0);
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);
897 act_var_bump(s,x);
898 if (var_level(s, x) == sat_solver3_dl(s))
899 cnt++;
900 else
901 veci_push(learnt,clause_read_lit(h));
902 }
903 }else{
904 clause* c = clause_read(s, h);
905
906 if (clause_learnt(c))
907 act_clause_bump(s,c);
908 lits = clause_begin(c);
909 //printlits(lits,lits+clause_size(c)); printf("\n");
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);
914 act_var_bump(s,x);
915 // bump variables propaged by the LBD=2 clause
916// if ( s->reasons[x] && clause_read(s, s->reasons[x])->lbd <= 2 )
917// act_var_bump(s,x);
918 if (var_level(s,x) == sat_solver3_dl(s))
919 cnt++;
920 else
921 veci_push(learnt,lits[j]);
922 }
923 }
924 }
925
926 while ( !var_tag(s, lit_var(trail[ind--])) );
927
928 p = trail[ind+1];
929 h = s->reasons[lit_var(p)];
930 cnt--;
931
932 }while (cnt > 0);
933
934 *veci_begin(learnt) = lit_neg(p);
935
936 lits = veci_begin(learnt);
937 minl = 0;
938 for (i = 1; i < veci_size(learnt); i++){
939 int lev = var_level(s, lit_var(lits[i]));
940 minl |= 1 << (lev & 31);
941 }
942
943 // simplify (full)
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))
946 lits[j++] = lits[i];
947 }
948
949 // update size of learnt + statistics
950 veci_resize(learnt,j);
951 s->stats.tot_literals += j;
952
953
954 // clear tags
955 solver2_clear_tags(s,0);
956
957#ifdef DEBUG
958 for (i = 0; i < s->size; i++)
959 assert(!var_tag(s, i));
960#endif
961
962#ifdef VERBOSEDEBUG
963 printf(L_IND"Learnt {", L_ind);
964 for (i = 0; i < veci_size(learnt); i++) printf(" "L_LIT, L_lit(lits[i]));
965#endif
966 if (veci_size(learnt) > 1){
967 int max_i = 1;
968 int max = var_level(s, lit_var(lits[1]));
969 lit tmp;
970
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]));
974 max_i = i;
975 }
976
977 tmp = lits[1];
978 lits[1] = lits[max_i];
979 lits[max_i] = tmp;
980 }
981#ifdef VERBOSEDEBUG
982 {
983 int lev = veci_size(learnt) > 1 ? var_level(s, lit_var(lits[1])) : 0;
984 printf(" } at level %d\n", lev);
985 }
986#endif
987}
988
989//#define TEST_CNF_LOAD
990
992{
993 int hConfl = 0;
994 lit* lits;
995 lit false_lit;
996
997 //printf("sat_solver3_propagate\n");
998 while (hConfl == 0 && s->qtail - s->qhead > 0){
999 lit p = s->trail[s->qhead++];
1000
1001#ifdef TEST_CNF_LOAD
1002 int v = lit_var(p);
1003 if ( s->pCnfFunc )
1004 {
1005 if ( lit_sign(p) )
1006 {
1007 if ( (s->loads[v] & 1) == 0 )
1008 {
1009 s->loads[v] ^= 1;
1010 s->pCnfFunc( s->pCnfMan, p );
1011 }
1012 }
1013 else
1014 {
1015 if ( (s->loads[v] & 2) == 0 )
1016 {
1017 s->loads[v] ^= 2;
1018 s->pCnfFunc( s->pCnfMan, p );
1019 }
1020 }
1021 }
1022 {
1023#endif
1024
1025 veci* ws = sat_solver3_read_wlist(s,p);
1026 int* begin = veci_begin(ws);
1027 int* end = begin + veci_size(ws);
1028 int*i, *j;
1029
1030 s->stats.propagations++;
1031// s->simpdb_props--;
1032
1033 //printf("checking lit %d: "L_LIT"\n", veci_size(ws), L_lit(p));
1034 for (i = j = begin; i < end; ){
1035 if (clause_is_lit(*i)){
1036
1037 int Lit = clause_read_lit(*i);
1038 if (var_value(s, lit_var(Lit)) == lit_sign(Lit)){
1039 *j++ = *i++;
1040 continue;
1041 }
1042
1043 *j++ = *i;
1044 if (!sat_solver3_enqueue(s,clause_read_lit(*i),clause_from_lit(p))){
1045 hConfl = s->hBinary;
1046 (clause_begin(s->binary))[1] = lit_neg(p);
1047 (clause_begin(s->binary))[0] = clause_read_lit(*i++);
1048 // Copy the remaining watches:
1049 while (i < end)
1050 *j++ = *i++;
1051 }
1052 }else{
1053
1054 clause* c = clause_read(s,*i);
1055 lits = clause_begin(c);
1056
1057 // Make sure the false literal is data[1]:
1058 false_lit = lit_neg(p);
1059 if (lits[0] == false_lit){
1060 lits[0] = lits[1];
1061 lits[1] = false_lit;
1062 }
1063 assert(lits[1] == false_lit);
1064
1065 // If 0th watch is true, then clause is already satisfied.
1066 if (var_value(s, lit_var(lits[0])) == lit_sign(lits[0]))
1067 *j++ = *i;
1068 else{
1069 // Look for new watch:
1070 lit* stop = lits + clause_size(c);
1071 lit* k;
1072 for (k = lits + 2; k < stop; k++){
1073 if (var_value(s, lit_var(*k)) != !lit_sign(*k)){
1074 lits[1] = *k;
1075 *k = false_lit;
1076 veci_push(sat_solver3_read_wlist(s,lit_neg(lits[1])),*i);
1077 goto next; }
1078 }
1079
1080 *j++ = *i;
1081 // Clause is unit under assignment:
1082 if ( c->lrn )
1083 c->lbd = sat_clause_compute_lbd(s, c);
1084 if (!sat_solver3_enqueue(s,lits[0], *i)){
1085 hConfl = *i++;
1086 // Copy the remaining watches:
1087 while (i < end)
1088 *j++ = *i++;
1089 }
1090 }
1091 }
1092 next:
1093 i++;
1094 }
1095
1096 s->stats.inspects += j - veci_begin(ws);
1097 veci_resize(ws,j - veci_begin(ws));
1098#ifdef TEST_CNF_LOAD
1099 }
1100#endif
1101 }
1102
1103 return hConfl;
1104}
1105
1106//=================================================================================================
1107// External solver functions:
1108
1110{
1111 sat_solver3* s = (sat_solver3*)ABC_CALLOC( char, sizeof(sat_solver3));
1112
1113// Vec_SetAlloc_(&s->Mem, 15);
1114 Sat_MemAlloc_(&s->Mem, 17);
1115 s->hLearnts = -1;
1116 s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
1117 s->binary = clause_read( s, s->hBinary );
1118
1119 s->nLearntStart = LEARNT_MAX_START_DEFAULT; // starting learned clause limit
1120 s->nLearntDelta = LEARNT_MAX_INCRE_DEFAULT; // delta of learned clause limit
1121 s->nLearntRatio = LEARNT_MAX_RATIO_DEFAULT; // ratio of learned clause limit
1122 s->nLearntMax = s->nLearntStart;
1123
1124 // initialize vectors
1125 veci_new(&s->order);
1126 veci_new(&s->trail_lim);
1127 veci_new(&s->tagged);
1128// veci_new(&s->learned);
1129 veci_new(&s->act_clas);
1130 veci_new(&s->stack);
1131// veci_new(&s->model);
1132 veci_new(&s->unit_lits);
1133 veci_new(&s->temp_clause);
1134 veci_new(&s->conf_final);
1135
1136 // initialize arrays
1137 s->wlists = 0;
1138 s->activity = 0;
1139 s->orderpos = 0;
1140 s->reasons = 0;
1141 s->trail = 0;
1142
1143 // initialize other vars
1144 s->size = 0;
1145 s->cap = 0;
1146 s->qhead = 0;
1147 s->qtail = 0;
1148
1149 solver_init_activities(s);
1150 veci_new(&s->act_vars);
1151
1152 s->root_level = 0;
1153// s->simpdb_assigns = 0;
1154// s->simpdb_props = 0;
1155 s->random_seed = 91648253;
1156 s->progress_estimate = 0;
1157// s->binary = (clause*)ABC_ALLOC( char, sizeof(clause) + sizeof(lit)*2);
1158// s->binary->size_learnt = (2 << 1);
1159 s->verbosity = 0;
1160
1161 s->stats.starts = 0;
1162 s->stats.decisions = 0;
1163 s->stats.propagations = 0;
1164 s->stats.inspects = 0;
1165 s->stats.conflicts = 0;
1166 s->stats.clauses = 0;
1167 s->stats.clauses_literals = 0;
1168 s->stats.learnts = 0;
1169 s->stats.learnts_literals = 0;
1170 s->stats.tot_literals = 0;
1171 return s;
1172}
1173
1175{
1176 sat_solver3* s = (sat_solver3*)ABC_CALLOC( char, sizeof(sat_solver3));
1177
1178// Vec_SetAlloc_(&s->Mem, 15);
1179 Sat_MemAlloc_(&s->Mem, 15);
1180 s->hLearnts = -1;
1181 s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
1182 s->binary = clause_read( s, s->hBinary );
1183
1184 s->nLearntStart = LEARNT_MAX_START_DEFAULT; // starting learned clause limit
1185 s->nLearntDelta = LEARNT_MAX_INCRE_DEFAULT; // delta of learned clause limit
1186 s->nLearntRatio = LEARNT_MAX_RATIO_DEFAULT; // ratio of learned clause limit
1187 s->nLearntMax = s->nLearntStart;
1188
1189 // initialize vectors
1190 veci_new(&s->order);
1191 veci_new(&s->trail_lim);
1192 veci_new(&s->tagged);
1193// veci_new(&s->learned);
1194 veci_new(&s->act_clas);
1195 veci_new(&s->stack);
1196// veci_new(&s->model);
1197 veci_new(&s->unit_lits);
1198 veci_new(&s->temp_clause);
1199 veci_new(&s->conf_final);
1200
1201 // initialize arrays
1202 s->wlists = 0;
1203 s->activity = 0;
1204 s->orderpos = 0;
1205 s->reasons = 0;
1206 s->trail = 0;
1207
1208 // initialize other vars
1209 s->size = 0;
1210 s->cap = 0;
1211 s->qhead = 0;
1212 s->qtail = 0;
1213
1214 solver_init_activities(s);
1215 veci_new(&s->act_vars);
1216
1217 s->root_level = 0;
1218// s->simpdb_assigns = 0;
1219// s->simpdb_props = 0;
1220 s->random_seed = seed;
1221 s->progress_estimate = 0;
1222// s->binary = (clause*)ABC_ALLOC( char, sizeof(clause) + sizeof(lit)*2);
1223// s->binary->size_learnt = (2 << 1);
1224 s->verbosity = 0;
1225
1226 s->stats.starts = 0;
1227 s->stats.decisions = 0;
1228 s->stats.propagations = 0;
1229 s->stats.inspects = 0;
1230 s->stats.conflicts = 0;
1231 s->stats.clauses = 0;
1232 s->stats.clauses_literals = 0;
1233 s->stats.learnts = 0;
1234 s->stats.learnts_literals = 0;
1235 s->stats.tot_literals = 0;
1236 return s;
1237}
1238
1240{
1241 int var;
1242
1243 if (s->cap < n){
1244 int old_cap = s->cap;
1245 while (s->cap < n) s->cap = s->cap*2+1;
1246 if ( s->cap < 50000 )
1247 s->cap = 50000;
1248
1249 s->wlists = ABC_REALLOC(veci, s->wlists, s->cap*2);
1250// s->vi = ABC_REALLOC(varinfo,s->vi, s->cap);
1251 s->levels = ABC_REALLOC(int, s->levels, s->cap);
1252 s->assigns = ABC_REALLOC(char, s->assigns, s->cap);
1253 s->polarity = ABC_REALLOC(char, s->polarity, s->cap);
1254 s->tags = ABC_REALLOC(char, s->tags, s->cap);
1255 s->loads = ABC_REALLOC(char, s->loads, s->cap);
1256 s->activity = ABC_REALLOC(word, s->activity, s->cap);
1257 s->activity2 = ABC_REALLOC(word, s->activity2,s->cap);
1258 s->pFreqs = ABC_REALLOC(char, s->pFreqs, s->cap);
1259
1260 if ( s->factors )
1261 s->factors = ABC_REALLOC(double, s->factors, s->cap);
1262 s->orderpos = ABC_REALLOC(int, s->orderpos, s->cap);
1263 s->reasons = ABC_REALLOC(int, s->reasons, s->cap);
1264 s->trail = ABC_REALLOC(lit, s->trail, s->cap);
1265 s->model = ABC_REALLOC(int, s->model, s->cap);
1266 memset( s->wlists + 2*old_cap, 0, 2*(s->cap-old_cap)*sizeof(veci) );
1267 }
1268
1269 for (var = s->size; var < n; var++){
1270 assert(!s->wlists[2*var].size);
1271 assert(!s->wlists[2*var+1].size);
1272 if ( s->wlists[2*var].ptr == NULL )
1273 veci_new(&s->wlists[2*var]);
1274 if ( s->wlists[2*var+1].ptr == NULL )
1275 veci_new(&s->wlists[2*var+1]);
1276
1277 if ( s->VarActType == 0 )
1278 s->activity[var] = (1<<10);
1279 else if ( s->VarActType == 1 )
1280 s->activity[var] = 0;
1281 else if ( s->VarActType == 2 )
1282 s->activity[var] = 0;
1283 else assert(0);
1284
1285 s->pFreqs[var] = 0;
1286 if ( s->factors )
1287 s->factors [var] = 0;
1288// *((int*)s->vi + var) = 0; s->vi[var].val = varX;
1289 s->levels [var] = 0;
1290 s->assigns [var] = varX;
1291 s->polarity[var] = 0;
1292 s->tags [var] = 0;
1293 s->loads [var] = 0;
1294 s->orderpos[var] = veci_size(&s->order);
1295 s->reasons [var] = 0;
1296 s->model [var] = 0;
1297
1298 /* does not hold because variables enqueued at top level will not be reinserted in the heap
1299 assert(veci_size(&s->order) == var);
1300 */
1301 veci_push(&s->order,var);
1302 order_update(s, var);
1303 }
1304
1305 s->size = n > s->size ? n : s->size;
1306}
1307
1309{
1310// Vec_SetFree_( &s->Mem );
1311 Sat_MemFree_( &s->Mem );
1312
1313 // delete vectors
1314 veci_delete(&s->order);
1315 veci_delete(&s->trail_lim);
1316 veci_delete(&s->tagged);
1317// veci_delete(&s->learned);
1318 veci_delete(&s->act_clas);
1319 veci_delete(&s->stack);
1320// veci_delete(&s->model);
1321 veci_delete(&s->act_vars);
1322 veci_delete(&s->unit_lits);
1323 veci_delete(&s->pivot_vars);
1324 veci_delete(&s->temp_clause);
1325 veci_delete(&s->conf_final);
1326
1327 // delete arrays
1328 if (s->reasons != 0){
1329 int i;
1330 for (i = 0; i < s->cap*2; i++)
1331 veci_delete(&s->wlists[i]);
1332 ABC_FREE(s->wlists );
1333// ABC_FREE(s->vi );
1334 ABC_FREE(s->levels );
1335 ABC_FREE(s->assigns );
1336 ABC_FREE(s->polarity );
1337 ABC_FREE(s->tags );
1338 ABC_FREE(s->loads );
1339 ABC_FREE(s->activity );
1340 ABC_FREE(s->activity2);
1341 ABC_FREE(s->pFreqs );
1342 ABC_FREE(s->factors );
1343 ABC_FREE(s->orderpos );
1344 ABC_FREE(s->reasons );
1345 ABC_FREE(s->trail );
1346 ABC_FREE(s->model );
1347 }
1348
1349 ABC_FREE(s);
1350}
1351
1353{
1354 int i;
1355 Sat_MemRestart( &s->Mem );
1356 s->hLearnts = -1;
1357 s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
1358 s->binary = clause_read( s, s->hBinary );
1359
1360 veci_resize(&s->trail_lim, 0);
1361 veci_resize(&s->order, 0);
1362 for ( i = 0; i < s->size*2; i++ )
1363 s->wlists[i].size = 0;
1364
1365 s->nDBreduces = 0;
1366
1367 // initialize other vars
1368 s->size = 0;
1369// s->cap = 0;
1370 s->qhead = 0;
1371 s->qtail = 0;
1372
1373
1374 // variable activities
1375 solver_init_activities(s);
1376 veci_resize(&s->act_clas, 0);
1377
1378
1379 s->root_level = 0;
1380// s->simpdb_assigns = 0;
1381// s->simpdb_props = 0;
1382 s->random_seed = 91648253;
1383 s->progress_estimate = 0;
1384 s->verbosity = 0;
1385
1386 s->stats.starts = 0;
1387 s->stats.decisions = 0;
1388 s->stats.propagations = 0;
1389 s->stats.inspects = 0;
1390 s->stats.conflicts = 0;
1391 s->stats.clauses = 0;
1392 s->stats.clauses_literals = 0;
1393 s->stats.learnts = 0;
1394 s->stats.learnts_literals = 0;
1395 s->stats.tot_literals = 0;
1396}
1397
1399{
1400 int i;
1401 Sat_MemRestart( &s->Mem );
1402 s->hLearnts = -1;
1403 s->hBinary = Sat_MemAppend( &s->Mem, NULL, 2, 0, 0 );
1404 s->binary = clause_read( s, s->hBinary );
1405
1406 veci_resize(&s->trail_lim, 0);
1407 veci_resize(&s->order, 0);
1408 for ( i = 0; i < s->size*2; i++ )
1409 s->wlists[i].size = 0;
1410
1411 s->nDBreduces = 0;
1412
1413 // initialize other vars
1414 s->size = 0;
1415// s->cap = 0;
1416 s->qhead = 0;
1417 s->qtail = 0;
1418
1419 solver_init_activities(s);
1420 veci_resize(&s->act_clas, 0);
1421
1422 s->root_level = 0;
1423// s->simpdb_assigns = 0;
1424// s->simpdb_props = 0;
1425 s->random_seed = seed;
1426 s->progress_estimate = 0;
1427 s->verbosity = 0;
1428
1429 s->stats.starts = 0;
1430 s->stats.decisions = 0;
1431 s->stats.propagations = 0;
1432 s->stats.inspects = 0;
1433 s->stats.conflicts = 0;
1434 s->stats.clauses = 0;
1435 s->stats.clauses_literals = 0;
1436 s->stats.learnts = 0;
1437 s->stats.learnts_literals = 0;
1438 s->stats.tot_literals = 0;
1439}
1440
1441// returns memory in bytes used by the SAT solver
1443{
1444 int i;
1445 double Mem = sizeof(sat_solver3);
1446 for (i = 0; i < s->cap*2; i++)
1447 Mem += s->wlists[i].cap * sizeof(int);
1448 Mem += s->cap * sizeof(veci); // ABC_FREE(s->wlists );
1449 Mem += s->cap * sizeof(int); // ABC_FREE(s->levels );
1450 Mem += s->cap * sizeof(char); // ABC_FREE(s->assigns );
1451 Mem += s->cap * sizeof(char); // ABC_FREE(s->polarity );
1452 Mem += s->cap * sizeof(char); // ABC_FREE(s->tags );
1453 Mem += s->cap * sizeof(char); // ABC_FREE(s->loads );
1454 Mem += s->cap * sizeof(word); // ABC_FREE(s->activity );
1455 if ( s->activity2 )
1456 Mem += s->cap * sizeof(word); // ABC_FREE(s->activity );
1457 if ( s->factors )
1458 Mem += s->cap * sizeof(double); // ABC_FREE(s->factors );
1459 Mem += s->cap * sizeof(int); // ABC_FREE(s->orderpos );
1460 Mem += s->cap * sizeof(int); // ABC_FREE(s->reasons );
1461 Mem += s->cap * sizeof(lit); // ABC_FREE(s->trail );
1462 Mem += s->cap * sizeof(int); // ABC_FREE(s->model );
1463
1464 Mem += s->order.cap * sizeof(int);
1465 Mem += s->trail_lim.cap * sizeof(int);
1466 Mem += s->tagged.cap * sizeof(int);
1467// Mem += s->learned.cap * sizeof(int);
1468 Mem += s->stack.cap * sizeof(int);
1469 Mem += s->act_vars.cap * sizeof(int);
1470 Mem += s->unit_lits.cap * sizeof(int);
1471 Mem += s->act_clas.cap * sizeof(int);
1472 Mem += s->temp_clause.cap * sizeof(int);
1473 Mem += s->conf_final.cap * sizeof(int);
1474 Mem += Sat_MemMemoryAll( &s->Mem );
1475 return Mem;
1476}
1477
1479{
1480 assert(sat_solver3_dl(s) == 0);
1481 if (sat_solver3_propagate(s) != 0)
1482 return false;
1483 return true;
1484}
1485
1487{
1488 static abctime TimeTotal = 0;
1489 abctime clk = Abc_Clock();
1490 Sat_Mem_t * pMem = &s->Mem;
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;
1495 clause * c;
1496
1497 assert( s->nLearntMax > 0 );
1498 assert( nLearnedOld == Sat_MemEntryNum(pMem, 1) );
1499 assert( nLearnedOld == (int)s->stats.learnts );
1500
1501 s->nDBreduces++;
1502
1503 //printf( "Calling reduceDB with %d learned clause limit.\n", s->nLearntMax );
1505// return;
1506
1507 // create sorting values
1508 pSortValues = ABC_ALLOC( int, nLearnedOld );
1509 Sat_MemForEachLearned( pMem, c, i, k )
1510 {
1511 Id = clause_id(c);
1512// pSortValues[Id] = act[Id];
1513 if ( s->ClaActType == 0 )
1514 pSortValues[Id] = ((7 - Abc_MinInt(c->lbd, 7)) << 28) | (act_clas[Id] >> 4);
1515 else
1516 pSortValues[Id] = ((7 - Abc_MinInt(c->lbd, 7)) << 28);// | (act_clas[Id] >> 4);
1517 assert( pSortValues[Id] >= 0 );
1518 }
1519
1520 // preserve 1/20 of last clauses
1521 CounterStart = nLearnedOld - (s->nLearntMax / 20);
1522
1523 // preserve 3/4 of most active clauses
1524 nSelected = nLearnedOld*s->nLearntRatio/100;
1525
1526 // find non-decreasing permutation
1527 pPerm = Abc_MergeSortCost( pSortValues, nLearnedOld );
1528 assert( pSortValues[pPerm[0]] <= pSortValues[pPerm[nLearnedOld-1]] );
1529 nCutoffValue = pSortValues[pPerm[nLearnedOld-nSelected]];
1530 ABC_FREE( pPerm );
1531// ActCutOff = ABC_INFINITY;
1532
1533 // mark learned clauses to remove
1534 Counter = j = 0;
1535 Sat_MemForEachLearned( pMem, c, i, k )
1536 {
1537 assert( c->mark == 0 );
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)];
1540 else // delete
1541 {
1542 c->mark = 1;
1543 s->stats.learnts_literals -= clause_size(c);
1544 s->stats.learnts--;
1545 }
1546 }
1547 assert( s->stats.learnts == (unsigned)j );
1548 assert( Counter == nLearnedOld );
1549 veci_resize(&s->act_clas,j);
1550 ABC_FREE( pSortValues );
1551
1552 // update ID of each clause to be its new handle
1553 Counter = Sat_MemCompactLearned( pMem, 0 );
1554 assert( Counter == (int)s->stats.learnts );
1555
1556 // update reasons
1557 for ( i = 0; i < s->size; i++ )
1558 {
1559 if ( !s->reasons[i] ) // no reason
1560 continue;
1561 if ( clause_is_lit(s->reasons[i]) ) // 2-lit clause
1562 continue;
1563 if ( !clause_learnt_h(pMem, s->reasons[i]) ) // problem clause
1564 continue;
1565 c = clause_read( s, s->reasons[i] );
1566 assert( c->mark == 0 );
1567 s->reasons[i] = clause_id(c); // updating handle here!!!
1568 }
1569
1570 // update watches
1571 for ( i = 0; i < s->size*2; i++ )
1572 {
1573 pArray = veci_begin(&s->wlists[i]);
1574 for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
1575 {
1576 if ( clause_is_lit(pArray[k]) ) // 2-lit clause
1577 pArray[j++] = pArray[k];
1578 else if ( !clause_learnt_h(pMem, pArray[k]) ) // problem clause
1579 pArray[j++] = pArray[k];
1580 else
1581 {
1582 c = clause_read(s, pArray[k]);
1583 if ( !c->mark ) // useful learned clause
1584 pArray[j++] = clause_id(c); // updating handle here!!!
1585 }
1586 }
1587 veci_resize(&s->wlists[i],j);
1588 }
1589
1590 // perform final move of the clauses
1591 Counter = Sat_MemCompactLearned( pMem, 1 );
1592 assert( Counter == (int)s->stats.learnts );
1593
1594 // report the results
1595 TimeTotal += Abc_Clock() - clk;
1596 if ( s->fVerbose )
1597 {
1598 Abc_Print(1, "reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
1599 s->stats.learnts, nLearnedOld, 100.0 * s->stats.learnts / nLearnedOld );
1600 Abc_PrintTime( 1, "Time", TimeTotal );
1601 }
1602}
1603
1604
1605// reverses to the previously bookmarked point
1607{
1608 Sat_Mem_t * pMem = &s->Mem;
1609 int i, k, j;
1610 static int Count = 0;
1611 Count++;
1612 assert( s->iVarPivot >= 0 && s->iVarPivot <= s->size );
1613 assert( s->iTrailPivot >= 0 && s->iTrailPivot <= s->qtail );
1614 // reset implication queue
1615 sat_solver3_canceluntil_rollback( s, s->iTrailPivot );
1616 // update order
1617 if ( s->iVarPivot < s->size )
1618 {
1619 if ( s->activity2 )
1620 {
1621 s->var_inc = s->var_inc2;
1622 memcpy( s->activity, s->activity2, sizeof(word) * s->iVarPivot );
1623 }
1624 veci_resize(&s->order, 0);
1625 for ( i = 0; i < s->iVarPivot; i++ )
1626 {
1627 if ( var_value(s, i) != varX )
1628 continue;
1629 s->orderpos[i] = veci_size(&s->order);
1630 veci_push(&s->order,i);
1631 order_update(s, i);
1632 }
1633 }
1634 // compact watches
1635 for ( i = 0; i < s->iVarPivot*2; i++ )
1636 {
1637 cla* pArray = veci_begin(&s->wlists[i]);
1638 for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
1639 {
1640 if ( clause_is_lit(pArray[k]) )
1641 {
1642 if ( clause_read_lit(pArray[k]) < s->iVarPivot*2 )
1643 pArray[j++] = pArray[k];
1644 }
1645 else if ( Sat_MemClauseUsed(pMem, pArray[k]) )
1646 pArray[j++] = pArray[k];
1647 }
1648 veci_resize(&s->wlists[i],j);
1649 }
1650 // reset watcher lists
1651 for ( i = 2*s->iVarPivot; i < 2*s->size; i++ )
1652 s->wlists[i].size = 0;
1653
1654 // reset clause counts
1655 s->stats.clauses = pMem->BookMarkE[0];
1656 s->stats.learnts = pMem->BookMarkE[1];
1657 // rollback clauses
1658 Sat_MemRollBack( pMem );
1659
1660 // resize learned arrays
1661 veci_resize(&s->act_clas, s->stats.learnts);
1662
1663 // initialize other vars
1664 s->size = s->iVarPivot;
1665 if ( s->size == 0 )
1666 {
1667 // s->size = 0;
1668 // s->cap = 0;
1669 s->qhead = 0;
1670 s->qtail = 0;
1671
1672 solver_init_activities(s);
1673
1674 s->root_level = 0;
1675 s->random_seed = 91648253;
1676 s->progress_estimate = 0;
1677 s->verbosity = 0;
1678
1679 s->stats.starts = 0;
1680 s->stats.decisions = 0;
1681 s->stats.propagations = 0;
1682 s->stats.inspects = 0;
1683 s->stats.conflicts = 0;
1684 s->stats.clauses = 0;
1685 s->stats.clauses_literals = 0;
1686 s->stats.learnts = 0;
1687 s->stats.learnts_literals = 0;
1688 s->stats.tot_literals = 0;
1689
1690 // initialize rollback
1691 s->iVarPivot = 0; // the pivot for variables
1692 s->iTrailPivot = 0; // the pivot for trail
1693 s->hProofPivot = 1; // the pivot for proof records
1694 }
1695}
1696
1697
1699{
1700 int fVerbose = 0;
1701 lit *i,*j;
1702 int maxvar;
1703 lit last;
1704 assert( begin < end );
1705 if ( fVerbose )
1706 {
1707 for ( i = begin; i < end; i++ )
1708 printf( "%s%d ", (*i)&1 ? "!":"", (*i)>>1 );
1709 printf( "\n" );
1710 }
1711
1712 veci_resize( &s->temp_clause, 0 );
1713 for ( i = begin; i < end; i++ )
1714 veci_push( &s->temp_clause, *i );
1715 begin = veci_begin( &s->temp_clause );
1716 end = begin + veci_size( &s->temp_clause );
1717
1718 // insertion sort
1719 maxvar = lit_var(*begin);
1720 for (i = begin + 1; i < end; i++){
1721 lit l = *i;
1722 maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
1723 for (j = i; j > begin && *(j-1) > l; j--)
1724 *j = *(j-1);
1725 *j = l;
1726 }
1727 sat_solver3_setnvars(s,maxvar+1);
1728
1729 // delete duplicates
1730 last = lit_Undef;
1731 for (i = j = begin; i < end; i++){
1732 //printf("lit: "L_LIT", value = %d\n", L_lit(*i), (lit_sign(*i) ? -s->assignss[lit_var(*i)] : s->assignss[lit_var(*i)]));
1733 if (*i == lit_neg(last) || var_value(s, lit_var(*i)) == lit_sign(*i))
1734 return true; // tautology
1735 else if (*i != last && var_value(s, lit_var(*i)) == varX)
1736 last = *j++ = *i;
1737 }
1738// j = i;
1739
1740 if (j == begin) // empty clause
1741 return false;
1742
1743 if (j - begin == 1) // unit clause
1744 return sat_solver3_enqueue(s,*begin,0);
1745
1746 // create new clause
1747 sat_solver3_clause_new(s,begin,j,0);
1748 return true;
1749}
1750
1751static double luby(double y, int x)
1752{
1753 int size, seq;
1754 for (size = 1, seq = 0; size < x+1; seq++, size = 2*size + 1);
1755 while (size-1 != x){
1756 size = (size-1) >> 1;
1757 seq--;
1758 x = x % size;
1759 }
1760 return pow(y, (double)seq);
1761}
1762
1763static void luby_test()
1764{
1765 int i;
1766 for ( i = 0; i < 20; i++ )
1767 printf( "%d ", (int)luby(2,i) );
1768 printf( "\n" );
1769}
1770
1771static lbool sat_solver3_search(sat_solver3* s, ABC_INT64_T nof_conflicts)
1772{
1773// double var_decay = 0.95;
1774// double clause_decay = 0.999;
1775 double random_var_freq = s->fNotUseRandom ? 0.0 : 0.02;
1776 ABC_INT64_T conflictC = 0;
1777 veci learnt_clause;
1778 int i;
1779
1780 assert(s->root_level == sat_solver3_dl(s));
1781
1782 s->nRestarts++;
1783 s->stats.starts++;
1784// s->var_decay = (float)(1 / var_decay ); // move this to sat_solver3_new()
1785// s->cla_decay = (float)(1 / clause_decay); // move this to sat_solver3_new()
1786// veci_resize(&s->model,0);
1787 veci_new(&learnt_clause);
1788
1789 // use activity factors in every even restart
1790 if ( (s->nRestarts & 1) && veci_size(&s->act_vars) > 0 )
1791// if ( veci_size(&s->act_vars) > 0 )
1792 for ( i = 0; i < s->act_vars.size; i++ )
1793 act_var_bump_factor(s, s->act_vars.ptr[i]);
1794
1795 // use activity factors in every restart
1796 if ( s->pGlobalVars && veci_size(&s->act_vars) > 0 )
1797 for ( i = 0; i < s->act_vars.size; i++ )
1798 act_var_bump_global(s, s->act_vars.ptr[i]);
1799
1800 for (;;){
1801 int hConfl = sat_solver3_propagate(s);
1802 if (hConfl != 0){
1803 // CONFLICT
1804 int blevel;
1805
1806#ifdef VERBOSEDEBUG
1807 printf(L_IND"**CONFLICT**\n", L_ind);
1808#endif
1809 s->stats.conflicts++; conflictC++;
1810 if (sat_solver3_dl(s) == s->root_level){
1811#ifdef SAT_USE_ANALYZE_FINAL
1812 sat_solver3_analyze_final(s, hConfl, 0);
1813#endif
1814 veci_delete(&learnt_clause);
1815 return l_False;
1816 }
1817
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;
1821 blevel = s->root_level > blevel ? s->root_level : blevel;
1822 sat_solver3_canceluntil(s,blevel);
1823 sat_solver3_record(s,&learnt_clause);
1824#ifdef SAT_USE_ANALYZE_FINAL
1825// 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)
1826 if ( learnt_clause.size == 1 )
1827 var_set_level(s, lit_var(learnt_clause.ptr[0]), 0);
1828#endif
1829 act_var_decay(s);
1830 act_clause_decay(s);
1831
1832 }else{
1833 // NO CONFLICT
1834 int next;
1835
1836 // Reached bound on number of conflicts:
1837 if ( (!s->fNoRestarts && nof_conflicts >= 0 && conflictC >= nof_conflicts) || (s->nRuntimeLimit && (s->stats.conflicts & 63) == 0 && Abc_Clock() > s->nRuntimeLimit)){
1838 s->progress_estimate = sat_solver3_progress(s);
1839 sat_solver3_canceluntil(s,s->root_level);
1840 veci_delete(&learnt_clause);
1841 return l_Undef; }
1842
1843 // Reached bound on number of conflicts:
1844 if ( (s->nConfLimit && s->stats.conflicts > s->nConfLimit) ||
1845 (s->nInsLimit && s->stats.propagations > s->nInsLimit) )
1846 {
1847 s->progress_estimate = sat_solver3_progress(s);
1848 sat_solver3_canceluntil(s,s->root_level);
1849 veci_delete(&learnt_clause);
1850 return l_Undef;
1851 }
1852
1853 // Simplify the set of problem clauses:
1854 if (sat_solver3_dl(s) == 0 && !s->fSkipSimplify)
1856
1857 // Reduce the set of learnt clauses:
1858// if (s->nLearntMax && veci_size(&s->learned) - s->qtail >= s->nLearntMax)
1859 if (s->nLearntMax && veci_size(&s->act_clas) >= s->nLearntMax)
1861
1862 // New variable decision:
1863 s->stats.decisions++;
1864 next = order_select(s,(float)random_var_freq);
1865
1866 if (next == var_Undef){
1867 // Model found:
1868 int i;
1869 for (i = 0; i < s->size; i++)
1870 s->model[i] = (var_value(s,i)==var1 ? l_True : l_False);
1871 sat_solver3_canceluntil(s,s->root_level);
1872 veci_delete(&learnt_clause);
1873
1874 /*
1875 veci apa; veci_new(&apa);
1876 for (i = 0; i < s->size; i++)
1877 veci_push(&apa,(int)(s->model.ptr[i] == l_True ? toLit(i) : lit_neg(toLit(i))));
1878 printf("model: "); printlits((lit*)apa.ptr, (lit*)apa.ptr + veci_size(&apa)); printf("\n");
1879 veci_delete(&apa);
1880 */
1881
1882 return l_True;
1883 }
1884
1885 if ( var_polar(s, next) ) // positive polarity
1886 sat_solver3_decision(s,toLit(next));
1887 else
1888 sat_solver3_decision(s,lit_neg(toLit(next)));
1889 }
1890 }
1891
1892 return l_Undef; // cannot happen
1893}
1894
1895// internal call to the SAT solver
1897{
1898 lbool status = l_Undef;
1899 int restart_iter = 0;
1900 veci_resize(&s->unit_lits, 0);
1901 s->nCalls++;
1902
1903 if (s->verbosity >= 1){
1904 printf("==================================[MINISAT]===================================\n");
1905 printf("| Conflicts | ORIGINAL | LEARNT | Progress |\n");
1906 printf("| | Clauses Literals | Limit Clauses Literals Lit/Cl | |\n");
1907 printf("==============================================================================\n");
1908 }
1909
1910 while (status == l_Undef){
1911 ABC_INT64_T nof_conflicts;
1912 double Ratio = (s->stats.learnts == 0)? 0.0 :
1913 s->stats.learnts_literals / (double)s->stats.learnts;
1914 if ( s->nRuntimeLimit && Abc_Clock() > s->nRuntimeLimit )
1915 break;
1916 if (s->verbosity >= 1)
1917 {
1918 printf("| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %6.3f %% |\n",
1919 (double)s->stats.conflicts,
1920 (double)s->stats.clauses,
1921 (double)s->stats.clauses_literals,
1922 (double)0,
1923 (double)s->stats.learnts,
1924 (double)s->stats.learnts_literals,
1925 Ratio,
1926 s->progress_estimate*100);
1927 fflush(stdout);
1928 }
1929 nof_conflicts = (ABC_INT64_T)( 100 * luby(2, restart_iter++) );
1930 status = sat_solver3_search(s, nof_conflicts);
1931 // quit the loop if reached an external limit
1932 if ( s->nConfLimit && s->stats.conflicts > s->nConfLimit )
1933 break;
1934 if ( s->nInsLimit && s->stats.propagations > s->nInsLimit )
1935 break;
1936 if ( s->nRuntimeLimit && Abc_Clock() > s->nRuntimeLimit )
1937 break;
1938 }
1939 if (s->verbosity >= 1)
1940 printf("==============================================================================\n");
1941
1942 sat_solver3_canceluntil(s,s->root_level);
1943 return status;
1944}
1945
1946// pushing one assumption to the stack of assumptions
1948{
1949 assert(lit_var(p) < s->size);
1950 veci_push(&s->trail_lim,s->qtail);
1951 s->root_level++;
1952 if (!sat_solver3_enqueue(s,p,0))
1953 {
1954 int h = s->reasons[lit_var(p)];
1955 if (h)
1956 {
1957 if (clause_is_lit(h))
1958 {
1959 (clause_begin(s->binary))[1] = lit_neg(p);
1960 (clause_begin(s->binary))[0] = clause_read_lit(h);
1961 h = s->hBinary;
1962 }
1963 sat_solver3_analyze_final(s, h, 1);
1964 veci_push(&s->conf_final, lit_neg(p));
1965 }
1966 else
1967 {
1968 veci_resize(&s->conf_final,0);
1969 veci_push(&s->conf_final, lit_neg(p));
1970 // the two lines below are a bug fix by Siert Wieringa
1971 if (var_level(s, lit_var(p)) > 0)
1972 veci_push(&s->conf_final, p);
1973 }
1974 //sat_solver3_canceluntil(s, 0);
1975 return false;
1976 }
1977 else
1978 {
1979 int fConfl = sat_solver3_propagate(s);
1980 if (fConfl){
1981 sat_solver3_analyze_final(s, fConfl, 0);
1982 //assert(s->conf_final.size > 0);
1983 //sat_solver3_canceluntil(s, 0);
1984 return false; }
1985 }
1986 return true;
1987}
1988
1989// removing one assumption from the stack of assumptions
1991{
1992 assert( sat_solver3_dl(s) > 0 );
1993 sat_solver3_canceluntil(s, --s->root_level);
1994}
1995
1996void sat_solver3_set_resource_limits(sat_solver3* s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
1997{
1998 // set the external limits
1999 s->nRestarts = 0;
2000 s->nConfLimit = 0;
2001 s->nInsLimit = 0;
2002 if ( nConfLimit )
2003 s->nConfLimit = s->stats.conflicts + nConfLimit;
2004 if ( nInsLimit )
2005// s->nInsLimit = s->stats.inspects + nInsLimit;
2006 s->nInsLimit = s->stats.propagations + nInsLimit;
2007 if ( nConfLimitGlobal && (s->nConfLimit == 0 || s->nConfLimit > nConfLimitGlobal) )
2008 s->nConfLimit = nConfLimitGlobal;
2009 if ( nInsLimitGlobal && (s->nInsLimit == 0 || s->nInsLimit > nInsLimitGlobal) )
2010 s->nInsLimit = nInsLimitGlobal;
2011}
2012
2013int 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)
2014{
2015 lbool status;
2016 lit * i;
2017 if ( s->fSolved )
2018 return l_False;
2019
2020 if ( s->fVerbose )
2021 printf( "Running SAT solver with parameters %d and %d and %d.\n", s->nLearntStart, s->nLearntDelta, s->nLearntRatio );
2022
2023 sat_solver3_set_resource_limits( s, nConfLimit, nInsLimit, nConfLimitGlobal, nInsLimitGlobal );
2024
2025#ifdef SAT_USE_ANALYZE_FINAL
2026 // Perform assumptions:
2027 s->root_level = 0;
2028 for ( i = begin; i < end; i++ )
2029 if ( !sat_solver3_push(s, *i) )
2030 {
2031 sat_solver3_canceluntil(s,0);
2032 s->root_level = 0;
2033 return l_False;
2034 }
2035 assert(s->root_level == sat_solver3_dl(s));
2036#else
2037 //printf("solve: "); printlits(begin, end); printf("\n");
2038 for (i = begin; i < end; i++){
2039// switch (lit_sign(*i) ? -s->assignss[lit_var(*i)] : s->assignss[lit_var(*i)]){
2040 switch (var_value(s, *i)) {
2041 case var1: // l_True:
2042 break;
2043 case varX: // l_Undef
2044 sat_solver3_decision(s, *i);
2045 if (sat_solver3_propagate(s) == 0)
2046 break;
2047 // fallthrough
2048 case var0: // l_False
2049 sat_solver3_canceluntil(s, 0);
2050 return l_False;
2051 }
2052 }
2053 s->root_level = sat_solver3_dl(s);
2054#endif
2055
2056 status = sat_solver3_solve_internal(s);
2057
2058 sat_solver3_canceluntil(s,0);
2059 s->root_level = 0;
2060 return status;
2061}
2062
2063// This LEXSAT procedure should be called with a set of literals (pLits, nLits),
2064// which defines both (1) variable order, and (2) assignment to begin search from.
2065// It retuns the LEXSAT assigment that is the same or larger than the given one.
2066// (It assumes that there is no smaller assignment than the one given!)
2067// The resulting assignment is returned in the same set of literals (pLits, nLits).
2068// It pushes/pops assumptions internally and will undo them before terminating.
2069int sat_solver3_solve_lexsat( sat_solver3* s, int * pLits, int nLits )
2070{
2071 int i, iLitFail = -1;
2072 lbool status;
2073 assert( nLits > 0 );
2074 // help the SAT solver by setting desirable polarity
2075 sat_solver3_set_literal_polarity( s, pLits, nLits );
2076 // check if there exists a satisfying assignment
2077 status = sat_solver3_solve_internal( s );
2078 if ( status != l_True ) // no assignment
2079 return status;
2080 // there is at least one satisfying assignment
2081 assert( status == l_True );
2082 // find the first mismatching literal
2083 for ( i = 0; i < nLits; i++ )
2084 if ( pLits[i] != sat_solver3_var_literal(s, Abc_Lit2Var(pLits[i])) )
2085 break;
2086 if ( i == nLits ) // no mismatch - the current assignment is the minimum one!
2087 return l_True;
2088 // mismatch happens in literal i
2089 iLitFail = i;
2090 // create assumptions up to this literal (as in pLits) - including this literal!
2091 for ( i = 0; i <= iLitFail; i++ )
2092 if ( !sat_solver3_push(s, pLits[i]) ) // can become UNSAT while adding the last assumption
2093 break;
2094 if ( i < iLitFail + 1 ) // the solver became UNSAT while adding assumptions
2095 status = l_False;
2096 else // solve under the assumptions
2097 status = sat_solver3_solve_internal( s );
2098 if ( status == l_True )
2099 {
2100 // we proved that there is a sat assignment with literal (iLitFail) having polarity as in pLits
2101 // continue solving recursively
2102 if ( iLitFail + 1 < nLits )
2103 status = sat_solver3_solve_lexsat( s, pLits + iLitFail + 1, nLits - iLitFail - 1 );
2104 }
2105 else if ( status == l_False )
2106 {
2107 // we proved that there is no assignment with iLitFail having polarity as in pLits
2108 assert( Abc_LitIsCompl(pLits[iLitFail]) ); // literal is 0
2109 // (this assert may fail only if there is a sat assignment smaller than one originally given in pLits)
2110 // now we flip this literal (make it 1), change the last assumption
2111 // and contiue looking for the 000...0-assignment of other literals
2112 sat_solver3_pop( s );
2113 pLits[iLitFail] = Abc_LitNot(pLits[iLitFail]);
2114 if ( !sat_solver3_push(s, pLits[iLitFail]) )
2115 printf( "sat_solver3_solve_lexsat(): A satisfying assignment should exist.\n" ); // because we know that the problem is satisfiable
2116 // update other literals to be 000...0
2117 for ( i = iLitFail + 1; i < nLits; i++ )
2118 pLits[i] = Abc_LitNot( Abc_LitRegular(pLits[i]) );
2119 // continue solving recursively
2120 if ( iLitFail + 1 < nLits )
2121 status = sat_solver3_solve_lexsat( s, pLits + iLitFail + 1, nLits - iLitFail - 1 );
2122 else
2123 status = l_True;
2124 }
2125 // undo the assumptions
2126 for ( i = iLitFail; i >= 0; i-- )
2127 sat_solver3_pop( s );
2128 return status;
2129}
2130
2131// This procedure is called on a set of assumptions to minimize their number.
2132// The procedure relies on the fact that the current set of assumptions is UNSAT.
2133// It receives and returns SAT solver without assumptions. It returns the number
2134// of assumptions after minimization. The set of assumptions is returned in pLits.
2135int sat_solver3_minimize_assumptions( sat_solver3* s, int * pLits, int nLits, int nConfLimit )
2136{
2137 int i, k, nLitsL, nLitsR, nResL, nResR;
2138 if ( nLits == 1 )
2139 {
2140 // since the problem is UNSAT, we will try to solve it without assuming the last literal
2141 // if the result is UNSAT, the last literal can be dropped; otherwise, it is needed
2142 int status = l_False;
2143 int Temp = s->nConfLimit;
2144 s->nConfLimit = nConfLimit;
2145 status = sat_solver3_solve_internal( s );
2146 s->nConfLimit = Temp;
2147 return (int)(status != l_False); // return 1 if the problem is not UNSAT
2148 }
2149 assert( nLits >= 2 );
2150 nLitsL = nLits / 2;
2151 nLitsR = nLits - nLitsL;
2152 // assume the left lits
2153 for ( i = 0; i < nLitsL; i++ )
2154 if ( !sat_solver3_push(s, pLits[i]) )
2155 {
2156 for ( k = i; k >= 0; k-- )
2157 sat_solver3_pop(s);
2158 return sat_solver3_minimize_assumptions( s, pLits, i+1, nConfLimit );
2159 }
2160 // solve for the right lits
2161 nResL = sat_solver3_minimize_assumptions( s, pLits + nLitsL, nLitsR, nConfLimit );
2162 for ( i = 0; i < nLitsL; i++ )
2163 sat_solver3_pop(s);
2164 // swap literals
2165// assert( nResL <= nLitsL );
2166// for ( i = 0; i < nResL; i++ )
2167// ABC_SWAP( int, pLits[i], pLits[nLitsL+i] );
2168 veci_resize( &s->temp_clause, 0 );
2169 for ( i = 0; i < nLitsL; i++ )
2170 veci_push( &s->temp_clause, pLits[i] );
2171 for ( i = 0; i < nResL; i++ )
2172 pLits[i] = pLits[nLitsL+i];
2173 for ( i = 0; i < nLitsL; i++ )
2174 pLits[nResL+i] = veci_begin(&s->temp_clause)[i];
2175 // assume the right lits
2176 for ( i = 0; i < nResL; i++ )
2177 if ( !sat_solver3_push(s, pLits[i]) )
2178 {
2179 for ( k = i; k >= 0; k-- )
2180 sat_solver3_pop(s);
2181 return sat_solver3_minimize_assumptions( s, pLits, i+1, nConfLimit );
2182 }
2183 // solve for the left lits
2184 nResR = sat_solver3_minimize_assumptions( s, pLits + nResL, nLitsL, nConfLimit );
2185 for ( i = 0; i < nResL; i++ )
2186 sat_solver3_pop(s);
2187 return nResL + nResR;
2188}
2189
2190// This is a specialized version of the above procedure with several custom changes:
2191// - makes sure that at least one of the marked literals is preserved in the clause
2192// - sets literals to zero when they do not have to be used
2193// - sets literals to zero for disproved variables
2194int sat_solver3_minimize_assumptions2( sat_solver3* s, int * pLits, int nLits, int nConfLimit )
2195{
2196 int i, k, nLitsL, nLitsR, nResL, nResR;
2197 if ( nLits == 1 )
2198 {
2199 // since the problem is UNSAT, we will try to solve it without assuming the last literal
2200 // if the result is UNSAT, the last literal can be dropped; otherwise, it is needed
2201 int RetValue = 1, LitNot = Abc_LitNot(pLits[0]);
2202 int status = l_False;
2203 int Temp = s->nConfLimit;
2204 s->nConfLimit = nConfLimit;
2205
2206 RetValue = sat_solver3_push( s, LitNot ); assert( RetValue );
2207 status = sat_solver3_solve_internal( s );
2208 sat_solver3_pop( s );
2209
2210 // if the problem is UNSAT, add clause
2211 if ( status == l_False )
2212 {
2213 RetValue = sat_solver3_addclause( s, &LitNot, &LitNot+1 );
2214 assert( RetValue );
2215 }
2216
2217 s->nConfLimit = Temp;
2218 return (int)(status != l_False); // return 1 if the problem is not UNSAT
2219 }
2220 assert( nLits >= 2 );
2221 nLitsL = nLits / 2;
2222 nLitsR = nLits - nLitsL;
2223 // assume the left lits
2224 for ( i = 0; i < nLitsL; i++ )
2225 if ( !sat_solver3_push(s, pLits[i]) )
2226 {
2227 for ( k = i; k >= 0; k-- )
2228 sat_solver3_pop(s);
2229
2230 // add clauses for these literal
2231 for ( k = i+1; k > nLitsL; k++ )
2232 {
2233 int LitNot = Abc_LitNot(pLits[i]);
2234 int RetValue = sat_solver3_addclause( s, &LitNot, &LitNot+1 );
2235 assert( RetValue );
2236 }
2237
2238 return sat_solver3_minimize_assumptions2( s, pLits, i+1, nConfLimit );
2239 }
2240 // solve for the right lits
2241 nResL = sat_solver3_minimize_assumptions2( s, pLits + nLitsL, nLitsR, nConfLimit );
2242 for ( i = 0; i < nLitsL; i++ )
2243 sat_solver3_pop(s);
2244 // swap literals
2245// assert( nResL <= nLitsL );
2246 veci_resize( &s->temp_clause, 0 );
2247 for ( i = 0; i < nLitsL; i++ )
2248 veci_push( &s->temp_clause, pLits[i] );
2249 for ( i = 0; i < nResL; i++ )
2250 pLits[i] = pLits[nLitsL+i];
2251 for ( i = 0; i < nLitsL; i++ )
2252 pLits[nResL+i] = veci_begin(&s->temp_clause)[i];
2253 // assume the right lits
2254 for ( i = 0; i < nResL; i++ )
2255 if ( !sat_solver3_push(s, pLits[i]) )
2256 {
2257 for ( k = i; k >= 0; k-- )
2258 sat_solver3_pop(s);
2259
2260 // add clauses for these literal
2261 for ( k = i+1; k > nResL; k++ )
2262 {
2263 int LitNot = Abc_LitNot(pLits[i]);
2264 int RetValue = sat_solver3_addclause( s, &LitNot, &LitNot+1 );
2265 assert( RetValue );
2266 }
2267
2268 return sat_solver3_minimize_assumptions2( s, pLits, i+1, nConfLimit );
2269 }
2270 // solve for the left lits
2271 nResR = sat_solver3_minimize_assumptions2( s, pLits + nResL, nLitsL, nConfLimit );
2272 for ( i = 0; i < nResL; i++ )
2273 sat_solver3_pop(s);
2274 return nResL + nResR;
2275}
2276
2277
2278
2280{
2281 return s->size;
2282}
2283
2284
2286{
2287 return s->stats.clauses;
2288}
2289
2290
2292{
2293 return (int)s->stats.conflicts;
2294}
2295
2296
2297
2299
ABC_INT64_T abctime
Definition abc_global.h:332
int * Abc_MergeSortCost(int *pCosts, int nSize)
Definition utilSort.c:442
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_CONST(number)
PARAMETERS ///.
Definition abc_global.h:240
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define l_True
Definition bmcBmcS.c:35
#define l_Undef
Definition bmcBmcS.c:34
#define l_False
Definition bmcBmcS.c:36
#define var_Undef
Definition SolverTypes.h:45
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
unsigned long long size
Definition giaNewBdd.h:39
#define Sat_MemForEachLearned(p, c, i, k)
Definition satClause.h:127
#define LEARNT_MAX_RATIO_DEFAULT
Definition satClause.h:39
#define LEARNT_MAX_START_DEFAULT
INCLUDES ///.
Definition satClause.h:37
#define LEARNT_MAX_INCRE_DEFAULT
Definition satClause.h:38
struct Sat_Mem_t_ Sat_Mem_t
Definition satClause.h:70
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)
Definition satSolver3.c:116
void sat_solver3_delete(sat_solver3 *s)
sat_solver3 * zsat_solver3_new_seed(double seed)
int sat_solver3_propagate(sat_solver3 *s)
Definition satSolver3.c:991
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)
#define L_lit(p)
Definition satSolver3.c:42
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)
Definition satSolver3.c:216
int sat_solver3_nclauses(sat_solver3 *s)
int sat_solver3_clause_new(sat_solver3 *s, lit *begin, lit *end, int learnt)
Definition satSolver3.c:514
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)
Definition satSolver3.c:716
struct sat_solver3_t sat_solver3
Definition satSolver3.h:41
#define L_ind
Definition satSolver.c:41
void luby_test()
Definition satSolver.c:1809
#define L_IND
Definition satSolver.c:40
double luby(double y, int x)
Definition satSolver.c:1797
#define L_LIT
Definition satSolver.c:42
int lit
Definition satVec.h:130
int cla
Definition satVec.h:131
struct veci_t veci
Definition satVec.h:36
signed char lbool
Definition satVec.h:135
int BookMarkE[2]
Definition satClause.h:75
unsigned lbd
Definition clause.h:22
unsigned lits[3]
Definition clause.h:39
unsigned size
Definition clause.h:37
Definition heap.h:19
Sat_Mem_t Mem
Definition satSolver3.h:107
double progress_estimate
Definition satSolver3.h:157
word * activity2
Definition satSolver3.h:125
double * factors
Definition satSolver3.h:173
unsigned cla_inc
Definition satSolver3.h:126
int * pGlobalVars
Definition satSolver3.h:184
double random_seed
Definition satSolver3.h:156
char * polarity
Definition satSolver3.h:136
clause * binary
Definition satSolver3.h:110
word * activity
Definition satSolver3.h:124
abctime nRuntimeLimit
Definition satSolver3.h:170
stats_t stats
Definition satSolver3.h:161
unsigned cla_decay
Definition satSolver3.h:127
ABC_INT64_T nInsLimit
Definition satSolver3.h:169
int(* pCnfFunc)(void *p, int)
Definition satSolver3.h:198
ABC_INT64_T nConfLimit
Definition satSolver3.h:168
ABC_INT64_T decisions
Definition satVec.h:156
ABC_INT64_T learnts_literals
Definition satVec.h:157
ABC_INT64_T conflicts
Definition satVec.h:156
ABC_INT64_T tot_literals
Definition satVec.h:157
unsigned clauses
Definition satVec.h:155
unsigned starts
Definition satVec.h:155
ABC_INT64_T inspects
Definition satVec.h:156
ABC_INT64_T clauses_literals
Definition satVec.h:157
unsigned learnts
Definition satVec.h:155
ABC_INT64_T propagations
Definition satVec.h:156
Definition walk.c:24
unsigned pol
Definition satSolver.c:84
unsigned tag
Definition satSolver.c:85
unsigned val
Definition satSolver.c:83
unsigned lev
Definition satSolver.c:86
int size
Definition satVec.h:33
int * ptr
Definition satVec.h:34
int cap
Definition satVec.h:32
ABC_NAMESPACE_HEADER_START typedef word xdbl
STRUCTURE DEFINITIONS ///.
Definition utilDouble.h:49
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()