ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
sweep.c File Reference
#include "sweep.h"
#include "dense.h"
#include "inline.h"
#include "kitten.h"
#include "logging.h"
#include "print.h"
#include "promote.h"
#include "propdense.h"
#include "proprobe.h"
#include "random.h"
#include "rank.h"
#include "report.h"
#include "terminate.h"
#include <inttypes.h>
#include <string.h>
Include dependency graph for sweep.c:

Go to the source code of this file.

Classes

struct  sweeper
 
struct  sweep_candidate
 

Macros

#define LOGBACKBONE(MESSAGE)
 
#define LOGPARTITION(MESSAGE)
 
#define all_scheduled(IDX)
 
#define RANK_SWEEP_CANDIDATE(CAND)
 

Typedefs

typedef struct sweeper sweeper
 
typedef struct sweep_candidate sweep_candidate
 

Functions

typedef STACK (sweep_candidate)
 
bool kissat_sweep (kissat *solver)
 

Macro Definition Documentation

◆ all_scheduled

#define all_scheduled ( IDX)
Value:
unsigned IDX = sweeper->first, NEXT_##IDX; \
IDX != INVALID_IDX && (NEXT_##IDX = sweeper->next[IDX], true); \
IDX = NEXT_##IDX
#define INVALID_IDX
Definition literal.h:18
#define IDX(LIT)
Definition literal.h:28
unsigned first
Definition sweep.c:25
unsigned * next
Definition sweep.c:24

Definition at line 819 of file sweep.c.

819#define all_scheduled(IDX) \
820 unsigned IDX = sweeper->first, NEXT_##IDX; \
821 IDX != INVALID_IDX && (NEXT_##IDX = sweeper->next[IDX], true); \
822 IDX = NEXT_##IDX

◆ LOGBACKBONE

#define LOGBACKBONE ( MESSAGE)
Value:
#define BEGIN_STACK(S)
Definition stack.h:46
#define SIZE_STACK(S)
Definition stack.h:19
#define LOGLITSET(...)
Definition logging.h:373
unsigneds backbone
Definition sweep.c:31

Definition at line 468 of file sweep.c.

468#define LOGBACKBONE(MESSAGE) \
469 LOGLITSET (SIZE_STACK (sweeper->backbone), \
470 BEGIN_STACK (sweeper->backbone), MESSAGE)

◆ LOGPARTITION

#define LOGPARTITION ( MESSAGE)
Value:
#define LOGLITPART(...)
Definition logging.h:376
unsigneds partition
Definition sweep.c:32

Definition at line 472 of file sweep.c.

472#define LOGPARTITION(MESSAGE) \
473 LOGLITPART (SIZE_STACK (sweeper->partition), \
474 BEGIN_STACK (sweeper->partition), MESSAGE)

◆ RANK_SWEEP_CANDIDATE

#define RANK_SWEEP_CANDIDATE ( CAND)
Value:
(CAND).rank
unsigned rank
Definition vector.c:142

Typedef Documentation

◆ sweep_candidate

typedef struct sweep_candidate sweep_candidate

Definition at line 1465 of file sweep.c.

◆ sweeper

typedef struct sweeper sweeper

Definition at line 40 of file sweep.c.

Function Documentation

◆ kissat_sweep()

bool kissat_sweep ( kissat * solver)

Definition at line 1650 of file sweep.c.

1650 {
1651 if (!GET_OPTION (sweep))
1652 return false;
1653 if (solver->inconsistent)
1654 return false;
1656 return false;
1657 if (DELAYING (sweep))
1658 return false;
1659 KISSAT_assert (!solver->level);
1660 KISSAT_assert (!solver->unflushed);
1661 START (sweep);
1662 INC (sweep);
1663 statistics *statistics = &solver->statistics_;
1664 uint64_t equivalences = statistics->sweep_equivalences;
1665 uint64_t units = statistics->sweep_units;
1667 init_sweeper (solver, &sweeper);
1668 const unsigned scheduled = schedule_sweeping (&sweeper);
1669 uint64_t swept = 0, limit = 10;
1670 for (;;) {
1671 if (solver->inconsistent)
1672 break;
1674 break;
1675 if (solver->statistics_.kitten_ticks > sweeper.limit.ticks)
1676 break;
1677 unsigned idx = next_scheduled (&sweeper);
1678 if (idx == INVALID_IDX)
1679 break;
1680 FLAGS (idx)->sweep = false;
1681#ifndef KISSAT_QUIET
1682 const char *res =
1683#endif
1684 sweep_variable (&sweeper, idx);
1686 solver, "swept[%" PRIu64 "] external variable %d %s", swept,
1687 kissat_export_literal (solver, LIT (idx)), res);
1688 if (++swept == limit) {
1690 "found %" PRIu64 " equivalences and %" PRIu64
1691 " units after sweeping %" PRIu64 " variables ",
1692 statistics->sweep_equivalences - equivalences,
1693 solver->statistics_.sweep_units - units, swept);
1694 limit *= 10;
1695 }
1696 }
1697 kissat_very_verbose (solver, "swept %" PRIu64 " variables", swept);
1698 equivalences = statistics->sweep_equivalences - equivalences,
1699 units = solver->statistics_.sweep_units - units;
1700 kissat_phase (solver, "sweep", GET (sweep),
1701 "found %" PRIu64 " equivalences and %" PRIu64 " units",
1702 equivalences, units);
1703 unschedule_sweeping (&sweeper, swept, scheduled);
1704 unsigned inactive = release_sweeper (&sweeper);
1705
1706 if (!solver->inconsistent) {
1707 solver->propagate = solver->trail.begin;
1709 }
1710
1711 uint64_t eliminated = equivalences + units;
1712#ifndef KISSAT_QUIET
1713 KISSAT_assert (solver->active >= inactive);
1714 solver->active -= inactive;
1715 REPORT (!eliminated, '=');
1716 solver->active += inactive;
1717#else
1718 (void) inactive;
1719#endif
1720 if (kissat_average (eliminated, swept) < 0.001)
1721 BUMP_DELAY (sweep);
1722 else
1723 REDUCE_DELAY (sweep);
1724 STOP (sweep);
1725 return eliminated;
1726}
#define INC(NAME)
#define FLAGS
#define BUMP_DELAY(NAME)
Definition kimits.h:183
#define REDUCE_DELAY(NAME)
Definition kimits.h:185
#define DELAYING(NAME)
Definition kimits.h:181
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#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
clause * kissat_probing_propagate(kissat *solver, clause *ignore, bool flush)
Definition proprobe.c:37
#define REPORT(...)
Definition report.h:10
#define LIT(IDX)
Definition literal.h:31
#define GET(NAME)
Definition statistics.h:416
struct sweeper::@220272220222261246232307276064033320167134062222 limit
uint64_t ticks
Definition sweep.c:35
#define TERMINATED(BIT)
Definition terminate.h:42
#define sweep_terminated_7
Definition terminate.h:76
#define sweep_terminated_8
Definition terminate.h:77
Here is the call graph for this function:

◆ STACK()

typedef STACK ( sweep_candidate )

Definition at line 1474 of file sweep.c.

1481 {
1483 const unsigned lit = LIT (idx);
1484 const size_t pos = SIZE_WATCHES (WATCHES (lit));
1485 if (!pos)
1486 return false;
1487 const unsigned max_occurrences = sweeper->limit.clauses;
1488 if (pos > max_occurrences)
1489 return false;
1490 const unsigned not_lit = NOT (lit);
1491 const size_t neg = SIZE_WATCHES (WATCHES (not_lit));
1492 if (!neg)
1493 return false;
1494 if (neg > max_occurrences)
1495 return false;
1496 *occ_ptr = pos + neg;
1497 return true;
1498}
bool pos
Definition globals.c:30
int lit
Definition satVec.h:130
#define NOT(LIT)
Definition literal.h:33
kissat * solver
Definition sweep.c:21
unsigned clauses
Definition sweep.c:36
#define SIZE_WATCHES(W)
Definition watch.h:104
#define WATCHES(LIT)
Definition watch.h:137