ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
transitive.h File Reference
#include "global.h"
Include dependency graph for transitive.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void kissat_transitive_reduction (struct kissat *)
 

Function Documentation

◆ kissat_transitive_reduction()

void kissat_transitive_reduction ( struct kissat * solver)

Definition at line 301 of file transitive.c.

301 {
302 if (solver->inconsistent)
303 return;
304 KISSAT_assert (solver->watching);
305 KISSAT_assert (solver->probing);
306 KISSAT_assert (!solver->level);
307 if (!GET_OPTION (transitive))
308 return;
310 return;
311 START (transitive);
312 INC (transitive_reductions);
313#if !defined(KISSAT_NDEBUG) || defined(METRICS)
314 KISSAT_assert (!solver->transitive_reducing);
315 solver->transitive_reducing = true;
316#endif
317 prioritize_binaries (solver);
318 bool success = false;
319 uint64_t reduced = 0;
320 unsigned units = 0;
321
322 SET_EFFORT_LIMIT (limit, transitive, transitive_ticks);
323
324#ifndef KISSAT_QUIET
325 const unsigned active = solver->active;
326 const uint64_t old_ticks = solver->statistics_.transitive_ticks;
328 solver, "starting with %" PRIu64 " transitive ticks", old_ticks);
329 unsigned probed = 0;
330#endif
331 unsigneds probes;
332 INIT_STACK (probes);
333 schedule_transitive (solver, &probes);
334 bool terminate = false;
335 while (!terminate && !EMPTY_STACK (probes)) {
336 const unsigned idx = POP_STACK (probes);
337 solver->flags[idx].transitive = false;
338 if (!ACTIVE (idx))
339 continue;
340 for (unsigned sign = 0; !terminate && sign < 2; sign++) {
341 const unsigned lit = 2 * idx + sign;
342 if (solver->values[lit])
343 continue;
344#ifndef KISSAT_QUIET
345 probed++;
346#endif
347 if (transitive_reduce (solver, lit, limit, &reduced, &units))
348 success = true;
349 if (solver->inconsistent)
350 terminate = true;
351 else if (solver->statistics_.transitive_ticks > limit)
352 terminate = true;
354 terminate = true;
355 }
356 }
357 const size_t remain = SIZE_STACK (probes);
358 if (remain) {
359 if (!GET_OPTION (transitivekeep)) {
361 solver, "dropping remaining %zu transitive candidates", remain);
362 while (!EMPTY_STACK (probes)) {
363 const unsigned idx = POP_STACK (probes);
364 solver->flags[idx].transitive = false;
365 }
366 }
367 } else
368 kissat_very_verbose (solver, "transitive reduction complete");
369 RELEASE_STACK (probes);
370
371#ifndef KISSAT_QUIET
372 const uint64_t new_ticks = solver->statistics_.transitive_ticks;
373 const uint64_t delta_ticks = new_ticks - old_ticks;
375 solver, "finished at %" PRIu64 " after %" PRIu64 " transitive ticks",
376 new_ticks, delta_ticks);
377#endif
378 kissat_phase (solver, "transitive", GET (probings),
379 "probed %u (%.0f%%): reduced %" PRIu64 ", units %u", probed,
380 kissat_percent (probed, 2 * active), reduced, units);
381
382#if !defined(KISSAT_NDEBUG) || defined(METRICS)
383 KISSAT_assert (solver->transitive_reducing);
384 solver->transitive_reducing = false;
385#endif
386 REPORT (!success, 't');
387 STOP (transitive);
388#ifdef KISSAT_QUIET
389 (void) success;
390#endif
391}
#define POP_STACK(S)
Definition stack.h:37
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define RELEASE_STACK(S)
Definition stack.h:71
#define INIT_STACK(S)
Definition stack.h:22
#define INC(NAME)
#define ACTIVE
Definition espresso.h:129
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
Definition limit.hpp:131
bool sign(Lit p)
Definition SolverTypes.h:63
#define GET_OPTION(N)
Definition options.h:295
#define kissat_extremely_verbose(...)
Definition print.h:53
#define kissat_very_verbose(...)
Definition print.h:52
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define REPORT(...)
Definition report.h:10
int lit
Definition satVec.h:130
#define GET(NAME)
Definition statistics.h:416
#define TERMINATED(BIT)
Definition terminate.h:42
#define transitive_terminated_2
Definition terminate.h:79
#define transitive_terminated_3
Definition terminate.h:80