plan9front/sys/src/libsat/impl.h

82 lines
2.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* note that internally, literals use a representation different from the API.
* variables are numbered from 0 (not 1) and 2v and 2v+1 correspond to v
* and ¬v, resp. */
#define VAR(l) ((l)>>1)
#define NOT(l) ((l)^1)
/* l[0] and l[1] are special: they are the watched literals.
* all clauses that have literal l on their watchlist form a linked list starting with s->lit[l].watch
* and watch[i] having the next clause for l[i] */
struct SATClause {
SATClause *next;
SATClause *watch[2];
double activity; /* activity is increased every time a clause is used to resolve a conflict (tiebreaking heuristic during purging) */
int n; /* >= 2 for learned clauses and > 2 for input clauses (binary input clauses are kept in the bimp tables) */
ushort range; /* heuristic used during purging, low range => keep clause (range 0..256) */
int l[1];
};
struct SATLit {
int *bimp; /* array of literals implied by this literal through binary clauses (Binary IMPlications) */
SATClause *watch; /* linked list of watched clauses */
int nbimp;
char val; /* -1 = not assigned, 0 = false, 1 = true */
};
struct SATVar {
double activity; /* activity is increased every time a variable shows up in a conflict */
union {
SATClause *reason; /* nil for decision and free literals */
int binreason; /* used when isbinreason == 1: the reason is the clause l l->binreason */
};
int lvl; /* level at which this variable is defined, or -1 for free variables */
int heaploc; /* location in binary heap or -1 when not in heap */
uint stamp; /* "stamp" value used for conflict resolution etc. */
uchar flags; /* see below */
char isbinreason;
};
enum {
VARPHASE = 1, /* for a free variables, VARPHASE is used as a first guess the next time it is picked */
VARUSER = 0x80, /* user assigned variable (unit clause in input) */
};
/* records conflicts during purging */
struct SATConflict {
union {
SATClause *c;
uvlong b;
};
int lvl; /* bit 31 denotes binary conflict */
};
#define CFLLVL(c) ((c).lvl & 0x7fffffff)
enum {
SATBLOCKSZ = 65536,
SATVARALLOC = 64,
CLAUSEALIGN = 8,
CFLCLALLOC = 16,
};
void saterror(SATSolve *, char *, ...);
void sataddtrail(SATSolve *, int);
void satdebuginit(SATSolve *);
void satprintstate(SATSolve *);
void satsanity(SATSolve *);
SATVar *satheaptake(SATSolve *);
void satheapput(SATSolve *, SATVar *);
void satreheap(SATSolve *, SATVar *);
void satheapreset(SATSolve *);
int satnrand(SATSolve *, int);
void *satrealloc(SATSolve *, void *, ulong);
SATClause *satnewclause(SATSolve *, int, int);
SATClause *satreplclause(SATSolve *, int);
void satcleanup(SATSolve *, int);
void satbackjump(SATSolve *, int);
#define signf(l) (((l)<<31>>31|1)*((l)+2>>1))
#pragma varargck type "Γ" SATClause*
#define ε 2.2250738585072014e-308
#define MAXACTIVITY 1e100