2023-03-26 19:15:17 +08:00

295 lines
6.2 KiB
C

#if defined(LOGGING) && !defined(QUIET)
#include "colors.h"
#include "inline.h"
#include <stdarg.h>
#include <string.h>
static void
begin_logging (kissat * solver, const char *fmt, va_list * ap)
{
TERMINAL (stdout, 1);
assert (GET_OPTION (log));
fputs ("c ", stdout);
COLOR (MAGENTA);
printf ("LOG %u ", solver->level);
vprintf (fmt, *ap);
}
static void
end_logging (void)
{
TERMINAL (stdout, 1);
fputc ('\n', stdout);
COLOR (NORMAL);
fflush (stdout);
}
void
kissat_log_msg (kissat * solver, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
end_logging ();
}
static void
append_sprintf (char *str, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
const size_t len = strlen (str);
vsprintf (str + len, fmt, ap);
va_end (ap);
}
const char *
kissat_log_lit (kissat * solver, unsigned lit)
{
assert (solver);
char *res = kissat_next_format_string (&solver->format);
sprintf (res, "%u", lit);
if (!solver->compacting && GET_OPTION (log) > 1)
{
append_sprintf (res, "(%d)", kissat_export_literal (solver, lit));
if (solver->values)
{
const value value = VALUE (lit);
if (value)
{
append_sprintf (res, "=%d", value);
if (solver->assigned)
append_sprintf (res, "@%u", LEVEL (lit));
}
}
}
assert (strlen (res) < FORMAT_STRING_SIZE);
return res;
}
static void
log_lits (kissat * solver, size_t size, const unsigned *lits)
{
for (size_t i = 0; i < size; i++)
{
fputc (' ', stdout);
fputs (LOGLIT (lits[i]), stdout);
}
}
void
kissat_log_lits (kissat * solver, size_t size, const unsigned *lits,
const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
printf (" size %zu clause", size);
log_lits (solver, size, lits);
end_logging ();
}
void
kissat_log_resolvent (kissat * solver, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
const size_t size = SIZE_STACK (solver->resolvent_lits);
printf (" size %zu resolvent", size);
const unsigned *lits = BEGIN_STACK (solver->resolvent_lits);
log_lits (solver, size, lits);
end_logging ();
}
void
kissat_log_ints (kissat * solver, size_t size, const int *lits,
const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
printf (" size %zu external literals clause", size);
for (size_t i = 0; i < size; i++)
printf (" %d", lits[i]);
end_logging ();
}
void
kissat_log_extensions (kissat * solver, size_t size, const extension * exts,
const char *fmt, ...)
{
assert (size > 0);
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
const extension *begin = BEGIN_STACK (solver->extend);
const size_t pos = exts - begin;
printf (" extend[%zu]", pos);
printf (" %d", exts[0].lit);
if (size > 1)
fputs (" :", stdout);
for (size_t i = 1; i < size; i++)
printf (" %d", exts[i].lit);
end_logging ();
}
void
kissat_log_unsigneds (kissat * solver,
size_t size, const unsigned *lits, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
printf (" size %zu unsigned literals clause", size);
for (size_t i = 0; i < size; i++)
printf (" %u", lits[i]);
end_logging ();
}
static void
log_clause (kissat * solver, clause * c)
{
fputc (' ', stdout);
if (c == &solver->conflict)
{
fputs ("static ", stdout);
fputs (c->redundant ? "redundant" : "irredundant", stdout);
fputs (" binary conflict clause", stdout);
}
else
{
if (c->hyper)
{
assert (c->size == 3);
fputs ("hyper ", stdout);
}
if (c->redundant)
printf ("redundant glue %u", c->glue);
else
fputs ("irredundant", stdout);
printf (" size %u", c->size);
if (c->reason)
fputs (" reason", stdout);
if (c->garbage)
fputs (" garbage", stdout);
fputs (" clause", stdout);
if (kissat_clause_in_arena (solver, c))
{
reference ref = kissat_reference_clause (solver, c);
printf ("[%u]", ref);
}
}
}
void
kissat_log_clause (kissat * solver, clause * c, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
log_clause (solver, c);
log_lits (solver, c->size, c->lits);
end_logging ();
}
static void
log_binary (kissat * solver, unsigned a, unsigned b)
{
printf (" binary clause %s %s", LOGLIT (a), LOGLIT (b));
}
void
kissat_log_binary (kissat * solver,
unsigned a, unsigned b, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
log_binary (solver, a, b);
end_logging ();
}
void
kissat_log_unary (kissat * solver, unsigned a, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
printf (" unary clause %s", LOGLIT (a));
end_logging ();
}
static void
log_ref (kissat * solver, reference ref)
{
clause *c = kissat_dereference_clause (solver, ref);
log_clause (solver, c);
log_lits (solver, c->size, c->lits);
}
void
kissat_log_ref (kissat * solver, reference ref, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
log_ref (solver, ref);
end_logging ();
}
void
kissat_log_watch (kissat * solver,
unsigned lit, watch watch, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
if (watch.type.binary)
log_binary (solver, lit, watch.binary.lit);
else
log_ref (solver, watch.large.ref);
end_logging ();
}
void
kissat_log_xor (kissat * solver, unsigned lit,
unsigned size, unsigned *lits, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
begin_logging (solver, fmt, &ap);
va_end (ap);
printf (" size %u XOR gate ", size);
fputs (kissat_log_lit (solver, lit), stdout);
printf (" =");
for (unsigned i = 0; i < size; i++)
{
if (i)
fputs (" ^ ", stdout);
else
fputc (' ', stdout);
fputs (kissat_log_lit (solver, lits[i]), stdout);
}
end_logging ();
}
#else
int kissat_log_dummy_to_avoid_pedantic_warning;
#endif