summaryrefslogtreecommitdiff
path: root/sys/src/libsat/impl.h
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-03-17 19:26:26 +0000
committeraiju <devnull@localhost>2018-03-17 19:26:26 +0000
commitc2c9562e3c2994d87f65ab09779190d1e7e09517 (patch)
tree6dc692d7358361da761bae454a1a858ec4c412d5 /sys/src/libsat/impl.h
parente0be49d7f1dcb50048bead1b7d62633448482246 (diff)
add libsat
Diffstat (limited to 'sys/src/libsat/impl.h')
-rw-r--r--sys/src/libsat/impl.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/sys/src/libsat/impl.h b/sys/src/libsat/impl.h
new file mode 100644
index 000000000..9049299b7
--- /dev/null
+++ b/sys/src/libsat/impl.h
@@ -0,0 +1,81 @@
+/* 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