alpar@9: /* minisat.h */ alpar@9: alpar@9: /* Modified by Andrew Makhorin , August 2011 */ alpar@9: alpar@9: /*********************************************************************** alpar@9: * MiniSat -- Copyright (c) 2005, Niklas Sorensson alpar@9: * http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/ alpar@9: * alpar@9: * Permission is hereby granted, free of charge, to any person alpar@9: * obtaining a copy of this software and associated documentation files alpar@9: * (the "Software"), to deal in the Software without restriction, alpar@9: * including without limitation the rights to use, copy, modify, merge, alpar@9: * publish, distribute, sublicense, and/or sell copies of the Software, alpar@9: * and to permit persons to whom the Software is furnished to do so, alpar@9: * subject to the following conditions: alpar@9: * alpar@9: * The above copyright notice and this permission notice shall be alpar@9: * included in all copies or substantial portions of the Software. alpar@9: * alpar@9: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, alpar@9: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF alpar@9: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND alpar@9: * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS alpar@9: * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN alpar@9: * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN alpar@9: * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE alpar@9: * SOFTWARE. alpar@9: ***********************************************************************/ alpar@9: /* Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko */ alpar@9: alpar@9: #ifndef MINISAT_H alpar@9: #define MINISAT_H alpar@9: alpar@9: /*====================================================================*/ alpar@9: /* Simple types: */ alpar@9: alpar@9: typedef int bool; alpar@9: alpar@9: #define true 1 alpar@9: #define false 0 alpar@9: alpar@9: typedef int lit; alpar@9: #if 0 /* by mao */ alpar@9: typedef char lbool; alpar@9: #else alpar@9: typedef int lbool; alpar@9: #endif alpar@9: alpar@9: #define var_Undef (int)(-1) alpar@9: #define lit_Undef (lit)(-2) alpar@9: alpar@9: #define l_Undef (lbool)0 alpar@9: #define l_True (lbool)1 alpar@9: #define l_False (lbool)(-1) alpar@9: alpar@9: #define toLit(v) (lit)((v) + (v)) alpar@9: #define lit_neg(l) (lit)((l) ^ 1) alpar@9: #define lit_var(l) (int)((l) >> 1) alpar@9: #define lit_sign(l) (int)((l) & 1) alpar@9: alpar@9: /*====================================================================*/ alpar@9: /* Vectors: */ alpar@9: alpar@9: /* vector of 32-bit intergers (added for 64-bit portability) */ alpar@9: typedef struct /* veci_t */ { alpar@9: int size; alpar@9: int cap; alpar@9: int* ptr; alpar@9: } veci; alpar@9: alpar@9: #define veci_new(v) \ alpar@9: { (v)->size = 0; \ alpar@9: (v)->cap = 4; \ alpar@9: (v)->ptr = (int*)malloc(sizeof(int)*(v)->cap); \ alpar@9: } alpar@9: alpar@9: #define veci_delete(v) free((v)->ptr) alpar@9: alpar@9: #define veci_begin(v) ((v)->ptr) alpar@9: alpar@9: #define veci_size(v) ((v)->size) alpar@9: alpar@9: #define veci_resize(v, k) (void)((v)->size = (k)) alpar@9: /* only safe to shrink !! */ alpar@9: alpar@9: #define veci_push(v, e) \ alpar@9: { if ((v)->size == (v)->cap) \ alpar@9: { int newsize = (v)->cap * 2+1; \ alpar@9: (v)->ptr = (int*)realloc((v)->ptr,sizeof(int)*newsize); \ alpar@9: (v)->cap = newsize; \ alpar@9: } \ alpar@9: (v)->ptr[(v)->size++] = (e); \ alpar@9: } alpar@9: alpar@9: /* vector of 32- or 64-bit pointers */ alpar@9: typedef struct /* vecp_t */ { alpar@9: int size; alpar@9: int cap; alpar@9: void** ptr; alpar@9: } vecp; alpar@9: alpar@9: #define vecp_new(v) \ alpar@9: { (v)->size = 0; \ alpar@9: (v)->cap = 4; \ alpar@9: (v)->ptr = (void**)malloc(sizeof(void*)*(v)->cap); \ alpar@9: } alpar@9: alpar@9: #define vecp_delete(v) free((v)->ptr) alpar@9: alpar@9: #define vecp_begin(v) ((v)->ptr) alpar@9: alpar@9: #define vecp_size(v) ((v)->size) alpar@9: alpar@9: #define vecp_resize(v, k) (void)((v)->size = (k)) alpar@9: /* only safe to shrink !! */ alpar@9: alpar@9: #define vecp_push(v, e) \ alpar@9: { if ((v)->size == (v)->cap) \ alpar@9: { int newsize = (v)->cap * 2+1; \ alpar@9: (v)->ptr = (void**)realloc((v)->ptr,sizeof(void*)*newsize); \ alpar@9: (v)->cap = newsize; \ alpar@9: } \ alpar@9: (v)->ptr[(v)->size++] = (e); \ alpar@9: } alpar@9: alpar@9: /*====================================================================*/ alpar@9: /* Solver representation: */ alpar@9: alpar@9: typedef struct /* clause_t */ alpar@9: { alpar@9: int size_learnt; alpar@9: lit lits[1]; alpar@9: } clause; alpar@9: alpar@9: typedef struct /* stats_t */ alpar@9: { alpar@9: double starts, decisions, propagations, inspects, conflicts; alpar@9: double clauses, clauses_literals, learnts, learnts_literals, alpar@9: max_literals, tot_literals; alpar@9: } stats; alpar@9: alpar@9: typedef struct /* solver_t */ alpar@9: { alpar@9: int size; /* nof variables */ alpar@9: int cap; /* size of varmaps */ alpar@9: int qhead; /* Head index of queue. */ alpar@9: int qtail; /* Tail index of queue. */ alpar@9: alpar@9: /* clauses */ alpar@9: vecp clauses; /* List of problem constraints. alpar@9: (contains: clause*) */ alpar@9: vecp learnts; /* List of learnt clauses. alpar@9: (contains: clause*) */ alpar@9: alpar@9: /* activities */ alpar@9: double var_inc; /* Amount to bump next variable with. */ alpar@9: double var_decay; /* INVERSE decay factor for variable alpar@9: activity: stores 1/decay. */ alpar@9: float cla_inc; /* Amount to bump next clause with. */ alpar@9: float cla_decay; /* INVERSE decay factor for clause alpar@9: activity: stores 1/decay. */ alpar@9: alpar@9: vecp* wlists; alpar@9: double* activity; /* A heuristic measurement of the activity alpar@9: of a variable. */ alpar@9: lbool* assigns; /* Current values of variables. */ alpar@9: int* orderpos; /* Index in variable order. */ alpar@9: clause** reasons; alpar@9: int* levels; alpar@9: lit* trail; alpar@9: alpar@9: clause* binary; /* A temporary binary clause */ alpar@9: lbool* tags; alpar@9: veci tagged; /* (contains: var) */ alpar@9: veci stack; /* (contains: var) */ alpar@9: alpar@9: veci order; /* Variable order. (heap) (contains: var) */ alpar@9: veci trail_lim; /* Separator indices for different decision alpar@9: levels in 'trail'. (contains: int) */ alpar@9: veci model; /* If problem is solved, this vector alpar@9: contains the model (contains: lbool). */ alpar@9: alpar@9: int root_level; /* Level of first proper decision. */ alpar@9: int simpdb_assigns;/* Number of top-level assignments at last alpar@9: 'simplifyDB()'. */ alpar@9: int simpdb_props; /* Number of propagations before next alpar@9: 'simplifyDB()'. */ alpar@9: double random_seed; alpar@9: double progress_estimate; alpar@9: int verbosity; /* Verbosity level. alpar@9: 0=silent, alpar@9: 1=some progress report, alpar@9: 2=everything */ alpar@9: alpar@9: stats stats; alpar@9: } solver; alpar@9: alpar@9: /*====================================================================*/ alpar@9: /* Public interface: */ alpar@9: alpar@9: #if 1 /* by mao; to keep namespace clean */ alpar@9: #define solver_new _glp_minisat_new alpar@9: #define solver_delete _glp_minisat_delete alpar@9: #define solver_addclause _glp_minisat_addclause alpar@9: #define solver_simplify _glp_minisat_simplify alpar@9: #define solver_solve _glp_minisat_solve alpar@9: #define solver_nvars _glp_minisat_nvars alpar@9: #define solver_nclauses _glp_minisat_nclauses alpar@9: #define solver_nconflicts _glp_minisat_nconflicts alpar@9: #define solver_setnvars _glp_minisat_setnvars alpar@9: #define solver_propagate _glp_minisat_propagate alpar@9: #define solver_reducedb _glp_minisat_reducedb alpar@9: #endif alpar@9: alpar@9: solver* solver_new(void); alpar@9: void solver_delete(solver* s); alpar@9: alpar@9: bool solver_addclause(solver* s, lit* begin, lit* end); alpar@9: bool solver_simplify(solver* s); alpar@9: bool solver_solve(solver* s, lit* begin, lit* end); alpar@9: alpar@9: int solver_nvars(solver* s); alpar@9: int solver_nclauses(solver* s); alpar@9: int solver_nconflicts(solver* s); alpar@9: alpar@9: void solver_setnvars(solver* s,int n); alpar@9: alpar@9: #endif alpar@9: alpar@9: /* eof */