ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
SimpSolver.cpp
Go to the documentation of this file.
1/***********************************************************************************[SimpSolver.cc]
2Copyright (c) 2006, Niklas Een, Niklas Sorensson
3Copyright (c) 2007-2010, Niklas Sorensson
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
21#include "sat/bsat2/Sort.h"
23#include "sat/bsat2/System.h"
24
26
27using namespace Minisat;
28
29//=================================================================================================
30// Options:
31
32
33static const char* _cat = "SIMP";
34
35static BoolOption opt_use_asymm (_cat, "asymm", "Shrink clauses by asymmetric branching.", false);
36static BoolOption opt_use_rcheck (_cat, "rcheck", "Check if a clause is already implied. (costly)", false);
37static BoolOption opt_use_elim (_cat, "elim", "Perform variable elimination.", true);
38static IntOption opt_grow (_cat, "grow", "Allow a variable elimination step to grow by a number of clauses.", 0);
39static IntOption opt_clause_lim (_cat, "cl-lim", "Variables are not eliminated if it produces a resolvent with a length above this limit. -1 means no limit", 20, IntRange(-1, INT32_MAX));
40static IntOption opt_subsumption_lim (_cat, "sub-lim", "Do not check if subsumption against a clause larger than this. -1 means no limit.", 1000, IntRange(-1, INT32_MAX));
41static DoubleOption opt_simp_garbage_frac(_cat, "simp-gc-frac", "The fraction of wasted memory allowed before a garbage collection is triggered during simplification.", 0.5, DoubleRange(0, false, HUGE_VAL, false));
42
43
44//=================================================================================================
45// Constructor/Destructor:
46
47
49 grow (opt_grow)
50 , clause_lim (opt_clause_lim)
51 , subsumption_lim (opt_subsumption_lim)
52 , simp_garbage_frac (opt_simp_garbage_frac)
53 , use_asymm (opt_use_asymm)
54 , use_rcheck (opt_use_rcheck)
55 , use_elim (opt_use_elim)
56 , merges (0)
57 , asymm_lits (0)
58 , eliminated_vars (0)
59 , elimorder (1)
63 , bwdsub_assigns (0)
64 , n_touched (0)
65{
66 vec<Lit> dummy(1,lit_Undef);
67 ca.extra_clause_field = true; // NOTE: must happen before allocating the dummy clause below.
68 bwdsub_tmpunit = ca.alloc(dummy);
69 remove_satisfied = false;
70}
71
72
76
77
78Var SimpSolver::newVar(bool sign, bool dvar) {
79 Var v = Solver::newVar(sign, dvar);
80
81 frozen .push((char)false);
82 eliminated.push((char)false);
83
85 n_occ .push(0);
86 n_occ .push(0);
87 occurs .init(v);
88 touched .push(0);
89 elim_heap .insert(v);
90 }
91 return v; }
92
93
94
95lbool SimpSolver::solve_(bool do_simp, bool turn_off_simp)
96{
97 vec<Var> extra_frozen;
98 lbool result = l_True;
99
100 do_simp &= use_simplification;
101
102 if (do_simp){
103 // Assumptions must be temporarily frozen to run variable elimination:
104 for (int i = 0; i < assumptions.size(); i++){
105 Var v = var(assumptions[i]);
106
107 // If an assumption has been eliminated, remember it.
108 assert(!isEliminated(v));
109
110 if (!frozen[v]){
111 // Freeze and store.
112 setFrozen(v, true);
113 extra_frozen.push(v);
114 } }
115
116 result = lbool(eliminate(turn_off_simp));
117 }
118
119 if (result == l_True)
120 result = Solver::solve_();
121 else if (verbosity >= 1)
122 printf("===============================================================================\n");
123
124 if (result == l_True)
125 extendModel();
126
127 if (do_simp)
128 // Unfreeze the assumptions that were frozen:
129 for (int i = 0; i < extra_frozen.size(); i++)
130 setFrozen(extra_frozen[i], false);
131
132 return result;
133}
134
135
136
138{
139#ifndef NDEBUG
140 for (int i = 0; i < ps.size(); i++)
141 assert(!isEliminated(var(ps[i])));
142#endif
143
144 int nclauses = clauses.size();
145
146 if (use_rcheck && implied(ps))
147 return true;
148
149 if (!Solver::addClause_(ps))
150 return false;
151
152 if (use_simplification && clauses.size() == nclauses + 1){
153 CRef cr = clauses.last();
154 const Clause& c = ca[cr];
155
156 // NOTE: the clause is added to the queue immediately and then
157 // again during 'gatherTouchedClauses()'. If nothing happens
158 // in between, it will only be checked once. Otherwise, it may
159 // be checked twice unnecessarily. This is an unfortunate
160 // consequence of how backward subsumption is used to mimic
161 // forward subsumption.
162 subsumption_queue.insert(cr);
163 for (int i = 0; i < c.size(); i++){
164 occurs[var(c[i])].push(cr);
165 n_occ[toInt(c[i])]++;
166 touched[var(c[i])] = 1;
167 n_touched++;
168 if (elim_heap.inHeap(var(c[i])))
169 elim_heap.increase(var(c[i]));
170 }
171 }
172
173 return true;
174}
175
176
178{
179 const Clause& c = ca[cr];
180
182 for (int i = 0; i < c.size(); i++){
183 n_occ[toInt(c[i])]--;
184 updateElimHeap(var(c[i]));
185 occurs.smudge(var(c[i]));
186 }
187
189}
190
191
193{
194 Clause& c = ca[cr];
195 assert(decisionLevel() == 0);
197
198 // FIX: this is too inefficient but would be nice to have (properly implemented)
199 // if (!find(subsumption_queue, &c))
200 subsumption_queue.insert(cr);
201
202 if (c.size() == 2){
203 removeClause(cr);
204 c.strengthen(l);
205 }else{
206 detachClause(cr, true);
207 c.strengthen(l);
208 attachClause(cr);
209 remove(occurs[var(l)], cr);
210 n_occ[toInt(l)]--;
212 }
213
214 return c.size() == 1 ? enqueue(c[0]) && propagate() == CRef_Undef : true;
215}
216
217
218// Returns FALSE if clause is always satisfied ('out_clause' should not be used).
219bool SimpSolver::merge(const Clause& _ps, const Clause& _qs, Var v, vec<Lit>& out_clause)
220{
221 merges++;
222 out_clause.clear();
223
224 bool ps_smallest = _ps.size() < _qs.size();
225 const Clause& ps = ps_smallest ? _qs : _ps;
226 const Clause& qs = ps_smallest ? _ps : _qs;
227 int i, j;
228
229 for (i = 0; i < qs.size(); i++){
230 if (var(qs[i]) != v){
231 for (j = 0; j < ps.size(); j++)
232 if (var(ps[j]) == var(qs[i]))
233 {
234 if (ps[j] == ~qs[i])
235 return false;
236 else
237 goto next;
238 }
239 out_clause.push(qs[i]);
240 }
241 next:;
242 }
243
244 for (i = 0; i < ps.size(); i++)
245 if (var(ps[i]) != v)
246 out_clause.push(ps[i]);
247
248 return true;
249}
250
251
252// Returns FALSE if clause is always satisfied.
253bool SimpSolver::merge(const Clause& _ps, const Clause& _qs, Var v, int& size)
254{
255 merges++;
256
257 bool ps_smallest = _ps.size() < _qs.size();
258 const Clause& ps = ps_smallest ? _qs : _ps;
259 const Clause& qs = ps_smallest ? _ps : _qs;
260 const Lit* __ps = (const Lit*)ps;
261 const Lit* __qs = (const Lit*)qs;
262
263 size = ps.size()-1;
264
265 for (int i = 0; i < qs.size(); i++){
266 if (var(__qs[i]) != v){
267 for (int j = 0; j < ps.size(); j++)
268 if (var(__ps[j]) == var(__qs[i]))
269 {
270 if (__ps[j] == ~__qs[i])
271 return false;
272 else
273 goto next;
274 }
275 size++;
276 }
277 next:;
278 }
279
280 return true;
281}
282
283
285{
286 if (n_touched == 0) return;
287
288 int i,j;
289 for (i = j = 0; i < subsumption_queue.size(); i++)
290 if (ca[subsumption_queue[i]].mark() == 0)
291 ca[subsumption_queue[i]].mark(2);
292
293 for (i = 0; i < touched.size(); i++)
294 if (touched[i]){
295 const vec<CRef>& cs = occurs.lookup(i);
296 for (j = 0; j < cs.size(); j++)
297 if (ca[cs[j]].mark() == 0){
298 subsumption_queue.insert(cs[j]);
299 ca[cs[j]].mark(2);
300 }
301 touched[i] = 0;
302 }
303
304 for (i = 0; i < subsumption_queue.size(); i++)
305 if (ca[subsumption_queue[i]].mark() == 2)
306 ca[subsumption_queue[i]].mark(0);
307
308 n_touched = 0;
309}
310
311
313{
314 assert(decisionLevel() == 0);
315
316 trail_lim.push(trail.size());
317 for (int i = 0; i < c.size(); i++)
318 if (value(c[i]) == l_True){
319 cancelUntil(0);
320 return false;
321 }else if (value(c[i]) != l_False){
322 assert(value(c[i]) == l_Undef);
323 uncheckedEnqueue(~c[i]);
324 }
325
326 bool result = propagate() != CRef_Undef;
327 cancelUntil(0);
328 return result;
329}
330
331
332// Backward subsumption + backward subsumption resolution
334{
335 int cnt = 0;
336 int subsumed = 0;
337 int deleted_literals = 0;
338 assert(decisionLevel() == 0);
339
340 while (subsumption_queue.size() > 0 || bwdsub_assigns < trail.size()){
341
342 // Empty subsumption queue and return immediately on user-interrupt:
343 if (asynch_interrupt){
344 subsumption_queue.clear();
345 bwdsub_assigns = trail.size();
346 break; }
347
348 // Check top-level assignments by creating a dummy clause and placing it in the queue:
349 if (subsumption_queue.size() == 0 && bwdsub_assigns < trail.size()){
350 Lit l = trail[bwdsub_assigns++];
351 ca[bwdsub_tmpunit][0] = l;
352 ca[bwdsub_tmpunit].calcAbstraction();
354
355 CRef cr = subsumption_queue.peek(); subsumption_queue.pop();
356 Clause& c = ca[cr];
357
358 if (c.mark()) continue;
359
360 if (verbose && verbosity >= 2 && cnt++ % 1000 == 0)
361 printf("subsumption left: %10d (%10d subsumed, %10d deleted literals)\r", subsumption_queue.size(), subsumed, deleted_literals);
362
363 assert(c.size() > 1 || value(c[0]) == l_True); // Unit-clauses should have been propagated before this point.
364
365 // Find best variable to scan:
366 Var best = var(c[0]);
367 for (int i = 1; i < c.size(); i++)
368 if (occurs[var(c[i])].size() < occurs[best].size())
369 best = var(c[i]);
370
371 // Search all candidates:
372 vec<CRef>& _cs = occurs.lookup(best);
373 CRef* cs = (CRef*)_cs;
374
375 for (int j = 0; j < _cs.size(); j++)
376 if (c.mark())
377 break;
378 else if (!ca[cs[j]].mark() && cs[j] != cr && (subsumption_lim == -1 || ca[cs[j]].size() < subsumption_lim)){
379 Lit l = c.subsumes(ca[cs[j]]);
380
381 if (l == lit_Undef)
382 subsumed++, removeClause(cs[j]);
383 else if (l != lit_Error){
384 deleted_literals++;
385
386 if (!strengthenClause(cs[j], ~l))
387 return false;
388
389 // Did current candidate get deleted from cs? Then check candidate at index j again:
390 if (var(l) == best)
391 j--;
392 }
393 }
394 }
395
396 return true;
397}
398
399
401{
402 Clause& c = ca[cr];
403 assert(decisionLevel() == 0);
404
405 if (c.mark() || satisfied(c)) return true;
406
407 trail_lim.push(trail.size());
408 Lit l = lit_Undef;
409 for (int i = 0; i < c.size(); i++)
410 if (var(c[i]) != v && value(c[i]) != l_False)
411 uncheckedEnqueue(~c[i]);
412 else
413 l = c[i];
414
415 if (propagate() != CRef_Undef){
416 cancelUntil(0);
417 asymm_lits++;
418 if (!strengthenClause(cr, l))
419 return false;
420 }else
421 cancelUntil(0);
422
423 return true;
424}
425
426
428{
430
431 const vec<CRef>& cls = occurs.lookup(v);
432
433 if (value(v) != l_Undef || cls.size() == 0)
434 return true;
435
436 for (int i = 0; i < cls.size(); i++)
437 if (!asymm(v, cls[i]))
438 return false;
439
441}
442
443
444static void mkElimClause(vec<uint32_t>& elimclauses, Lit x)
445{
446 elimclauses.push(toInt(x));
447 elimclauses.push(1);
448}
449
450
451static void mkElimClause(vec<uint32_t>& elimclauses, Var v, Clause& c)
452{
453 int first = elimclauses.size();
454 int v_pos = -1;
455
456 // Copy clause to elimclauses-vector. Remember position where the
457 // variable 'v' occurs:
458 for (int i = 0; i < c.size(); i++){
459 elimclauses.push(toInt(c[i]));
460 if (var(c[i]) == v)
461 v_pos = i + first;
462 }
463 assert(v_pos != -1);
464
465 // Swap the first literal with the 'v' literal, so that the literal
466 // containing 'v' will occur first in the clause:
467 uint32_t tmp = elimclauses[v_pos];
468 elimclauses[v_pos] = elimclauses[first];
469 elimclauses[first] = tmp;
470
471 // Store the length of the clause last:
472 elimclauses.push(c.size());
473}
474
475
476
478{
479 assert(!frozen[v]);
480 assert(!isEliminated(v));
481 assert(value(v) == l_Undef);
482 int i;
483
484 // Split the occurrences into positive and negative:
485 //
486 const vec<CRef>& cls = occurs.lookup(v);
487 vec<CRef> pos, neg;
488 for (i = 0; i < cls.size(); i++)
489 (find(ca[cls[i]], mkLit(v)) ? pos : neg).push(cls[i]);
490
491 // Check wether the increase in number of clauses stays within the allowed ('grow'). Moreover, no
492 // clause must exceed the limit on the maximal clause size (if it is set):
493 //
494 int cnt = 0;
495 int clause_size = 0;
496
497 for (i = 0; i < pos.size(); i++)
498 for (int j = 0; j < neg.size(); j++)
499 if (merge(ca[pos[i]], ca[neg[j]], v, clause_size) &&
500 (++cnt > cls.size() + grow || (clause_lim != -1 && clause_size > clause_lim)))
501 return true;
502
503 // Delete and store old clauses:
504 eliminated[v] = true;
505 setDecisionVar(v, false);
507
508 if (pos.size() > neg.size()){
509 for (int i = 0; i < neg.size(); i++)
510 mkElimClause(elimclauses, v, ca[neg[i]]);
511 mkElimClause(elimclauses, mkLit(v));
512 }else{
513 for (int i = 0; i < pos.size(); i++)
514 mkElimClause(elimclauses, v, ca[pos[i]]);
515 mkElimClause(elimclauses, ~mkLit(v));
516 }
517
518 for (i = 0; i < cls.size(); i++)
519 removeClause(cls[i]);
520
521 // Produce clauses in cross product:
522 vec<Lit>& resolvent = add_tmp;
523 for (i = 0; i < pos.size(); i++)
524 for (int j = 0; j < neg.size(); j++)
525 if (merge(ca[pos[i]], ca[neg[j]], v, resolvent) && !addClause_(resolvent))
526 return false;
527
528 // Free occurs list for this variable:
529 occurs[v].clear(true);
530
531 // Free watchers lists for this variable, if possible:
532 if (watches[ mkLit(v)].size() == 0) watches[ mkLit(v)].clear(true);
533 if (watches[~mkLit(v)].size() == 0) watches[~mkLit(v)].clear(true);
534
536}
537
538
540{
541 assert(!frozen[v]);
542 assert(!isEliminated(v));
543 assert(value(v) == l_Undef);
544
545 if (!ok) return false;
546
547 eliminated[v] = true;
548 setDecisionVar(v, false);
549 const vec<CRef>& cls = occurs.lookup(v);
550
551 vec<Lit>& subst_clause = add_tmp;
552 for (int i = 0; i < cls.size(); i++){
553 Clause& c = ca[cls[i]];
554
555 subst_clause.clear();
556 for (int j = 0; j < c.size(); j++){
557 Lit p = c[j];
558 subst_clause.push(var(p) == v ? x ^ sign(p) : p);
559 }
560
561 removeClause(cls[i]);
562
563 if (!addClause_(subst_clause))
564 return ok = false;
565 }
566
567 return true;
568}
569
570
572{
573 int i, j;
574 Lit x;
575
576 for (i = elimclauses.size()-1; i > 0; i -= j){
577 for (j = elimclauses[i--]; j > 1; j--, i--)
579 goto next;
580
581 x = toLit(elimclauses[i]);
582 model[var(x)] = lbool(!sign(x));
583 next:;
584 }
585}
586
587
588bool SimpSolver::eliminate(bool turn_off_elim)
589{
590 if (!simplify())
591 return false;
592 else if (!use_simplification)
593 return true;
594
595 // Main simplification loop:
596 //
597 while (n_touched > 0 || bwdsub_assigns < trail.size() || elim_heap.size() > 0){
598
600 // printf(" ## (time = %6.2f s) BWD-SUB: queue = %d, trail = %d\n", cpuTime(), subsumption_queue.size(), trail.size() - bwdsub_assigns);
601 if ((subsumption_queue.size() > 0 || bwdsub_assigns < trail.size()) &&
603 ok = false; goto cleanup; }
604
605 // Empty elim_heap and return immediately on user-interrupt:
606 if (asynch_interrupt){
607 assert(bwdsub_assigns == trail.size());
608 assert(subsumption_queue.size() == 0);
609 assert(n_touched == 0);
610 elim_heap.clear();
611 goto cleanup; }
612
613 // printf(" ## (time = %6.2f s) ELIM: vars = %d\n", cpuTime(), elim_heap.size());
614 for (int cnt = 0; !elim_heap.empty(); cnt++){
615 Var elim = elim_heap.removeMin();
616
617 if (asynch_interrupt) break;
618
619 if (isEliminated(elim) || value(elim) != l_Undef) continue;
620
621 if (verbosity >= 2 && cnt % 100 == 0)
622 printf("elimination left: %10d\r", elim_heap.size());
623
624 if (use_asymm){
625 // Temporarily freeze variable. Otherwise, it would immediately end up on the queue again:
626 bool was_frozen = frozen[elim];
627 frozen[elim] = true;
628 if (!asymmVar(elim)){
629 ok = false; goto cleanup; }
630 frozen[elim] = was_frozen; }
631
632 // At this point, the variable may have been set by assymetric branching, so check it
633 // again. Also, don't eliminate frozen variables:
634 if (use_elim && value(elim) == l_Undef && !frozen[elim] && !eliminateVar(elim)){
635 ok = false; goto cleanup; }
636
638 }
639
640 assert(subsumption_queue.size() == 0);
641 }
642 cleanup:
643
644 // If no more simplification is needed, free all simplification-related data structures:
645 if (turn_off_elim){
646 touched .clear(true);
647 occurs .clear(true);
648 n_occ .clear(true);
649 elim_heap.clear(true);
650 subsumption_queue.clear(true);
651
652 use_simplification = false;
653 remove_satisfied = true;
654 ca.extra_clause_field = false;
655
656 // Force full cleanup (this is safe and desirable since it only happens once):
659 }else{
660 // Cheaper cleanup:
661 cleanUpClauses(); // TODO: can we make 'cleanUpClauses()' not be linear in the problem size somehow?
662 checkGarbage();
663 }
664
665 if (verbosity >= 1 && elimclauses.size() > 0)
666 printf("| Eliminated clauses: %10.2f Mb |\n",
667 double(elimclauses.size() * sizeof(uint32_t)) / (1024*1024));
668
669 return ok;
670}
671
672
674{
675 occurs.cleanAll();
676 int i,j;
677 for (i = j = 0; i < clauses.size(); i++)
678 if (ca[clauses[i]].mark() == 0)
679 clauses[j++] = clauses[i];
680 clauses.shrink(i - j);
681}
682
683
684//=================================================================================================
685// Garbage Collection methods:
686
687
689{
690 if (!use_simplification) return;
691
692 // All occurs lists:
693 //
694 int i;
695 for (i = 0; i < nVars(); i++){
696 vec<CRef>& cs = occurs[i];
697 for (int j = 0; j < cs.size(); j++)
698 ca.reloc(cs[j], to);
699 }
700
701 // Subsumption queue:
702 //
703 for (i = 0; i < subsumption_queue.size(); i++)
704 ca.reloc(subsumption_queue[i], to);
705
706 // Temporary clause:
707 //
708 ca.reloc(bwdsub_tmpunit, to);
709}
710
711
713{
714 // Initialize the next region to a size corresponding to the estimated utilization degree. This
715 // is not precise but should avoid some unnecessary reallocations for the new region:
716 ClauseAllocator to(ca.size() - ca.wasted());
717
719 to.extra_clause_field = ca.extra_clause_field; // NOTE: this is important to keep (or lose) the extra fields.
720 relocAll(to);
722 if (verbosity >= 2)
723 printf("| Garbage collection: %12d bytes => %12d bytes |\n",
725 to.moveTo(ca);
726}
727
unsigned int uint32_t
Definition Fxch.h:32
#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 INT32_MAX
Definition pstdint.h:415
ABC_NAMESPACE_IMPL_START typedef signed char value
void moveTo(ClauseAllocator &to)
void strengthen(Lit p)
Lit subsumes(const Clause &other) const
uint32_t size() const
Definition Alloc.h:58
bool substitute(Var v, Lit x)
OccLists< Var, vec< CRef >, ClauseDeleted > occurs
Definition SimpSolver.h:132
void removeClause(CRef cr)
Queue< CRef > subsumption_queue
Definition SimpSolver.h:135
bool implied(const vec< Lit > &c)
bool eliminate(bool turn_off_elim=false)
bool strengthenClause(CRef cr, Lit l)
bool eliminateVar(Var v)
Var newVar(bool polarity=true, bool dvar=true)
void updateElimHeap(Var v)
Definition SimpSolver.h:171
vec< uint32_t > elimclauses
Definition SimpSolver.h:129
bool asymm(Var v, CRef cr)
bool merge(const Clause &_ps, const Clause &_qs, Var v, vec< Lit > &out_clause)
bool addClause_(vec< Lit > &ps)
vec< char > frozen
Definition SimpSolver.h:136
bool isEliminated(Var v) const
Definition SimpSolver.h:170
virtual void garbageCollect()
bool backwardSubsumptionCheck(bool verbose=false)
vec< char > eliminated
Definition SimpSolver.h:137
vec< char > touched
Definition SimpSolver.h:130
Heap< ElimLt > elim_heap
Definition SimpSolver.h:134
void relocAll(ClauseAllocator &to)
void setFrozen(Var v, bool b)
Definition SimpSolver.h:183
bool addClause_(vec< Lit > &ps)
Definition Solver.cpp:134
CRef propagate()
Definition Solver.cpp:451
void checkGarbage()
Definition Solver.h:305
void cancelUntil(int level)
Definition Solver.cpp:209
bool remove_satisfied
Definition Solver.h:192
lbool modelValue(Var x) const
Definition Solver.h:324
int nVars() const
Definition Solver.h:329
void relocAll(ClauseAllocator &to)
Definition Solver.cpp:878
void removeClause(CRef cr)
Definition Solver.cpp:190
void detachClause(CRef cr, bool strict=false)
Definition Solver.cpp:173
void rebuildOrderHeap()
Definition Solver.cpp:561
void attachClause(CRef cr)
Definition Solver.cpp:164
vec< Lit > add_tmp
Definition Solver.h:202
vec< int > trail_lim
Definition Solver.h:184
vec< lbool > model
Definition Solver.h:111
OccLists< Lit, vec< Watcher >, WatcherDeleted > watches
Definition Solver.h:179
vec< Lit > trail
Definition Solver.h:183
ClauseAllocator ca
Definition Solver.h:194
lbool solve_()
Definition Solver.cpp:753
int decisionLevel() const
Definition Solver.h:320
Var newVar(bool polarity=true, bool dvar=true)
Definition Solver.cpp:116
bool simplify()
Definition Solver.cpp:579
void setDecisionVar(Var v, bool b)
Definition Solver.h:332
vec< Lit > assumptions
Definition Solver.h:189
lbool value(Var x) const
Definition Solver.h:322
vec< CRef > clauses
Definition Solver.h:173
void uncheckedEnqueue(Lit p, CRef from=CRef_Undef)
Definition Solver.cpp:431
bool asynch_interrupt
Definition Solver.h:212
bool enqueue(Lit p, CRef from=CRef_Undef)
Definition Solver.h:311
bool satisfied(const Clause &c) const
Definition Solver.cpp:200
int size(void) const
Definition Vec.h:65
void clear(bool dealloc=false)
Definition Vec.h:126
void push(void)
Definition Vec.h:75
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
Definition Alg.h:28
const CRef CRef_Undef
int toInt(Var v)
Definition SolverTypes.h:67
Lit toLit(int i)
Definition SolverTypes.h:69
int var(Lit p)
Definition SolverTypes.h:64
RegionAllocator< uint32_t >::Ref CRef
const Lit lit_Error
Definition SolverTypes.h:75
Lit mkLit(Var var, bool sign=false)
Definition SolverTypes.h:60
bool sign(Lit p)
Definition SolverTypes.h:63
const Lit lit_Undef
Definition SolverTypes.h:74
#define true
Definition place_base.h:28
signed char lbool
Definition satVec.h:135
#define assert(ex)
Definition util_old.h:213
#define HUGE_VAL
Definition util_old.h:295
signed char mark
Definition value.h:8