equal/hKis/test/testcollect.c
2022-10-25 18:36:19 +08:00

194 lines
4.3 KiB
C

#include "test.h"
#if defined(NDEBUG) || !defined(NOPTIONS)
#include "../src/collect.h"
#include "../src/dense.h"
#include "../src/flags.h"
#include "../src/import.h"
#include "../src/propsearch.h"
#include "../src/trail.h"
#define REDUNDANT_LITERAL 2
#define IRREDUNDANT_LITERAL 4
static void
flush_unit (kissat * solver)
{
clause *conflict = kissat_search_propagate (solver);
assert (!conflict);
kissat_flush_trail (solver);
}
static void
add_unit_to_satisfy_redundant_clause (kissat * solver)
{
if (solver->values[REDUNDANT_LITERAL])
return;
kissat_assign_unit (solver, REDUNDANT_LITERAL);
flush_unit (solver);
}
static void
add_unit_to_satisfy_irredundant_clause (kissat * solver)
{
if (solver->values[IRREDUNDANT_LITERAL])
return;
kissat_assign_unit (solver, IRREDUNDANT_LITERAL);
flush_unit (solver);
}
static void
just_import_and_activate_four_variables (kissat * solver)
{
int ilit;
ilit = kissat_import_literal (solver, 1);
assert (ilit == 0);
kissat_activate_literal (solver, ilit);
ilit = kissat_import_literal (solver, 2);
assert (ilit == 2);
kissat_activate_literal (solver, ilit);
ilit = kissat_import_literal (solver, 3);
assert (ilit == 4);
kissat_activate_literal (solver, ilit);
ilit = kissat_import_literal (solver, 4);
assert (ilit == 6);
kissat_activate_literal (solver, ilit);
}
static void
add_large_redundant_clause (kissat * solver)
{
assert (solver->vars == 4);
PUSH_STACK (solver->clause.lits, 0);
PUSH_STACK (solver->clause.lits, REDUNDANT_LITERAL);
PUSH_STACK (solver->clause.lits, 6);
kissat_new_redundant_clause (solver, 2);
}
static void
add_large_irredundant_clause (kissat * solver)
{
assert (solver->vars == 4);
PUSH_STACK (solver->clause.lits, 0);
PUSH_STACK (solver->clause.lits, IRREDUNDANT_LITERAL);
PUSH_STACK (solver->clause.lits, 6);
kissat_new_irredundant_clause (solver);
}
static void
mark_redundant_clauses_as_garbage (kissat * solver)
{
for (all_clauses (c))
if (c->redundant)
kissat_mark_clause_as_garbage (solver, c);
}
static void
mark_irredundant_clauses_as_garbage (kissat * solver)
{
for (all_clauses (c))
if (!c->redundant)
kissat_mark_clause_as_garbage (solver, c);
}
#define IFBIT(BIT,FUNCTION) \
do { \
assert (BIT < bits); \
if ((i & (1 << BIT))) \
FUNCTION (solver); \
} while (0)
static void
test_collect (void)
{
const unsigned bits = 14;
for (unsigned i = 0; i < (1u << bits); i++)
{
if (!(i & ((i << 7) | (i << 9) | (i << 11))))
continue;
kissat *solver = kissat_init ();
tissat_init_solver (solver);
#if !defined(NDEBUG)
solver->options.check = 0;
#endif
just_import_and_activate_four_variables (solver);
IFBIT (0, add_large_redundant_clause);
IFBIT (1, add_large_irredundant_clause);
IFBIT (2, add_large_redundant_clause);
IFBIT (3, add_large_irredundant_clause);
IFBIT (4, add_large_redundant_clause);
bool redundant_unit;
bool irredundant_unit;
if (i & (1 << 13))
{
redundant_unit = irredundant_unit = false;
IFBIT (5, mark_redundant_clauses_as_garbage);
IFBIT (6, mark_irredundant_clauses_as_garbage);
}
else
{
redundant_unit = ((i & (i << 5)) != 0);
irredundant_unit = ((i & (i << 6)) != 0);
IFBIT (5, add_unit_to_satisfy_redundant_clause);
IFBIT (6, add_unit_to_satisfy_irredundant_clause);
}
if (i & (i << 7))
{
bool compact = !(i & (i << 8));
kissat_sparse_collect (solver, compact, 0);
}
else if (i & (i << 8))
{
if (!redundant_unit)
add_unit_to_satisfy_redundant_clause (solver);
if (!irredundant_unit)
add_unit_to_satisfy_irredundant_clause (solver);
redundant_unit = irredundant_unit = true;
}
if (i & (i << 9))
{
kissat_enter_dense_mode (solver, 0, 0);
kissat_dense_collect (solver);
bool flush = !(i & (i << 10));
kissat_resume_sparse_mode (solver, flush, 0, 0);
}
else if (i & (i << 10))
{
if (!redundant_unit)
add_unit_to_satisfy_redundant_clause (solver);
if (!irredundant_unit)
add_unit_to_satisfy_irredundant_clause (solver);
}
if (i & (i << 11))
{
bool compact = !(i & (i << 12));
kissat_sparse_collect (solver, compact, 0);
}
kissat_release (solver);
}
}
void
tissat_schedule_collect (void)
{
SCHEDULE_FUNCTION (test_collect);
}
#else
void
tissat_schedule_collect (void)
{
}
#endif