15 LOG (
"resetting lit %i",
lit);
23 LOG (
"resetting %zu shrinkable variables", reset);
27 int blevel, std::vector<int>::size_type minimized_start) {
29 size_t marked = 0, reset = 0;
32 unsigned kept = 0, minireset = 0;
33 for (; minimized_start <
minimized.size (); ++minimized_start) {
37 if (v.
level == blevel) {
47 (void) minimized_start;
66 LOG (
"resetting %zu shrinkable variables", reset);
67 LOG (
"marked %zu removable variables",
marked);
79 LOG (
"skipping root level assigned %d", (
lit));
93 LOG (
"skipping already shrinkable literal %d", (
lit));
97 if (v.
level < blevel) {
99 LOG (
"skipping removable thus shrinkable %d", (
lit));
102 const bool always_minimize_on_lower_blevel = (
opts.shrink > 2);
104 LOG (
"minimized thus shrinkable %d", (
lit));
107 LOG (
"literal %d on lower blevel %u < %u not removable/shrinkable",
112 LOG (
"marking %d as shrinkable",
lit);
116 if (
opts.shrinkreap) {
118 const unsigned dist = max_trail - v.
trail;
125 int uip,
int blevel, std::vector<int>::reverse_iterator &rbegin_block,
126 std::vector<int>::reverse_iterator &rend_block,
127 std::vector<int>::size_type minimized_start,
const int uip0) {
130 LOG (
"UIP on level %u, uip: %i (replacing by %i)", blevel, uip, uip0);
133 unsigned block_shrunken = 0;
134 *rbegin_block = -uip;
146 flags (-uip).keep =
true;
147 for (
auto p = rbegin_block + 1;
p != rend_block; ++
p) {
158 return block_shrunken;
162 const std::vector<int>::reverse_iterator &rbegin_block,
163 const std::vector<int>::reverse_iterator &rend_block,
164 unsigned &block_minimized,
const int uip0) {
168 LOG (
"no UIP found, now minimizing");
169 for (
auto p = rbegin_block;
p != rend_block; ++
p) {
186 const std::vector<int>::reverse_iterator &rbegin_block,
187 const std::vector<int>::reverse_iterator &rend_block,
int blevel,
188 unsigned max_trail) {
190 for (
auto p = rbegin_block;
p != rend_block; ++
p) {
195#ifndef CADICAL_NDEBUG
204 unsigned &max_trail) {
205 const auto &t = &
trail;
206 if (
opts.shrinkreap) {
208 const unsigned dist =
reap.pop ();
211 const unsigned pos = max_trail - dist;
213 const int uip = (*t)[
pos];
215 LOG (
"trying to shrink literal %d at trail[%u] and level %d", uip,
pos,
220#ifndef CADICAL_NDEBUG
221 unsigned init_max_trail = max_trail;
225 uip = (*t)[max_trail--];
228 LOG (
"open is now %d, uip = %d, level %d", open, uip, blevel);
235 bool resolve_large_clauses,
237 unsigned max_trail) {
238 LOG (
"shrinking along the reason of lit %i", uip);
240#ifndef CADICAL_NDEBUG
249 if (
opts.minimizeticks)
252 if (resolve_large_clauses || v.
reason->
size == 2) {
276 std::vector<int>::reverse_iterator &rend_block,
277 int blevel,
unsigned &open,
278 unsigned &block_minimized,
const int uip0,
279 unsigned max_trail) {
290 LOG (
"trying to shrink %u literals on level %u", open, blevel);
292 const auto &t = &
trail;
294 LOG (
"maximum trail position %zd on level %u", t->size (), blevel);
296 LOG (
"shrinking up to %u", max_trail);
299 const bool resolve_large_clauses = (
opts.shrink > 1);
301 unsigned block_shrunken = 0;
302 std::vector<int>::size_type minimized_start =
minimized.size ();
304 unsigned max_trail2 = max_trail;
323 LOG (
"shrinking found UIP %i on level %i (open: %d)", uip, blevel,
326 LOG (
"shrinking failed on level %i", blevel);
331 block_minimized, uip0);
334 rend_block, minimized_start, uip0);
339 return block_shrunken;
352 uint64_t res = v.
level;
372 std::vector<int>::reverse_iterator &rbegin_block,
373 unsigned &total_shrunken,
unsigned &total_minimized,
const int uip0)
376 LOG (
"shrinking block");
383 std::vector<int>::reverse_iterator rend_block;
386 const int lit = *rbegin_block;
388 blevel =
vtab[idx].level;
389 max_trail =
vtab[idx].trail;
390 LOG (
"Block at level %i (first lit: %i)", blevel,
lit);
392 rend_block = rbegin_block;
396 const int lit = *(++rend_block);
398 finished = (blevel !=
vtab[idx].level);
399 if (!finished && (
unsigned)
vtab[idx].
trail > max_trail)
400 max_trail =
vtab[idx].trail;
403 "testing if lit %i is on the same level (of lit: %i, global: %i)",
413 unsigned block_shrunken = 0, block_minimized = 0;
415 flags (*rbegin_block).keep =
true;
418 block_shrunken =
shrink_block (rbegin_block, rend_block, blevel, open,
419 block_minimized, uip0, max_trail);
421 LOG (
"shrunken %u literals on level %u (including %u minimized)",
422 block_shrunken, blevel, block_minimized);
424 total_shrunken += block_shrunken;
425 total_minimized += block_minimized;
438 unsigned total_shrunken = 0;
439 unsigned total_minimized = 0;
441 LOG (
clause,
"shrink first UIP clause (CADICAL_asserting lit: %i)",
clause[0]);
443 auto rend_lits =
clause.rend () - 1;
444 auto rend_block =
clause.rbegin ();
445 const int uip0 =
clause[0];
452 old_clause_lrat.push_back (i);
454 while (rend_block != rend_lits) {
456 total_minimized, uip0);
460 "post shrink pass (with uips, not removed) first UIP clause");
461 LOG (old_clause_lrat,
"(used for lratdirect) before shrink: clause");
462#if defined(LOGGING) || !defined(CADICAL_NDEBUG)
463 const unsigned old_size =
clause.size ();
465 std::vector<int> stack;
467 std::vector<int>::size_type i = 1;
468 for (std::vector<int>::size_type j = 1; j <
clause.size (); ++j) {
474 if (
clause[j] != old_clause_lrat[j]) {
492 (
unsigned)
clause.size () + total_shrunken + total_minimized);
493 LOG (
clause,
"after shrinking first UIP clause");
494 LOG (
"clause shrunken by %zd literals (including %u minimized)",
495 old_size -
clause.size (), total_minimized);
497 stats.shrunken += total_shrunken;
498 stats.minishrunken += total_minimized;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
#define MSORT(LIMIT, FIRST, LAST, RANK, LESS)
unsigned shrunken_block_uip(int, int, std::vector< int >::reverse_iterator &, std::vector< int >::reverse_iterator &, std::vector< int >::size_type, const int)
void mark_shrinkable_as_removable(int, std::vector< int >::size_type)
vector< int64_t > lrat_chain
void clear_minimized_literals()
void shrunken_block_no_uip(const std::vector< int >::reverse_iterator &, const std::vector< int >::reverse_iterator &, unsigned &, const int)
void calculate_minimize_chain(int lit, std::vector< int > &stack)
Clause * learn_external_reason_clause(int lit, int falsified_elit=0, bool no_backtrack=false)
int shrink_literal(int, int, unsigned)
signed char val(int lit) const
signed char marked(int lit) const
bool minimize_literal(int lit, int depth=0)
std::vector< int >::reverse_iterator minimize_and_shrink_block(std::vector< int >::reverse_iterator &, unsigned int &, unsigned int &, const int)
void push_literals_of_block(const std::vector< int >::reverse_iterator &, const std::vector< int >::reverse_iterator &, int, unsigned)
unsigned shrink_along_reason(int, int, bool, bool &, unsigned)
unsigned shrink_block(std::vector< int >::reverse_iterator &, std::vector< int >::reverse_iterator &, int, unsigned &, unsigned &, const int, unsigned)
vector< int64_t > minimize_chain
void shrink_and_minimize_clause()
unsigned shrink_next(int, unsigned &, unsigned &)
vector< int64_t > mini_chain
struct CaDiCaL::Level::@023147271015376226021074167111310127126167046351 seen
bool operator()(const int &a, const int &b) const
shrink_trail_larger(Internal *s)
shrink_trail_negative_rank(Internal *s)