11 s = calloc(1, sizeof(SATSolve));
12 if(s == nil) return nil;
13 s->bl[0].next = s->bl[0].prev = &s->bl[0];
14 s->bl[1].next = s->bl[1].prev = &s->bl[1];
15 s->bl[0].end = (uchar*)&s->bl[0] + SATBLOCKSZ; /* this block is "full" */
16 s->bl[1].end = (uchar*)&s->bl[1] + SATBLOCKSZ;
18 s->lastp[1] = &s->learncl;
19 s->lastbl = &s->bl[1];
20 s->randfn = (long(*)(void*)) lrand;
22 s->goofprob = 0.02 * (1UL<<31);
29 s->flushψ = (1ULL<<32)*0.05;
44 for(i = 0; i < 2; i++)
45 for(b = s->bl[i].next; b != &s->bl[i]; b = bb){
49 for(i = 0; i < 2 * s->nvar; i++)
64 saterror(SATSolve *s, char *msg, ...)
70 vsnprint(buf, sizeof(buf), msg, va);
73 if(s != nil && s->errfun != nil)
74 s->errfun(buf, s->erraux);
79 satval(SATSolve *s, int l)
83 if(s->unsat) return -1;
86 if(v < 0 || v >= s->nvar) return -1;
87 return s->lit[2*v+(m&1)].val;
91 satnrand(SATSolve *s, int n)
96 slop = 0x7fffffff % n;
98 v = s->randfn(s->randaux);
104 satrealloc(SATSolve *s, void *v, ulong n)
108 saterror(s, "realloc: %r");
109 setmalloctag(v, getcallerpc(&s));
113 #define LEFT(x) (2*(x)+1)
114 #define RIGHT(x) (2*(x)+2)
115 #define UP(x) ((x)-1>>1)
118 heapswap(SATSolve *s, int i, int j)
122 if(i == j) return s->heap[i];
124 s->heap[i] = s->heap[j];
126 s->heap[i]->heaploc = i;
127 s->heap[j]->heaploc = j;
132 heapup(SATSolve *s, int i)
138 if(LEFT(i) < s->nheap && s->heap[LEFT(i)]->activity > s->heap[m]->activity)
140 if(RIGHT(i) < s->nheap && s->heap[RIGHT(i)]->activity > s->heap[m]->activity)
149 heapdown(SATSolve *s, int i)
153 for(; i > 0 && s->heap[p = UP(i)]->activity < s->heap[i]->activity; i = p)
158 satheaptake(SATSolve *s)
162 assert(s->nheap > 0);
163 r = heapswap(s, 0, --s->nheap);
170 satheapput(SATSolve *s, SATVar *v)
172 assert(s->nheap < s->nvar);
173 v->heaploc = s->nheap;
174 s->heap[s->nheap++] = v;
175 heapdown(s, s->nheap - 1);
179 satreheap(SATSolve *s, SATVar *v)
190 satheapreset(SATSolve *s)
194 s->heap = satrealloc(s, s->heap, s->nvar * sizeof(SATVar *));
197 for(i = 0; i < n; i++){
198 s->heap[i] = &s->var[i];
199 s->heap[i]->heaploc = i;
201 for(i = 0; i < n - 1; i++){
202 j = i + satnrand(s, n - i);