ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
SimpSolver.h
Go to the documentation of this file.
1/************************************************************************************[SimpSolver.h]
2Copyright (c) 2006, Niklas Een, Niklas Sorensson
3Copyright (c) 2007-2010, Niklas Sorensson
4
5Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
6associated documentation files (the "Software"), to deal in the Software without restriction,
7including without limitation the rights to use, copy, modify, merge, publish, distribute,
8sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
9furnished to do so, subject to the following conditions:
10
11The above copyright notice and this permission notice shall be included in all copies or
12substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
15NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
18OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19**************************************************************************************************/
20
21#ifndef Glucose_SimpSolver_h
22#define Glucose_SimpSolver_h
23
24#include "sat/glucose/Queue.h"
25#include "sat/glucose/Solver.h"
26
28
29namespace Gluco {
30
31//=================================================================================================
32
33
34class SimpSolver : public Solver {
35 public:
36 // Constructor/Destructor:
37 //
38 SimpSolver();
40
41 // Problem specification:
42 //
43 Var newVar (bool polarity = true, bool dvar = true);
44 void addVar (Var v);
45 bool addClause (const vec<Lit>& ps);
46 bool addEmptyClause(); // Add the empty clause to the solver.
47 bool addClause (Lit p); // Add a unit clause to the solver.
48 bool addClause (Lit p, Lit q); // Add a binary clause to the solver.
49 bool addClause (Lit p, Lit q, Lit r); // Add a ternary clause to the solver.
50 bool addClause_( vec<Lit>& ps);
51 bool substitute(Var v, Lit x); // Replace all occurences of v with x (may cause a contradiction).
52
53 // Variable mode:
54 //
55 void setFrozen (Var v, bool b); // If a variable is frozen it will not be eliminated.
56 bool isEliminated(Var v) const;
57
58 // Solving:
59 //
60 bool solve (const vec<Lit>& assumps, bool do_simp = true, bool turn_off_simp = false);
61 lbool solveLimited(const vec<Lit>& assumps, bool do_simp = true, bool turn_off_simp = false);
62 bool solve ( bool do_simp = true, bool turn_off_simp = false);
63 bool solve (Lit p , bool do_simp = true, bool turn_off_simp = false);
64 bool solve (Lit p, Lit q, bool do_simp = true, bool turn_off_simp = false);
65 bool solve (Lit p, Lit q, Lit r, bool do_simp = true, bool turn_off_simp = false);
66 bool eliminate (bool turn_off_elim = false); // Perform variable elimination based simplification.
67
68 // Memory managment:
69 //
70 virtual void reset();
71 virtual void garbageCollect();
72
73
74 // Generate a (possibly simplified) DIMACS file:
75 //
76#if 0
77 void toDimacs (const char* file, const vec<Lit>& assumps);
78 void toDimacs (const char* file);
79 void toDimacs (const char* file, Lit p);
80 void toDimacs (const char* file, Lit p, Lit q);
81 void toDimacs (const char* file, Lit p, Lit q, Lit r);
82#endif
83
84 // Mode of operation:
85 //
87 int grow; // Allow a variable elimination step to grow by a number of clauses (default to zero).
88 int clause_lim; // Variables are not eliminated if it produces a resolvent with a length above this limit.
89 // -1 means no limit.
90 int subsumption_lim; // Do not check if subsumption against a clause larger than this. -1 means no limit.
91 double simp_garbage_frac; // A different limit for when to issue a GC during simplification (Also see 'garbage_frac').
92
93 bool use_asymm; // Shrink clauses by asymmetric branching.
94 bool use_rcheck; // Check if a clause is already implied. Prett costly, and subsumes subsumptions :)
95 bool use_elim; // Perform variable elimination.
96
97 // Statistics:
98 //
99 int merges;
103
104 protected:
105
106 // Helper structures:
107 //
108 struct ElimLt {
110 explicit ElimLt(const vec<int>& no) : n_occ(no) {}
111
112 // TODO: are 64-bit operations here noticably bad on 32-bit platforms? Could use a saturating
113 // 32-bit implementation instead then, but this will have to do for now.
114 uint64_t cost (Var x) const { return (uint64_t)n_occ[toInt(mkLit(x))] * (uint64_t)n_occ[toInt(~mkLit(x))]; }
115 bool operator()(Var x, Var y) const { return cost(x) < cost(y); }
116
117 // TODO: investigate this order alternative more.
118 // bool operator()(Var x, Var y) const {
119 // int c_x = cost(x);
120 // int c_y = cost(y);
121 // return c_x < c_y || c_x == c_y && x < y; }
122 };
123
126 explicit ClauseDeleted(const ClauseAllocator& _ca) : ca(_ca) {}
127 bool operator()(const CRef& cr) const { return ca[cr].mark() == 1; } };
128
129 // Solver state:
130 //
144
145 // Temporaries:
146 //
148
149 // Main internal methods:
150 //
151 lbool solve_ (bool do_simp = true, bool turn_off_simp = false);
152 bool asymm (Var v, CRef cr);
153 bool asymmVar (Var v);
154 void updateElimHeap (Var v);
155 void gatherTouchedClauses ();
156 bool merge (const Clause& _ps, const Clause& _qs, Var v, vec<Lit>& out_clause);
157 bool merge (const Clause& _ps, const Clause& _qs, Var v, int& size);
158 bool backwardSubsumptionCheck (bool verbose = false);
159 bool eliminateVar (Var v);
160 void extendModel ();
161
162 void removeClause (CRef cr);
163 bool strengthenClause (CRef cr, Lit l);
164 void cleanUpClauses ();
165 bool implied (const vec<Lit>& c);
166 void relocAll (ClauseAllocator& to);
167};
168
169
170//=================================================================================================
171// Implementation of inline methods:
172
173
174//inline bool SimpSolver::isEliminated (Var v) const { return eliminated[v]; }
175inline bool SimpSolver::isEliminated (Var v) const { return eliminated.size() > 0 ? eliminated[v] != 0 : 0; }
178 // if (!frozen[v] && !isEliminated(v) && value(v) == l_Undef)
179 if (elim_heap.inHeap(v) || (!frozen[v] && !isEliminated(v) && value(v) == l_Undef))
180 elim_heap.update(v); }
181
182
183inline bool SimpSolver::addClause (const vec<Lit>& ps) { ps.copyTo(add_tmp); return addClause_(add_tmp); }
184inline bool SimpSolver::addEmptyClause() { add_tmp.clear(); return addClause_(add_tmp); }
185inline bool SimpSolver::addClause (Lit p) { add_tmp.clear(); add_tmp.push(p); return addClause_(add_tmp); }
186inline bool SimpSolver::addClause (Lit p, Lit q) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); return addClause_(add_tmp); }
187inline bool SimpSolver::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); }
188inline void SimpSolver::setFrozen (Var v, bool b) { frozen[v] = (char)b; if (use_simplification && !b) { updateElimHeap(v); } }
189
190inline bool SimpSolver::solve ( bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); return solve_(do_simp, turn_off_simp) == l_True; }
191inline bool SimpSolver::solve (Lit p , bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); return solve_(do_simp, turn_off_simp) == l_True; }
192inline bool SimpSolver::solve (Lit p, Lit q, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); return solve_(do_simp, turn_off_simp) == l_True; }
193inline bool SimpSolver::solve (Lit p, Lit q, Lit r, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); assumptions.push(r); return solve_(do_simp, turn_off_simp) == l_True; }
194inline bool SimpSolver::solve (const vec<Lit>& assumps, bool do_simp, bool turn_off_simp){
195 budgetOff(); assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp) == l_True; }
196
197inline lbool SimpSolver::solveLimited (const vec<Lit>& assumps, bool do_simp, bool turn_off_simp){
198 assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp); }
199
200inline void SimpSolver::addVar(Var v) { while (v >= nVars()) newVar(); }
201
202//=================================================================================================
203}
204
206
207#endif
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
#define l_True
Definition bmcBmcS.c:35
#define l_Undef
Definition bmcBmcS.c:34
ABC_NAMESPACE_IMPL_START typedef signed char value
virtual void reset()
Heap< ElimLt > elim_heap
Definition SimpSolver.h:138
void updateElimHeap(Var v)
Definition SimpSolver.h:176
bool addClause(const vec< Lit > &ps)
Definition SimpSolver.h:183
bool substitute(Var v, Lit x)
void removeClause(CRef cr)
double simp_garbage_frac
Definition SimpSolver.h:91
vec< char > frozen
Definition SimpSolver.h:140
lbool solveLimited(const vec< Lit > &assumps, bool do_simp=true, bool turn_off_simp=false)
Definition SimpSolver.h:197
void setFrozen(Var v, bool b)
Definition SimpSolver.h:188
bool implied(const vec< Lit > &c)
Queue< CRef > subsumption_queue
Definition SimpSolver.h:139
bool eliminate(bool turn_off_elim=false)
bool strengthenClause(CRef cr, Lit l)
bool eliminateVar(Var v)
Var newVar(bool polarity=true, bool dvar=true)
bool asymmVar(Var v)
bool asymm(Var v, CRef cr)
bool merge(const Clause &_ps, const Clause &_qs, Var v, vec< Lit > &out_clause)
vec< char > touched
Definition SimpSolver.h:134
bool addClause_(vec< Lit > &ps)
bool isEliminated(Var v) const
Definition SimpSolver.h:175
vec< char > eliminated
Definition SimpSolver.h:141
virtual void garbageCollect()
OccLists< Var, vec< CRef >, ClauseDeleted > occurs
Definition SimpSolver.h:136
void addVar(Var v)
Definition SimpSolver.h:200
bool backwardSubsumptionCheck(bool verbose=false)
vec< int > n_occ
Definition SimpSolver.h:137
void gatherTouchedClauses()
void relocAll(ClauseAllocator &to)
vec< uint32_t > elimclauses
Definition SimpSolver.h:133
void toDimacs(FILE *f, const vec< Lit > &assumps)
Definition Glucose.cpp:1341
vec< Lit > assumptions
Definition Solver.h:250
vec< Lit > add_tmp
Definition Solver.h:276
bool solve()
Definition Solver.h:451
vec< char > polarity
Definition Solver.h:241
int nVars() const
Definition Solver.h:426
lbool solve_()
Definition Glucose.cpp:1209
void budgetOff()
Definition Solver.h:442
void copyTo(vec< T > &copy) const
Definition Vec.h:92
Cube * p
Definition exorList.c:222
Definition Alg.h:28
int toInt(Var v)
Definition SolverTypes.h:74
RegionAllocator< uint32_t >::Ref CRef
int Var
Definition SolverTypes.h:52
Lit mkLit(Var var, bool sign=false)
Definition SolverTypes.h:67
const ClauseAllocator & ca
Definition SimpSolver.h:125
bool operator()(const CRef &cr) const
Definition SimpSolver.h:127
ClauseDeleted(const ClauseAllocator &_ca)
Definition SimpSolver.h:126
const vec< int > & n_occ
Definition SimpSolver.h:109
uint64_t cost(Var x) const
Definition SimpSolver.h:114
bool operator()(Var x, Var y) const
Definition SimpSolver.h:115
ElimLt(const vec< int > &no)
Definition SimpSolver.h:110
Definition file.h:23
#define assert(ex)
Definition util_old.h:213