165 if (LONG_MAX - delta <
stats.condprops)
170 size_t initial_trail_level =
trail.size ();
171 int initial_level =
level;
173 LOG (
"initial trail level %zd", initial_trail_level);
177#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
178 int additionally_assigned = 0;
181 for (
auto idx :
vars) {
182 const signed char tmp =
val (idx);
186 const int lit = tmp < 0 ? -idx : idx;
188 LOG (
"temporarily unassigning inactive literal %d",
lit);
192 LOG (
"temporarily unassigning frozen literal %d",
lit);
196 }
else if (
frozen (idx)) {
197 LOG (
"keeping frozen literal %d unassigned", idx);
198 }
else if (!
active (idx)) {
199 LOG (
"keeping inactive literal %d unassigned", idx);
201 if (initial_level ==
level) {
203 LOG (
"new condition decision level");
209#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
210 additionally_assigned++;
214 LOG (
"assigned %d additional literals", additionally_assigned);
235 size_t assigned, conditional, autarky;
238 initial.assigned = 0;
239 for (
auto idx :
vars) {
240 const signed char tmp =
val (idx);
245 LOG (
"initial assignment %ds", tmp < 0 ? -idx : idx);
249 PHASE (
"condition",
stats.conditionings,
"initial assignment of size %zd",
271 initial.autarky = initial.assigned;
272 initial.conditional = 0;
277 const size_t size_max =
clauses.size () + 1;
285 size_t conditioned = 0, unconditioned = 0;
291 for (
const auto &c :
clauses) {
304 size_t minsize = size_max;
313 const signed char tmp =
val (
lit);
333 LOG (c,
"found %d positive literals in candidate", positive);
334 candidates.push_back (c);
355 if (negative > 0 && positive > 0) {
356 LOG (c,
"found %d negative literals in candidate", negative);
365 LOG (c,
"watching %d with %zd occurrences in",
watch, minsize);
373 if (negative > 0 && !positive) {
375 size_t new_conditionals = 0;
379 signed char tmp =
val (
lit);
388 conditional.push_back (-
lit);
391 if (new_conditionals > 0)
392 LOG (c,
"marked %zu negations of literals as conditional in",
395 initial.conditional += new_conditionals;
397 initial.autarky -= new_conditionals;
402 PHASE (
"condition",
stats.conditionings,
"found %zd candidate clauses",
405 "watching %zu literals and clauses", watched);
407 "initially %zd conditional literals %.0f%%", initial.conditional,
408 percent (initial.conditional, initial.assigned));
410 "initially %zd autarky literals %.0f%%", initial.autarky,
411 percent (initial.autarky, initial.assigned));
413 for (
size_t i = 0; i < conditional.
size (); i++) {
414 LOG (
"initial conditional %d", conditional[i]);
417 for (
size_t i = 0; i <
trail.size (); i++)
419 LOG (
"initial autarky %d",
trail[i]);
422 CADICAL_assert (initial.assigned == initial.conditional + initial.autarky);
424 stats.condassinit += initial.assigned;
425 stats.condcondinit += initial.conditional;
426 stats.condautinit += initial.autarky;
456 if (conditioned && unconditioned) {
457 stable_sort (candidates.begin (), candidates.end (),
460 "focusing on %zd candidates %.0f%% not tried last time",
461 unconditioned,
percent (unconditioned, candidates.
size ()));
462 }
else if (conditioned && !unconditioned) {
463 for (
auto const &c : candidates) {
465 c->conditioned =
false;
468 "all %zd candidates tried before", conditioned);
471 PHASE (
"condition",
stats.conditionings,
"all %zd candidates are fresh",
486 size_t untried = candidates.
size ();
488 for (
const auto &c : candidates) {
490 if (initial.autarky <= 0)
496 bool terminated_or_limit_hit =
true;
498 LOG (
"asynchronous termination detected");
500 LOG (
"condition propagation limit %ld hit",
limit);
502 terminated_or_limit_hit =
false;
504 if (terminated_or_limit_hit) {
506 "%zd candidates %.0f%% not tried after %ld propagations",
507 untried,
percent (untried, candidates.
size ()), props);
516 LOG (c,
"candidate");
525 int watched_autarky_literal = 0;
534 if (watched_autarky_literal)
538 watched_autarky_literal =
lit;
544 if (!watched_autarky_literal) {
545 LOG (
"no initial autarky literal found");
553 LOG (
"watching first autarky literal %d", watched_autarky_literal);
563 size_t conditional, unassigned;
569 while (watched_autarky_literal &&
stats.condprops <
limit &&
570 next.conditional < conditional.
size ()) {
574 const int conditional_lit = conditional[next.conditional++];
575 LOG (
"processing next conditional %d", conditional_lit);
579 LOG (
"conditional %d negated in candidate clause", conditional_lit);
583 LOG (
"conditional %d does not occur negated in candidate clause",
588 unassigned.push_back (conditional_lit);
592 remain.conditional--;
595 while (watched_autarky_literal &&
stats.condprops <
limit &&
596 next.unassigned < unassigned.
size ()) {
597 const int unassigned_lit = unassigned[next.unassigned++];
598 LOG (
"processing next unassigned %d", unassigned_lit);
618 auto i = os.begin (), j = i;
619 for (; watched_autarky_literal && j != os.end (); j++) {
628 const signed char tmp =
val (
lit);
636 LOG (
"found replacement %d for unassigned %d", replacement,
638 LOG (d,
"unwatching %d in", unassigned_lit);
640 LOG (d,
"watching %d in", replacement);
643 occs (replacement).push_back (d);
648 LOG (
"no replacement found for unassigned %d", unassigned_lit);
653 LOG (d,
"no negative autarky literals left in");
657 LOG (d,
"found %d negative autarky literals in", negative);
660 watched_autarky_literal && l != d->
end (); l++) {
665 conditional.push_back (-
lit);
667 remain.conditional++;
671 if (-
lit != watched_autarky_literal)
674 LOG (
"need to replace autarky literal %d in candidate", -
lit);
680 !replacement && k != c->end (); k++) {
681 const int other = *k;
685 watched_autarky_literal = replacement;
688 LOG (c,
"watching autarky %d instead %d in candidate",
689 replacement, watched_autarky_literal);
690 watched_autarky_literal = replacement;
692 LOG (
"failed to find an autarky replacement");
693 watched_autarky_literal = 0;
702 while (j != os.end ())
704 LOG (
"flushed %zd occurrences of %d", os.end () - i,
706 os.resize (i - os.begin ());
716 LOG (
"remaining assignment of size %zd", remain.assigned);
717 LOG (
"remaining conditional part of size %zd", remain.conditional);
718 LOG (
"remaining autarky part of size %zd", remain.autarky);
720 CADICAL_assert (remain.assigned - remain.conditional == remain.autarky);
722#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
730 size_t assigned, conditional, autarky;
733 for (
size_t i = 0; i <
trail.size (); i++) {
738 LOG (
"remaining conditional %d",
lit);
743 LOG (
"remaining autarky %d",
lit);
760 if (watched_autarky_literal &&
stats.condprops <
limit) {
766 LOG (c,
"positive autarky literal %d globally blocks",
767 watched_autarky_literal);
769 LOG (
"remaining %zd assigned literals %.0f%%", remain.assigned,
770 percent (remain.assigned, initial.assigned));
771 LOG (
"remaining %zd conditional literals %.0f%%", remain.conditional,
772 percent (remain.conditional, remain.assigned));
773 LOG (
"remaining %zd autarky literals %.0f%%", remain.autarky,
774 percent (remain.autarky, remain.assigned));
791 external->push_zero_on_extension_stack ();
794 external->push_witness_literal_on_extension_stack (
lit);
796 proof->weaken_minus (c);
797 external->push_clause_on_extension_stack (c);
801 stats.condassrem += remain.assigned;
802 stats.condcondrem += remain.conditional;
803 stats.condautrem += remain.autarky;
804 stats.condassirem += initial.assigned;
811 if (!unassigned.empty ()) {
812 LOG (
"reassigning %zd literals", unassigned.
size ());
813 while (!unassigned.empty ()) {
814 const int lit = unassigned.back ();
815 unassigned.pop_back ();
823 if (initial.conditional < conditional.
size ()) {
824 LOG (
"flushing %zd autarky literals from conditional stack",
825 conditional.
size () - initial.conditional);
826 while (initial.conditional < conditional.
size ()) {
827 const int lit = conditional.back ();
828 conditional.pop_back ();
841 "globally blocked %ld clauses %.0f%%", blocked,
846 for (
const auto &
lit : conditional)
855#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
856 int additionally_unassigned = 0;
858 while (
trail.size () > initial_trail_level) {
862#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
863 additionally_unassigned++;
866 LOG (
"unassigned %d additionally assigned literals",
867 additionally_unassigned);
868 CADICAL_assert (additionally_unassigned == additionally_assigned);
870 if (
level > initial_level) {
871 LOG (
"reset condition decision level");
872 level = initial_level;
880 LOG (
"reassigning previously assigned variables");
881 for (
size_t i = 0; i < initial_trail_level; i++) {
883 const signed char tmp =
val (
lit);
889#ifndef CADICAL_NDEBUG