<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>CVC3: minisat_solver.cpp Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.4 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">CVC3 <span id="projectnumber">2.4.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div id="navrow2" class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> <div class="header"> <div class="headertitle"> <div class="title">minisat_solver.cpp</div> </div> </div> <div class="contents"> <a href="minisat__solver_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*****************************************************************************/</span><span class="comment"></span> <a name="l00002"></a>00002 <span class="comment">/*!</span> <a name="l00003"></a>00003 <span class="comment"> *\file minisat_solver.cpp</span> <a name="l00004"></a>00004 <span class="comment"> *\brief Adaptation of MiniSat to DPLL(T)</span> <a name="l00005"></a>00005 <span class="comment"> *</span> <a name="l00006"></a>00006 <span class="comment"> * Author: Alexander Fuchs</span> <a name="l00007"></a>00007 <span class="comment"> *</span> <a name="l00008"></a>00008 <span class="comment"> * Created: Fri Sep 08 11:04:00 2006</span> <a name="l00009"></a>00009 <span class="comment"> *</span> <a name="l00010"></a>00010 <span class="comment"> * <hr></span> <a name="l00011"></a>00011 <span class="comment"> *</span> <a name="l00012"></a>00012 <span class="comment"> * License to use, copy, modify, sell and/or distribute this software</span> <a name="l00013"></a>00013 <span class="comment"> * and its documentation for any purpose is hereby granted without</span> <a name="l00014"></a>00014 <span class="comment"> * royalty, subject to the terms and conditions defined in the \ref</span> <a name="l00015"></a>00015 <span class="comment"> * LICENSE file provided with this distribution.</span> <a name="l00016"></a>00016 <span class="comment"> * </span> <a name="l00017"></a>00017 <span class="comment"> * <hr></span> <a name="l00018"></a>00018 <span class="comment"> */</span> <a name="l00019"></a>00019 <span class="comment">/*****************************************************************************/</span> <a name="l00020"></a>00020 <a name="l00021"></a>00021 <span class="comment">/****************************************************************************************[Solver.C]</span> <a name="l00022"></a>00022 <span class="comment">MiniSat -- Copyright (c) 2003-2005, Niklas Een, Niklas Sorensson</span> <a name="l00023"></a>00023 <span class="comment"></span> <a name="l00024"></a>00024 <span class="comment">Permission is hereby granted, free of charge, to any person obtaining a copy of this software and</span> <a name="l00025"></a>00025 <span class="comment">associated documentation files (the "Software"), to deal in the Software without restriction,</span> <a name="l00026"></a>00026 <span class="comment">including without limitation the rights to use, copy, modify, merge, publish, distribute,</span> <a name="l00027"></a>00027 <span class="comment">sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is</span> <a name="l00028"></a>00028 <span class="comment">furnished to do so, subject to the following conditions:</span> <a name="l00029"></a>00029 <span class="comment"></span> <a name="l00030"></a>00030 <span class="comment">The above copyright notice and this permission notice shall be included in all copies or</span> <a name="l00031"></a>00031 <span class="comment">substantial portions of the Software.</span> <a name="l00032"></a>00032 <span class="comment"></span> <a name="l00033"></a>00033 <span class="comment">THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT</span> <a name="l00034"></a>00034 <span class="comment">NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</span> <a name="l00035"></a>00035 <span class="comment">NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,</span> <a name="l00036"></a>00036 <span class="comment">DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT</span> <a name="l00037"></a>00037 <span class="comment">OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span> <a name="l00038"></a>00038 <span class="comment">**************************************************************************************************/</span> <a name="l00039"></a>00039 <a name="l00040"></a>00040 <span class="preprocessor">#include "<a class="code" href="minisat__solver_8h.html" title="Adaptation of MiniSat to DPLL(T)">minisat_solver.h</a>"</span> <a name="l00041"></a>00041 <span class="preprocessor">#include "<a class="code" href="minisat__types_8h.html" title="MiniSat internal types.">minisat_types.h</a>"</span> <a name="l00042"></a>00042 <span class="preprocessor">#include <cmath></span> <a name="l00043"></a>00043 <span class="preprocessor">#include <iostream></span> <a name="l00044"></a>00044 <span class="preprocessor">#include <algorithm></span> <a name="l00045"></a>00045 <a name="l00046"></a>00046 <span class="keyword">using namespace </span>std; <a name="l00047"></a>00047 <span class="keyword">using namespace </span>MiniSat; <a name="l00048"></a>00048 <a name="l00049"></a>00049 <span class="comment"></span> <a name="l00050"></a>00050 <span class="comment">///</span> <a name="l00051"></a>00051 <span class="comment">/// Constants</span> <a name="l00052"></a>00052 <span class="comment">///</span> <a name="l00053"></a>00053 <span class="comment"></span> <a name="l00054"></a>00054 <a name="l00055"></a>00055 <span class="comment">// if true do propositional propagation to exhaustion</span> <a name="l00056"></a>00056 <span class="comment">// before asserting propagated literals to the theories.</span> <a name="l00057"></a>00057 <span class="comment">// that is, a SAT propagation is not immediately asserted to the theories as well,</span> <a name="l00058"></a>00058 <span class="comment">// but only when the SAT core has to do a decision.</span> <a name="l00059"></a>00059 <span class="comment">//</span> <a name="l00060"></a>00060 <span class="comment">// this way a branch may be closed propositionally only,</span> <a name="l00061"></a>00061 <span class="comment">// which avoids work on the theory part,</span> <a name="l00062"></a>00062 <span class="comment">// and introduction of new theory clauses and implications.</span> <a name="l00063"></a><a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">00063</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">defer_theory_propagation</a> = <span class="keyword">true</span>; <a name="l00064"></a>00064 <a name="l00065"></a>00065 <span class="comment"></span> <a name="l00066"></a>00066 <span class="comment">/// theory implications</span> <a name="l00067"></a>00067 <span class="comment"></span> <a name="l00068"></a>00068 <span class="comment">// retrieve explanations of theory implications eagerly</span> <a name="l00069"></a>00069 <span class="comment">// and store them right away as clauses</span> <a name="l00070"></a><a class="code" href="minisat__solver_8cpp.html#aa44f156407ac4e41255a1f3bc645f6e2">00070</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#aa44f156407ac4e41255a1f3bc645f6e2" title="theory implications">eager_explanation</a> = <span class="keyword">true</span>; <a name="l00071"></a>00071 <a name="l00072"></a>00072 <span class="comment">// if explanations for theory implications are retrieved lazily</span> <a name="l00073"></a>00073 <span class="comment">// during regressions, should they be added as clauses?</span> <a name="l00074"></a>00074 <span class="comment">//</span> <a name="l00075"></a>00075 <span class="comment">// only used if eager_explanation is false.</span> <a name="l00076"></a><a class="code" href="minisat__solver_8cpp.html#a9e2daa67569a36e7548c8d87faecde63">00076</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a9e2daa67569a36e7548c8d87faecde63">keep_lazy_explanation</a> = <span class="keyword">true</span>; <a name="l00077"></a>00077 <a name="l00078"></a>00078 <span class="comment"></span> <a name="l00079"></a>00079 <span class="comment">/// pushes</span> <a name="l00080"></a>00080 <span class="comment"></span> <a name="l00081"></a>00081 <span class="comment">// determines which theory operations are done,</span> <a name="l00082"></a>00082 <span class="comment">// when unit propagation is done to exhaustion at the root level</span> <a name="l00083"></a>00083 <span class="comment">// because a push is done.</span> <a name="l00084"></a>00084 <a name="l00085"></a>00085 <span class="comment">// if true then assert propositional propagations to theories as well</span> <a name="l00086"></a>00086 <span class="comment">// (this is done anyway when defer_theory_propagation is false)</span> <a name="l00087"></a><a class="code" href="minisat__solver_8cpp.html#a67517b99ec3ab97998c5d8c896145a52">00087</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a67517b99ec3ab97998c5d8c896145a52" title="pushes">push_theory_propagation</a> = <span class="keyword">true</span>; <a name="l00088"></a>00088 <a name="l00089"></a>00089 <span class="comment">// if push_theory_propagation is also true,</span> <a name="l00090"></a>00090 <span class="comment">// retrieve and propagate theory implications as well</span> <a name="l00091"></a><a class="code" href="minisat__solver_8cpp.html#aed1d0bd28881a467f60fc68355821894">00091</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#aed1d0bd28881a467f60fc68355821894">push_theory_implication</a> = <span class="keyword">true</span>; <a name="l00092"></a>00092 <a name="l00093"></a>00093 <span class="comment">// if push_theory_propagation is also true,</span> <a name="l00094"></a>00094 <span class="comment">// retrieve and add theory clauses as well (and handle their propagations)</span> <a name="l00095"></a><a class="code" href="minisat__solver_8cpp.html#a80083d75f5d5e9233b5696497a549713">00095</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a80083d75f5d5e9233b5696497a549713">push_theory_clause</a> = <span class="keyword">true</span>; <a name="l00096"></a>00096 <a name="l00097"></a>00097 <a name="l00098"></a>00098 <a name="l00099"></a>00099 <a name="l00100"></a>00100 <span class="comment">// the number of literals considered in propLookahead()</span> <a name="l00101"></a><a class="code" href="minisat__solver_8cpp.html#aa0fea054b893512d7bd35c129433ecf5">00101</a> <span class="keyword">const</span> <a class="code" href="namespaceHash.html#a34e07ea2356b048f9871d1cfdf478da6">vector<Var>::size_type</a> <a class="code" href="minisat__solver_8cpp.html#aa0fea054b893512d7bd35c129433ecf5">prop_lookahead</a> = 1; <a name="l00102"></a>00102 <a name="l00103"></a>00103 <a name="l00104"></a>00104 <span class="comment">// print the derivation</span> <a name="l00105"></a><a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">00105</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a> = <span class="keyword">false</span>; <a name="l00106"></a>00106 <span class="comment">//const bool protocol = true;</span> <a name="l00107"></a>00107 <a name="l00108"></a>00108 <a name="l00109"></a>00109 <a name="l00110"></a>00110 <a name="l00111"></a>00111 <span class="comment">// perform expensive assertion checks</span> <a name="l00112"></a><a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">00112</a> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">debug_full</a> = <span class="keyword">false</span>; <a name="l00113"></a>00113 <a name="l00114"></a>00114 <a name="l00115"></a>00115 <a name="l00116"></a>00116 <span class="comment"></span> <a name="l00117"></a>00117 <span class="comment">///</span> <a name="l00118"></a>00118 <span class="comment">/// conversions between MiniSat and CVC data types:</span> <a name="l00119"></a>00119 <span class="comment">///</span> <a name="l00120"></a>00120 <span class="comment"></span> <a name="l00121"></a><a class="code" href="namespaceMiniSat.html#ace6b835dfa37172fd8e8177fa6373c4b">00121</a> <span class="keywordtype">bool</span> <a class="code" href="namespaceMiniSat.html#a6d37e2f7d3903e1a85baf8f1e83eff78">MiniSat::cvcToMiniSat</a>(<span class="keyword">const</span> <a class="code" href="classSAT_1_1Clause.html">SAT::Clause</a>& clause, std::vector<Lit>& literals) { <a name="l00122"></a>00122 <span class="comment">// register all clause literals</span> <a name="l00123"></a>00123 <a class="code" href="classSAT_1_1Clause.html#af739bca890fe8219a7ebda3beefb0474">SAT::Clause::const_iterator</a> j, jend; <a name="l00124"></a>00124 <a name="l00125"></a>00125 <span class="keywordflow">for</span> (j = clause.<a class="code" href="classSAT_1_1Clause.html#a6d0f568c60e06a1c59c2bf37788ff778">begin</a>(), jend = clause.<a class="code" href="classSAT_1_1Clause.html#a38094b009b923d08ca9b1a8f517b591e">end</a>(); j != jend; ++j) { <a name="l00126"></a>00126 <span class="keyword">const</span> <a class="code" href="classSAT_1_1Lit.html">SAT::Lit</a>& literal = *j; <a name="l00127"></a>00127 <a name="l00128"></a>00128 <span class="comment">// simplify based on true/false literals</span> <a name="l00129"></a>00129 <span class="keywordflow">if</span> (literal.<a class="code" href="classSAT_1_1Lit.html#a770e1901858f699490f50e9d2ff1d070">isTrue</a>()) <a name="l00130"></a>00130 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00131"></a>00131 <a name="l00132"></a>00132 <span class="keywordflow">if</span> (!literal.<a class="code" href="classSAT_1_1Lit.html#ab866c8154de88e5285f166f53cdf2d33">isFalse</a>()) <a name="l00133"></a>00133 literals.push_back(<a class="code" href="namespaceMiniSat.html#a6d37e2f7d3903e1a85baf8f1e83eff78">cvcToMiniSat</a>(literal)); <a name="l00134"></a>00134 } <a name="l00135"></a>00135 <a name="l00136"></a>00136 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00137"></a>00137 } <a name="l00138"></a>00138 <a name="l00139"></a><a class="code" href="classMiniSat_1_1Solver.html#abbb1190222cc3ad99638caf6e86ee698">00139</a> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* <a class="code" href="namespaceMiniSat.html#a6d37e2f7d3903e1a85baf8f1e83eff78">Solver::cvcToMiniSat</a>(<span class="keyword">const</span> <a class="code" href="classSAT_1_1Clause.html">SAT::Clause</a>& clause, <span class="keywordtype">int</span> <span class="keywordtype">id</span>) { <a name="l00140"></a>00140 vector<MiniSat::Lit> literals; <a name="l00141"></a>00141 <span class="keywordflow">if</span> (<a class="code" href="namespaceMiniSat.html#a6d37e2f7d3903e1a85baf8f1e83eff78">MiniSat::cvcToMiniSat</a>(clause, literals)) { <a name="l00142"></a>00142 <span class="keywordflow">if</span> (getDerivation() != NULL) <a name="l00143"></a>00143 <span class="keywordflow">return</span> <a class="code" href="namespaceMiniSat.html#a9a3ff2cc55978ca3a973861cad2814e2">Clause_new</a>(literals, clause.<a class="code" href="classSAT_1_1Clause.html#aa4d692df8aaef4ea4c1c45af006c1301">getClauseTheorem</a>(), id); <a name="l00144"></a>00144 <span class="keywordflow">else</span> <a name="l00145"></a>00145 <span class="keywordflow">return</span> <a class="code" href="namespaceMiniSat.html#a9a3ff2cc55978ca3a973861cad2814e2">Clause_new</a>(literals, <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a>(), <span class="keywordtype">id</span>); <a name="l00146"></a>00146 } <a name="l00147"></a>00147 <span class="keywordflow">else</span> { <a name="l00148"></a>00148 <span class="keywordflow">return</span> NULL; <a name="l00149"></a>00149 } <a name="l00150"></a>00150 } <a name="l00151"></a>00151 <a name="l00152"></a>00152 <a name="l00153"></a>00153 <a name="l00154"></a>00154 <a name="l00155"></a>00155 <span class="comment"></span> <a name="l00156"></a>00156 <span class="comment">/// Initialization</span> <a name="l00157"></a>00157 <span class="comment"></span> <a name="l00158"></a><a class="code" href="classMiniSat_1_1Solver.html#ae192cadcb9b0cace709e816612b42f02">00158</a> Solver::Solver(<a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html">SAT::DPLLT::TheoryAPI</a>* theoryAPI, <a class="code" href="classSAT_1_1DPLLT_1_1Decider.html">SAT::DPLLT::Decider</a>* decider, <a name="l00159"></a>00159 <span class="keywordtype">bool</span> logDerivation) : <a name="l00160"></a>00160 d_inSearch(false), <a name="l00161"></a>00161 d_ok(true), <a name="l00162"></a>00162 d_conflict(NULL), <a name="l00163"></a>00163 d_qhead (0), <a name="l00164"></a>00164 d_thead (0), <a name="l00165"></a>00165 d_registeredVars (1), <a name="l00166"></a>00166 d_clauseIDCounter (3), <span class="comment">// -1 and -2 are used in Clause for special clauses,</span> <a name="l00167"></a>00167 <span class="comment">// and negative ids are in general used for theory clauses,</span> <a name="l00168"></a>00168 <span class="comment">// so avoid overlap by setting 3 as the possible first clause id.</span> <a name="l00169"></a>00169 d_popRequests (0), <a name="l00170"></a>00170 d_cla_inc (1), <a name="l00171"></a>00171 d_cla_decay (1), <a name="l00172"></a>00172 d_var_inc (1), <a name="l00173"></a>00173 d_var_decay (1), <a name="l00174"></a>00174 d_order (d_assigns, d_activity), <a name="l00175"></a>00175 d_simpDB_assigns (0), <a name="l00176"></a>00176 d_simpDB_props (0), <a name="l00177"></a>00177 d_simpRD_learnts (0), <a name="l00178"></a>00178 d_theoryAPI(theoryAPI), <a name="l00179"></a>00179 d_decider(decider), <a name="l00180"></a>00180 d_derivation(NULL), <a name="l00181"></a>00181 d_default_params(<a class="code" href="structMiniSat_1_1SearchParams.html">SearchParams</a>(0.95, 0.999, 0.02)), <a name="l00182"></a>00182 d_expensive_ccmin(true) <a name="l00183"></a>00183 { <a name="l00184"></a>00184 <span class="keywordflow">if</span> (logDerivation) <a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> = <span class="keyword">new</span> <a class="code" href="classMiniSat_1_1Derivation.html">Derivation</a>(); <a name="l00185"></a>00185 } <a name="l00186"></a>00186 <a name="l00187"></a>00187 <a name="l00188"></a>00188 <span class="comment">// add a lemma which has not been computed just now (see push(), createFrom()),</span> <a name="l00189"></a>00189 <span class="comment">// so it is not necessarily propagating</span> <a name="l00190"></a><a class="code" href="classMiniSat_1_1Solver.html#a2ba80609ff72dbd93ae116a25923808d">00190</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a2ba80609ff72dbd93ae116a25923808d">Solver::insertLemma</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* lemma, <span class="keywordtype">int</span> clauseID, <span class="keywordtype">int</span> pushID) { <a name="l00191"></a>00191 <span class="comment">// need to add lemmas manually,</span> <a name="l00192"></a>00192 <span class="comment">// as addClause/insertClause assume that the lemma has just been computed and is propagating,</span> <a name="l00193"></a>00193 <span class="comment">// and as we want to keep the activity.</span> <a name="l00194"></a>00194 vector<Lit> literals; <a name="l00195"></a>00195 lemma-><a class="code" href="classMiniSat_1_1Clause.html#acc411f48a92972844738dd3378be0dc8">toLit</a>(literals); <a name="l00196"></a>00196 <a name="l00197"></a>00197 <span class="comment">// If a lemma is based purely on theory lemmas (i.e. theory clauses),</span> <a name="l00198"></a>00198 <span class="comment">// then in backtracking those theory lemmas might be retracted,</span> <a name="l00199"></a>00199 <span class="comment">// and literals occurring in the lemma might not occur in any remaining clauses.</span> <a name="l00200"></a>00200 <span class="comment">// When creating a new solver based on an existing instance</span> <a name="l00201"></a>00201 <span class="comment">// (i.e. in continuing the search after finding a model),</span> <a name="l00202"></a>00202 <span class="comment">// then those literals have to be registered here.</span> <a name="l00203"></a>00203 <span class="keywordflow">for</span> (vector<Lit>::const_iterator i = literals.begin(); i != literals.end(); ++i) { <a name="l00204"></a>00204 <a class="code" href="classMiniSat_1_1Solver.html#a7a11f6c3676dd169d093a4e7c5af5299" title="Operations on clauses:">registerVar</a>(i->var()); <a name="l00205"></a>00205 } <a name="l00206"></a>00206 <a name="l00207"></a>00207 <span class="comment">// While lemma simplification might be nice to have,</span> <a name="l00208"></a>00208 <span class="comment">// this poses a problem with derivation recording,</span> <a name="l00209"></a>00209 <span class="comment">// as we would also have to modify the derivation of the original</span> <a name="l00210"></a>00210 <span class="comment">// lemma towards a derivation of the new lemma.</span> <a name="l00211"></a>00211 <span class="comment">// In the case of a new solver inheriting the lemmas of the previous solver </span> <a name="l00212"></a>00212 <span class="comment">// the lemma is registered for the first time in the derivation.</span> <a name="l00213"></a>00213 <span class="comment">// In the case where the lemma was kept over a push the old lemma</span> <a name="l00214"></a>00214 <span class="comment">// is registered with the derivation, but about to be removed from memory (xfree).</span> <a name="l00215"></a>00215 <span class="comment">// So the simplest thing is to just replace any previous registration of the</span> <a name="l00216"></a>00216 <span class="comment">// lemma with a new identical lemma, and not do any simplification at all.</span> <a name="l00217"></a>00217 <span class="comment">//if (!simplifyClause(literals, clauseID)) {</span> <a name="l00218"></a>00218 <span class="comment">// ensure that order is appropriate for watched literals</span> <a name="l00219"></a>00219 <a class="code" href="classMiniSat_1_1Solver.html#aa8b5dfa883cace427d4b8b89769ca6df">orderClause</a>(literals); <a name="l00220"></a>00220 <a name="l00221"></a>00221 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* newLemma = <a class="code" href="namespaceMiniSat.html#a2659fd436dc00aebee015ce18ae2c89a">Lemma_new</a>(literals, clauseID, pushID); <a name="l00222"></a>00222 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a86b49978f3ea0aa72cd4815e241ff7ad">registerClause</a>(newLemma); <a name="l00223"></a>00223 <a name="l00224"></a>00224 newLemma-><a class="code" href="classMiniSat_1_1Clause.html#a013f54f33ca6995dea2c116725d34258">setActivity</a>(lemma-><a class="code" href="classMiniSat_1_1Clause.html#af64021472c748c6adbfb88238cae5a9d">activity</a>()); <a name="l00225"></a>00225 <a name="l00226"></a>00226 <span class="comment">// add to watches and lemmas</span> <a name="l00227"></a>00227 <span class="keywordflow">if</span> (newLemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() >= 2) { <a name="l00228"></a>00228 <a class="code" href="classMiniSat_1_1Solver.html#af3891961fe824bc91b47b59ee1e4a90b">addWatch</a>(~(*newLemma)[0], newLemma); <a name="l00229"></a>00229 <a class="code" href="classMiniSat_1_1Solver.html#af3891961fe824bc91b47b59ee1e4a90b">addWatch</a>(~(*newLemma)[1], newLemma); <a name="l00230"></a>00230 } <a name="l00231"></a>00231 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.push_back(newLemma); <a name="l00232"></a>00232 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a> += newLemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00233"></a>00233 <a name="l00234"></a>00234 <span class="comment">// unsatisfiable</span> <a name="l00235"></a>00235 <span class="keywordflow">if</span> (newLemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 0 || <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*newLemma)[0]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00236"></a>00236 <a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">updateConflict</a>(newLemma); <a name="l00237"></a>00237 } <a name="l00238"></a>00238 <span class="comment">// propagate</span> <a name="l00239"></a>00239 <span class="keywordflow">if</span> (newLemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 1 || <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*newLemma)[1]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00240"></a>00240 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>((*newLemma)[0], <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>, newLemma)) { <a name="l00241"></a>00241 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"MiniSat::Solver::insertLemma: conflicting/implying lemma"</span>); <a name="l00242"></a>00242 } <a name="l00243"></a>00243 } <a name="l00244"></a>00244 <span class="comment">//}</span> <a name="l00245"></a>00245 } <a name="l00246"></a>00246 <a name="l00247"></a>00247 <a name="l00248"></a><a class="code" href="classMiniSat_1_1Solver.html#a7fce9c6a705405959f91d559a6e06ee4">00248</a> <a class="code" href="classMiniSat_1_1Solver.html">Solver</a>* <a class="code" href="classMiniSat_1_1Solver.html#a7fce9c6a705405959f91d559a6e06ee4">Solver::createFrom</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Solver.html">Solver</a>* oldSolver) { <a name="l00249"></a>00249 <a class="code" href="classMiniSat_1_1Solver.html">Solver</a>* solver = <span class="keyword">new</span> <a class="code" href="classMiniSat_1_1Solver.html#ae192cadcb9b0cace709e816612b42f02" title="Initialization.">MiniSat::Solver</a>(oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>, <a name="l00250"></a>00250 oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a>, oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL); <a name="l00251"></a>00251 <a name="l00252"></a>00252 <span class="comment">// reuse literal activity</span> <a name="l00253"></a>00253 <span class="comment">// assigning d_activity before the clauses are added</span> <a name="l00254"></a>00254 <span class="comment">// will automatically rebuild d_order in the right way.</span> <a name="l00255"></a>00255 solver-><a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a> = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a>; <a name="l00256"></a>00256 solver-><a class="code" href="classMiniSat_1_1Solver.html#aa9cba0f1df8f31b5ae94f2ce0ccb290f">d_var_inc</a> = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#aa9cba0f1df8f31b5ae94f2ce0ccb290f">d_var_inc</a>; <a name="l00257"></a>00257 solver-><a class="code" href="classMiniSat_1_1Solver.html#a0765ad8a98718bb5523e487e32d66ae1">d_activity</a> = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a0765ad8a98718bb5523e487e32d66ae1">d_activity</a>; <a name="l00258"></a>00258 <a name="l00259"></a>00259 <a name="l00260"></a>00260 <span class="comment">// build the current formula</span> <a name="l00261"></a>00261 <a name="l00262"></a>00262 <span class="comment">// add the formula and assignment from the previous solver</span> <a name="l00263"></a>00263 <span class="comment">// first assignment, as this contains only unit clauses, then clauses,</span> <a name="l00264"></a>00264 <span class="comment">// as these are immediately simplified by the assigned unit clauses</span> <a name="l00265"></a>00265 <a name="l00266"></a>00266 <span class="comment">// get the old assignment</span> <a name="l00267"></a>00267 <span class="keyword">const</span> vector<MiniSat::Lit>& trail = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a16a71aec47f38eed46547c52ca9b152b">getTrail</a>(); <a name="l00268"></a>00268 <span class="keywordflow">for</span> (vector<MiniSat::Lit>::const_iterator i = trail.begin(); i != trail.end(); ++i) { <a name="l00269"></a>00269 <span class="comment">//:TODO: use special clause as reason instead of NULL</span> <a name="l00270"></a>00270 solver-><a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(*i, <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a>()); <a name="l00271"></a>00271 } <a name="l00272"></a>00272 <a name="l00273"></a>00273 <span class="comment">// get the old clause set</span> <a name="l00274"></a>00274 <span class="keyword">const</span> vector<MiniSat::Clause*>& clauses = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#a70a7ffd14675ce9d3f1d445a79505278">getClauses</a>(); <a name="l00275"></a>00275 <span class="keywordflow">for</span> (vector<MiniSat::Clause*>::const_iterator i = clauses.begin(); i != clauses.end(); ++i) { <a name="l00276"></a>00276 solver-><a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(**i, <span class="keyword">false</span>); <a name="l00277"></a>00277 } <a name="l00278"></a>00278 <a name="l00279"></a>00279 <span class="comment">// get the old lemmas</span> <a name="l00280"></a>00280 <span class="keyword">const</span> vector<MiniSat::Clause*>& lemmas = oldSolver-><a class="code" href="classMiniSat_1_1Solver.html#aadbf5bfce16879745ac1fc7e5226957c">getLemmas</a>(); <a name="l00281"></a>00281 <span class="keywordflow">for</span> (vector<MiniSat::Clause*>::const_iterator i = lemmas.begin(); <a name="l00282"></a>00282 !solver-><a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && i != lemmas.end(); ++i) { <a name="l00283"></a>00283 <span class="comment">// can use clauseID for clause id as well as push id -</span> <a name="l00284"></a>00284 <span class="comment">// after all this is the root level, so all lemmas are ok in any push level anyway</span> <a name="l00285"></a>00285 <span class="keywordtype">int</span> clauseID = solver-><a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>(); <a name="l00286"></a>00286 solver-><a class="code" href="classMiniSat_1_1Solver.html#a2ba80609ff72dbd93ae116a25923808d">insertLemma</a>(*i, clauseID, clauseID); <a name="l00287"></a>00287 } <a name="l00288"></a>00288 <a name="l00289"></a>00289 <span class="keywordflow">return</span> solver; <a name="l00290"></a>00290 } <a name="l00291"></a>00291 <a name="l00292"></a><a class="code" href="classMiniSat_1_1Solver.html#aba52d3c92fafceb6fe39f937f2d73db3">00292</a> <a class="code" href="classMiniSat_1_1Solver.html#aba52d3c92fafceb6fe39f937f2d73db3">Solver::~Solver</a>() { <a name="l00293"></a>00293 <span class="keywordflow">for</span> (vector<Clause*>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.end(); ++i) <a name="l00294"></a>00294 <span class="keyword">remove</span>(*i, <span class="keyword">true</span>); <a name="l00295"></a>00295 <a name="l00296"></a>00296 <span class="keywordflow">for</span> (vector<Clause*>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.end(); ++i) <a name="l00297"></a>00297 <span class="keyword">remove</span>(*i, <span class="keyword">true</span>); <a name="l00298"></a>00298 <a name="l00299"></a>00299 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.empty()) { <a name="l00300"></a>00300 <a class="code" href="namespaceMiniSat.html#acbe7b3fac8ab3909327207b0fea1f4d8">xfree</a>(<a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.front()); <a name="l00301"></a>00301 <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.pop(); <a name="l00302"></a>00302 } <a name="l00303"></a>00303 <a name="l00304"></a>00304 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.empty()) { <a name="l00305"></a>00305 <a class="code" href="namespaceMiniSat.html#acbe7b3fac8ab3909327207b0fea1f4d8">xfree</a>(<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.top().second); <a name="l00306"></a>00306 <a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.pop(); <a name="l00307"></a>00307 } <a name="l00308"></a>00308 <a name="l00309"></a>00309 <span class="keyword">delete</span> <a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a>; <a name="l00310"></a>00310 } <a name="l00311"></a>00311 <a name="l00312"></a>00312 <a name="l00313"></a>00313 <a name="l00314"></a>00314 <span class="comment"></span> <a name="l00315"></a>00315 <span class="comment">///</span> <a name="l00316"></a>00316 <span class="comment">/// String representation</span> <a name="l00317"></a>00317 <span class="comment"></span><span class="comment">//</span> <a name="l00318"></a>00318 <a name="l00319"></a><a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c">00319</a> std::string <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">Solver::toString</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> literal, <span class="keywordtype">bool</span> showAssignment)<span class="keyword"> const </span>{ <a name="l00320"></a>00320 ostringstream buffer; <a name="l00321"></a>00321 buffer << literal.<a class="code" href="classMiniSat_1_1Lit.html#a13ff0ff47faf39d618cdcc075867e6f3">toString</a>(); <a name="l00322"></a>00322 <a name="l00323"></a>00323 <span class="keywordflow">if</span> (showAssignment) { <a name="l00324"></a>00324 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literal) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) <a name="l00325"></a>00325 buffer << <span class="stringliteral">"(+)"</span>; <a name="l00326"></a>00326 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literal) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) <a name="l00327"></a>00327 buffer << <span class="stringliteral">"(-)"</span>; <a name="l00328"></a>00328 } <a name="l00329"></a>00329 <a name="l00330"></a>00330 <span class="keywordflow">return</span> buffer.str(); <a name="l00331"></a>00331 } <a name="l00332"></a>00332 <a name="l00333"></a>00333 <a name="l00334"></a><a class="code" href="classMiniSat_1_1Solver.html#a1fb9f09c66fb11ee96a0761ee2869511">00334</a> std::string <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">Solver::toString</a>(<span class="keyword">const</span> std::vector<Lit>& clause, <span class="keywordtype">bool</span> showAssignment)<span class="keyword"> const </span>{ <a name="l00335"></a>00335 ostringstream buffer; <a name="l00336"></a>00336 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; j < clause.size(); ++j) { <a name="l00337"></a>00337 buffer << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause[j], showAssignment) << <span class="stringliteral">" "</span>; <a name="l00338"></a>00338 } <a name="l00339"></a>00339 buffer << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00340"></a>00340 <a name="l00341"></a>00341 <span class="keywordflow">return</span> buffer.str(); <a name="l00342"></a>00342 } <a name="l00343"></a>00343 <a name="l00344"></a><a class="code" href="classMiniSat_1_1Solver.html#ad18f5b06217e20ca14269eb41264be1f">00344</a> std::string <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">Solver::toString</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause, <span class="keywordtype">bool</span> showAssignment)<span class="keyword"> const </span>{ <a name="l00345"></a>00345 std::vector<Lit> literals; <a name="l00346"></a>00346 clause.<a class="code" href="classMiniSat_1_1Clause.html#acc411f48a92972844738dd3378be0dc8">toLit</a>(literals); <a name="l00347"></a>00347 <span class="keywordflow">return</span> <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(literals, showAssignment); <a name="l00348"></a>00348 } <a name="l00349"></a>00349 <a name="l00350"></a>00350 <a name="l00351"></a><a class="code" href="classMiniSat_1_1Solver.html#aac50fbefa27ff761747fe0873722f927">00351</a> std::vector<SAT::Lit> <a class="code" href="classMiniSat_1_1Solver.html#aac50fbefa27ff761747fe0873722f927">Solver::curAssigns</a>(){ <a name="l00352"></a>00352 vector<SAT::Lit> res; <a name="l00353"></a>00353 cout << <span class="stringliteral">"current Assignment: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00354"></a>00354 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); ++i) { <a name="l00355"></a>00355 res.push_back(<a class="code" href="namespaceMiniSat.html#a72756c106b9bd53cf77c2aab214e7cf5">miniSatToCVC</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i])); <a name="l00356"></a>00356 } <a name="l00357"></a>00357 <span class="keywordflow">return</span> res; <a name="l00358"></a>00358 } <a name="l00359"></a>00359 <a name="l00360"></a><a class="code" href="classMiniSat_1_1Solver.html#afb1410338334a3220d95ec28e5a68f71">00360</a> std::vector<std::vector<SAT::Lit> > <a class="code" href="classMiniSat_1_1Solver.html#afb1410338334a3220d95ec28e5a68f71">Solver::curClauses</a>(){ <a name="l00361"></a>00361 std::vector<std::vector< SAT::Lit> > res; <a name="l00362"></a>00362 cout << <span class="stringliteral">"current Clauses: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00363"></a>00363 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l00364"></a>00364 std::vector<SAT::Lit> oneClause; <a name="l00365"></a>00365 oneClause.clear(); <a name="l00366"></a>00366 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < (*<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]).size(); ++j) { <a name="l00367"></a>00367 oneClause.push_back(<a class="code" href="namespaceMiniSat.html#a72756c106b9bd53cf77c2aab214e7cf5">miniSatToCVC</a>((*<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i])[j])); <a name="l00368"></a>00368 } <a name="l00369"></a>00369 res.push_back(oneClause); <a name="l00370"></a>00370 } <a name="l00371"></a>00371 <span class="keywordflow">return</span> res; <a name="l00372"></a>00372 } <a name="l00373"></a>00373 <a name="l00374"></a>00374 <a name="l00375"></a><a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">00375</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">Solver::printState</a>()<span class="keyword"> const </span>{ <a name="l00376"></a>00376 cout << <span class="stringliteral">"Lemmas: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00377"></a>00377 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); ++i) { <a name="l00378"></a>00378 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(*(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]), <span class="keyword">true</span>); <a name="l00379"></a>00379 } <a name="l00380"></a>00380 <a name="l00381"></a>00381 cout << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00382"></a>00382 <a name="l00383"></a>00383 cout << <span class="stringliteral">"Clauses: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00384"></a>00384 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l00385"></a>00385 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(*(<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]), <span class="keyword">true</span>); <a name="l00386"></a>00386 } <a name="l00387"></a>00387 <a name="l00388"></a>00388 cout << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00389"></a>00389 <a name="l00390"></a>00390 cout << <span class="stringliteral">"Assignment: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00391"></a>00391 <span class="comment">// for (size_type i = 0; i < d_qhead; ++i) {</span> <a name="l00392"></a>00392 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); ++i) { <a name="l00393"></a>00393 <span class="keywordtype">string</span> split = <span class="stringliteral">""</span>; <a name="l00394"></a>00394 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i].var()) == <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>()) { <a name="l00395"></a>00395 split = <span class="stringliteral">"(S)"</span>; <a name="l00396"></a>00396 } <a name="l00397"></a>00397 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i], <span class="keyword">false</span>) << split << <span class="stringliteral">" "</span>; <a name="l00398"></a>00398 } <a name="l00399"></a>00399 cout << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00400"></a>00400 } <a name="l00401"></a>00401 <a name="l00402"></a>00402 <a name="l00403"></a>00403 <a name="l00404"></a>00404 <a name="l00405"></a><a class="code" href="classMiniSat_1_1Solver.html#ac3d7b1cc4327878d22b91d105ea32409">00405</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#ac3d7b1cc4327878d22b91d105ea32409">Solver::printDIMACS</a>()<span class="keyword"> const </span>{ <a name="l00406"></a>00406 <span class="keywordtype">int</span> max_id = <a class="code" href="classMiniSat_1_1Solver.html#a679fa13af0d75beca98981dc40f3f2a2">nVars</a>(); <a name="l00407"></a>00407 <span class="keywordtype">int</span> num_clauses = <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size() + <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size();<span class="comment">// + learnts.size() ;</span> <a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="comment">// header</span> <a name="l00410"></a>00410 cout << <span class="stringliteral">"c minisat test"</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00411"></a>00411 cout << <span class="stringliteral">"p cnf "</span> << max_id << <span class="stringliteral">" "</span> << num_clauses << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00412"></a>00412 <a name="l00413"></a>00413 <span class="comment">// clauses</span> <a name="l00414"></a>00414 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l00415"></a>00415 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause = *<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]; <a name="l00416"></a>00416 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++j) { <a name="l00417"></a>00417 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = clause[j]; <a name="l00418"></a>00418 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) << <span class="stringliteral">" "</span>; <a name="l00419"></a>00419 } <a name="l00420"></a>00420 cout << <span class="stringliteral">"0"</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00421"></a>00421 } <a name="l00422"></a>00422 <a name="l00423"></a>00423 <span class="comment">// lemmas</span> <a name="l00424"></a>00424 <span class="comment">//for (int i = 0; i < learnts.size(); ++i) {</span> <a name="l00425"></a>00425 <span class="comment">// Clause& clause = *learnts[i];</span> <a name="l00426"></a>00426 <span class="comment">// for (int j = 0; j < clause.size(); ++j) {</span> <a name="l00427"></a>00427 <span class="comment">// Lit lit = clause[j];</span> <a name="l00428"></a>00428 <span class="comment">// cout << toString(lit, false) << " ";</span> <a name="l00429"></a>00429 <span class="comment">// }</span> <a name="l00430"></a>00430 <span class="comment">// cout << "0" << endl;</span> <a name="l00431"></a>00431 <span class="comment">//}</span> <a name="l00432"></a>00432 <a name="l00433"></a>00433 <span class="comment">// context</span> <a name="l00434"></a>00434 <span class="keywordflow">for</span> (vector<Lit>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.end(); ++i) { <a name="l00435"></a>00435 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit(*i); <a name="l00436"></a>00436 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()) == <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>()) <a name="l00437"></a>00437 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) << <span class="stringliteral">" 0"</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00438"></a>00438 <span class="keywordflow">else</span> <a name="l00439"></a>00439 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) << <span class="stringliteral">" 0"</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l00440"></a>00440 } <a name="l00441"></a>00441 } <a name="l00442"></a>00442 <a name="l00443"></a>00443 <a name="l00444"></a>00444 <span class="comment"></span> <a name="l00445"></a>00445 <span class="comment">/// Operations on clauses:</span> <a name="l00446"></a>00446 <span class="comment"></span> <a name="l00447"></a>00447 <a name="l00448"></a><a class="code" href="classMiniSat_1_1Solver.html#a31a0f344abc3fd65ee540f954b014f62">00448</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a31a0f344abc3fd65ee540f954b014f62" title="Operations on clauses:">Solver::isRegistered</a>(<a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> var) { <a name="l00449"></a>00449 <span class="keywordflow">for</span> (vector<<a class="code" href="classHash_1_1hash__set.html">Hash::hash_set<Var></a> >::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.begin(); <a name="l00450"></a>00450 i != <a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.end(); ++i) { <a name="l00451"></a>00451 <span class="keywordflow">if</span> ((*i).count(var) > 0) <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00452"></a>00452 } <a name="l00453"></a>00453 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00454"></a>00454 } <a name="l00455"></a>00455 <a name="l00456"></a>00456 <span class="comment">// registers var with given index to all data structures</span> <a name="l00457"></a><a class="code" href="classMiniSat_1_1Solver.html#a7a11f6c3676dd169d093a4e7c5af5299">00457</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a7a11f6c3676dd169d093a4e7c5af5299" title="Operations on clauses:">Solver::registerVar</a>(<a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> index) { <a name="l00458"></a>00458 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a31a0f344abc3fd65ee540f954b014f62" title="Operations on clauses:">isRegistered</a>(index)) <span class="keywordflow">return</span>; <a name="l00459"></a>00459 <a name="l00460"></a>00460 <span class="comment">// register variables to all data structures</span> <a name="l00461"></a>00461 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a679fa13af0d75beca98981dc40f3f2a2">nVars</a>() <= index) { <a name="l00462"></a>00462 <span class="comment">// 2 * index + 1 will be accessed for neg. literal,</span> <a name="l00463"></a>00463 <span class="comment">// so we need + 1 fiels for 0 field</span> <a name="l00464"></a>00464 <a class="code" href="classMiniSat_1_1Solver.html#a6a3e831d47c15ac42fe7a7002c276c0e" title="variable assignments, and pending propagations">d_watches</a> .resize(2 * index + 2); <a name="l00465"></a>00465 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a> .resize(index + 1, NULL); <a name="l00466"></a>00466 <a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a> .resize(index + 1, <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>)); <a name="l00467"></a>00467 <a class="code" href="classMiniSat_1_1Solver.html#a34c9afcb69ae37cebbf43a61505009b3">d_level</a> .resize(index + 1, -1); <a name="l00468"></a>00468 <a class="code" href="classMiniSat_1_1Solver.html#a0765ad8a98718bb5523e487e32d66ae1">d_activity</a> .resize(index + 1, 0); <a name="l00469"></a>00469 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>.resize(index + 1, 0); <a name="l00470"></a>00470 <a class="code" href="classMiniSat_1_1Solver.html#ab0b2d4e87d57046e30c2cb3554925e2b">d_pushIDs</a> .resize(index + 1, -1); <a name="l00471"></a>00471 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a31a1d57eabc2169a4a9fc1cf4c87a2a7">d_trail_pos</a>.resize(index + 1, <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.max_size()); <a name="l00472"></a>00472 } <a name="l00473"></a>00473 <a name="l00474"></a>00474 <span class="comment">// register with internal variable selection heuristics</span> <a name="l00475"></a>00475 <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a> .<a class="code" href="classMiniSat_1_1VarOrder.html#abbbb3b10b818db613dc1c9b9d18883d5">newVar</a>(index); <a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="comment">// marks as registered</span> <a name="l00478"></a>00478 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.empty(), <span class="stringliteral">"MiniSat::Solver::registerVar: d_registeredVars is empty"</span>); <a name="l00479"></a>00479 <a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.back().insert(index); <a name="l00480"></a>00480 } <a name="l00481"></a>00481 <a name="l00482"></a><a class="code" href="classMiniSat_1_1Solver.html#af3e9229206719e24e2a951be84c33a42">00482</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">Solver::addClause</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p, <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a> theorem) { <a name="l00483"></a>00483 vector<Lit> literals; <a name="l00484"></a>00484 literals.push_back(p); <a name="l00485"></a>00485 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(literals, theorem, <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>()); <a name="l00486"></a>00486 } <a name="l00487"></a>00487 <a name="l00488"></a><a class="code" href="classMiniSat_1_1Solver.html#a27b79e9b52cd9850e3e21cd2e2af9a04">00488</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">Solver::addClause</a>(<span class="keyword">const</span> <a class="code" href="classSAT_1_1Clause.html">SAT::Clause</a>& clause, <span class="keywordtype">bool</span> isTheoryClause) { <a name="l00489"></a>00489 vector<MiniSat::Lit> literals; <a name="l00490"></a>00490 <span class="keywordflow">if</span> (<a class="code" href="namespaceMiniSat.html#a6d37e2f7d3903e1a85baf8f1e83eff78">MiniSat::cvcToMiniSat</a>(clause, literals)) { <a name="l00491"></a>00491 <span class="keywordtype">int</span> clauseID = <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>(); <a name="l00492"></a>00492 <span class="comment">// theory clauses have negative ids:</span> <a name="l00493"></a>00493 <span class="keywordflow">if</span> (isTheoryClause) clauseID = -clauseID; <a name="l00494"></a>00494 <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a> theorem; <a name="l00495"></a>00495 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) { <a name="l00496"></a>00496 <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a8f1063fe441a90d388e56ca4002a87e1">registerInputClause</a>(clauseID); <a name="l00497"></a>00497 theorem = clause.<a class="code" href="classSAT_1_1Clause.html#aa4d692df8aaef4ea4c1c45af006c1301">getClauseTheorem</a>(); <a name="l00498"></a>00498 } <a name="l00499"></a>00499 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(literals, theorem, clauseID); <a name="l00500"></a>00500 } <a name="l00501"></a>00501 <span class="keywordflow">else</span> { <a name="l00502"></a>00502 <span class="comment">// ignore tautologies</span> <a name="l00503"></a>00503 <span class="keywordflow">return</span>; <a name="l00504"></a>00504 } <a name="l00505"></a>00505 } <a name="l00506"></a>00506 <a name="l00507"></a><a class="code" href="classMiniSat_1_1Solver.html#a03e24ae79c2068ab70b8c9633829777c">00507</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">Solver::addClause</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause, <span class="keywordtype">bool</span> keepClauseID) { <a name="l00508"></a>00508 vector<Lit> literals; <a name="l00509"></a>00509 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00510"></a>00510 literals.push_back(clause[i]); <a name="l00511"></a>00511 } <a name="l00512"></a>00512 <span class="keywordflow">if</span> (keepClauseID) { <a name="l00513"></a>00513 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(literals, clause.<a class="code" href="classMiniSat_1_1Clause.html#a16f3db82b77ca7e28752602bf1dc8177">getTheorem</a>(), clause.<a class="code" href="classMiniSat_1_1Clause.html#aeb8881da1f982f5bc58bac190ab2f2a4">id</a>()); <a name="l00514"></a>00514 } <span class="keywordflow">else</span> { <a name="l00515"></a>00515 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(literals, clause.<a class="code" href="classMiniSat_1_1Clause.html#a16f3db82b77ca7e28752602bf1dc8177">getTheorem</a>(), <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>()); <a name="l00516"></a>00516 } <a name="l00517"></a>00517 } <a name="l00518"></a>00518 <a name="l00519"></a>00519 <span class="comment">// Note:</span> <a name="l00520"></a>00520 <span class="comment">// tried to improve efficiency by asserting unit clauses first,</span> <a name="l00521"></a>00521 <span class="comment">// then clauses of size 2, and so on,</span> <a name="l00522"></a>00522 <span class="comment">// in the hope to immediately simplify or remove clauses.</span> <a name="l00523"></a>00523 <span class="comment">//</span> <a name="l00524"></a>00524 <span class="comment">// didn't work well with the theories, though,</span> <a name="l00525"></a>00525 <span class="comment">// lead to significant overhead, even when the derivation did not change much.</span> <a name="l00526"></a>00526 <span class="comment">// presumably as this interleaves clauses belonging to different 'groups',</span> <a name="l00527"></a>00527 <span class="comment">// which describe different concepts and are better handled in sequence</span> <a name="l00528"></a>00528 <span class="comment">// without interleaving them.</span> <a name="l00529"></a><a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">00529</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">Solver::addFormula</a>(<span class="keyword">const</span> <a class="code" href="classSAT_1_1CNF__Formula.html">SAT::CNF_Formula</a>& cnf, <span class="keywordtype">bool</span> isTheoryClause) { <a name="l00530"></a>00530 <a class="code" href="classSAT_1_1CNF__Formula.html#ac247d01a4cc1e5aab84294cb4c00ddbf">SAT::CNF_Formula::const_iterator</a> i, iend; <a name="l00531"></a>00531 <span class="comment">// for comparison: this is the order used by -sat sat</span> <a name="l00532"></a>00532 <span class="comment">//for (i = cnf.end()-1, iend = cnf.begin()-1; i != iend; --i) {</span> <a name="l00533"></a>00533 <span class="keywordflow">for</span> (i = cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a69dfc94796b23b6913c44a4d6d60f0d8">begin</a>(), iend = cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a6631cf3c5a6938f655360f7f63522b79">end</a>(); i != iend; i++) { <a name="l00534"></a>00534 <span class="comment">// if(i->d_reason.isNull()){</span> <a name="l00535"></a>00535 <span class="comment">// cout<<"found null thm in Solver::addFormula"<<endl<<flush;</span> <a name="l00536"></a>00536 <span class="comment">// }</span> <a name="l00537"></a>00537 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(*i, isTheoryClause); <a name="l00538"></a>00538 } <a name="l00539"></a>00539 } <a name="l00540"></a>00540 <a name="l00541"></a>00541 <a name="l00542"></a>00542 <a name="l00543"></a>00543 <span class="comment">// based on root level assignment removes all permanently falsified literals.</span> <a name="l00544"></a>00544 <span class="comment">// return true if clause is permanently satisfied.</span> <a name="l00545"></a><a class="code" href="classMiniSat_1_1Solver.html#abe63b049c7c54b810266baffb315c89b">00545</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#abe63b049c7c54b810266baffb315c89b">Solver::simplifyClause</a>(vector<Lit>& literals, <span class="keywordtype">int</span> clausePushID)<span class="keyword"> const </span>{ <a name="l00546"></a>00546 <span class="comment">// Check if clause is a tautology: p \/ -p \/ C:</span> <a name="l00547"></a>00547 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 1; i < literals.size(); i++){ <a name="l00548"></a>00548 <span class="keywordflow">if</span> (literals[i-1] == ~literals[i]){ <a name="l00549"></a>00549 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00550"></a>00550 } <a name="l00551"></a>00551 } <a name="l00552"></a>00552 <a name="l00553"></a>00553 <span class="comment">// Remove permanently satisfied clauses and falsified literals:</span> <a name="l00554"></a>00554 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i, j; <a name="l00555"></a>00555 <span class="keywordflow">for</span> (i = j = 0; i < literals.size(); i++) { <a name="l00556"></a>00556 <span class="keywordtype">bool</span> rootAssign = ( <a name="l00557"></a>00557 <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(literals[i]) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a> <a name="l00558"></a>00558 && <a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">isImpliedAt</a>(literals[i], clausePushID) ); <a name="l00559"></a>00559 <a name="l00560"></a>00560 <span class="keywordflow">if</span> (rootAssign && (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[i]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>)){ <a name="l00561"></a>00561 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00562"></a>00562 } <a name="l00563"></a>00563 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rootAssign && (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)){ <a name="l00564"></a>00564 <a name="l00565"></a>00565 ; <a name="l00566"></a>00566 } <a name="l00567"></a>00567 <span class="keywordflow">else</span>{ <a name="l00568"></a>00568 literals[j++] = literals[i]; <a name="l00569"></a>00569 } <a name="l00570"></a>00570 } <a name="l00571"></a>00571 literals.resize(j); <a name="l00572"></a>00572 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00573"></a>00573 } <a name="l00574"></a>00574 <a name="l00575"></a>00575 <a name="l00576"></a>00576 <a name="l00577"></a>00577 <span class="comment">// need the invariant, that</span> <a name="l00578"></a>00578 <span class="comment">// a) either two undefined literals are chosen as watched literals,</span> <a name="l00579"></a>00579 <span class="comment">// or b) that after backtracking either a) kicks in</span> <a name="l00580"></a>00580 <span class="comment">// or the clause is still satisfied/unit </span> <a name="l00581"></a>00581 <span class="comment">//</span> <a name="l00582"></a>00582 <span class="comment">// so either:</span> <a name="l00583"></a>00583 <span class="comment">// - find two literals which are undefined or satisfied</span> <a name="l00584"></a>00584 <span class="comment">// - or find a literal that is satisfied or unsatisfied</span> <a name="l00585"></a>00585 <span class="comment">// and the most recently falsified literal</span> <a name="l00586"></a>00586 <span class="comment">// - or the two most recently falsified literals</span> <a name="l00587"></a>00587 <span class="comment">// and put these two literals at the first two positions</span> <a name="l00588"></a><a class="code" href="classMiniSat_1_1Solver.html#aa8b5dfa883cace427d4b8b89769ca6df">00588</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#aa8b5dfa883cace427d4b8b89769ca6df">Solver::orderClause</a>(vector<Lit>& literals)<span class="keyword"> const </span>{ <a name="l00589"></a>00589 <span class="keywordflow">if</span> (literals.size() >= 2) { <a name="l00590"></a>00590 <span class="keywordtype">int</span> first = 0; <a name="l00591"></a>00591 <span class="keywordtype">int</span> levelFirst = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(literals[first]); <a name="l00592"></a>00592 <a class="code" href="classMiniSat_1_1lbool.html">lbool</a> valueFirst = <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[first]); <a name="l00593"></a>00593 <span class="keywordtype">int</span> second = 1; <a name="l00594"></a>00594 <span class="keywordtype">int</span> levelSecond = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(literals[second]); <a name="l00595"></a>00595 <a class="code" href="classMiniSat_1_1lbool.html">lbool</a> valueSecond = <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[second]); <a name="l00596"></a>00596 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 2; i < literals.size(); i++) { <a name="l00597"></a>00597 <span class="comment">// found two watched or satisfied literals</span> <a name="l00598"></a>00598 <span class="keywordflow">if</span> (!(valueFirst == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) && !(valueSecond == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) <a name="l00599"></a>00599 <span class="keywordflow">break</span>; <a name="l00600"></a>00600 <a name="l00601"></a>00601 <span class="comment">// check if new literal is better than the currently picked ones</span> <a name="l00602"></a>00602 <span class="keywordtype">int</span> levelNew = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(literals[i]); <a name="l00603"></a>00603 <a class="code" href="classMiniSat_1_1lbool.html">lbool</a> valueNew = <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[i]); <a name="l00604"></a>00604 <a name="l00605"></a>00605 <span class="comment">// usable, take instead of previously chosen literal</span> <a name="l00606"></a>00606 <span class="keywordflow">if</span> (!(valueNew == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) { <a name="l00607"></a>00607 <span class="keywordflow">if</span> ((valueFirst == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) && (valueSecond == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) { <a name="l00608"></a>00608 <span class="keywordflow">if</span> (levelFirst > levelSecond) { <a name="l00609"></a>00609 second = i; levelSecond = levelNew; valueSecond = valueNew; <a name="l00610"></a>00610 } <span class="keywordflow">else</span> { <a name="l00611"></a>00611 first = i; levelFirst = levelNew; valueFirst = valueNew; <a name="l00612"></a>00612 } <a name="l00613"></a>00613 } <a name="l00614"></a>00614 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (valueFirst == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00615"></a>00615 first = i; levelFirst = levelNew; valueFirst = valueNew; <a name="l00616"></a>00616 } <a name="l00617"></a>00617 <span class="keywordflow">else</span> { <a name="l00618"></a>00618 second = i; levelSecond = levelNew; valueSecond = valueNew; <a name="l00619"></a>00619 } <a name="l00620"></a>00620 } <a name="l00621"></a>00621 <span class="comment">// check if new pick was falsified more recently than the others</span> <a name="l00622"></a>00622 <span class="keywordflow">else</span> { <a name="l00623"></a>00623 <span class="keywordflow">if</span> ((valueFirst == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) && (valueSecond == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) { <a name="l00624"></a>00624 <span class="keywordflow">if</span> ((levelNew > levelFirst) && (levelNew > levelSecond)) { <a name="l00625"></a>00625 <span class="keywordflow">if</span> (levelSecond > levelFirst) { <a name="l00626"></a>00626 first = i; levelFirst = levelNew; valueFirst = valueNew; <a name="l00627"></a>00627 } <a name="l00628"></a>00628 <span class="keywordflow">else</span> { <a name="l00629"></a>00629 second = i; levelSecond = levelNew; valueSecond = valueNew; <a name="l00630"></a>00630 } <a name="l00631"></a>00631 } <a name="l00632"></a>00632 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (levelNew > levelFirst) { <a name="l00633"></a>00633 first = i; levelFirst = levelNew; valueFirst = valueNew; <a name="l00634"></a>00634 } <a name="l00635"></a>00635 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (levelNew > levelSecond) { <a name="l00636"></a>00636 second = i; levelSecond = levelNew; valueSecond = valueNew; <a name="l00637"></a>00637 } <a name="l00638"></a>00638 } <a name="l00639"></a>00639 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (valueFirst == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00640"></a>00640 <span class="keywordflow">if</span> (levelNew > levelFirst) { <a name="l00641"></a>00641 first = i; levelFirst = levelNew; valueFirst = valueNew; <a name="l00642"></a>00642 } <a name="l00643"></a>00643 } <a name="l00644"></a>00644 <span class="keywordflow">else</span> { <span class="comment">// valueSecond == l_false</span> <a name="l00645"></a>00645 <span class="keywordflow">if</span> (levelNew > levelSecond) { <a name="l00646"></a>00646 second = i; levelSecond = levelNew; valueSecond = valueNew; <a name="l00647"></a>00647 } <a name="l00648"></a>00648 } <a name="l00649"></a>00649 } <a name="l00650"></a>00650 } <a name="l00651"></a>00651 <a name="l00652"></a>00652 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> swap = literals[0]; literals[0] = literals[first]; literals[first] = swap; <a name="l00653"></a>00653 swap = literals[1]; literals[1] = literals[second]; literals[second] = swap; <a name="l00654"></a>00654 <a name="l00655"></a>00655 <span class="comment">// if a literal is satisfied, the first literal is satisfied,</span> <a name="l00656"></a>00656 <span class="comment">// otherwise if a literal is falsified, the second literal is falsified.</span> <a name="l00657"></a>00657 <span class="keywordflow">if</span> ( <a name="l00658"></a>00658 <span class="comment">// satisfied literal at first position</span> <a name="l00659"></a>00659 ((<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[0]) != <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) && (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[1]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>)) <a name="l00660"></a>00660 || <a name="l00661"></a>00661 <span class="comment">// falsified literal at second position</span> <a name="l00662"></a>00662 (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literals[0]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) <a name="l00663"></a>00663 ) <a name="l00664"></a>00664 { <a name="l00665"></a>00665 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> swap = literals[0]; literals[0] = literals[1]; literals[1] = swap; <a name="l00666"></a>00666 } <a name="l00667"></a>00667 } <a name="l00668"></a>00668 } <a name="l00669"></a>00669 <a name="l00670"></a>00670 <a name="l00671"></a><a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">00671</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">Solver::addClause</a>(vector<Lit>& literals, <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a> theorem, <span class="keywordtype">int</span> clauseID) { <a name="l00672"></a>00672 <span class="comment">// sort clause</span> <a name="l00673"></a>00673 std::sort(literals.begin(), literals.end()); <a name="l00674"></a>00674 <a name="l00675"></a>00675 <span class="comment">// remove duplicates</span> <a name="l00676"></a>00676 vector<Lit>::iterator end = std::unique(literals.begin(), literals.end()); <a name="l00677"></a>00677 literals.erase(end, literals.end()); <a name="l00678"></a>00678 <a name="l00679"></a>00679 <span class="comment">// register var for each clause literal</span> <a name="l00680"></a>00680 <span class="keywordflow">for</span> (vector<Lit>::const_iterator i = literals.begin(); i != literals.end(); ++i){ <a name="l00681"></a>00681 <a class="code" href="classMiniSat_1_1Solver.html#a7a11f6c3676dd169d093a4e7c5af5299" title="Operations on clauses:">registerVar</a>(i->var()); <a name="l00682"></a>00682 } <a name="l00683"></a>00683 <a name="l00684"></a>00684 <span class="comment">// simplify clause</span> <a name="l00685"></a>00685 vector<Lit> simplified(literals); <a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="keywordtype">bool</span> replaceReason = <span class="keyword">false</span>; <a name="l00688"></a>00688 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#abe63b049c7c54b810266baffb315c89b">simplifyClause</a>(simplified, clauseID)) { <a name="l00689"></a>00689 <span class="comment">// it can happen that a unit clause was contradictory when it was added (in a non-root state).</span> <a name="l00690"></a>00690 <span class="comment">// then it was first added to list of pending clauses,</span> <a name="l00691"></a>00691 <span class="comment">// and the conflict analyzed and retracted:</span> <a name="l00692"></a>00692 <span class="comment">// this lead to the computation of a lemma which was used as a reason for the literal</span> <a name="l00693"></a>00693 <span class="comment">// instead of the unit clause itself.</span> <a name="l00694"></a>00694 <span class="comment">// so fix this here</span> <a name="l00695"></a>00695 <span class="keywordflow">if</span> (literals.size() == 1 && <a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(literals[0].var())-><a class="code" href="classMiniSat_1_1Clause.html#ae162f0e3b02b53dd127573885d3c198b">learnt</a>()) { <a name="l00696"></a>00696 replaceReason = <span class="keyword">true</span>; <a name="l00697"></a>00697 } <a name="l00698"></a>00698 <span class="keywordflow">else</span> { <a name="l00699"></a>00699 <span class="comment">// permanently satisfied clause</span> <a name="l00700"></a>00700 <span class="keywordflow">return</span>; <a name="l00701"></a>00701 } <a name="l00702"></a>00702 } <a name="l00703"></a>00703 <a name="l00704"></a>00704 <span class="comment">// record derivation for a simplified clause</span> <a name="l00705"></a>00705 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL && simplified.size() < literals.size()) { <a name="l00706"></a>00706 <span class="comment">// register original clause as start of simplification</span> <a name="l00707"></a>00707 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c = <a class="code" href="namespaceMiniSat.html#a9a3ff2cc55978ca3a973861cad2814e2">Clause_new</a>(literals, theorem, clauseID); <a name="l00708"></a>00708 <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a86b49978f3ea0aa72cd4815e241ff7ad">registerClause</a>(c); <a name="l00709"></a>00709 <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a98bcad6982734612b1afd68e38dea7b8">removedClause</a>(c); <a name="l00710"></a>00710 <a name="l00711"></a>00711 <span class="comment">// register simplification steps</span> <a name="l00712"></a>00712 <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>* inference = <span class="keyword">new</span> <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>(clauseID); <a name="l00713"></a>00713 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; <a name="l00714"></a>00714 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < literals.size(); ++i) { <a name="l00715"></a>00715 <span class="comment">// literal removed in simplification</span> <a name="l00716"></a>00716 <span class="keywordflow">if</span> (j >= simplified.size() || literals[i] != simplified[j]) { <a name="l00717"></a>00717 inference-><a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(literals[i], <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()->computeRootReason(~literals[i], <span class="keyword">this</span>)); <a name="l00718"></a>00718 } <a name="l00719"></a>00719 <span class="comment">// keep literal</span> <a name="l00720"></a>00720 <span class="keywordflow">else</span> { <a name="l00721"></a>00721 ++j; <a name="l00722"></a>00722 } <a name="l00723"></a>00723 } <a name="l00724"></a>00724 <a name="l00725"></a>00725 <span class="comment">// register resolution leading to simplified clause</span> <a name="l00726"></a>00726 clauseID = <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>(); <a name="l00727"></a>00727 <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a7c0cfa1103212b370236814a4923dec5">registerInference</a>(clauseID, inference); <a name="l00728"></a>00728 } <a name="l00729"></a>00729 <a name="l00730"></a>00730 <span class="comment">// insert simplified clause</span> <a name="l00731"></a>00731 <a class="code" href="classMiniSat_1_1Solver.html#aa8b5dfa883cace427d4b8b89769ca6df">orderClause</a>(simplified); <a name="l00732"></a>00732 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c; <a name="l00733"></a>00733 <span class="keywordflow">if</span> (simplified.size() < literals.size()) { <a name="l00734"></a>00734 c = <a class="code" href="namespaceMiniSat.html#a9a3ff2cc55978ca3a973861cad2814e2">Clause_new</a>(simplified, <a class="code" href="classCVC3_1_1Theorem.html">CVC3::Theorem</a>(), clauseID); <a name="l00735"></a>00735 } <span class="keywordflow">else</span> { <a name="l00736"></a>00736 c = <a class="code" href="namespaceMiniSat.html#a9a3ff2cc55978ca3a973861cad2814e2">Clause_new</a>(simplified, theorem, clauseID); <a name="l00737"></a>00737 } <a name="l00738"></a>00738 <a name="l00739"></a>00739 <span class="comment">// cout<<"clause size" << c->size() << endl << flush;</span> <a name="l00740"></a>00740 <a name="l00741"></a>00741 <a class="code" href="classMiniSat_1_1Solver.html#aa0d36a2c07c88350dd9d54e62b3cef7b">insertClause</a>(c); <a name="l00742"></a>00742 <span class="comment">// cout<<"after clause size" << c->size() << endl << flush;</span> <a name="l00743"></a>00743 <span class="keywordflow">if</span> (replaceReason) { <a name="l00744"></a>00744 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[literals[0].var()] = c; <a name="l00745"></a>00745 } <a name="l00746"></a>00746 <span class="comment">// cout<<"after after clause size" << c->size() << endl << flush;</span> <a name="l00747"></a>00747 } <a name="l00748"></a>00748 <a name="l00749"></a>00749 <a name="l00750"></a><a class="code" href="classMiniSat_1_1Solver.html#aa0d36a2c07c88350dd9d54e62b3cef7b">00750</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#aa0d36a2c07c88350dd9d54e62b3cef7b">Solver::insertClause</a>(<a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c) { <a name="l00751"></a>00751 <span class="comment">// clause set is unsatisfiable</span> <a name="l00752"></a>00752 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>) { <a name="l00753"></a>00753 <span class="keyword">remove</span>(c, <span class="keyword">true</span>); <a name="l00754"></a>00754 <span class="keywordflow">return</span>; <a name="l00755"></a>00755 } <a name="l00756"></a>00756 <a name="l00757"></a>00757 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a86b49978f3ea0aa72cd4815e241ff7ad">registerClause</a>(c); <a name="l00758"></a>00758 <a name="l00759"></a>00759 <span class="keywordflow">if</span> (c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 0){ <a name="l00760"></a>00760 <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> = c; <a name="l00761"></a>00761 <a name="l00762"></a>00762 <span class="comment">// for garbage collection: need to put clause somewhere</span> <a name="l00763"></a>00763 <span class="keywordflow">if</span> (!c-><a class="code" href="classMiniSat_1_1Clause.html#ae162f0e3b02b53dd127573885d3c198b">learnt</a>()) { <a name="l00764"></a>00764 <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.push_back(c); <a name="l00765"></a>00765 } <span class="keywordflow">else</span> { <a name="l00766"></a>00766 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.push_back(c); <a name="l00767"></a>00767 } <a name="l00768"></a>00768 <a name="l00769"></a>00769 <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> = <span class="keyword">false</span>; <a name="l00770"></a>00770 <span class="keywordflow">return</span>; <a name="l00771"></a>00771 } <a name="l00772"></a>00772 <a name="l00773"></a>00773 <span class="comment">// process clause -</span> <a name="l00774"></a>00774 <span class="comment">// if clause is conflicting add it to pending clause and return</span> <a name="l00775"></a>00775 <a name="l00776"></a>00776 <span class="comment">// unit clause</span> <a name="l00777"></a>00777 <span class="keywordflow">if</span> (c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 1) { <a name="l00778"></a>00778 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>((*c)[0], <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>, c)) { <a name="l00779"></a>00779 <span class="comment">// this backtracks to d_rootLevel, as reason c is just one literal,</span> <a name="l00780"></a>00780 <span class="comment">// which is immediately UIP, so c will be learned as a lemma as well.</span> <a name="l00781"></a>00781 <a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">updateConflict</a>(c); <a name="l00782"></a>00782 <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.push(c); <a name="l00783"></a>00783 <span class="keywordflow">return</span>; <a name="l00784"></a>00784 } <a name="l00785"></a>00785 } <a name="l00786"></a>00786 <span class="comment">// non-unit clause</span> <a name="l00787"></a>00787 <span class="keywordflow">else</span> { <a name="l00788"></a>00788 <span class="comment">// ensure that for a lemma the second literal has the highest decision level</span> <a name="l00789"></a>00789 <span class="keywordflow">if</span> (c-><a class="code" href="classMiniSat_1_1Clause.html#ae162f0e3b02b53dd127573885d3c198b">learnt</a>()){ <a name="l00790"></a>00790 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[0]) == <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>, <a name="l00791"></a>00791 <span class="stringliteral">"MiniSat::Solver::insertClause: first literal of new lemma not undefined"</span>); <a name="l00792"></a>00792 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l00793"></a>00793 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00794"></a>00794 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l00795"></a>00795 <span class="stringliteral">"MiniSat::Solver::insertClause: lemma literal not false"</span>); <a name="l00796"></a>00796 } <a name="l00797"></a>00797 ) <a name="l00798"></a>00798 <a name="l00799"></a>00799 <span class="comment">// Put the second watch on the literal with highest decision level: </span> <a name="l00800"></a>00800 <span class="keywordtype">int</span> max_i = 1; <a name="l00801"></a>00801 <span class="keywordtype">int</span> <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">max</a> = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>((*c)[1]); <a name="l00802"></a>00802 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 2; i < c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); i++) { <a name="l00803"></a>00803 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>((*c)[i]) > <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">max</a>) { <a name="l00804"></a>00804 max = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>((*c)[i]); <a name="l00805"></a>00805 max_i = i; <a name="l00806"></a>00806 } <a name="l00807"></a>00807 } <a name="l00808"></a>00808 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> swap((*c)[1]); <a name="l00809"></a>00809 (*c)[1] = (*c)[max_i]; <a name="l00810"></a>00810 (*c)[max_i] = swap; <a name="l00811"></a>00811 <a name="l00812"></a>00812 <span class="comment">// (newly learnt clauses should be considered active)</span> <a name="l00813"></a>00813 <a class="code" href="classMiniSat_1_1Solver.html#a4154a7c87f54bcbf48e8e1689dae68a9">claBumpActivity</a>(c); <a name="l00814"></a>00814 } <a name="l00815"></a>00815 <a name="l00816"></a>00816 <span class="comment">// satisfied</span> <a name="l00817"></a>00817 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[0]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) { <a name="l00818"></a>00818 ; <a name="l00819"></a>00819 } <a name="l00820"></a>00820 <span class="comment">// conflicting</span> <a name="l00821"></a>00821 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[0]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00822"></a>00822 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l00823"></a>00823 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00824"></a>00824 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l00825"></a>00825 <span class="stringliteral">"MiniSat::Solver::insertClause: bogus conflicting clause"</span>); <a name="l00826"></a>00826 } <a name="l00827"></a>00827 ) <a name="l00828"></a>00828 <a name="l00829"></a>00829 <a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">updateConflict</a>(c); <a name="l00830"></a>00830 <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.push(c); <a name="l00831"></a>00831 <span class="keywordflow">return</span>; <a name="l00832"></a>00832 } <a name="l00833"></a>00833 <span class="comment">// propagation</span> <a name="l00834"></a>00834 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[1]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l00835"></a>00835 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[0]) == <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>, <a name="l00836"></a>00836 <span class="stringliteral">"MiniSat::Solver::insertClause: bogus propagating clause"</span>); <a name="l00837"></a>00837 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l00838"></a>00838 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00839"></a>00839 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*c)[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l00840"></a>00840 <span class="stringliteral">"MiniSat::Solver::insertClause: bogus propagating clause"</span>); <a name="l00841"></a>00841 } <a name="l00842"></a>00842 ) <a name="l00843"></a>00843 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>((*c)[0], <a class="code" href="classMiniSat_1_1Solver.html#a4d5144ec81209e86f7374972b8a78aa0">getImplicationLevel</a>(*c), c)) { <a name="l00844"></a>00844 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"MiniSat::Solver::insertClause: conflicting/implying clause"</span>); <a name="l00845"></a>00845 } <a name="l00846"></a>00846 } <a name="l00847"></a>00847 <a name="l00848"></a>00848 <span class="comment">// Watch clause:</span> <a name="l00849"></a>00849 <a class="code" href="classMiniSat_1_1Solver.html#af3891961fe824bc91b47b59ee1e4a90b">addWatch</a>(~(*c)[0], c); <a name="l00850"></a>00850 <a class="code" href="classMiniSat_1_1Solver.html#af3891961fe824bc91b47b59ee1e4a90b">addWatch</a>(~(*c)[1], c); <a name="l00851"></a>00851 } <a name="l00852"></a>00852 <a name="l00853"></a>00853 <span class="comment">// clause is not conflicting, so insert it into the clause list.</span> <a name="l00854"></a>00854 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a4a57518371483fdd7f3def6f3fb0a4d8">max_literals</a> += c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00855"></a>00855 <span class="keywordflow">if</span> (!c-><a class="code" href="classMiniSat_1_1Clause.html#ae162f0e3b02b53dd127573885d3c198b">learnt</a>()) { <a name="l00856"></a>00856 <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.push_back(c); <a name="l00857"></a>00857 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a2d6b6031c1da1bac5f1da1faf1dc59df">clauses_literals</a> += c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00858"></a>00858 } <span class="keywordflow">else</span> { <a name="l00859"></a>00859 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.push_back(c); <a name="l00860"></a>00860 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a> += c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00861"></a>00861 } <a name="l00862"></a>00862 } <a name="l00863"></a>00863 <a name="l00864"></a>00864 <a name="l00865"></a>00865 <a name="l00866"></a>00866 <a name="l00867"></a>00867 <span class="comment">// Disposes a clauses and removes it from watcher lists.</span> <a name="l00868"></a>00868 <span class="comment">// NOTE! Low-level; does NOT change the 'clauses' and 'learnts' vector.</span> <a name="l00869"></a><a class="code" href="classMiniSat_1_1Solver.html#a241e960f84c150b1421bf4e3b3a6b073">00869</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a241e960f84c150b1421bf4e3b3a6b073">Solver::remove</a>(<a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c, <span class="keywordtype">bool</span> just_dealloc) { <a name="l00870"></a>00870 <span class="comment">// no watches added for clauses of size < 2</span> <a name="l00871"></a>00871 <span class="keywordflow">if</span> (!just_dealloc && c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() >= 2){ <a name="l00872"></a>00872 <a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5" title="Conflict handling.">removeWatch</a>(<a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~(*c)[0]), c); <a name="l00873"></a>00873 <a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5" title="Conflict handling.">removeWatch</a>(<a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~(*c)[1]), c); <a name="l00874"></a>00874 } <a name="l00875"></a>00875 <a name="l00876"></a>00876 <span class="keywordflow">if</span> (c-><a class="code" href="classMiniSat_1_1Clause.html#ae162f0e3b02b53dd127573885d3c198b">learnt</a>()) <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a> -= c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00877"></a>00877 <span class="keywordflow">else</span> <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a2d6b6031c1da1bac5f1da1faf1dc59df">clauses_literals</a> -= c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l00878"></a>00878 <a name="l00879"></a>00879 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() == NULL) <a class="code" href="namespaceMiniSat.html#acbe7b3fac8ab3909327207b0fea1f4d8">xfree</a>(c); <a name="l00880"></a>00880 <span class="keywordflow">else</span> <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a98bcad6982734612b1afd68e38dea7b8">removedClause</a>(c); <a name="l00881"></a>00881 } <a name="l00882"></a>00882 <a name="l00883"></a>00883 <a name="l00884"></a>00884 <a name="l00885"></a>00885 <span class="comment"></span> <a name="l00886"></a>00886 <span class="comment">/// Conflict handling</span> <a name="l00887"></a>00887 <span class="comment"></span> <a name="l00888"></a>00888 <span class="comment">// Pre-condition: 'elem' must exists in 'ws' OR 'ws' must be empty.</span> <a name="l00889"></a><a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5">00889</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5" title="Conflict handling.">Solver::removeWatch</a>(std::vector<Clause*>& ws, <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* elem) { <a name="l00890"></a>00890 <span class="keywordflow">if</span> (ws.size() == 0) <span class="keywordflow">return</span>; <span class="comment">// (skip lists that are already cleared)</span> <a name="l00891"></a>00891 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; <a name="l00892"></a>00892 <span class="keywordflow">for</span> (; ws[j] != elem; j++) { <a name="l00893"></a>00893 <span class="comment">// want to find the right j, so the loop should be executed</span> <a name="l00894"></a>00894 <span class="comment">// and not wrapped in a debug guard</span> <a name="l00895"></a>00895 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(j < ws.size(), <span class="stringliteral">"MiniSat::Solver::removeWatch: elem not in watched list"</span>); <a name="l00896"></a>00896 } <a name="l00897"></a>00897 <a name="l00898"></a>00898 ws[j] = ws.back(); <a name="l00899"></a>00899 ws.pop_back(); <a name="l00900"></a>00900 } <a name="l00901"></a>00901 <a name="l00902"></a>00902 <a name="l00903"></a>00903 <span class="comment">// for a clause, of which the first literal is implied,</span> <a name="l00904"></a>00904 <span class="comment">// get the highest decision level of the implying literals,</span> <a name="l00905"></a>00905 <span class="comment">// i.e. the decision level from which on the literal is implied</span> <a name="l00906"></a>00906 <span class="comment">//</span> <a name="l00907"></a>00907 <span class="comment">// as theory clauses can be added at any time,</span> <a name="l00908"></a>00908 <span class="comment">// this is not necessarily the level of the second literal.</span> <a name="l00909"></a>00909 <span class="comment">// thus, all literals have to be checked.</span> <a name="l00910"></a><a class="code" href="classMiniSat_1_1Solver.html#a4d5144ec81209e86f7374972b8a78aa0">00910</a> <span class="keywordtype">int</span> <a class="code" href="classMiniSat_1_1Solver.html#a4d5144ec81209e86f7374972b8a78aa0">Solver::getImplicationLevel</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause)<span class="keyword"> const </span>{ <a name="l00911"></a>00911 <span class="keywordtype">int</span> currentLevel = <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(); <a name="l00912"></a>00912 <span class="keywordtype">int</span> maxLevel = <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>; <a name="l00913"></a>00913 <a name="l00914"></a>00914 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00915"></a>00915 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l00916"></a>00916 <span class="stringliteral">"MiniSat::Solver::getImplicationLevelFull: literal not false"</span>); <a name="l00917"></a>00917 <a name="l00918"></a>00918 <span class="keywordtype">int</span> newLevel = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(clause[i]); <a name="l00919"></a>00919 <a name="l00920"></a>00920 <span class="comment">// highest possible level</span> <a name="l00921"></a>00921 <span class="keywordflow">if</span> (newLevel == currentLevel) <a name="l00922"></a>00922 <span class="keywordflow">return</span> currentLevel; <a name="l00923"></a>00923 <a name="l00924"></a>00924 <span class="comment">// highest level up to now</span> <a name="l00925"></a>00925 <span class="keywordflow">if</span> (newLevel > maxLevel) <a name="l00926"></a>00926 maxLevel = newLevel; <a name="l00927"></a>00927 } <a name="l00928"></a>00928 <a name="l00929"></a>00929 <span class="keywordflow">return</span> maxLevel; <a name="l00930"></a>00930 } <a name="l00931"></a>00931 <a name="l00932"></a>00932 <a name="l00933"></a>00933 <span class="comment">// like getImplicationLevel, but for all literals,</span> <a name="l00934"></a>00934 <span class="comment">// i.e. for conflicting instead of propagating clause</span> <a name="l00935"></a><a class="code" href="classMiniSat_1_1Solver.html#a0d0c1aef5c834bc7ba7682ac3fe5b59c">00935</a> <span class="keywordtype">int</span> <a class="code" href="classMiniSat_1_1Solver.html#a0d0c1aef5c834bc7ba7682ac3fe5b59c">Solver::getConflictLevel</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause)<span class="keyword"> const </span>{ <a name="l00936"></a>00936 <span class="keywordtype">int</span> <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a> = <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>; <a name="l00937"></a>00937 <a name="l00938"></a>00938 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00939"></a>00939 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <span class="stringliteral">"MiniSat::Solver::getConflictLevel: literal not false"</span>); <a name="l00940"></a>00940 <a name="l00941"></a>00941 <span class="keywordtype">int</span> newLevel = <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(clause[i]); <a name="l00942"></a>00942 <span class="keywordflow">if</span> (newLevel > decisionLevel) <a name="l00943"></a>00943 decisionLevel = newLevel; <a name="l00944"></a>00944 } <a name="l00945"></a>00945 <a name="l00946"></a>00946 <span class="keywordflow">return</span> <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>; <a name="l00947"></a>00947 } <a name="l00948"></a>00948 <a name="l00949"></a>00949 <a name="l00950"></a><a class="code" href="classMiniSat_1_1Solver.html#a031fbfd0b0f291ad294dc9e49a8e7ec7">00950</a> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* <a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">Solver::getReason</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> literal, <span class="keywordtype">bool</span> _resolveTheoryImplication) { <a name="l00951"></a>00951 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> var = literal.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>(); <a name="l00952"></a>00952 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* reason = <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[var]; <a name="l00953"></a>00953 <a name="l00954"></a>00954 <span class="keywordflow">if</span> (!_resolveTheoryImplication) <a name="l00955"></a>00955 <span class="keywordflow">return</span> reason; <a name="l00956"></a>00956 <a name="l00957"></a>00957 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(reason != NULL, <span class="stringliteral">"MiniSat::getReason: reason[var] == NULL."</span>); <a name="l00958"></a>00958 <a name="l00959"></a>00959 <span class="keywordflow">if</span> (reason == <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) { <a name="l00960"></a>00960 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literal) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) <a name="l00961"></a>00961 <a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">resolveTheoryImplication</a>(literal); <a name="l00962"></a>00962 <span class="keywordflow">else</span> <a name="l00963"></a>00963 <a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">resolveTheoryImplication</a>(~literal); <a name="l00964"></a>00964 reason = <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[var]; <a name="l00965"></a>00965 } <a name="l00966"></a>00966 <a name="l00967"></a>00967 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[var] != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>(), <a name="l00968"></a>00968 <span class="stringliteral">"MiniSat::getReason: reason[var] == TheoryImplication."</span>); <a name="l00969"></a>00969 <a name="l00970"></a>00970 <span class="keywordflow">return</span> reason; <a name="l00971"></a>00971 } <a name="l00972"></a>00972 <a name="l00973"></a><a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">00973</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">Solver::isConflicting</a>()<span class="keyword"> const </span>{ <a name="l00974"></a>00974 <span class="keywordflow">return</span> (<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> != NULL); <a name="l00975"></a>00975 } <a name="l00976"></a>00976 <a name="l00977"></a><a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">00977</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">Solver::updateConflict</a>(<a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* clause) { <a name="l00978"></a>00978 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(clause != NULL, <span class="stringliteral">"MiniSat::updateConflict: clause == NULL."</span>); <a name="l00979"></a>00979 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l00980"></a>00980 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < clause-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l00981"></a>00981 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*clause)[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <span class="stringliteral">"MiniSat::Solver::updateConflict: literal not false"</span>); <a name="l00982"></a>00982 } <a name="l00983"></a>00983 ) <a name="l00984"></a>00984 <a name="l00985"></a>00985 <span class="keywordflow">if</span> ( <a name="l00986"></a>00986 (<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> == NULL) <a name="l00987"></a>00987 || <a name="l00988"></a>00988 (clause-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() < <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>()) <a name="l00989"></a>00989 ) { <a name="l00990"></a>00990 <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> = clause; <a name="l00991"></a>00991 } <a name="l00992"></a>00992 } <a name="l00993"></a>00993 <a name="l00994"></a>00994 <a name="l00995"></a>00995 <a name="l00996"></a>00996 <span class="comment">// retrieve the explanation and update the implication level of a theory implied literal.</span> <a name="l00997"></a>00997 <span class="comment">// if necessary, do this recursively (bottom up) for the literals in the explanation.</span> <a name="l00998"></a>00998 <span class="comment">// assumes that the literal is true in the current context</span> <a name="l00999"></a><a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">00999</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">Solver::resolveTheoryImplication</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> literal) { <a name="l01000"></a>01000 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#aa44f156407ac4e41255a1f3bc645f6e2" title="theory implications">eager_explanation</a>) <span class="keywordflow">return</span>; <a name="l01001"></a>01001 <a name="l01002"></a>01002 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[literal.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] == <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) { <a name="l01003"></a>01003 <span class="comment">// instead of recursion put the theory implications to check in toRegress,</span> <a name="l01004"></a>01004 <span class="comment">// and the theory implications depending on them in toComplete</span> <a name="l01005"></a>01005 stack<Lit> toRegress; <a name="l01006"></a>01006 stack<Clause*> toComplete; <a name="l01007"></a>01007 toRegress.push(literal); <a name="l01008"></a>01008 <a name="l01009"></a>01009 <a class="code" href="classSAT_1_1Clause.html">SAT::Clause</a> clauseCVC; <a name="l01010"></a>01010 <span class="keywordflow">while</span> (!toRegress.empty()) { <a name="l01011"></a>01011 <span class="comment">// get the explanation for the first theory implication</span> <a name="l01012"></a>01012 literal = toRegress.top(); <a name="l01013"></a>01013 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(literal) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>, <a name="l01014"></a>01014 <span class="stringliteral">"MiniSat::Solver::resolveTheoryImplication: literal is not true"</span>); <a name="l01015"></a>01015 toRegress.pop(); <a name="l01016"></a>01016 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"Not implemented yet"</span>); <a name="l01017"></a>01017 <span class="comment">// d_theoryAPI->getExplanation(miniSatToCVC(literal), clauseCVC);</span> <a name="l01018"></a>01018 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* explanation = <a class="code" href="classMiniSat_1_1Solver.html#abbb1190222cc3ad99638caf6e86ee698" title="problem specification">cvcToMiniSat</a>(clauseCVC, <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>()); <a name="l01019"></a>01019 <a name="l01020"></a>01020 <span class="comment">// must ensure that propagated literal is at first position</span> <a name="l01021"></a>01021 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < (*explanation).size(); ++i) { <a name="l01022"></a>01022 <span class="keywordflow">if</span> ((*explanation)[i] == literal) { <a name="l01023"></a>01023 <a class="code" href="classMiniSat_1_1Lit.html">MiniSat::Lit</a> swap = (*explanation)[0]; <a name="l01024"></a>01024 (*explanation)[0] = (*explanation)[i]; <a name="l01025"></a>01025 (*explanation)[i] = swap; <a name="l01026"></a>01026 <span class="keywordflow">break</span>; <a name="l01027"></a>01027 } <a name="l01028"></a>01028 } <a name="l01029"></a>01029 <span class="comment">// assert that clause is implying the first literal</span> <a name="l01030"></a>01030 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a>( <a name="l01031"></a>01031 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>((*explanation)[0] == literal, <a name="l01032"></a>01032 <span class="stringliteral">"MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 1"</span>); <a name="l01033"></a>01033 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*explanation)[0]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>, <a name="l01034"></a>01034 <span class="stringliteral">"MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 2"</span>); <a name="l01035"></a>01035 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < (*explanation).size(); ++i) { <a name="l01036"></a>01036 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*explanation)[i]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l01037"></a>01037 <span class="stringliteral">"MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 3"</span>); <a name="l01038"></a>01038 } <a name="l01039"></a>01039 ) <a name="l01040"></a>01040 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[literal.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = explanation; <a name="l01041"></a>01041 <a name="l01042"></a>01042 <span class="comment">// if any of the reasons is also a theory implication,</span> <a name="l01043"></a>01043 <span class="comment">// then need to know its level first, so add it to toRegress</span> <a name="l01044"></a>01044 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < (*explanation).size(); ++i) { <a name="l01045"></a>01045 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[(*explanation)[i].var()] == <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) { <a name="l01046"></a>01046 toRegress.push((*explanation)[i]); <a name="l01047"></a>01047 } <a name="l01048"></a>01048 } <a name="l01049"></a>01049 <span class="comment">// set literal and its explanation aside for later processing</span> <a name="l01050"></a>01050 toComplete.push(explanation); <a name="l01051"></a>01051 } <a name="l01052"></a>01052 <a name="l01053"></a>01053 <span class="comment">// now set the real implication levels after they have been resolved</span> <a name="l01054"></a>01054 <span class="comment">// std::pair<Lit, Clause*> pair;</span> <a name="l01055"></a>01055 <span class="keywordflow">while</span> (!toComplete.empty()) { <a name="l01056"></a>01056 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* explanation = toComplete.top(); <a name="l01057"></a>01057 toComplete.pop(); <a name="l01058"></a>01058 <a name="l01059"></a>01059 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l01060"></a>01060 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < explanation-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l01061"></a>01061 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (<a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[(*explanation)[i].var()] != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>(), <a name="l01062"></a>01062 <span class="stringliteral">"MiniSat::Solver::resolveTheoryImplication: not done to completion"</span>); <a name="l01063"></a>01063 } <a name="l01064"></a>01064 ) <a name="l01065"></a>01065 <a name="l01066"></a>01066 <span class="comment">// update propagation information</span> <a name="l01067"></a>01067 <span class="keywordtype">int</span> level = <a class="code" href="classMiniSat_1_1Solver.html#a4d5144ec81209e86f7374972b8a78aa0">getImplicationLevel</a>(*explanation); <a name="l01068"></a>01068 <a class="code" href="classMiniSat_1_1Solver.html#adf6fbd3cddfa511acae41f180b187454">setLevel</a>((*explanation)[0], level); <a name="l01069"></a>01069 <a class="code" href="classMiniSat_1_1Solver.html#a07e86f7cb7f6a34c4e28df990cbf43d1">setPushID</a>((*explanation)[0].var(), explanation); <a name="l01070"></a>01070 <a name="l01071"></a>01071 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a9e2daa67569a36e7548c8d87faecde63">keep_lazy_explanation</a>) { <a name="l01072"></a>01072 <span class="comment">// the reason can be added to the clause set without any effect,</span> <a name="l01073"></a>01073 <span class="comment">// as the explanation implies the first literal, which is currently true</span> <a name="l01074"></a>01074 <span class="comment">// so neither propagation nor conflict are triggered,</span> <a name="l01075"></a>01075 <span class="comment">// only the correct literals are registered as watched literals.</span> <a name="l01076"></a>01076 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(*explanation, <span class="keyword">true</span>); <a name="l01077"></a>01077 <a class="code" href="namespaceMiniSat.html#acbe7b3fac8ab3909327207b0fea1f4d8">xfree</a>(explanation); <a name="l01078"></a>01078 } <span class="keywordflow">else</span> { <a name="l01079"></a>01079 <span class="comment">// store explanation for later deallocation</span> <a name="l01080"></a>01080 <a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.push(std::make_pair(level, explanation)); <a name="l01081"></a>01081 } <a name="l01082"></a>01082 } <a name="l01083"></a>01083 } <a name="l01084"></a>01084 <a name="l01085"></a>01085 } <a name="l01086"></a>01086 <a name="l01087"></a>01087 <a name="l01088"></a>01088 <span class="comment"></span> <a name="l01089"></a>01089 <span class="comment">/// Conflict handling</span> <a name="l01090"></a>01090 <span class="comment"></span> <a name="l01091"></a><a class="code" href="classMiniSat_1_1Solver.html#ab4bacf381f8980c23eb2184c712b882d">01091</a> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* <a class="code" href="classMiniSat_1_1Solver.html#ab4bacf381f8980c23eb2184c712b882d" title="Conflict handling.">Solver::analyze</a>(<span class="keywordtype">int</span>& out_btlevel) { <a name="l01092"></a>01092 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> != NULL, <span class="stringliteral">"MiniSat::Solver::analyze called when no conflict was detected"</span>); <a name="l01093"></a>01093 <a name="l01094"></a>01094 <span class="comment">// compute the correct decision level for theory propagated literals</span> <a name="l01095"></a>01095 <span class="comment">//</span> <a name="l01096"></a>01096 <span class="comment">// need to find the most recent implication level of any of the literals in d_conflict,</span> <a name="l01097"></a>01097 <span class="comment">// after updating conflict levels due to lazy retrieval of theory implications.</span> <a name="l01098"></a>01098 <span class="comment">//</span> <a name="l01099"></a>01099 <span class="comment">// that is, really need to do:</span> <a name="l01100"></a>01100 <span class="comment">// 1) assume that the currently highest known level is the UIP Level,</span> <a name="l01101"></a>01101 <span class="comment">// initially this is the decision level</span> <a name="l01102"></a>01102 <span class="comment">// 2) find a literal in the conflict clause whose real implication level is the UIP Level</span> <a name="l01103"></a>01103 <span class="comment">// 3) if their is no such literal, pick the new UIP level as the highest of their implication levels,</span> <a name="l01104"></a>01104 <span class="comment">// and repeat</span> <a name="l01105"></a>01105 <span class="comment">//</span> <a name="l01106"></a>01106 <span class="comment">// unfortunately, 2) is not that easy:</span> <a name="l01107"></a>01107 <span class="comment">// - if the literals' level is smaller than the UIP level the literal can be ignored</span> <a name="l01108"></a>01108 <span class="comment">// - otherwise, it might depend on theory implications,</span> <a name="l01109"></a>01109 <span class="comment">// who have just been assumed to be of the UIP level, but which in reality are of lower levels.</span> <a name="l01110"></a>01110 <span class="comment">// So, must check all literals the literal depends on,</span> <a name="l01111"></a>01111 <span class="comment">// until the real level of all of them is determined,</span> <a name="l01112"></a>01112 <span class="comment">// and thus also of the literal we are really interested in.</span> <a name="l01113"></a>01113 <span class="comment">// this can be stopped if the level must be lower than the (currently assumed) UIP level,</span> <a name="l01114"></a>01114 <span class="comment">// or if it is sure that the literal really has the UIP level.</span> <a name="l01115"></a>01115 <span class="comment">// but this is only the case if it depends on the decision literal of the UIP level.</span> <a name="l01116"></a>01116 <span class="comment">//</span> <a name="l01117"></a>01117 <span class="comment">// but how to find this out efficiently?</span> <a name="l01118"></a>01118 <span class="comment">//</span> <a name="l01119"></a>01119 <span class="comment">// so, this is done as an approximation instead:</span> <a name="l01120"></a>01120 <span class="comment">// 1) if the explanation of a (conflict clause) literal is known, stop and take the literal's level</span> <a name="l01121"></a>01121 <span class="comment">// 2) otherwise, retrieve its explanation,</span> <a name="l01122"></a>01122 <span class="comment">// and do 1) and 2) on each literal in the explanation.</span> <a name="l01123"></a>01123 <span class="comment">// then set the original literal's level to the highest level of its explanation.</span> <a name="l01124"></a>01124 <span class="comment">//</span> <a name="l01125"></a>01125 <span class="comment">// as an example, if we have:</span> <a name="l01126"></a>01126 <span class="comment">// - theory implication A in level n</span> <a name="l01127"></a>01127 <span class="comment">// - propositional implication B depending on A and literals below level n</span> <a name="l01128"></a>01128 <span class="comment">// - propositional implication C depending on B and literals below level n</span> <a name="l01129"></a>01129 <span class="comment">// then A, B, C will all be assumed to be of level n,</span> <a name="l01130"></a>01130 <span class="comment">// and if C is in a conflict it will be assumed to be of level n</span> <a name="l01131"></a>01131 <span class="comment">// in the conflict analysis</span> <a name="l01132"></a>01132 <span class="comment">//</span> <a name="l01133"></a>01133 <span class="comment">// this is fast to compute,</span> <a name="l01134"></a>01134 <span class="comment">// but it is not clear if starting from the real UIP level</span> <a name="l01135"></a>01135 <span class="comment">// would lead to a significantly better lemma</span> <a name="l01136"></a>01136 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); j++){ <a name="l01137"></a>01137 <a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">resolveTheoryImplication</a>(~((*<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>)[j])); <a name="l01138"></a>01138 } <a name="l01139"></a>01139 <span class="keywordtype">int</span> UIPLevel = <a class="code" href="classMiniSat_1_1Solver.html#a0d0c1aef5c834bc7ba7682ac3fe5b59c">getConflictLevel</a>(*<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>); <a name="l01140"></a>01140 <a name="l01141"></a>01141 <span class="comment">// clause literals to regress are marked by setting analyze_d_seen[var]</span> <a name="l01142"></a>01142 <span class="comment">// seen should be false for all variables</span> <a name="l01143"></a>01143 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l01144"></a>01144 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>.size(); ++i) { <a name="l01145"></a>01145 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (<a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[i] == 0, <span class="stringliteral">"MiniSat::Solver::analyze: analyze_seen is not clear at: "</span> <span class="comment">/*+ i*/</span>); <a name="l01146"></a>01146 } <a name="l01147"></a>01147 ) <a name="l01148"></a>01148 <span class="comment">// index into trail, regression is done chronologically (in combination with analyze_seen)</span> <a name="l01149"></a>01149 <span class="keywordtype">int</span> index = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() - 1; <a name="l01150"></a>01150 <span class="comment">// lemma is generated here;</span> <a name="l01151"></a>01151 vector<Lit> out_learnt; <a name="l01152"></a>01152 <span class="comment">// number of literals to regress in current decision level</span> <a name="l01153"></a>01153 <span class="keywordtype">int</span> pathC = 0; <a name="l01154"></a>01154 <span class="comment">// highest level below UIP level, i.e. the level to backtrack to</span> <a name="l01155"></a>01155 out_btlevel = 0; <a name="l01156"></a>01156 <span class="comment">// current literal to regress</span> <a name="l01157"></a>01157 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p = <a class="code" href="namespaceMiniSat.html#a120ea2f17b58215d657cd7b005edcd85">lit_Undef</a>; <a name="l01158"></a>01158 <a name="l01159"></a>01159 <span class="comment">// derivation logging</span> <a name="l01160"></a>01160 <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>* inference = NULL; <a name="l01161"></a>01161 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) inference = <span class="keyword">new</span> <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>-><a class="code" href="classMiniSat_1_1Clause.html#aeb8881da1f982f5bc58bac190ab2f2a4">id</a>()); <a name="l01162"></a>01162 <a name="l01163"></a>01163 <span class="comment">// conflict clause is the initial clause to regress</span> <a name="l01164"></a>01164 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* confl = <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>; <a name="l01165"></a>01165 <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> = NULL; <a name="l01166"></a>01166 <a name="l01167"></a>01167 <span class="comment">// compute pushID as max pushID of all regressed clauses</span> <a name="l01168"></a>01168 <span class="keywordtype">int</span> pushID = confl-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>(); <a name="l01169"></a>01169 <a name="l01170"></a>01170 <span class="comment">// do until pathC == 1, i.e. UIP found</span> <a name="l01171"></a>01171 <span class="keywordflow">if</span> (confl->size() == 1) { <a name="l01172"></a>01172 out_learnt.push_back((*confl)[0]); <a name="l01173"></a>01173 } <span class="keywordflow">else</span> { <a name="l01174"></a>01174 <span class="comment">// leave room for the asserting literal -</span> <a name="l01175"></a>01175 <span class="comment">// we might get an empty lemma if a new clause is conflicting at the root level.</span> <a name="l01176"></a>01176 <span class="keywordflow">if</span> (UIPLevel != <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) out_learnt.push_back(<a class="code" href="namespaceMiniSat.html#a120ea2f17b58215d657cd7b005edcd85">lit_Undef</a>); <a name="l01177"></a>01177 <a name="l01178"></a>01178 <span class="keywordflow">do</span> { <a name="l01179"></a>01179 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (confl != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>(), <span class="stringliteral">"MiniSat::Solver::analyze: no reason for conflict"</span>); <a name="l01180"></a>01180 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (confl != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>(), <span class="stringliteral">"MiniSat::Solver::analyze: theory implication not resolved"</span>); <a name="l01181"></a>01181 <a name="l01182"></a>01182 <span class="keywordflow">if</span> (confl->learnt()) <a class="code" href="classMiniSat_1_1Solver.html#a4154a7c87f54bcbf48e8e1689dae68a9">claBumpActivity</a>(confl); <a name="l01183"></a>01183 <a name="l01184"></a>01184 <span class="comment">// regress p</span> <a name="l01185"></a>01185 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = (p == <a class="code" href="namespaceMiniSat.html#a120ea2f17b58215d657cd7b005edcd85">lit_Undef</a>) ? 0 : 1; j < confl->size(); j++){ <a name="l01186"></a>01186 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> q = (*confl)[j]; <a name="l01187"></a>01187 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(q) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <span class="stringliteral">"MiniSat::Solver::analyze: literal to regress is not false"</span>); <a name="l01188"></a>01188 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(q) <= UIPLevel, <span class="stringliteral">"MiniSat::Solver::analyze: literal above UIP level"</span>); <a name="l01189"></a>01189 <a name="l01190"></a>01190 <span class="comment">// get explanation and compute implication level for theory implication</span> <a name="l01191"></a>01191 <a class="code" href="classMiniSat_1_1Solver.html#a22b59f22e9df28fcb892e5873d998c75">resolveTheoryImplication</a>(~q); <a name="l01192"></a>01192 <a name="l01193"></a>01193 <span class="comment">// first time that q is in a reason, so process it</span> <a name="l01194"></a>01194 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[q.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()]) { <a name="l01195"></a>01195 <span class="comment">// q is falsified at root level, so it can be dropped</span> <a name="l01196"></a>01196 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(q) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) { <a name="l01197"></a>01197 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.push_back(q); <a name="l01198"></a>01198 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[q.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 1; <a name="l01199"></a>01199 } <a name="l01200"></a>01200 <span class="keywordflow">else</span> { <a name="l01201"></a>01201 <a class="code" href="classMiniSat_1_1Solver.html#ab4af8739e981ec3caaa5a20ef1eb2f0f" title="Activity:">varBumpActivity</a>(q); <a name="l01202"></a>01202 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[q.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 1; <a name="l01203"></a>01203 <span class="comment">// mark q to regress</span> <a name="l01204"></a>01204 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(q) == UIPLevel) <a name="l01205"></a>01205 pathC++; <a name="l01206"></a>01206 <span class="comment">// add q to lemma</span> <a name="l01207"></a>01207 <span class="keywordflow">else</span>{ <a name="l01208"></a>01208 out_learnt.push_back(q); <a name="l01209"></a>01209 out_btlevel = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">max</a>(out_btlevel, <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(q)); <a name="l01210"></a>01210 } <a name="l01211"></a>01211 } <a name="l01212"></a>01212 } <a name="l01213"></a>01213 } <a name="l01214"></a>01214 <a name="l01215"></a>01215 <span class="comment">// for clause conflicting at root level pathC can be 0 right away</span> <a name="l01216"></a>01216 <span class="keywordflow">if</span> (pathC == 0) <span class="keywordflow">break</span>; <a name="l01217"></a>01217 <a name="l01218"></a>01218 <span class="comment">// pick next literal in UIP level to regress.</span> <a name="l01219"></a>01219 <span class="comment">// as trail is not ordered wrt. implication level (theory clause/ implications),</span> <a name="l01220"></a>01220 <span class="comment">// check also if the next literal is really from the UIP level.</span> <a name="l01221"></a>01221 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[index].var()] || (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[index])) != UIPLevel) { <a name="l01222"></a>01222 --index; <a name="l01223"></a>01223 } <a name="l01224"></a>01224 --index; <a name="l01225"></a>01225 <span class="comment">// this could theoretically happen if UIP Level is 0,</span> <a name="l01226"></a>01226 <span class="comment">// but should be catched as then the conflict clause</span> <a name="l01227"></a>01227 <span class="comment">// is simplified to the empty clause.</span> <a name="l01228"></a>01228 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(index >= -1, <span class="stringliteral">"MiniSat::Solver::analyze: index out of bound"</span>); <a name="l01229"></a>01229 <a name="l01230"></a>01230 <span class="comment">// set up p to be regressed</span> <a name="l01231"></a>01231 p = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[index+1]; <a name="l01232"></a>01232 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 0; <a name="l01233"></a>01233 pathC--; <a name="l01234"></a>01234 <a name="l01235"></a>01235 confl = <a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(p); <a name="l01236"></a>01236 pushID = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">max</a>(pushID, confl->pushID()); <a name="l01237"></a>01237 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL && pathC > 0) inference-><a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(~p, confl); <a name="l01238"></a>01238 } <span class="keywordflow">while</span> (pathC > 0); <a name="l01239"></a>01239 <span class="comment">// add the UIP - except in root level, here all literals have been resolved.</span> <a name="l01240"></a>01240 <span class="keywordflow">if</span> (UIPLevel != <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) out_learnt[0] = ~p; <a name="l01241"></a>01241 } <a name="l01242"></a>01242 <a name="l01243"></a>01243 <span class="comment">// check that the UIP has been found</span> <a name="l01244"></a>01244 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a> ( <a name="l01245"></a>01245 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> ((out_learnt.size() == 0 && UIPLevel == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) <a name="l01246"></a>01246 || <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(out_learnt[0]) == UIPLevel, <a name="l01247"></a>01247 <span class="stringliteral">"MiniSat::Solver::analyze: backtracked past UIP level."</span>); <a name="l01248"></a>01248 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 1; i < out_learnt.size(); ++i) { <a name="l01249"></a>01249 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(out_learnt[i]) < UIPLevel, <a name="l01250"></a>01250 <span class="stringliteral">"MiniSat::Solver::analyze: conflict clause contains literal from UIP level or higher."</span>); <a name="l01251"></a>01251 } <a name="l01252"></a>01252 ) <a name="l01253"></a>01253 <a name="l01254"></a>01254 <a class="code" href="classMiniSat_1_1Solver.html#affb21521fe39f5d003e61180dc3f5f3c">analyze_minimize</a>(out_learnt, inference, pushID); <a name="l01255"></a>01255 <a name="l01256"></a>01256 <span class="comment">// clear seen for lemma</span> <a name="l01257"></a>01257 <span class="keywordflow">for</span> (vector<Lit>::const_iterator j = out_learnt.begin(); j != out_learnt.end(); ++j) { <a name="l01258"></a>01258 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[j->var()] = 0; <a name="l01259"></a>01259 } <a name="l01260"></a>01260 <a name="l01261"></a>01261 <span class="comment">// finish logging of conflict clause generation</span> <a name="l01262"></a>01262 <span class="keywordtype">int</span> clauseID = <a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>(); <a name="l01263"></a>01263 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#a7c0cfa1103212b370236814a4923dec5">registerInference</a>(clauseID, inference); <a name="l01264"></a>01264 <a name="l01265"></a>01265 <span class="keywordflow">return</span> <a class="code" href="namespaceMiniSat.html#a2659fd436dc00aebee015ce18ae2c89a">Lemma_new</a>(out_learnt, clauseID, pushID); <a name="l01266"></a>01266 } <a name="l01267"></a>01267 <a name="l01268"></a><a class="code" href="classlastToFirst__lt.html">01268</a> <span class="keyword">class </span><a class="code" href="classlastToFirst__lt.html">lastToFirst_lt</a> { <span class="comment">// Helper class to 'analyze' -- order literals from last to first occurance in 'trail[]'.</span> <a name="l01269"></a><a class="code" href="classlastToFirst__lt.html#aba54c1f94b132b69e8ccde70245d9cc4">01269</a> <span class="keyword">const</span> vector<MiniSat::size_type>& <a class="code" href="classlastToFirst__lt.html#aba54c1f94b132b69e8ccde70245d9cc4">d_trail_pos</a>; <a name="l01270"></a>01270 <span class="keyword">public</span>: <a name="l01271"></a><a class="code" href="classlastToFirst__lt.html#a652441495f3ad70bb9d9d449544a50a9">01271</a> <a class="code" href="classlastToFirst__lt.html#a652441495f3ad70bb9d9d449544a50a9">lastToFirst_lt</a>(<span class="keyword">const</span> vector<MiniSat::size_type>& trail_pos) : d_trail_pos(trail_pos) {} <a name="l01272"></a>01272 <a name="l01273"></a><a class="code" href="classlastToFirst__lt.html#a8ff406f0ee4e609f9dcce00fcaf4e067">01273</a> <span class="keywordtype">bool</span> operator () (<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p, <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> q) { <a name="l01274"></a>01274 <span class="keywordflow">return</span> d_trail_pos[p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] > d_trail_pos[q.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()]; <a name="l01275"></a>01275 } <a name="l01276"></a>01276 }; <a name="l01277"></a>01277 <a name="l01278"></a><a class="code" href="classMiniSat_1_1Solver.html#affb21521fe39f5d003e61180dc3f5f3c">01278</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#affb21521fe39f5d003e61180dc3f5f3c">Solver::analyze_minimize</a>(vector<Lit>& out_learnt, <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>* inference, <span class="keywordtype">int</span>& pushID) { <a name="l01279"></a>01279 <span class="comment">// for empty clause current analyze_minimize will actually do something wrong</span> <a name="l01280"></a>01280 <span class="keywordflow">if</span> (out_learnt.size() > 1) { <a name="l01281"></a>01281 <a name="l01282"></a>01282 <span class="comment">// literals removed from out_learnt in conflict clause minimization,</span> <a name="l01283"></a>01283 <span class="comment">// including reason literals which had to be removed as well</span> <a name="l01284"></a>01284 <span class="comment">// (except for literals implied at root level).</span> <a name="l01285"></a>01285 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i, j; <a name="l01286"></a>01286 <span class="comment">// 1) Simplify conflict clause (a lot):</span> <a name="l01287"></a>01287 <span class="comment">// drop a literal if it is implied by the remaining lemma literals:</span> <a name="l01288"></a>01288 <span class="comment">// that is, as in 2), but also recursively taking the reasons</span> <a name="l01289"></a>01289 <span class="comment">// for the implying clause, and their reasone, and so on into consideration.</span> <a name="l01290"></a>01290 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a4ecef2c87d4be7bf5a0ba8b4e800e09c">d_expensive_ccmin</a>){ <a name="l01291"></a>01291 <span class="comment">// (maintain an abstraction of levels involved in conflict)</span> <a name="l01292"></a>01292 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> min_level = 0; <a name="l01293"></a>01293 <span class="keywordflow">for</span> (i = 1; i < out_learnt.size(); i++) <a name="l01294"></a>01294 min_level |= 1 << (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(out_learnt[i]) & 31); <a name="l01295"></a>01295 <a name="l01296"></a>01296 <span class="keywordflow">for</span> (i = j = 1; i < out_learnt.size(); i++) { <a name="l01297"></a>01297 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit(out_learnt[i]); <a name="l01298"></a>01298 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit) == <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>() || !<a class="code" href="classMiniSat_1_1Solver.html#ab91573c3ebb667e9e94f30f889598434">analyze_removable</a>(lit, min_level, pushID)) <a name="l01299"></a>01299 out_learnt[j++] = lit; <a name="l01300"></a>01300 } <a name="l01301"></a>01301 } <a name="l01302"></a>01302 <span class="comment">// 2) Simplify conflict clause (a little):</span> <a name="l01303"></a>01303 <span class="comment">// drop a literal if it is implied by the remaining lemma literals:</span> <a name="l01304"></a>01304 <span class="comment">// that is, if the other literals of its implying clause</span> <a name="l01305"></a>01305 <span class="comment">// are falsified by the other lemma literals.</span> <a name="l01306"></a>01306 <span class="keywordflow">else</span> { <a name="l01307"></a>01307 <span class="keywordflow">for</span> (i = j = 1; i < out_learnt.size(); i++) { <a name="l01308"></a>01308 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit(out_learnt[i]); <a name="l01309"></a>01309 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& c = *<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit); <a name="l01310"></a>01310 <span class="keywordflow">if</span> (&c == <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>()) { <a name="l01311"></a>01311 out_learnt[j++] = lit; <a name="l01312"></a>01312 } <span class="keywordflow">else</span> { <a name="l01313"></a>01313 <span class="keywordtype">bool</span> keep = <span class="keyword">false</span>; <a name="l01314"></a>01314 <span class="comment">// all literals of the implying clause must be:</span> <a name="l01315"></a>01315 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 1; !keep && k < c.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); k++) { <a name="l01316"></a>01316 <span class="keywordflow">if</span> ( <a name="l01317"></a>01317 <span class="comment">// already part of the lemma</span> <a name="l01318"></a>01318 !<a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[c[k].var()] <a name="l01319"></a>01319 && <a name="l01320"></a>01320 <span class="comment">// or falsified in the root level</span> <a name="l01321"></a>01321 <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(c[k]) != <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a> <a name="l01322"></a>01322 ) { <a name="l01323"></a>01323 <span class="comment">// failed, can't remove lit</span> <a name="l01324"></a>01324 out_learnt[j++] = lit; <a name="l01325"></a>01325 keep = <span class="keyword">true</span>; <a name="l01326"></a>01326 } <a name="l01327"></a>01327 } <a name="l01328"></a>01328 <span class="keywordflow">if</span> (!keep) { <a name="l01329"></a>01329 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.push_back(lit); <a name="l01330"></a>01330 } <a name="l01331"></a>01331 } <a name="l01332"></a>01332 } <a name="l01333"></a>01333 } <a name="l01334"></a>01334 <a name="l01335"></a>01335 out_learnt.resize(j); <a name="l01336"></a>01336 } <a name="l01337"></a>01337 <a name="l01338"></a>01338 <span class="comment">// clean seen for simplification and log derivation</span> <a name="l01339"></a>01339 <span class="comment">// do this in reverse chronological order of variable assignment</span> <a name="l01340"></a>01340 <span class="comment">// in combination with removing duplication literals after each resolution step</span> <a name="l01341"></a>01341 <span class="comment">// this allows to resolve on each literal only once,</span> <a name="l01342"></a>01342 <span class="comment">// as it depends only on literals (its clause contains only literals)</span> <a name="l01343"></a>01343 <span class="comment">// which were assigned earlier.</span> <a name="l01344"></a>01344 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) { <a name="l01345"></a>01345 std::sort(<a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.begin(), <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.end(), <a class="code" href="classlastToFirst__lt.html">lastToFirst_lt</a>(<a class="code" href="classMiniSat_1_1Solver.html#a31a1d57eabc2169a4a9fc1cf4c87a2a7">d_trail_pos</a>)); <a name="l01346"></a>01346 } <a name="l01347"></a>01347 <span class="keywordflow">for</span> (vector<Lit>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.end(); ++i) { <a name="l01348"></a>01348 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit(*i); <a name="l01349"></a>01349 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[lit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 0; <a name="l01350"></a>01350 <a name="l01351"></a>01351 <span class="comment">// if this literal is falsified in the root level,</span> <a name="l01352"></a>01352 <span class="comment">// but not implied in the current push level,</span> <a name="l01353"></a>01353 <span class="comment">// and the lemma is currently valid in levels lower than the current push level,</span> <a name="l01354"></a>01354 <span class="comment">// then don't remove the literal.</span> <a name="l01355"></a>01355 <span class="comment">// instead move it to the end of the lemma,</span> <a name="l01356"></a>01356 <span class="comment">// so that it won't hurt performance.</span> <a name="l01357"></a>01357 <span class="keywordflow">if</span> (out_learnt.size() > 0 <span class="comment">// found the empty clause, so remove all literals</span> <a name="l01358"></a>01358 && <a name="l01359"></a>01359 <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a> <a name="l01360"></a>01360 && <a name="l01361"></a>01361 <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) > pushID <a name="l01362"></a>01362 && <a name="l01363"></a>01363 !<a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.empty() <a name="l01364"></a>01364 && <a name="l01365"></a>01365 <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) > <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.front().d_clauseID <a name="l01366"></a>01366 ) { <a name="l01367"></a>01367 out_learnt.push_back(lit); <a name="l01368"></a>01368 <span class="keywordflow">continue</span>; <a name="l01369"></a>01369 } <a name="l01370"></a>01370 <a name="l01371"></a>01371 <span class="comment">// update the push level and the derivation wrt. the removed literal</span> <a name="l01372"></a>01372 <a name="l01373"></a>01373 pushID = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">max</a>(pushID, <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit)); <a name="l01374"></a>01374 <a name="l01375"></a>01375 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) { <a name="l01376"></a>01376 <span class="comment">// resolve on each removed literal with its reason</span> <a name="l01377"></a>01377 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) { <a name="l01378"></a>01378 inference-><a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(lit, <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()->computeRootReason(~lit, <span class="keyword">this</span>)); <a name="l01379"></a>01379 } <a name="l01380"></a>01380 <span class="keywordflow">else</span> { <a name="l01381"></a>01381 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* reason = <a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit); <a name="l01382"></a>01382 inference-><a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(lit, reason); <a name="l01383"></a>01383 } <a name="l01384"></a>01384 } <a name="l01385"></a>01385 } <a name="l01386"></a>01386 <a name="l01387"></a>01387 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.clear(); <a name="l01388"></a>01388 } <a name="l01389"></a>01389 <a name="l01390"></a>01390 <a name="l01391"></a>01391 <span class="comment">// Check if 'p' can be removed. 'min_level' is used to abort early if visiting literals at a level that cannot be removed.</span> <a name="l01392"></a>01392 <span class="comment">//</span> <a name="l01393"></a>01393 <span class="comment">// 'p' can be removed if it depends only on literals</span> <a name="l01394"></a>01394 <span class="comment">// on which they other conflict clause literals do depend as well.</span> <a name="l01395"></a><a class="code" href="classMiniSat_1_1Solver.html#ab91573c3ebb667e9e94f30f889598434">01395</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#ab91573c3ebb667e9e94f30f889598434">Solver::analyze_removable</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> min_level, <span class="keywordtype">int</span> pushID) { <a name="l01396"></a>01396 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(p) != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>(), <span class="stringliteral">"MiniSat::Solver::analyze_removable: p is a decision."</span>); <a name="l01397"></a>01397 <a name="l01398"></a>01398 <a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.clear(); <a name="l01399"></a>01399 <a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.push_back(p); <a name="l01400"></a>01400 <span class="keywordtype">int</span> top = <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.size(); <a name="l01401"></a>01401 <a name="l01402"></a>01402 <span class="keywordflow">while</span> (<a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.size() > 0){ <a name="l01403"></a>01403 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.back()) != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>(), <a name="l01404"></a>01404 <span class="stringliteral">"MiniSat::Solver::analyze_removable: stack var is a decision."</span>); <a name="l01405"></a>01405 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.back()) != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>(), <a name="l01406"></a>01406 <span class="stringliteral">"MiniSat::Solver::analyze_removable: stack var is an unresolved theory implication."</span>); <a name="l01407"></a>01407 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& c = *<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.back()); <a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.pop_back(); <a name="l01408"></a>01408 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < c.size(); i++) { <a name="l01409"></a>01409 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p = c[i]; <a name="l01410"></a>01410 <span class="comment">// ignore literals already considered or implied at root level</span> <a name="l01411"></a>01411 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()]) { <a name="l01412"></a>01412 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(p) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) { <a name="l01413"></a>01413 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.push_back(p); <a name="l01414"></a>01414 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 1; <a name="l01415"></a>01415 } <a name="l01416"></a>01416 <span class="keywordflow">else</span> { <a name="l01417"></a>01417 <span class="comment">// min_level is a precheck,</span> <a name="l01418"></a>01418 <span class="comment">// only try to remove literals which might be implied,</span> <a name="l01419"></a>01419 <span class="comment">// at least wrt. to the abstraction min_level</span> <a name="l01420"></a>01420 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(p) != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>() && ((1 << (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(p) & 31)) & min_level) != 0){ <a name="l01421"></a>01421 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()] = 1; <a name="l01422"></a>01422 <a class="code" href="classMiniSat_1_1Solver.html#aede680f26ad5344891484b6f821de222">d_analyze_stack</a>.push_back(p); <a name="l01423"></a>01423 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.push_back(p); <a name="l01424"></a>01424 } <span class="keywordflow">else</span> { <a name="l01425"></a>01425 <span class="comment">// failed, so undo changes to seen literals/redundant and return</span> <a name="l01426"></a>01426 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = top; j < <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.size(); ++j) { <a name="l01427"></a>01427 <a class="code" href="classMiniSat_1_1Solver.html#ae2fd56e35cc318aed56d10fc7e5af484" title="Temporaries (to reduce allocation overhead).">d_analyze_seen</a>[<a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>[j].var()] = 0; <a name="l01428"></a>01428 } <a name="l01429"></a>01429 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.resize(top); <a name="l01430"></a>01430 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01431"></a>01431 } <a name="l01432"></a>01432 } <a name="l01433"></a>01433 } <a name="l01434"></a>01434 } <a name="l01435"></a>01435 } <a name="l01436"></a>01436 <a name="l01437"></a>01437 <a class="code" href="classMiniSat_1_1Solver.html#a81ed0225fec06bae415c6d86c86781f1">d_analyze_redundant</a>.push_back(p); <a name="l01438"></a>01438 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01439"></a>01439 } <a name="l01440"></a>01440 <a name="l01441"></a>01441 <a name="l01442"></a>01442 <a name="l01443"></a><a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">01443</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">Solver::isImpliedAt</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit, <span class="keywordtype">int</span> clausePushID)<span class="keyword"> const </span>{ <a name="l01444"></a>01444 <span class="keywordflow">return</span> <a name="l01445"></a>01445 <span class="comment">// literal asserted before first push</span> <a name="l01446"></a>01446 (<a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.empty() || <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) <= <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.front().d_clauseID) <a name="l01447"></a>01447 || <a name="l01448"></a>01448 <span class="comment">// or literal depends only on clauses added before given clause</span> <a name="l01449"></a>01449 <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) < clausePushID; <a name="l01450"></a>01450 <a name="l01451"></a>01451 } <a name="l01452"></a>01452 <a name="l01453"></a>01453 <a name="l01454"></a>01454 <span class="comment">// Can assume everything has been propagated! (esp. the first two literals are != l_False, unless</span> <a name="l01455"></a>01455 <span class="comment">// the clause is binary and satisfied, in which case the first literal is true)</span> <a name="l01456"></a>01456 <span class="comment">// Returns True if clause is satisfied (will be removed), False otherwise.</span> <a name="l01457"></a>01457 <span class="comment">//</span> <a name="l01458"></a><a class="code" href="classMiniSat_1_1Solver.html#ad64d6215811b4c4ca6c5ac86da4c787d">01458</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#ad64d6215811b4c4ca6c5ac86da4c787d">Solver::isPermSatisfied</a>(<a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c)<span class="keyword"> const </span>{ <a name="l01459"></a>01459 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < c-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); i++){ <a name="l01460"></a>01460 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit((*c)[i]); <a name="l01461"></a>01461 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(lit) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a> <a name="l01462"></a>01462 && <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a> <a name="l01463"></a>01463 && <a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">isImpliedAt</a>(lit, c-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>()) <a name="l01464"></a>01464 ) <a name="l01465"></a>01465 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01466"></a>01466 } <a name="l01467"></a>01467 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01468"></a>01468 } <a name="l01469"></a>01469 <a name="l01470"></a>01470 <a name="l01471"></a>01471 <a name="l01472"></a>01472 <span class="comment">// a split decision, returns FALSE if immediate conflict.</span> <a name="l01473"></a><a class="code" href="classMiniSat_1_1Solver.html#a48e255f2f05f6d56518c8e8925b30639">01473</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a48e255f2f05f6d56518c8e8925b30639">Solver::assume</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p) { <a name="l01474"></a>01474 <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.push_back(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size()); <a name="l01475"></a>01475 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a8bcaa8cbf6c443908d1b7be97a7109e8">max_level</a> = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">std::max</a>(<a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.size(), <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a>(<a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a8bcaa8cbf6c443908d1b7be97a7109e8">max_level</a>)); <a name="l01476"></a>01476 <span class="keywordflow">return</span> <a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>(p, <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(), <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>()); <a name="l01477"></a>01477 } <a name="l01478"></a>01478 <a name="l01479"></a>01479 <a name="l01480"></a>01480 <span class="comment">// Revert to the state at given level, assert conflict clause and pending clauses</span> <a name="l01481"></a><a class="code" href="classMiniSat_1_1Solver.html#a49421463a8047553ffbd5fc9d04c0ad8">01481</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a49421463a8047553ffbd5fc9d04c0ad8">Solver::backtrack</a>(<span class="keywordtype">int</span> toLevel, <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* learnt_clause) { <a name="l01482"></a>01482 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a> (<a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() > toLevel, <span class="stringliteral">"MiniSat::Solver::backtrack: backtrack not to previous level"</span>); <a name="l01483"></a>01483 <a name="l01484"></a>01484 <span class="comment">// backtrack theories</span> <a name="l01485"></a>01485 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(toLevel >= <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>, <span class="stringliteral">"MiniSat::Solver::backtrack: backtrack beyond root level"</span>); <a name="l01486"></a>01486 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = toLevel; i < <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(); ++i) { <a name="l01487"></a>01487 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a51a08aab04c2185513676a316aee14b4" title="Restore most recent checkpoint.">pop</a>(); <a name="l01488"></a>01488 } <a name="l01489"></a>01489 <a name="l01490"></a>01490 <span class="comment">// backtrack trail</span> <a name="l01491"></a>01491 <span class="keywordtype">int</span> trail_size = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); <a name="l01492"></a>01492 <span class="keywordtype">int</span> trail_jump = <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>[toLevel]; <a name="l01493"></a>01493 <span class="keywordtype">int</span> first_invalid = <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>[toLevel]; <a name="l01494"></a>01494 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = first_invalid; c < trail_size; ++c) { <a name="l01495"></a>01495 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> x = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[c].var(); <a name="l01496"></a>01496 <span class="comment">// only remove enqueued elements which are not still implied after backtracking</span> <a name="l01497"></a>01497 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(x) > toLevel) { <a name="l01498"></a>01498 <span class="comment">//setLevel(x, -1);</span> <a name="l01499"></a>01499 <a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a>[x] = <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>); <a name="l01500"></a>01500 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a> [x] = NULL; <a name="l01501"></a>01501 <span class="comment">//d_pushIDs[x] = -1;</span> <a name="l01502"></a>01502 <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a9a5913c635dc1c57cd1127a8af30eefb">undo</a>(x); <a name="l01503"></a>01503 } <a name="l01504"></a>01504 <span class="keywordflow">else</span> { <a name="l01505"></a>01505 <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[first_invalid] = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[c]; <a name="l01506"></a>01506 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a31a1d57eabc2169a4a9fc1cf4c87a2a7">d_trail_pos</a>[x] = first_invalid; <a name="l01507"></a>01507 ++first_invalid; <a name="l01508"></a>01508 } <a name="l01509"></a>01509 } <a name="l01510"></a>01510 <span class="comment">// shrink queue</span> <a name="l01511"></a>01511 <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.resize(first_invalid); <a name="l01512"></a>01512 <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.resize(toLevel); <a name="l01513"></a>01513 <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> = trail_jump; <a name="l01514"></a>01514 <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> = <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>; <a name="l01515"></a>01515 <a name="l01516"></a>01516 <span class="comment">// insert lemma</span> <a name="l01517"></a>01517 <span class="comment">// we want to insert the lemma before the original conflicting clause,</span> <a name="l01518"></a>01518 <span class="comment">// so that propagation is done on the lemma instead of that clause.</span> <a name="l01519"></a>01519 <span class="comment">// as that clause might be a theory clause in d_pendingClauses,</span> <a name="l01520"></a>01520 <span class="comment">// the lemma has to be inserted before the pending clauses are added.</span> <a name="l01521"></a>01521 <a class="code" href="classMiniSat_1_1Solver.html#aa0d36a2c07c88350dd9d54e62b3cef7b">insertClause</a>(learnt_clause); <a name="l01522"></a>01522 <a name="l01523"></a>01523 <a name="l01524"></a>01524 <span class="comment">// enqueue clauses which were conflicting in previous assignment</span> <a name="l01525"></a>01525 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && !<a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.empty()) { <a name="l01526"></a>01526 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* c = <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.front(); <a name="l01527"></a>01527 <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.pop(); <a name="l01528"></a>01528 <a class="code" href="classMiniSat_1_1Solver.html#a36711ef6cb28057fa6f00235f58c03ff">addClause</a>(*c, <span class="keyword">true</span>); <a name="l01529"></a>01529 <a class="code" href="namespaceMiniSat.html#acbe7b3fac8ab3909327207b0fea1f4d8">xfree</a>(c); <a name="l01530"></a>01530 } <a name="l01531"></a>01531 <a name="l01532"></a>01532 <a name="l01533"></a>01533 <span class="comment">// deallocate explanations for theory implications</span> <a name="l01534"></a>01534 <span class="comment">// which have been retracted and are thus not needed anymore.</span> <a name="l01535"></a>01535 <span class="comment">//</span> <a name="l01536"></a>01536 <span class="comment">// not necessarily ordered by level,</span> <a name="l01537"></a>01537 <span class="comment">// so stackwise deallocation by level does not necessarily remove</span> <a name="l01538"></a>01538 <span class="comment">// all possible explanations as soon as possible.</span> <a name="l01539"></a>01539 <span class="comment">// still, should be a good enough compromise between speed and completeness.</span> <a name="l01540"></a>01540 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>; <a name="l01541"></a>01541 <span class="keywordflow">while</span> (!done && !<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.empty()) { <a name="l01542"></a>01542 std::pair<int, Clause*> pair = <a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.top(); <a name="l01543"></a>01543 <span class="keywordflow">if</span> (pair.first > toLevel) { <a name="l01544"></a>01544 <a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.pop(); <a name="l01545"></a>01545 <span class="keyword">remove</span>(pair.second, <span class="keyword">true</span>); <a name="l01546"></a>01546 } <a name="l01547"></a>01547 <span class="keywordflow">else</span> { <a name="l01548"></a>01548 done = <span class="keyword">true</span>; <a name="l01549"></a>01549 } <a name="l01550"></a>01550 } <a name="l01551"></a>01551 } <a name="l01552"></a>01552 <a name="l01553"></a>01553 <a name="l01554"></a>01554 <span class="comment">/*_________________________________________________________________________________________________</span> <a name="l01555"></a>01555 <span class="comment">|</span> <a name="l01556"></a>01556 <span class="comment">| enqueue : (p : Lit) (from : Clause*) -> [bool]</span> <a name="l01557"></a>01557 <span class="comment">| </span> <a name="l01558"></a>01558 <span class="comment">| Description:</span> <a name="l01559"></a>01559 <span class="comment">| Puts a new fact on the propagation queue as well as immediately updating the variable's value.</span> <a name="l01560"></a>01560 <span class="comment">| Should a conflict arise, FALSE is returned.</span> <a name="l01561"></a>01561 <span class="comment">| </span> <a name="l01562"></a>01562 <span class="comment">| Input:</span> <a name="l01563"></a>01563 <span class="comment">| p - The fact to enqueue</span> <a name="l01564"></a>01564 <span class="comment">| decisionLevel - The level from which on this propagation/decision holds.</span> <a name="l01565"></a>01565 <span class="comment">| if a clause is added in a non-root level, there might be propagations</span> <a name="l01566"></a>01566 <span class="comment">| which are not only valid in the current, but also earlier levels.</span> <a name="l01567"></a>01567 <span class="comment">| from - [Optional] Fact propagated from this (currently) unit clause. Stored in 'reason[]'.</span> <a name="l01568"></a>01568 <span class="comment">| Default value is NULL (no reason).</span> <a name="l01569"></a>01569 <span class="comment">| GClause::s_theoryImplication means theory implication where explanation</span> <a name="l01570"></a>01570 <span class="comment">| has not been retrieved yet.</span> <a name="l01571"></a>01571 <span class="comment">| </span> <a name="l01572"></a>01572 <span class="comment">| Output:</span> <a name="l01573"></a>01573 <span class="comment">| TRUE if fact was enqueued without conflict, FALSE otherwise.</span> <a name="l01574"></a>01574 <span class="comment">|________________________________________________________________________________________________@*/</span> <a name="l01575"></a><a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">01575</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">Solver::enqueue</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p, <span class="keywordtype">int</span> decisionLevel, <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* from) { <a name="l01576"></a>01576 <a class="code" href="classMiniSat_1_1lbool.html">lbool</a> value(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(p)); <a name="l01577"></a>01577 <span class="keywordflow">if</span> (value != <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>) { <a name="l01578"></a>01578 <span class="keywordflow">return</span> value != <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>; <a name="l01579"></a>01579 } <a name="l01580"></a>01580 <span class="keywordflow">else</span> { <a name="l01581"></a>01581 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> var(p.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()); <a name="l01582"></a>01582 <a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a>[var] = <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="classMiniSat_1_1lbool.html">lbool</a>(p.<a class="code" href="classMiniSat_1_1Lit.html#a75dadacca265ff92462528f29f1fcfd8">sign</a>())); <a name="l01583"></a>01583 <a class="code" href="classMiniSat_1_1Solver.html#adf6fbd3cddfa511acae41f180b187454">setLevel</a>(var, decisionLevel); <a name="l01584"></a>01584 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a> [var] = from; <a name="l01585"></a>01585 <a class="code" href="classMiniSat_1_1Solver.html#a07e86f7cb7f6a34c4e28df990cbf43d1">setPushID</a>(var, from); <a name="l01586"></a>01586 <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.push_back(p); <a name="l01587"></a>01587 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a31a1d57eabc2169a4a9fc1cf4c87a2a7">d_trail_pos</a>[var] = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); <a name="l01588"></a>01588 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01589"></a>01589 } <a name="l01590"></a>01590 } <a name="l01591"></a>01591 <a name="l01592"></a>01592 <a name="l01593"></a>01593 <span class="comment">/*_________________________________________________________________________________________________</span> <a name="l01594"></a>01594 <span class="comment">|</span> <a name="l01595"></a>01595 <span class="comment">| propagate : [void] -> [Clause*]</span> <a name="l01596"></a>01596 <span class="comment">| </span> <a name="l01597"></a>01597 <span class="comment">| Description:</span> <a name="l01598"></a>01598 <span class="comment">| Propagates one enqueued fact. If a conflict arises, updateConflict is called.</span> <a name="l01599"></a>01599 <span class="comment">|________________________________________________________________________________________________@*/</span> <a name="l01600"></a>01600 <a name="l01601"></a>01601 <span class="comment">// None:</span> <a name="l01602"></a>01602 <span class="comment">//</span> <a name="l01603"></a>01603 <span class="comment">// due to theory clauses and lazy retrieval of theory implications we get propagations</span> <a name="l01604"></a>01604 <span class="comment">// out of any chronological order.</span> <a name="l01605"></a>01605 <span class="comment">// therefore it is not guaranteed that in a propagating clause</span> <a name="l01606"></a>01606 <span class="comment">// the first two literals (the watched literals) have the highest decision level.</span> <a name="l01607"></a>01607 <span class="comment">//</span> <a name="l01608"></a>01608 <span class="comment">// this doesn't matter, though, it suffices to ensure that</span> <a name="l01609"></a>01609 <span class="comment">// if there are less than two undefined literals in a clause,</span> <a name="l01610"></a>01610 <span class="comment">// than these are at the first two positions?</span> <a name="l01611"></a>01611 <span class="comment">//</span> <a name="l01612"></a>01612 <span class="comment">// Reasoning, for eager retrieval of explanations for theory implications:</span> <a name="l01613"></a>01613 <span class="comment">// case analysis for first two positions:</span> <a name="l01614"></a>01614 <span class="comment">// 1) TRUE, TRUE</span> <a name="l01615"></a>01615 <span class="comment">// then the clause is satisfied until after backtracking</span> <a name="l01616"></a>01616 <span class="comment">// the first two literals are undefined, or we get case 2) TRUE, FALSE</span> <a name="l01617"></a>01617 <span class="comment">//</span> <a name="l01618"></a>01618 <span class="comment">// 2) TRUE, FALSE</span> <a name="l01619"></a>01619 <span class="comment">// if TRUE is true because it is a theory implication of FALSE,</span> <a name="l01620"></a>01620 <span class="comment">// this is fine, as TRUE and FALSE will be backtracked at the same time,</span> <a name="l01621"></a>01621 <span class="comment">// and then both literals will be undefined.</span> <a name="l01622"></a>01622 <span class="comment">//</span> <a name="l01623"></a>01623 <span class="comment">// this holds in general if TRUE was set before FALSE was set,</span> <a name="l01624"></a>01624 <span class="comment">// so this case is fine.</span> <a name="l01625"></a>01625 <span class="comment">//</span> <a name="l01626"></a>01626 <span class="comment">// and TRUE can't be set after FALSE was set,</span> <a name="l01627"></a>01627 <span class="comment">// as this would imply that all other literals are falsified as well</span> <a name="l01628"></a>01628 <span class="comment">// (otherwise the FALSE literal would be replace by an undefined/satisfied literal),</span> <a name="l01629"></a>01629 <span class="comment">// and then TRUE would be implied at the same level as FALSE</span> <a name="l01630"></a>01630 <span class="comment">//</span> <a name="l01631"></a>01631 <span class="comment">// 3) FALSE, TRUE</span> <a name="l01632"></a>01632 <span class="comment">// can not happen, falsifying the first literal will reorder this to TRUE, FALSE</span> <a name="l01633"></a>01633 <span class="comment">//</span> <a name="l01634"></a>01634 <span class="comment">// 4) FALSE, FALSE</span> <a name="l01635"></a>01635 <span class="comment">// Both literals must be falsified at the current level,</span> <a name="l01636"></a>01636 <span class="comment">// as falsifying one triggers unit propagation on the other in the same level.</span> <a name="l01637"></a>01637 <span class="comment">// so after backtracking both are undefined.</span> <a name="l01638"></a>01638 <span class="comment">//</span> <a name="l01639"></a>01639 <span class="comment">//</span> <a name="l01640"></a>01640 <span class="comment">// now, if explanations for theory implications are retrieved lazily,</span> <a name="l01641"></a>01641 <span class="comment">// then the level in which a literal was set might change later on.</span> <a name="l01642"></a>01642 <span class="comment">// i.e. first it is assumed to be of the level in which the theory implication happened,</span> <a name="l01643"></a>01643 <span class="comment">// but later on, when checking its explanation,</span> <a name="l01644"></a>01644 <span class="comment">// the real level might be calculated to be an earlier level.</span> <a name="l01645"></a>01645 <span class="comment">//</span> <a name="l01646"></a>01646 <span class="comment">// this means, when the original level was L and the real level is K,</span> <a name="l01647"></a>01647 <span class="comment">// that this literal is going to be undefined when backtracking before L,</span> <a name="l01648"></a>01648 <span class="comment">// but is immediately propagated again if the new level is >= K.</span> <a name="l01649"></a>01649 <span class="comment">// this is done until level K is reached,</span> <a name="l01650"></a>01650 <span class="comment">// then this literal behaves like any ordinary literal.</span> <a name="l01651"></a>01651 <span class="comment">// (ensured by backtrack)</span> <a name="l01652"></a>01652 <span class="comment">//</span> <a name="l01653"></a>01653 <span class="comment">// case analysis for first two positions:</span> <a name="l01654"></a>01654 <span class="comment">// 1) TRUE, TRUE</span> <a name="l01655"></a>01655 <span class="comment">// same as before</span> <a name="l01656"></a>01656 <span class="comment">//</span> <a name="l01657"></a>01657 <span class="comment">// 2) TRUE, FALSE</span> <a name="l01658"></a>01658 <span class="comment">// the new case is that TRUE was initially of level <= FALSE,</span> <a name="l01659"></a>01659 <span class="comment">// but now FALSE is set to a level < TRUE.</span> <a name="l01660"></a>01660 <span class="comment">//</span> <a name="l01661"></a>01661 <span class="comment">// then when on backtracking TRUE is unset,</span> <a name="l01662"></a>01662 <span class="comment">// FALSE will also be unset, but then right away be set to FALSE again,</span> <a name="l01663"></a>01663 <span class="comment">// so they work fine as watched literals.</span> <a name="l01664"></a>01664 <span class="comment">//</span> <a name="l01665"></a>01665 <span class="comment">// 3) FALSE, TRUE</span> <a name="l01666"></a>01666 <span class="comment">// same as before</span> <a name="l01667"></a>01667 <span class="comment">//</span> <a name="l01668"></a>01668 <span class="comment">// 4) FALSE, FALSE</span> <a name="l01669"></a>01669 <span class="comment">// if the level of both literals is unchanged,</span> <a name="l01670"></a>01670 <span class="comment">// changes in other literals don't matter,</span> <a name="l01671"></a>01671 <span class="comment">// as after backtracking both are undefined (same as before)</span> <a name="l01672"></a>01672 <span class="comment">//</span> <a name="l01673"></a>01673 <span class="comment">// if for one of the two (or both) the level is changed,</span> <a name="l01674"></a>01674 <span class="comment">// after backtracking it will be falsified again immediately,</span> <a name="l01675"></a>01675 <span class="comment">// and the watched literal works as expected:</span> <a name="l01676"></a>01676 <span class="comment">// either the other literal is propagated,</span> <a name="l01677"></a>01677 <span class="comment">// or there is now an undefined literal in the rest of the clause</span> <a name="l01678"></a>01678 <span class="comment">// which becomes the new watched literal.</span> <a name="l01679"></a>01679 <span class="comment">//</span> <a name="l01680"></a>01680 <span class="comment">// changes in the rest of the clause are of no consequence,</span> <a name="l01681"></a>01681 <span class="comment">// as they are assumed to be false in the conflict level,</span> <a name="l01682"></a>01682 <span class="comment">// changes in their level do not change this,</span> <a name="l01683"></a>01683 <span class="comment">// and after backtracking they are again taken into consideration</span> <a name="l01684"></a>01684 <span class="comment">// for finding a new watched literal.</span> <a name="l01685"></a>01685 <span class="comment">//</span> <a name="l01686"></a>01686 <span class="comment">// so, even for lazy retrieval of theory implication explanations</span> <a name="l01687"></a>01687 <span class="comment">// there is no need to explicitly set the 2nd watched literal</span> <a name="l01688"></a>01688 <span class="comment">// to the most recently falsified one.</span> <a name="l01689"></a><a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">01689</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">Solver::propagate</a>() { <a name="l01690"></a>01690 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> p = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>++]; <span class="comment">// 'p' is enqueued fact to propagate.</span> <a name="l01691"></a>01691 vector<Clause*>& ws = <a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(p); <a name="l01692"></a>01692 <a name="l01693"></a>01693 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a615f23871d55f1adcac61e4803aff7d6">propagations</a>++; <a name="l01694"></a>01694 --<a class="code" href="classMiniSat_1_1Solver.html#a4f2b0a42acb3d470ca9500b2f4fd8077">d_simpDB_props</a>; <a name="l01695"></a>01695 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(p) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) ++<a class="code" href="classMiniSat_1_1Solver.html#ac114e23a9bd1329c9002eb758c1595b7">d_simpDB_assigns</a>; <a name="l01696"></a>01696 <a name="l01697"></a>01697 <span class="comment">// propagate p to theories</span> <a name="l01698"></a>01698 <span class="keywordflow">if</span> (!<a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">defer_theory_propagation</a>) { <a name="l01699"></a>01699 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a3b3ef70567e0298cd3e971fd57d26fa6" title="Notify theory when a literal is set to true.">assertLit</a>(<a class="code" href="namespaceMiniSat.html#a72756c106b9bd53cf77c2aab214e7cf5">miniSatToCVC</a>(p)); <a name="l01700"></a>01700 ++<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>; <a name="l01701"></a>01701 } <a name="l01702"></a>01702 <a name="l01703"></a>01703 vector<Clause*>::iterator j = ws.begin(); <a name="l01704"></a>01704 vector<Clause*>::iterator i = ws.begin(); <a name="l01705"></a>01705 vector<Clause*>::iterator end = ws.end(); <a name="l01706"></a>01706 <span class="keywordflow">while</span> (i != end) { <a name="l01707"></a>01707 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& c = **i; <a name="l01708"></a>01708 ++i; <a name="l01709"></a>01709 <a name="l01710"></a>01710 <span class="comment">// Make sure the false literal is data[1]:</span> <a name="l01711"></a>01711 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> false_lit = ~p; <a name="l01712"></a>01712 <span class="keywordflow">if</span> (c[0] == false_lit) { <a name="l01713"></a>01713 c[0] = c[1]; <a name="l01714"></a>01714 c[1] = false_lit; <a name="l01715"></a>01715 } <a name="l01716"></a>01716 <a name="l01717"></a>01717 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> first = c[0]; <a name="l01718"></a>01718 <a class="code" href="classMiniSat_1_1lbool.html">lbool</a> val = <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(first); <a name="l01719"></a>01719 <a name="l01720"></a>01720 <span class="comment">// If 0th watch is true, then clause is already satisfied.</span> <a name="l01721"></a>01721 <span class="keywordflow">if</span> (val == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) { <a name="l01722"></a>01722 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(c[0]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a> && <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(c[1]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l01723"></a>01723 <span class="stringliteral">"MiniSat::Solver:::propagate: True/False"</span>); <a name="l01724"></a>01724 *j = &c; ++j; <a name="l01725"></a>01725 } <a name="l01726"></a>01726 <span class="comment">// Look for new watch:</span> <a name="l01727"></a>01727 <span class="keywordflow">else</span> { <a name="l01728"></a>01728 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 2; k < c.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); k++) { <a name="l01729"></a>01729 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(c[k]) != <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l01730"></a>01730 c[1] = c[k]; <a name="l01731"></a>01731 c[k] = false_lit; <a name="l01732"></a>01732 <a class="code" href="classMiniSat_1_1Solver.html#af3891961fe824bc91b47b59ee1e4a90b">addWatch</a>(~c[1], &c); <a name="l01733"></a>01733 <span class="keywordflow">goto</span> FoundWatch; <a name="l01734"></a>01734 } <a name="l01735"></a>01735 } <a name="l01736"></a>01736 <a name="l01737"></a>01737 <span class="comment">// Did not find watch -- clause is unit under assignment:</span> <a name="l01738"></a>01738 <a name="l01739"></a>01739 <span class="comment">// check that all other literals are false</span> <a name="l01740"></a>01740 <a class="code" href="debug_8h.html#a600cb2d68efe7cc413cccbb5714c7016">IF_DEBUG</a>( <a name="l01741"></a>01741 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> z = 1; z < c.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++z) { <a name="l01742"></a>01742 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(c[z]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>, <a name="l01743"></a>01743 <span class="stringliteral">"MiniSat::Solver:::propagate: Unit Propagation"</span>); <a name="l01744"></a>01744 } <a name="l01745"></a>01745 ) <a name="l01746"></a>01746 <a name="l01747"></a>01747 *j = &c; ++j; <a name="l01748"></a>01748 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>(first, <a class="code" href="classMiniSat_1_1Solver.html#a4d5144ec81209e86f7374972b8a78aa0">getImplicationLevel</a>(c), &c)){ <a name="l01749"></a>01749 <span class="comment">// clause is conflicting</span> <a name="l01750"></a>01750 <a class="code" href="classMiniSat_1_1Solver.html#abe256fba9eac8bb202c8c58c87b1bb82">updateConflict</a>(&c); <a name="l01751"></a>01751 <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); <a name="l01752"></a>01752 <a name="l01753"></a>01753 <span class="comment">// remove gap created by watches for which a new watch has been picked</span> <a name="l01754"></a>01754 <span class="keywordflow">if</span> (i != j) ws.erase(j, i); <a name="l01755"></a>01755 <span class="keywordflow">return</span>; <a name="l01756"></a>01756 } <a name="l01757"></a>01757 <a name="l01758"></a>01758 FoundWatch:; <a name="l01759"></a>01759 } <a name="l01760"></a>01760 } <a name="l01761"></a>01761 <a name="l01762"></a>01762 <span class="comment">// remove gap created by watches for which a new watch has been picked</span> <a name="l01763"></a>01763 ws.erase(j, ws.end()); <a name="l01764"></a>01764 } <a name="l01765"></a>01765 <a name="l01766"></a>01766 <a name="l01767"></a>01767 <span class="comment">/*_________________________________________________________________________________________________</span> <a name="l01768"></a>01768 <span class="comment">|</span> <a name="l01769"></a>01769 <span class="comment">| reduceDB : () -> [void]</span> <a name="l01770"></a>01770 <span class="comment">| </span> <a name="l01771"></a>01771 <span class="comment">| Description:</span> <a name="l01772"></a>01772 <span class="comment">| Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked</span> <a name="l01773"></a>01773 <span class="comment">| clauses are clauses that are reason to some assignment. Binary clauses are never removed.</span> <a name="l01774"></a>01774 <span class="comment">|________________________________________________________________________________________________@*/</span> <a name="l01775"></a><a class="code" href="structreduceDB__lt.html">01775</a> <span class="keyword">struct </span><a class="code" href="structreduceDB__lt.html">reduceDB_lt</a> { <a name="l01776"></a><a class="code" href="structreduceDB__lt.html#aa7592e52bef15952453dc48ca7c45ecf">01776</a> <span class="keywordtype">bool</span> operator () (<a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* x, <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* y) { <a name="l01777"></a>01777 <span class="keywordflow">return</span> x-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() > 2 && (y-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 2 || x-><a class="code" href="classMiniSat_1_1Clause.html#af64021472c748c6adbfb88238cae5a9d">activity</a>() < y-><a class="code" href="classMiniSat_1_1Clause.html#af64021472c748c6adbfb88238cae5a9d">activity</a>()); <a name="l01778"></a>01778 } <a name="l01779"></a>01779 }; <a name="l01780"></a>01780 <a name="l01781"></a><a class="code" href="classMiniSat_1_1Solver.html#a62eea2c00917497fbfb843bf9ca4482e">01781</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a62eea2c00917497fbfb843bf9ca4482e">Solver::reduceDB</a>() { <a name="l01782"></a>01782 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a05f292ab1b5be5cdbe9d005c2723aec2">lm_simpl</a>++; <a name="l01783"></a>01783 <a name="l01784"></a>01784 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i, j; <a name="l01785"></a>01785 <span class="keywordtype">double</span> extra_lim = <a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a> / <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); <span class="comment">// Remove any clause below this activity</span> <a name="l01786"></a>01786 <a name="l01787"></a>01787 std::sort(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.begin(), <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.end(), <a class="code" href="structreduceDB__lt.html">reduceDB_lt</a>()); <a name="l01788"></a>01788 <span class="keywordflow">for</span> (i = j = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size() / 2; i++){ <a name="l01789"></a>01789 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]->size() > 2 && !<a class="code" href="classMiniSat_1_1Solver.html#a344d9206f065425f276b408e86b7e1d3">isReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i])) <a name="l01790"></a>01790 <span class="keyword">remove</span>(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]); <a name="l01791"></a>01791 <span class="keywordflow">else</span> <a name="l01792"></a>01792 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[j++] = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]; <a name="l01793"></a>01793 } <a name="l01794"></a>01794 <span class="keywordflow">for</span> (; i < <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); i++){ <a name="l01795"></a>01795 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]->size() > 2 && !<a class="code" href="classMiniSat_1_1Solver.html#a344d9206f065425f276b408e86b7e1d3">isReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]) && <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]->activity() < extra_lim) <a name="l01796"></a>01796 <span class="keyword">remove</span>(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]); <a name="l01797"></a>01797 <span class="keywordflow">else</span> <a name="l01798"></a>01798 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[j++] = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]; <a name="l01799"></a>01799 } <a name="l01800"></a>01800 <a name="l01801"></a>01801 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.resize(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size() - (i - j), NULL); <a name="l01802"></a>01802 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a516c7e93fc14492cadd8215bec03b788">del_lemmas</a> += (i - j); <a name="l01803"></a>01803 <a name="l01804"></a>01804 <a class="code" href="classMiniSat_1_1Solver.html#ac380f5046f3dddbb0bdebf4107d8d506">d_simpRD_learnts</a> = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); <a name="l01805"></a>01805 } <a name="l01806"></a>01806 <a name="l01807"></a>01807 <a name="l01808"></a>01808 <span class="comment">/*_________________________________________________________________________________________________</span> <a name="l01809"></a>01809 <span class="comment">|</span> <a name="l01810"></a>01810 <span class="comment">| simplifyDB : [void] -> [bool]</span> <a name="l01811"></a>01811 <span class="comment">| </span> <a name="l01812"></a>01812 <span class="comment">| Description:</span> <a name="l01813"></a>01813 <span class="comment">| Simplify the clause database according to the current top-level assigment. Currently, the only</span> <a name="l01814"></a>01814 <span class="comment">| thing done here is the removal of satisfied clauses, but more things can be put here.</span> <a name="l01815"></a>01815 <span class="comment">|________________________________________________________________________________________________@*/</span> <a name="l01816"></a><a class="code" href="classMiniSat_1_1Solver.html#a4e6b8a057747d66f650e6e785f8fc334">01816</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a4e6b8a057747d66f650e6e785f8fc334">Solver::simplifyDB</a>() { <a name="l01817"></a>01817 <span class="comment">// clause set is unsatisfiable</span> <a name="l01818"></a>01818 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) <span class="keywordflow">return</span>; <a name="l01819"></a>01819 <a name="l01820"></a>01820 <span class="comment">// need to do propagation to exhaustion before watches can be removed below.</span> <a name="l01821"></a>01821 <span class="comment">// e.g. in a <- b, c, where b an c are satisfied by unit clauses,</span> <a name="l01822"></a>01822 <span class="comment">// and b and c have been added to the propagation queue,</span> <a name="l01823"></a>01823 <span class="comment">// but not propagated yet: then the watches are not evaluated yet,</span> <a name="l01824"></a>01824 <span class="comment">// and a has not been propapagated.</span> <a name="l01825"></a>01825 <span class="comment">// thus by removing the watches on b and c,</span> <a name="l01826"></a>01826 <span class="comment">// the propagation of a would be lost.</span> <a name="l01827"></a>01827 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> == <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(), <a name="l01828"></a>01828 <span class="stringliteral">"MiniSat::Solver::simplifyDB: called while propagation queue was not empty"</span>); <a name="l01829"></a>01829 <a name="l01830"></a>01830 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a24160d9cefb9aec5f5a88c031d77c048">db_simpl</a>++; <a name="l01831"></a>01831 <a name="l01832"></a>01832 <span class="comment">// Clear watcher lists:</span> <a name="l01833"></a>01833 <span class="comment">// could do that only for literals which are implied permanently,</span> <a name="l01834"></a>01834 <span class="comment">// but we don't know that anymore with the push/pop interface:</span> <a name="l01835"></a>01835 <span class="comment">// even if the push id of a literal is less than the first push clause id,</span> <a name="l01836"></a>01836 <span class="comment">// it might depend on theory clauses,</span> <a name="l01837"></a>01837 <span class="comment">// which will be retracted after a pop,</span> <a name="l01838"></a>01838 <span class="comment">// so that the literal is not implied anymore.</span> <a name="l01839"></a>01839 <span class="comment">// thus, this faster way of cleaning watches can not be used,</span> <a name="l01840"></a>01840 <span class="comment">// instead they have to removed per clause below</span> <a name="l01841"></a>01841 <span class="comment">/*</span> <a name="l01842"></a>01842 <span class="comment"> Lit lit;</span> <a name="l01843"></a>01843 <span class="comment"> for (vector<Lit>::const_iterator i = d_trail.begin(); i != d_trail.end(); ++i) {</span> <a name="l01844"></a>01844 <span class="comment"> lit = *i;</span> <a name="l01845"></a>01845 <span class="comment"> if (getLevel(lit) == d_rootLevel</span> <a name="l01846"></a>01846 <span class="comment"> &&</span> <a name="l01847"></a>01847 <span class="comment"> // must be in the root push</span> <a name="l01848"></a>01848 <span class="comment"> (d_pushes.empty() || getPushID(lit) <= d_pushes.front().d_clauseID)</span> <a name="l01849"></a>01849 <span class="comment"> ) {</span> <a name="l01850"></a>01850 <span class="comment"> getWatches(lit).clear();</span> <a name="l01851"></a>01851 <span class="comment"> getWatches(~(lit)).clear();</span> <a name="l01852"></a>01852 <span class="comment"> }</span> <a name="l01853"></a>01853 <span class="comment"> }</span> <a name="l01854"></a>01854 <span class="comment"> */</span> <a name="l01855"></a>01855 <a name="l01856"></a>01856 <span class="comment">// Remove satisfied clauses:</span> <a name="l01857"></a>01857 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type = 0; type < 2; type++){ <a name="l01858"></a>01858 vector<Clause*>& cs = type ? <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a> : <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>; <a name="l01859"></a>01859 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; <a name="l01860"></a>01860 <span class="keywordtype">bool</span> satisfied = <span class="keyword">false</span>; <a name="l01861"></a>01861 <span class="keywordflow">for</span> (vector<Clause*>::const_iterator i = cs.begin(); i != cs.end(); ++i) { <a name="l01862"></a>01862 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* clause = *i; <a name="l01863"></a>01863 <a name="l01864"></a>01864 <a name="l01865"></a>01865 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a344d9206f065425f276b408e86b7e1d3">isReason</a>(clause)) { <a name="l01866"></a>01866 cs[j++] = clause; <a name="l01867"></a>01867 } <a name="l01868"></a>01868 <span class="keywordflow">else</span> { <a name="l01869"></a>01869 satisfied = <span class="keyword">false</span>; <a name="l01870"></a>01870 <span class="comment">// falsified = 0;</span> <a name="l01871"></a>01871 <span class="keywordtype">int</span> k = 0; <a name="l01872"></a>01872 <span class="keywordtype">int</span> end = clause-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() - 1; <a name="l01873"></a>01873 <span class="comment">// skip the already permanently falsified tail</span> <a name="l01874"></a>01874 <span class="comment">// clause should not be permanently falsified,</span> <a name="l01875"></a>01875 <span class="comment">// as simplifyDB should only be called in a consistent state.</span> <a name="l01876"></a>01876 <span class="keywordflow">while</span> ( <a name="l01877"></a>01877 (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>((*clause)[end]) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) <a name="l01878"></a>01878 && <a name="l01879"></a>01879 (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>((*clause)[end]) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) { <a name="l01880"></a>01880 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(end > 0, <a name="l01881"></a>01881 <span class="stringliteral">"MiniSat::Solver::simplifyDB: permanently falsified clause found"</span>); <a name="l01882"></a>01882 --end; <a name="l01883"></a>01883 } <a name="l01884"></a>01884 <a name="l01885"></a>01885 <span class="keywordflow">while</span> (k < end) { <a name="l01886"></a>01886 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit((*clause)[k]); <a name="l01887"></a>01887 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) != <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) { <a name="l01888"></a>01888 ++k; <a name="l01889"></a>01889 } <a name="l01890"></a>01890 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(lit) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) { <a name="l01891"></a>01891 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">isImpliedAt</a>(lit, clause-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>())) { <a name="l01892"></a>01892 satisfied = <span class="keyword">true</span>; <a name="l01893"></a>01893 <span class="keywordflow">break</span>; <a name="l01894"></a>01894 } <a name="l01895"></a>01895 <span class="keywordflow">else</span> { <a name="l01896"></a>01896 ++k; <a name="l01897"></a>01897 } <a name="l01898"></a>01898 } <a name="l01899"></a>01899 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (k > 1 && <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(lit) == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l01900"></a>01900 --end; <a name="l01901"></a>01901 (*clause)[k] = (*clause)[end]; <a name="l01902"></a>01902 (*clause)[end] = lit; <a name="l01903"></a>01903 } <span class="keywordflow">else</span> { <a name="l01904"></a>01904 ++k; <a name="l01905"></a>01905 } <a name="l01906"></a>01906 } <a name="l01907"></a>01907 <a name="l01908"></a>01908 <span class="keywordflow">if</span> (satisfied) { <a name="l01909"></a>01909 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#aa64931fc97117dd89851ae88dadc897a">del_clauses</a>++; <a name="l01910"></a>01910 <span class="keyword">remove</span>(clause); <a name="l01911"></a>01911 } <a name="l01912"></a>01912 <span class="keywordflow">else</span> { <a name="l01913"></a>01913 cs[j++] = clause; <a name="l01914"></a>01914 } <a name="l01915"></a>01915 } <a name="l01916"></a>01916 <a name="l01917"></a>01917 <a name="l01918"></a>01918 <span class="comment">// isReason also ensures that unit clauses are kept</span> <a name="l01919"></a>01919 <span class="comment">/*</span> <a name="l01920"></a>01920 <span class="comment"> if (!isReason(clause) && isPermSatisfied(clause)) {</span> <a name="l01921"></a>01921 <span class="comment"> d_stats.del_clauses++;</span> <a name="l01922"></a>01922 <span class="comment"> remove(clause);</span> <a name="l01923"></a>01923 <span class="comment"> }</span> <a name="l01924"></a>01924 <span class="comment"> else {</span> <a name="l01925"></a>01925 <span class="comment"> cs[j++] = clause;</span> <a name="l01926"></a>01926 <span class="comment"> }*/</span> <a name="l01927"></a>01927 <a name="l01928"></a>01928 } <a name="l01929"></a>01929 cs.resize(j); <a name="l01930"></a>01930 } <a name="l01931"></a>01931 <a name="l01932"></a>01932 <a class="code" href="classMiniSat_1_1Solver.html#ac114e23a9bd1329c9002eb758c1595b7">d_simpDB_assigns</a> = 0; <a name="l01933"></a>01933 <a class="code" href="classMiniSat_1_1Solver.html#a4f2b0a42acb3d470ca9500b2f4fd8077">d_simpDB_props</a> = <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a2d6b6031c1da1bac5f1da1faf1dc59df">clauses_literals</a> + <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a>; <a name="l01934"></a>01934 } <a name="l01935"></a>01935 <a name="l01936"></a>01936 <a name="l01937"></a><a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">01937</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">Solver::protocolPropagation</a>()<span class="keyword"> const </span>{ <a name="l01938"></a>01938 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l01939"></a>01939 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>]); <a name="l01940"></a>01940 cout << <span class="stringliteral">"propagate: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() << <span class="stringliteral">" : "</span> << lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l01941"></a>01941 cout << <span class="stringliteral">"propagate: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() << <span class="stringliteral">" : "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">true</span>) <a name="l01942"></a>01942 << <span class="stringliteral">" at: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit); <a name="l01943"></a>01943 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()) != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>()) <a name="l01944"></a>01944 cout << <span class="stringliteral">" from: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(*<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>()), <span class="keyword">true</span>); <a name="l01945"></a>01945 cout << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l01946"></a>01946 } <a name="l01947"></a>01947 } <a name="l01948"></a>01948 <a name="l01949"></a>01949 <a name="l01950"></a><a class="code" href="classMiniSat_1_1Solver.html#a5ff984eddca26831d3057733f3848fdf">01950</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a5ff984eddca26831d3057733f3848fdf">Solver::propLookahead</a>(<span class="keyword">const</span> <a class="code" href="structMiniSat_1_1SearchParams.html">SearchParams</a>& params) { <a name="l01951"></a>01951 <span class="comment">// retrieve the best vars according to the heuristic</span> <a name="l01952"></a>01952 vector<Var> nextVars(<a class="code" href="minisat__solver_8cpp.html#aa0fea054b893512d7bd35c129433ecf5">prop_lookahead</a>); <a name="l01953"></a>01953 <a class="code" href="namespaceHash.html#a34e07ea2356b048f9871d1cfdf478da6">vector<Var>::size_type</a> fetchedVars = 0; <a name="l01954"></a>01954 <span class="keywordflow">while</span> (fetchedVars < nextVars.size()) { <a name="l01955"></a>01955 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> nextVar = <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a108a646f3c1191a41f095d3ad9652e27">select</a>(params.<a class="code" href="structMiniSat_1_1SearchParams.html#a39d0f6c147449c2af63a89a186e4bdad">random_var_freq</a>); <a name="l01956"></a>01956 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a31a0f344abc3fd65ee540f954b014f62" title="Operations on clauses:">isRegistered</a>(nextVar) || nextVar == <a class="code" href="namespaceMiniSat.html#af0b81724f9c7f24ed9a52a4627b5db86">var_Undef</a>) { <a name="l01957"></a>01957 nextVars[fetchedVars] = nextVar; <a name="l01958"></a>01958 ++fetchedVars; <a name="l01959"></a>01959 } <a name="l01960"></a>01960 } <a name="l01961"></a>01961 <span class="comment">// and immediately put the variables back</span> <a name="l01962"></a>01962 <span class="keywordflow">for</span> (<a class="code" href="namespaceHash.html#a34e07ea2356b048f9871d1cfdf478da6">vector<Var>::size_type</a> i = 0; i < nextVars.size(); ++i) { <a name="l01963"></a>01963 <span class="keywordflow">if</span> (nextVars[i] != <a class="code" href="namespaceMiniSat.html#af0b81724f9c7f24ed9a52a4627b5db86">var_Undef</a>) <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a9a5913c635dc1c57cd1127a8af30eefb">undo</a>(nextVars[i]); <a name="l01964"></a>01964 } <a name="l01965"></a>01965 <a name="l01966"></a>01966 <a name="l01967"></a>01967 <span class="comment">// propagate on these vars</span> <a name="l01968"></a>01968 <span class="keywordtype">int</span> level = <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(); <a name="l01969"></a>01969 <span class="keywordtype">int</span> first_invalid = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); <a name="l01970"></a>01970 <a name="l01971"></a>01971 <span class="keywordflow">for</span> (<a class="code" href="namespaceHash.html#a34e07ea2356b048f9871d1cfdf478da6">vector<Var>::size_type</a> i = 0; i < nextVars.size(); ++i) { <a name="l01972"></a>01972 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> nextVar = nextVars[i]; <a name="l01973"></a>01973 <span class="keywordflow">if</span> (nextVar == <a class="code" href="namespaceMiniSat.html#af0b81724f9c7f24ed9a52a4627b5db86">var_Undef</a>) <span class="keywordflow">continue</span>; <a name="l01974"></a>01974 <a name="l01975"></a>01975 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> sign = 0; sign < 2; ++sign) { <a name="l01976"></a>01976 <span class="comment">// first propagate on +var, then on -var</span> <a name="l01977"></a>01977 <span class="keywordflow">if</span> (sign == 0) { <a name="l01978"></a>01978 <a class="code" href="classMiniSat_1_1Solver.html#a48e255f2f05f6d56518c8e8925b30639">assume</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a>(nextVar, <span class="keyword">true</span>)); <a name="l01979"></a>01979 } <span class="keywordflow">else</span> { <a name="l01980"></a>01980 <a class="code" href="classMiniSat_1_1Solver.html#a48e255f2f05f6d56518c8e8925b30639">assume</a>(<a class="code" href="classMiniSat_1_1Lit.html">Lit</a>(nextVar, <span class="keyword">false</span>)); <a name="l01981"></a>01981 } <a name="l01982"></a>01982 <a name="l01983"></a>01983 <span class="keywordflow">while</span> (<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() && !<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) { <a name="l01984"></a>01984 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l01985"></a>01985 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l01986"></a>01986 } <a name="l01987"></a>01987 <span class="comment">// propagation found a conflict</span> <a name="l01988"></a>01988 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) <span class="keywordflow">return</span>; <a name="l01989"></a>01989 <a name="l01990"></a>01990 <span class="comment">// otherwise remove assumption and backtrack</span> <a name="l01991"></a>01991 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() - 1; i >= first_invalid; --i) { <a name="l01992"></a>01992 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> x = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i].var(); <a name="l01993"></a>01993 <a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a>[x] = <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>); <a name="l01994"></a>01994 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a> [x] = NULL; <a name="l01995"></a>01995 <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a9a5913c635dc1c57cd1127a8af30eefb">undo</a>(x); <a name="l01996"></a>01996 } <a name="l01997"></a>01997 <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.resize(first_invalid); <a name="l01998"></a>01998 <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.resize(level); <a name="l01999"></a>01999 <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> = first_invalid; <a name="l02000"></a>02000 } <a name="l02001"></a>02001 } <a name="l02002"></a>02002 } <a name="l02003"></a>02003 <a name="l02004"></a>02004 <a name="l02005"></a><a class="code" href="classMiniSat_1_1Solver.html#af43d31ac67426e7b3b699491b02d62c1">02005</a> <a class="code" href="namespaceCVC3.html#a060d21b3207cc3471e24f8dbcff3498b">CVC3::QueryResult</a> <a class="code" href="classMiniSat_1_1Solver.html#af43d31ac67426e7b3b699491b02d62c1" title="search">Solver::search</a>() { <a name="l02006"></a>02006 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a> == 0, <span class="stringliteral">"MiniSat::Solver::search: pop requests pending"</span>); <a name="l02007"></a>02007 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.empty(), <span class="stringliteral">"MiniSat::Solver::search: no push before search"</span>); <a name="l02008"></a>02008 <a name="l02009"></a>02009 <a class="code" href="classMiniSat_1_1Solver.html#a53dec8ba9fc22afeeef701f1a329a669" title="status">d_inSearch</a> = <span class="keyword">true</span>; <a name="l02010"></a>02010 <a name="l02011"></a>02011 <a class="code" href="structMiniSat_1_1SearchParams.html">SearchParams</a> params(<a class="code" href="classMiniSat_1_1Solver.html#aece892bd1701b50038331c77b70d0949" title="Mode of operation:">d_default_params</a>); <a name="l02012"></a>02012 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a54dce5ac31ad5638d8d5046c45f71ac8">starts</a>++; <a name="l02013"></a>02013 <a class="code" href="classMiniSat_1_1Solver.html#a354cacc000d52901cb2a60d1fe659d26">d_var_decay</a> = 1 / params.<a class="code" href="structMiniSat_1_1SearchParams.html#a5edda8afdf5b72caac6f9dab89111042">var_decay</a>; <a name="l02014"></a>02014 <a class="code" href="classMiniSat_1_1Solver.html#a3b0e8d36281ddcfefb54812accad5a55">d_cla_decay</a> = 1 / params.<a class="code" href="structMiniSat_1_1SearchParams.html#a69b3a22ed8d5d7e2e4e2f8c84b1f7e36">clause_decay</a>; <a name="l02015"></a>02015 <a name="l02016"></a>02016 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02017"></a>02017 <a name="l02018"></a>02018 <span class="comment">// initial unit propagation has been done in push -</span> <a name="l02019"></a>02019 <span class="comment">// already unsatisfiable without search</span> <a name="l02020"></a>02020 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>) { <a name="l02021"></a>02021 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#ad17e91fe3a421ef68df9463710c5fdc9">finish</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>, <span class="keyword">this</span>); <a name="l02022"></a>02022 <span class="keywordflow">return</span> <a class="code" href="xchaff__solver_8h.html#a259c70233f322b3e490149190b8bb87ba709691b4dfbbba6c6f992a7cd34dd0e9">CVC3::UNSATISFIABLE</a>; <a name="l02023"></a>02023 } <a name="l02024"></a>02024 <a name="l02025"></a>02025 <span class="comment">// main search loop</span> <a name="l02026"></a>02026 <a class="code" href="classSAT_1_1Lit.html">SAT::Lit</a> literal; <a name="l02027"></a>02027 <a class="code" href="classSAT_1_1CNF__Formula__Impl.html">SAT::CNF_Formula_Impl</a> clauses; <a name="l02028"></a>02028 <span class="keywordflow">for</span> (;;){ <a name="l02029"></a>02029 <span class="comment">// if (d_learnts.size() == 1 && decisionLevel() == 3) printState();</span> <a name="l02030"></a>02030 <span class="comment">// -1 needed if the current 'propagation' is a split</span> <a name="l02031"></a>02031 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> <= <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>, <span class="stringliteral">"MiniSat::Solver::search: thead <= qhead"</span>); <a name="l02032"></a>02032 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.size() == 0 || <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> >= (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a>)<a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>[<a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() - 1], <a name="l02033"></a>02033 <span class="stringliteral">"MiniSat::Solver::search: qhead >= trail_lim[decisionLevel()"</span>); <a name="l02034"></a>02034 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.size() == 0 || <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> >= (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a>)<a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>[<a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() - 1], <a name="l02035"></a>02035 <span class="stringliteral">"MiniSat::Solver::search: thead >= trail_lim[decisionLevel()"</span>); <a name="l02036"></a>02036 <a name="l02037"></a>02037 <span class="comment">// 1. clause set detected to be unsatisfiable</span> <a name="l02038"></a>02038 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>) { <a name="l02039"></a>02039 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a3a48e22367a0b5fe8aae15ea465424b3">conflicts</a>++; <a name="l02040"></a>02040 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#ad17e91fe3a421ef68df9463710c5fdc9">finish</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>, <span class="keyword">this</span>); <a name="l02041"></a>02041 <span class="keywordflow">return</span> <a class="code" href="xchaff__solver_8h.html#a259c70233f322b3e490149190b8bb87ba709691b4dfbbba6c6f992a7cd34dd0e9">CVC3::UNSATISFIABLE</a>; <a name="l02042"></a>02042 } <a name="l02043"></a>02043 <a name="l02044"></a>02044 <span class="comment">// 2. out of resources, e.g. quantifier instantiation aborted</span> <a name="l02045"></a>02045 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a6484231750edf5bd9d10d9408c6b5a59" title="Check if the work budget has been exceeded.">outOfResources</a>()) { <a name="l02046"></a>02046 <span class="keywordflow">return</span> <a class="code" href="namespaceCVC3.html#a060d21b3207cc3471e24f8dbcff3498ba33046505033fa14ebb412efb4474ff56">CVC3::ABORT</a>; <a name="l02047"></a>02047 } <a name="l02048"></a>02048 <a name="l02049"></a>02049 <span class="comment">// 3. boolean conflict, backtrack</span> <a name="l02050"></a>02050 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> != NULL){ <a name="l02051"></a>02051 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a3a48e22367a0b5fe8aae15ea465424b3">conflicts</a>++; <a name="l02052"></a>02052 <a name="l02053"></a>02053 <span class="comment">// unsatisfiability detected</span> <a name="l02054"></a>02054 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>){ <a name="l02055"></a>02055 <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> = <span class="keyword">false</span>; <a name="l02056"></a>02056 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-><a class="code" href="classMiniSat_1_1Derivation.html#ad17e91fe3a421ef68df9463710c5fdc9">finish</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>, <span class="keyword">this</span>); <a name="l02057"></a>02057 <span class="keywordflow">return</span> <a class="code" href="xchaff__solver_8h.html#a259c70233f322b3e490149190b8bb87ba709691b4dfbbba6c6f992a7cd34dd0e9">CVC3::UNSATISFIABLE</a>; <a name="l02058"></a>02058 } <a name="l02059"></a>02059 <a name="l02060"></a>02060 <span class="keywordtype">int</span> backtrack_level; <a name="l02061"></a>02061 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* learnt_clause = <a class="code" href="classMiniSat_1_1Solver.html#ab4bacf381f8980c23eb2184c712b882d" title="Conflict handling.">analyze</a>(backtrack_level); <a name="l02062"></a>02062 <a class="code" href="classMiniSat_1_1Solver.html#a49421463a8047553ffbd5fc9d04c0ad8">backtrack</a>(backtrack_level, learnt_clause); <a name="l02063"></a>02063 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02064"></a>02064 cout << <span class="stringliteral">"conflict clause: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(*learnt_clause, <span class="keyword">true</span>); <a name="l02065"></a>02065 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02066"></a>02066 } <a name="l02067"></a>02067 <a class="code" href="classMiniSat_1_1Solver.html#a91d54211b76e271e6838b57fca9ecfad">varDecayActivity</a>(); <a name="l02068"></a>02068 <a class="code" href="classMiniSat_1_1Solver.html#a3e6ce9dc49e278926bfcc32289a343c1">claDecayActivity</a>(); <a name="l02069"></a>02069 <a name="l02070"></a>02070 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02071"></a>02071 cout << <span class="stringliteral">"backtrack to: "</span> << backtrack_level << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02072"></a>02072 } <a name="l02073"></a>02073 } <a name="l02074"></a>02074 <a name="l02075"></a>02075 <span class="comment">// 4. theory conflict - cheap theory consistency check</span> <a name="l02076"></a>02076 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a4b3f4a97dbac21236e479a157d866545" title="Check consistency of the current assignment.">checkConsistent</a>(clauses, <span class="keyword">false</span>) == <a class="code" href="classSAT_1_1DPLLT.html#ac612908684032ffe76ad97f04afd0ca8a1dbdf8ba98f0b618f9f4dffcbc947f95">SAT::DPLLT::INCONSISTENT</a>) { <a name="l02077"></a>02077 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02078"></a>02078 cout << <span class="stringliteral">"theory inconsistency: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02079"></a>02079 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02080"></a>02080 } <a name="l02081"></a>02081 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#aae74a427da81263e6a453bd4109f8da0">theory_conflicts</a>++; <a name="l02082"></a>02082 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">true</span>); <a name="l02083"></a>02083 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02084"></a>02084 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> && <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() && !<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) { <a name="l02085"></a>02085 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02086"></a>02086 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02087"></a>02087 } <a name="l02088"></a>02088 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>(), <span class="stringliteral">"expected conflict"</span>); <a name="l02089"></a>02089 } <a name="l02090"></a>02090 <a name="l02091"></a>02091 <span class="comment">// 5. boolean propagation</span> <a name="l02092"></a>02092 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size()) { <a name="l02093"></a>02093 <span class="comment">// do boolean propagation to exhaustion</span> <a name="l02094"></a>02094 <span class="comment">// before telling the theories about propagated literals</span> <a name="l02095"></a>02095 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">defer_theory_propagation</a>) { <a name="l02096"></a>02096 <span class="keywordflow">while</span> (<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> && <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() && !<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) { <a name="l02097"></a>02097 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02098"></a>02098 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02099"></a>02099 } <a name="l02100"></a>02100 } <a name="l02101"></a>02101 <span class="comment">// immediately tell theories about boolean propagations</span> <a name="l02102"></a>02102 <span class="keywordflow">else</span> { <a name="l02103"></a>02103 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02104"></a>02104 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02105"></a>02105 } <a name="l02106"></a>02106 } <a name="l02107"></a>02107 <a name="l02108"></a>02108 <span class="comment">// :TODO: move to 8. tell theories about new boolean propagations</span> <a name="l02109"></a>02109 <span class="comment">// problem: can lead to worse performance,</span> <a name="l02110"></a>02110 <span class="comment">// apparently then to many theory clauses are learnt,</span> <a name="l02111"></a>02111 <span class="comment">// so need to forget them (database cleanup), or limit them (subsumption test)</span> <a name="l02112"></a>02112 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">defer_theory_propagation</a> && <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> < <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>) { <a name="l02113"></a>02113 <span class="keywordflow">while</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> < <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>) { <a name="l02114"></a>02114 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a3b3ef70567e0298cd3e971fd57d26fa6" title="Notify theory when a literal is set to true.">assertLit</a>(<a class="code" href="namespaceMiniSat.html#a72756c106b9bd53cf77c2aab214e7cf5">miniSatToCVC</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>])); <a name="l02115"></a>02115 ++<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>; <a name="l02116"></a>02116 } <a name="l02117"></a>02117 } <a name="l02118"></a>02118 <a name="l02119"></a>02119 <span class="comment">// everything else</span> <a name="l02120"></a>02120 <span class="keywordflow">else</span> { <a name="l02121"></a>02121 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> == <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>, <span class="stringliteral">"MiniSat::Solver::search: d_qhead != d_thead"</span>); <a name="l02122"></a>02122 <a name="l02123"></a>02123 <span class="comment">// 6. theory clauses</span> <a name="l02124"></a>02124 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a7d4bf4b22f7e9f19174a4f2813294acd" title="Get new clauses from the theory.">getNewClauses</a>(clauses)) { <a name="l02125"></a>02125 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02126"></a>02126 cout << <span class="stringliteral">"theory clauses: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02127"></a>02127 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02128"></a>02128 <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02129"></a>02129 } <a name="l02130"></a>02130 <a name="l02131"></a>02131 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">true</span>); <a name="l02132"></a>02132 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02133"></a>02133 <span class="keywordflow">continue</span>; <a name="l02134"></a>02134 } <a name="l02135"></a>02135 <a name="l02136"></a>02136 <span class="comment">// 7. theory implication</span> <a name="l02137"></a>02137 literal = <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#ad61236a10860b9771e1e09505ab501b5" title="Get a literal that is implied by the current assignment.">getImplication</a>(); <a name="l02138"></a>02138 <span class="keywordflow">if</span> (!literal.<a class="code" href="classSAT_1_1Lit.html#ad5f6236c582c95356d720a7401623f36">isNull</a>()) { <a name="l02139"></a>02139 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = <a class="code" href="classMiniSat_1_1Solver.html#abbb1190222cc3ad99638caf6e86ee698" title="problem specification">MiniSat::cvcToMiniSat</a>(literal); <a name="l02140"></a>02140 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02141"></a>02141 cout << <span class="stringliteral">"theory implication: "</span> << lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02142"></a>02142 } <a name="l02143"></a>02143 <span class="keywordflow">if</span> ( <a name="l02144"></a>02144 <span class="comment">// get explanation now</span> <a name="l02145"></a>02145 <a class="code" href="minisat__solver_8cpp.html#aa44f156407ac4e41255a1f3bc645f6e2" title="theory implications">eager_explanation</a> <a name="l02146"></a>02146 || <a name="l02147"></a>02147 <span class="comment">// enqueue, and retrieve explanation (as a conflict clause)</span> <a name="l02148"></a>02148 <span class="comment">// only if this implication is responsible for a conflict.</span> <a name="l02149"></a>02149 !<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>(lit, <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(), <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) <a name="l02150"></a>02150 ) { <a name="l02151"></a>02151 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#ab7a85a15823cb0771d1e9bb4c0ce0703" title="Get an explanation for a literal that was implied.">getExplanation</a>(literal, clauses); <a name="l02152"></a>02152 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02153"></a>02153 cout << <span class="stringliteral">"theory implication reason: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02154"></a>02154 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02155"></a>02155 } <a name="l02156"></a>02156 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">true</span>); <a name="l02157"></a>02157 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02158"></a>02158 } <a name="l02159"></a>02159 <span class="keywordflow">continue</span>; <a name="l02160"></a>02160 } <a name="l02161"></a>02161 <a name="l02162"></a>02162 <span class="comment">// // 8. tell theories about new boolean propagations</span> <a name="l02163"></a>02163 <span class="comment">// if (defer_theory_propagation && d_thead < d_qhead) {</span> <a name="l02164"></a>02164 <span class="comment">// d_theoryAPI->assertLit(miniSatToCVC(d_trail[d_thead]));</span> <a name="l02165"></a>02165 <span class="comment">// ++d_thead;</span> <a name="l02166"></a>02166 <span class="comment">// continue;</span> <a name="l02167"></a>02167 <span class="comment">// }</span> <a name="l02168"></a>02168 <span class="comment">// DebugAssert(d_qhead == d_thead, "MiniSat::Solver::search: d_qhead != d_thead");</span> <a name="l02169"></a>02169 <a name="l02170"></a>02170 <span class="comment">// 9. boolean split</span> <a name="l02171"></a>02171 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> next = <a class="code" href="namespaceMiniSat.html#a120ea2f17b58215d657cd7b005edcd85">lit_Undef</a>; <a name="l02172"></a>02172 <a name="l02173"></a>02173 <a name="l02174"></a>02174 <span class="comment">// use CVC decider</span> <a name="l02175"></a>02175 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a> != NULL) { <a name="l02176"></a>02176 literal = <a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a>-><a class="code" href="classSAT_1_1DPLLT_1_1Decider.html#a9a15df2a6d6fdd38d9719f5681c068f2" title="Make a decision.">makeDecision</a>(); <a name="l02177"></a>02177 <span class="keywordflow">if</span> (!literal.<a class="code" href="classSAT_1_1Lit.html#ad5f6236c582c95356d720a7401623f36">isNull</a>()) { <a name="l02178"></a>02178 next = <a class="code" href="classMiniSat_1_1Solver.html#abbb1190222cc3ad99638caf6e86ee698" title="problem specification">MiniSat::cvcToMiniSat</a>(literal); <a name="l02179"></a>02179 } <a name="l02180"></a>02180 } <a name="l02181"></a>02181 <span class="comment">// use MiniSat's decision heuristic</span> <a name="l02182"></a>02182 <span class="keywordflow">else</span> { <a name="l02183"></a>02183 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> nextVar = <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a108a646f3c1191a41f095d3ad9652e27">select</a>(params.<a class="code" href="structMiniSat_1_1SearchParams.html#a39d0f6c147449c2af63a89a186e4bdad">random_var_freq</a>); <a name="l02184"></a>02184 <span class="keywordflow">if</span> (nextVar != <a class="code" href="namespaceMiniSat.html#af0b81724f9c7f24ed9a52a4627b5db86">var_Undef</a>){ <a name="l02185"></a>02185 next = ~<a class="code" href="classMiniSat_1_1Lit.html">Lit</a>(nextVar, <span class="keyword">false</span>); <a name="l02186"></a>02186 } <a name="l02187"></a>02187 } <a name="l02188"></a>02188 <span class="keywordflow">if</span> (next != <a class="code" href="namespaceMiniSat.html#a120ea2f17b58215d657cd7b005edcd85">lit_Undef</a>) { <a name="l02189"></a>02189 <span class="comment">// Simplify the set of problem clauses:</span> <a name="l02190"></a>02190 <span class="comment">// there must have been enough propagations in root level,</span> <a name="l02191"></a>02191 <span class="comment">// and no simplification too recently</span> <a name="l02192"></a>02192 <span class="keywordflow">if</span> (<span class="keyword">false</span> && d_simpDB_props <= 0 && d_simpDB_assigns > (<a class="code" href="classMiniSat_1_1Solver.html#af2bc4c7b90705664cf10982944640b3f">nAssigns</a>() / 10)) { <a name="l02193"></a>02193 <a class="code" href="classMiniSat_1_1Solver.html#a4e6b8a057747d66f650e6e785f8fc334">simplifyDB</a>(); <a name="l02194"></a>02194 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>, <span class="stringliteral">"MiniSat::Solver::search: simplifyDB resulted in conflict"</span>); <a name="l02195"></a>02195 } <a name="l02196"></a>02196 <a name="l02197"></a>02197 <span class="comment">// Reduce the set of learnt clauses:</span> <a name="l02198"></a>02198 <span class="comment">//if (nof_learnts >= 0 && learnts.size()-nAssigns() >= nof_learnts)</span> <a name="l02199"></a>02199 <span class="comment">//if (learnts.size()-nAssigns() >= nClauses() / 3)</span> <a name="l02200"></a>02200 <span class="comment">// don't remove lemmas unless there are a significant number</span> <a name="l02201"></a>02201 <span class="comment">//if (d_learnts.size() - nAssigns() < nClauses() / 3)</span> <a name="l02202"></a>02202 <span class="comment">//return;</span> <a name="l02203"></a>02203 <span class="comment">// don't remove lemmas unless there are lots of new ones</span> <a name="l02204"></a>02204 <span class="comment">// if (d_learnts.size() - nAssigns() < 3 * d_simpRD_learnts)</span> <a name="l02205"></a>02205 <span class="comment">// return;</span> <a name="l02206"></a>02206 <span class="comment">// :TODO:</span> <a name="l02207"></a>02207 <span class="comment">//reduceDB();</span> <a name="l02208"></a>02208 <a name="l02209"></a>02209 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a0e6f2f64d6ed499602c0389a0616a0a1">decisions</a>++; <a name="l02210"></a>02210 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a771e84ea6308cb7d3f7d02e7858b37db" title="Set a checkpoint for backtracking.">push</a>(); <a name="l02211"></a>02211 <a name="l02212"></a>02212 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(next) == <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>, <a name="l02213"></a>02213 <span class="stringliteral">"MiniSat::Solver::search not undefined split variable chosen."</span>); <a name="l02214"></a>02214 <a name="l02215"></a>02215 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02216"></a>02216 cout << <span class="stringliteral">"Split: "</span> << next.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02217"></a>02217 } <a name="l02218"></a>02218 <a name="l02219"></a>02219 <span class="comment">// do lookahead based on MiniSat's decision heuristic</span> <a name="l02220"></a>02220 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#a5ff984eddca26831d3057733f3848fdf">propLookahead</a>(params); <a name="l02221"></a>02221 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) { <a name="l02222"></a>02222 ++<a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#aa10f0f08361269825bc6b784fdf4af6f">debug</a>; <a name="l02223"></a>02223 <span class="keywordflow">continue</span>; <a name="l02224"></a>02224 } <a name="l02225"></a>02225 <a name="l02226"></a>02226 <a name="l02227"></a>02227 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a48e255f2f05f6d56518c8e8925b30639">assume</a>(next)) { <a name="l02228"></a>02228 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"MiniSat::Solver::search contradictory split variable chosen."</span>); <a name="l02229"></a>02229 } <a name="l02230"></a>02230 <span class="keywordflow">continue</span>; <a name="l02231"></a>02231 } <a name="l02232"></a>02232 <a name="l02233"></a>02233 <span class="comment">// 10. full theory consistency check</span> <a name="l02234"></a>02234 <a class="code" href="classSAT_1_1DPLLT.html#ac612908684032ffe76ad97f04afd0ca8">SAT::DPLLT::ConsistentResult</a> result = <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a4b3f4a97dbac21236e479a157d866545" title="Check consistency of the current assignment.">checkConsistent</a>(clauses, <span class="keyword">true</span>); <a name="l02235"></a>02235 <span class="comment">// inconsistency detected</span> <a name="l02236"></a>02236 <span class="keywordflow">if</span> (result == <a class="code" href="classSAT_1_1DPLLT.html#ac612908684032ffe76ad97f04afd0ca8a1dbdf8ba98f0b618f9f4dffcbc947f95">SAT::DPLLT::INCONSISTENT</a>) { <a name="l02237"></a>02237 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02238"></a>02238 cout << <span class="stringliteral">"theory conflict (FULL): "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02239"></a>02239 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02240"></a>02240 <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02241"></a>02241 } <a name="l02242"></a>02242 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#aae74a427da81263e6a453bd4109f8da0">theory_conflicts</a>++; <a name="l02243"></a>02243 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">true</span>); <a name="l02244"></a>02244 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02245"></a>02245 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> && <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() && !<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) { <a name="l02246"></a>02246 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02247"></a>02247 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02248"></a>02248 } <a name="l02249"></a>02249 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>(), <span class="stringliteral">"expected conflict"</span>); <a name="l02250"></a>02250 <span class="keywordflow">continue</span>; <a name="l02251"></a>02251 } <a name="l02252"></a>02252 <span class="comment">// perhaps consistent, new clauses added by theory propagation</span> <a name="l02253"></a>02253 <span class="keywordflow">if</span> (result == <a class="code" href="classSAT_1_1DPLLT.html#ac612908684032ffe76ad97f04afd0ca8ab418da559e5bf8e1e7bb7f21dbd1b8ac">SAT::DPLLT::MAYBE_CONSISTENT</a>) { <a name="l02254"></a>02254 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a7d4bf4b22f7e9f19174a4f2813294acd" title="Get new clauses from the theory.">getNewClauses</a>(clauses)) { <a name="l02255"></a>02255 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02256"></a>02256 cout << <span class="stringliteral">"theory clauses: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02257"></a>02257 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02258"></a>02258 } <a name="l02259"></a>02259 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">true</span>); <a name="l02260"></a>02260 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02261"></a>02261 } <a name="l02262"></a>02262 <span class="comment">// it can happen that after doing a full consistency check</span> <a name="l02263"></a>02263 <span class="comment">// there are actually no new theory clauses,</span> <a name="l02264"></a>02264 <span class="comment">// but then there will be new decisions in the next round.</span> <a name="l02265"></a>02265 <span class="keywordflow">continue</span>; <a name="l02266"></a>02266 } <a name="l02267"></a>02267 <span class="comment">// consistent</span> <a name="l02268"></a>02268 <span class="keywordflow">if</span> (result == <a class="code" href="classSAT_1_1DPLLT.html#ac612908684032ffe76ad97f04afd0ca8ae8ec5d9933decee81ba80f5bd5cfbed2">SAT::DPLLT::CONSISTENT</a>) { <a name="l02269"></a>02269 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a> == NULL || <a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a>-><a class="code" href="classSAT_1_1DPLLT_1_1Decider.html#a9a15df2a6d6fdd38d9719f5681c068f2" title="Make a decision.">makeDecision</a>().isNull(), <a name="l02270"></a>02270 <span class="stringliteral">"DPLLTMiniSat::search: consistent result, but decider not done yet."</span>); <a name="l02271"></a>02271 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a4d58130f36a501e919bb82f5f1438e32" title="debugging">allClausesSatisfied</a>(), <a name="l02272"></a>02272 <span class="stringliteral">"DPLLTMiniSat::search: consistent result, but not all clauses satisfied."</span>); <a name="l02273"></a>02273 <span class="keywordflow">return</span> <a class="code" href="xchaff__solver_8h.html#a259c70233f322b3e490149190b8bb87baa6a5c07f8c320f440ebc34fed65eb550">CVC3::SATISFIABLE</a>; <a name="l02274"></a>02274 } <a name="l02275"></a>02275 <a name="l02276"></a>02276 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"DPLLTMiniSat::search: unreachable"</span>); <a name="l02277"></a>02277 <span class="keywordflow">return</span> <a class="code" href="xchaff__solver_8h.html#a259c70233f322b3e490149190b8bb87baa6a5c07f8c320f440ebc34fed65eb550">CVC3::SATISFIABLE</a>; <a name="l02278"></a>02278 } <a name="l02279"></a>02279 } <a name="l02280"></a>02280 } <a name="l02281"></a>02281 <a name="l02282"></a>02282 <a name="l02283"></a>02283 <a name="l02284"></a>02284 <span class="comment"></span> <a name="l02285"></a>02285 <span class="comment">/// Activity</span> <a name="l02286"></a>02286 <span class="comment"></span> <a name="l02287"></a>02287 <a name="l02288"></a>02288 <span class="comment">// Divide all variable activities by 1e100.</span> <a name="l02289"></a>02289 <span class="comment">//</span> <a name="l02290"></a><a class="code" href="classMiniSat_1_1Solver.html#a711410b67cec21e4fc1480ea6490f4f2">02290</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a711410b67cec21e4fc1480ea6490f4f2" title="Activity.">Solver::varRescaleActivity</a>() { <a name="l02291"></a>02291 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#a679fa13af0d75beca98981dc40f3f2a2">nVars</a>(); i++) <a name="l02292"></a>02292 <a class="code" href="classMiniSat_1_1Solver.html#a0765ad8a98718bb5523e487e32d66ae1">d_activity</a>[i] *= 1e-100; <a name="l02293"></a>02293 <a class="code" href="classMiniSat_1_1Solver.html#aa9cba0f1df8f31b5ae94f2ce0ccb290f">d_var_inc</a> *= 1e-100; <a name="l02294"></a>02294 } <a name="l02295"></a>02295 <a name="l02296"></a>02296 <a name="l02297"></a>02297 <span class="comment">// Divide all constraint activities by 1e100.</span> <a name="l02298"></a>02298 <span class="comment">//</span> <a name="l02299"></a><a class="code" href="classMiniSat_1_1Solver.html#a3cdc4675e024f72e82d718596159456d">02299</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a3cdc4675e024f72e82d718596159456d">Solver::claRescaleActivity</a>() { <a name="l02300"></a>02300 <span class="keywordflow">for</span> (vector<Clause*>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.end(); i++) { <a name="l02301"></a>02301 (*i)->setActivity((*i)->activity() * (float)1e-20); <a name="l02302"></a>02302 } <a name="l02303"></a>02303 <a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a> *= 1e-20; <a name="l02304"></a>02304 } <a name="l02305"></a>02305 <a name="l02306"></a>02306 <a name="l02307"></a>02307 <a name="l02308"></a>02308 <span class="comment"></span> <a name="l02309"></a>02309 <span class="comment">///</span> <a name="l02310"></a>02310 <span class="comment">/// expensive debug checks</span> <a name="l02311"></a>02311 <span class="comment">///</span> <a name="l02312"></a>02312 <span class="comment"></span> <a name="l02313"></a><a class="code" href="classMiniSat_1_1Solver.html#a4d58130f36a501e919bb82f5f1438e32">02313</a> <span class="keywordtype">bool</span> <a class="code" href="classMiniSat_1_1Solver.html#a4d58130f36a501e919bb82f5f1438e32" title="debugging">Solver::allClausesSatisfied</a>() { <a name="l02314"></a>02314 <span class="keywordflow">if</span> (!<a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">debug_full</a>) <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02315"></a>02315 <a name="l02316"></a>02316 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l02317"></a>02317 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause = *<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]; <a name="l02318"></a>02318 <span class="keywordtype">int</span> size = clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l02319"></a>02319 <span class="keywordtype">bool</span> satisfied = <span class="keyword">false</span>; <a name="l02320"></a>02320 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < size; ++j) { <a name="l02321"></a>02321 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[j]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) { <a name="l02322"></a>02322 satisfied = <span class="keyword">true</span>; <a name="l02323"></a>02323 <span class="keywordflow">break</span>; <a name="l02324"></a>02324 } <a name="l02325"></a>02325 } <a name="l02326"></a>02326 <span class="keywordflow">if</span> (!satisfied) { <a name="l02327"></a>02327 cout << <span class="stringliteral">"Clause not satisfied:"</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02328"></a>02328 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause, <span class="keyword">true</span>); <a name="l02329"></a>02329 <a name="l02330"></a>02330 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < size; ++j) { <a name="l02331"></a>02331 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = clause[j]; <a name="l02332"></a>02332 <span class="keywordtype">bool</span> found = <span class="keyword">false</span>; <a name="l02333"></a>02333 <span class="keyword">const</span> vector<Clause*>& ws = <a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~lit); <a name="l02334"></a>02334 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) { <a name="l02335"></a>02335 found = <span class="keyword">true</span>; <a name="l02336"></a>02336 } <span class="keywordflow">else</span> { <a name="l02337"></a>02337 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; !found && j < ws.size(); ++j) { <a name="l02338"></a>02338 <span class="keywordflow">if</span> (ws[j] == &clause) { <a name="l02339"></a>02339 found = <span class="keyword">true</span>; <a name="l02340"></a>02340 <span class="keywordflow">break</span>; <a name="l02341"></a>02341 } <a name="l02342"></a>02342 } <a name="l02343"></a>02343 } <a name="l02344"></a>02344 <a name="l02345"></a>02345 <span class="keywordflow">if</span> (found) { <a name="l02346"></a>02346 cout << <span class="stringliteral">" watched: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">true</span>) << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02347"></a>02347 } <span class="keywordflow">else</span> { <a name="l02348"></a>02348 cout << <span class="stringliteral">"not watched: "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">true</span>) << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02349"></a>02349 } <a name="l02350"></a>02350 } <a name="l02351"></a>02351 <a name="l02352"></a>02352 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l02353"></a>02353 } <a name="l02354"></a>02354 } <a name="l02355"></a>02355 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02356"></a>02356 } <a name="l02357"></a>02357 <a name="l02358"></a>02358 <a name="l02359"></a><a class="code" href="classMiniSat_1_1Solver.html#a09e6b3c658982dbaeec9a18d440dbe7a">02359</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a6b4bb1db7b767e1368884b178f523dcf">Solver::checkWatched</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause)<span class="keyword"> const </span>{ <a name="l02360"></a>02360 <span class="comment">// unary clauses are not watched</span> <a name="l02361"></a>02361 <span class="keywordflow">if</span> (clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() < 2) <span class="keywordflow">return</span>; <a name="l02362"></a>02362 <a name="l02363"></a>02363 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < 2; ++i) { <a name="l02364"></a>02364 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = clause[i]; <a name="l02365"></a>02365 <span class="keywordtype">bool</span> found = <span class="keyword">false</span>; <a name="l02366"></a>02366 <span class="keyword">const</span> vector<Clause*>& ws = <a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~lit); <a name="l02367"></a>02367 <a name="l02368"></a>02368 <span class="comment">// simplifyDB removes watches on permanently set literals</span> <a name="l02369"></a>02369 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(lit) == <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>) found = <span class="keyword">true</span>; <a name="l02370"></a>02370 <a name="l02371"></a>02371 <span class="comment">// search for clause in watches</span> <a name="l02372"></a>02372 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> j = 0; !found && j < ws.size(); ++j) { <a name="l02373"></a>02373 <span class="keywordflow">if</span> (ws[j] == &clause) found = <span class="keyword">true</span>; <a name="l02374"></a>02374 } <a name="l02375"></a>02375 <a name="l02376"></a>02376 <span class="keywordflow">if</span> (!found) { <a name="l02377"></a>02377 <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02378"></a>02378 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause, <span class="keyword">true</span>) << <span class="stringliteral">" : "</span> << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause[i], <span class="keyword">false</span>) << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02379"></a>02379 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"MiniSat::Solver::checkWatched"</span>); <a name="l02380"></a>02380 } <a name="l02381"></a>02381 } <a name="l02382"></a>02382 } <a name="l02383"></a>02383 <a name="l02384"></a><a class="code" href="classMiniSat_1_1Solver.html#a6b4bb1db7b767e1368884b178f523dcf">02384</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a6b4bb1db7b767e1368884b178f523dcf">Solver::checkWatched</a>()<span class="keyword"> const </span>{ <a name="l02385"></a>02385 <span class="keywordflow">if</span> (!<a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">debug_full</a>) <span class="keywordflow">return</span>; <a name="l02386"></a>02386 <a name="l02387"></a>02387 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l02388"></a>02388 <a class="code" href="classMiniSat_1_1Solver.html#a6b4bb1db7b767e1368884b178f523dcf">checkWatched</a>(*<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]); <a name="l02389"></a>02389 } <a name="l02390"></a>02390 <a name="l02391"></a>02391 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); ++i) { <a name="l02392"></a>02392 <a class="code" href="classMiniSat_1_1Solver.html#a6b4bb1db7b767e1368884b178f523dcf">checkWatched</a>(*<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]); <a name="l02393"></a>02393 } <a name="l02394"></a>02394 } <a name="l02395"></a>02395 <a name="l02396"></a>02396 <a name="l02397"></a>02397 <a name="l02398"></a><a class="code" href="classMiniSat_1_1Solver.html#ad4c405a5b6aac64b41c190aaa68004aa">02398</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#ad4c405a5b6aac64b41c190aaa68004aa">Solver::checkClause</a>(<span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause)<span class="keyword"> const </span>{ <a name="l02399"></a>02399 <span class="comment">// unary clauses are true anyway</span> <a name="l02400"></a>02400 <span class="keywordflow">if</span> (clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() < 2) <span class="keywordflow">return</span>; <a name="l02401"></a>02401 <a name="l02402"></a>02402 <span class="comment">// 1) the first two literals are undefined</span> <a name="l02403"></a>02403 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[0]) == <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a> && <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[1]) == <a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>) <a name="l02404"></a>02404 <span class="keywordflow">return</span>; <a name="l02405"></a>02405 <a name="l02406"></a>02406 <span class="comment">// 2) one of the first two literals is satisfied</span> <a name="l02407"></a>02407 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[0]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a> || <a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[1]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) <a name="l02408"></a>02408 <span class="keywordflow">return</span>; <a name="l02409"></a>02409 <a name="l02410"></a>02410 <span class="comment">// 3) the first literal is undefined and all other literals are falsified</span> <a name="l02411"></a>02411 <span class="comment">// 4) all literals are falsified</span> <a name="l02412"></a>02412 <span class="keywordflow">else</span> { <a name="l02413"></a>02413 <span class="keywordtype">bool</span> ok = <span class="keyword">true</span>; <a name="l02414"></a>02414 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[0]) == <a class="code" href="namespaceMiniSat.html#ad0b6e52186f3374f569c4de9db621be1">l_True</a>) <a name="l02415"></a>02415 ok = <span class="keyword">false</span>; <a name="l02416"></a>02416 <a name="l02417"></a>02417 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 1; ok && j < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++j) { <a name="l02418"></a>02418 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#adc9d01899ff6c1eefea8749a1a97309b" title="clauses / assignment">getValue</a>(clause[j]) != <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>) { <a name="l02419"></a>02419 ok = <span class="keyword">false</span>; <a name="l02420"></a>02420 } <a name="l02421"></a>02421 } <a name="l02422"></a>02422 <a name="l02423"></a>02423 <span class="keywordflow">if</span> (ok) <span class="keywordflow">return</span>; <a name="l02424"></a>02424 } <a name="l02425"></a>02425 <a name="l02426"></a>02426 <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02427"></a>02427 cout << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02428"></a>02428 cout << <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause, <span class="keyword">true</span>) << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02429"></a>02429 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<span class="keyword">false</span>, <span class="stringliteral">"MiniSat::Solver::checkClause"</span>); <a name="l02430"></a>02430 } <a name="l02431"></a>02431 <a name="l02432"></a><a class="code" href="classMiniSat_1_1Solver.html#a9e152e0ed1d83a51f7886df8cd5fe681">02432</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a9e152e0ed1d83a51f7886df8cd5fe681">Solver::checkClauses</a>()<span class="keyword"> const </span>{ <a name="l02433"></a>02433 <span class="keywordflow">if</span> (!<a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">debug_full</a>) <span class="keywordflow">return</span>; <a name="l02434"></a>02434 <a name="l02435"></a>02435 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) { <a name="l02436"></a>02436 <a class="code" href="classMiniSat_1_1Solver.html#ad4c405a5b6aac64b41c190aaa68004aa">checkClause</a>(*<a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>[i]); <a name="l02437"></a>02437 } <a name="l02438"></a>02438 <a name="l02439"></a>02439 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); ++i) { <a name="l02440"></a>02440 <a class="code" href="classMiniSat_1_1Solver.html#ad4c405a5b6aac64b41c190aaa68004aa">checkClause</a>(*<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]); <a name="l02441"></a>02441 } <a name="l02442"></a>02442 } <a name="l02443"></a>02443 <a name="l02444"></a>02444 <a name="l02445"></a>02445 <a name="l02446"></a><a class="code" href="classMiniSat_1_1Solver.html#a9457fd91045b9496ef5bdcd1a93fcae5">02446</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a9457fd91045b9496ef5bdcd1a93fcae5">Solver::checkTrail</a>()<span class="keyword"> const </span>{ <a name="l02447"></a>02447 <span class="keywordflow">if</span> (!<a class="code" href="minisat__solver_8cpp.html#a8df07c808718a782f55ddb9e822f2c80">debug_full</a>) <span class="keywordflow">return</span>; <a name="l02448"></a>02448 <a name="l02449"></a>02449 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; i < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); ++i) { <a name="l02450"></a>02450 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i]; <a name="l02451"></a>02451 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> var = lit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>(); <a name="l02452"></a>02452 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* reason = <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a>[var]; <a name="l02453"></a>02453 <a name="l02454"></a>02454 <span class="keywordflow">if</span> (reason == <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>() <a name="l02455"></a>02455 || <a name="l02456"></a>02456 reason == <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) { <a name="l02457"></a>02457 } <a name="l02458"></a>02458 <a name="l02459"></a>02459 <span class="keywordflow">else</span> { <a name="l02460"></a>02460 <span class="keyword">const</span> <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>& clause = *reason; <a name="l02461"></a>02461 <a name="l02462"></a>02462 <span class="comment">// check that the first clause literal is the implied literal</span> <a name="l02463"></a>02463 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() > 0, <span class="stringliteral">"MiniSat::Solver::checkTrail: empty clause as reason for "</span> <span class="comment">/*+ var*/</span>); <a name="l02464"></a>02464 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(lit == clause[0], <span class="stringliteral">"MiniSat::Solver::checkTrail: incorrect reason for "</span> <span class="comment">/*+ var*/</span>); <a name="l02465"></a>02465 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a>[var] == <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="classMiniSat_1_1lbool.html">lbool</a>(lit.<a class="code" href="classMiniSat_1_1Lit.html#a75dadacca265ff92462528f29f1fcfd8">sign</a>())), <span class="stringliteral">"MiniSat::Solver::checkTrail: incorrect value for "</span> <span class="comment">/*+ var*/</span>); <a name="l02466"></a>02466 <a name="l02467"></a>02467 <span class="comment">// check that other literals are in the trail before this literal and this literal's level</span> <a name="l02468"></a>02468 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 1; j < clause.<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++j) { <a name="l02469"></a>02469 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> clauseLit = clause[j]; <a name="l02470"></a>02470 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> clauseVar = clauseLit.<a class="code" href="classMiniSat_1_1Lit.html#a952944c0a85fca7f8db8b532a72b3fda">var</a>(); <a name="l02471"></a>02471 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(var) >= <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(clauseVar), <a name="l02472"></a>02472 <span class="stringliteral">"MiniSat::Solver::checkTrail: depends on later asserted literal "</span> <span class="comment">/*+ var*/</span>); <a name="l02473"></a>02473 <a name="l02474"></a>02474 <span class="keywordtype">bool</span> found = <span class="keyword">false</span>; <a name="l02475"></a>02475 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> k = 0; k < i; ++k) { <a name="l02476"></a>02476 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[k] == ~clauseLit) { <a name="l02477"></a>02477 found = <span class="keyword">true</span>; <a name="l02478"></a>02478 <span class="keywordflow">break</span>; <a name="l02479"></a>02479 } <a name="l02480"></a>02480 } <a name="l02481"></a>02481 <a class="code" href="debug_8h.html#a2637b2fffa22e3c9fad40cda8fcc3bce" title="If something goes horribly wrong, print a message and abort immediately with exit(1).">FatalAssert</a>(found, <span class="stringliteral">"MiniSat::Solver::checkTrail: depends on literal not in context "</span> <span class="comment">/*+ var*/</span>); <a name="l02482"></a>02482 } <a name="l02483"></a>02483 } <a name="l02484"></a>02484 } <a name="l02485"></a>02485 } <a name="l02486"></a>02486 <a name="l02487"></a>02487 <a name="l02488"></a>02488 <a name="l02489"></a>02489 <a name="l02490"></a>02490 <a name="l02491"></a>02491 <a name="l02492"></a>02492 <a name="l02493"></a>02493 <a name="l02494"></a>02494 <a name="l02495"></a>02495 <a name="l02496"></a><a class="code" href="classMiniSat_1_1Solver.html#a07e86f7cb7f6a34c4e28df990cbf43d1">02496</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a07e86f7cb7f6a34c4e28df990cbf43d1">Solver::setPushID</a>(<a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> var, <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* from) { <a name="l02497"></a>02497 <span class="comment">// check that var is implied by from</span> <a name="l02498"></a>02498 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(var) == from, <span class="stringliteral">"MiniSat::Solver::setPushID: wrong reason given"</span>); <a name="l02499"></a>02499 <span class="keywordtype">int</span> pushID = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">std::numeric_limits<int>::max</a>(); <a name="l02500"></a>02500 <span class="keywordflow">if</span> (from != <a class="code" href="classMiniSat_1_1Clause.html#a9a00e9c7831cc291c83d54bf4188e830">Clause::Decision</a>() && from != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) { <a name="l02501"></a>02501 pushID = from-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>(); <a name="l02502"></a>02502 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < from-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); ++i) { <a name="l02503"></a>02503 pushID = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">std::max</a>(pushID, <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>((*from)[i])); <a name="l02504"></a>02504 } <a name="l02505"></a>02505 } <a name="l02506"></a>02506 <a class="code" href="classMiniSat_1_1Solver.html#ab0b2d4e87d57046e30c2cb3554925e2b">d_pushIDs</a>[var] = pushID; <a name="l02507"></a>02507 } <a name="l02508"></a>02508 <a name="l02509"></a>02509 <a name="l02510"></a><a class="code" href="classMiniSat_1_1Solver.html#aec12c38c0c17d7067e12da239353ebc8">02510</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#aec12c38c0c17d7067e12da239353ebc8" title="Push / Pop.">Solver::push</a>() { <a name="l02511"></a>02511 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classMiniSat_1_1Solver.html#ae28b9db22e418c5907fb82dbe49a6832">inSearch</a>(), <span class="stringliteral">"MiniSat::Solver::push: already in search"</span>); <a name="l02512"></a>02512 <a name="l02513"></a>02513 <span class="comment">// inconsistency before this push, so nothing can happen after it,</span> <a name="l02514"></a>02514 <span class="comment">// so just mark this push as useless.</span> <a name="l02515"></a>02515 <span class="comment">// (can happen if before checkSat initial unit propagation finds an inconsistency)</span> <a name="l02516"></a>02516 <span class="keywordflow">if</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>) { <a name="l02517"></a>02517 <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.push_back(<a class="code" href="structMiniSat_1_1PushEntry.html">PushEntry</a>(-1, 0, 0, 0, <span class="keyword">true</span>)); <a name="l02518"></a>02518 <span class="keywordflow">return</span>; <a name="l02519"></a>02519 } <a name="l02520"></a>02520 <a name="l02521"></a>02521 <a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.resize(<a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.size() + 1); <a name="l02522"></a>02522 <a name="l02523"></a>02523 <span class="comment">// reinsert lemmas kept over the last pop</span> <a name="l02524"></a>02524 <span class="keywordflow">for</span> (vector<Clause*>::const_iterator i = <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.begin(); i != <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.end(); ++i) { <a name="l02525"></a>02525 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* lemma = *i; <a name="l02526"></a>02526 <a class="code" href="classMiniSat_1_1Solver.html#a2ba80609ff72dbd93ae116a25923808d">insertLemma</a>(lemma, lemma-><a class="code" href="classMiniSat_1_1Clause.html#aeb8881da1f982f5bc58bac190ab2f2a4">id</a>(), lemma-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>()); <a name="l02527"></a>02527 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a> -= lemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l02528"></a>02528 <span class="keyword">remove</span>(lemma, <span class="keyword">true</span>); <a name="l02529"></a>02529 } <a name="l02530"></a>02530 <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.clear(); <a name="l02531"></a>02531 <a name="l02532"></a>02532 <span class="comment">// do propositional propagation to exhaustion, including the theory</span> <a name="l02533"></a>02533 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a67517b99ec3ab97998c5d8c896145a52" title="pushes">push_theory_propagation</a>) { <a name="l02534"></a>02534 <a class="code" href="classSAT_1_1Lit.html">SAT::Lit</a> literal; <a name="l02535"></a>02535 <a class="code" href="classSAT_1_1Clause.html">SAT::Clause</a> clause; <a name="l02536"></a>02536 <a class="code" href="classSAT_1_1CNF__Formula__Impl.html">SAT::CNF_Formula_Impl</a> clauses; <a name="l02537"></a>02537 <span class="comment">// while more can be propagated</span> <a name="l02538"></a>02538 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && (<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() || <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> < <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>)) { <a name="l02539"></a>02539 <span class="comment">// do propositional propagation to exhaustion</span> <a name="l02540"></a>02540 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size()) { <a name="l02541"></a>02541 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02542"></a>02542 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02543"></a>02543 } <a name="l02544"></a>02544 <a name="l02545"></a>02545 <span class="comment">// also propagate to theories right away</span> <a name="l02546"></a>02546 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a95956acbcfddb07f0be9f737c70d8fe9">defer_theory_propagation</a>) { <a name="l02547"></a>02547 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> < <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>) { <a name="l02548"></a>02548 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a3b3ef70567e0298cd3e971fd57d26fa6" title="Notify theory when a literal is set to true.">assertLit</a>(<a class="code" href="namespaceMiniSat.html#a72756c106b9bd53cf77c2aab214e7cf5">miniSatToCVC</a>(<a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>])); <a name="l02549"></a>02549 ++<a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>; <a name="l02550"></a>02550 } <a name="l02551"></a>02551 } <a name="l02552"></a>02552 <a name="l02553"></a>02553 <span class="comment">// propagate a theory implication</span> <a name="l02554"></a>02554 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#aed1d0bd28881a467f60fc68355821894">push_theory_implication</a>) { <a name="l02555"></a>02555 literal = <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#ad61236a10860b9771e1e09505ab501b5" title="Get a literal that is implied by the current assignment.">getImplication</a>(); <a name="l02556"></a>02556 <span class="keywordflow">if</span> (!literal.<a class="code" href="classSAT_1_1Lit.html#ad5f6236c582c95356d720a7401623f36">isNull</a>()) { <a name="l02557"></a>02557 <a class="code" href="classMiniSat_1_1Lit.html">Lit</a> lit = <a class="code" href="classMiniSat_1_1Solver.html#abbb1190222cc3ad99638caf6e86ee698" title="problem specification">MiniSat::cvcToMiniSat</a>(literal); <a name="l02558"></a>02558 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02559"></a>02559 cout << <span class="stringliteral">"theory implication: "</span> << lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02560"></a>02560 } <a name="l02561"></a>02561 <span class="keywordflow">if</span> ( <a name="l02562"></a>02562 <span class="comment">// get explanation now</span> <a name="l02563"></a>02563 <a class="code" href="minisat__solver_8cpp.html#aa44f156407ac4e41255a1f3bc645f6e2" title="theory implications">eager_explanation</a> <a name="l02564"></a>02564 || <a name="l02565"></a>02565 <span class="comment">// enqueue, and retrieve explanation (as a conflict clause)</span> <a name="l02566"></a>02566 <span class="comment">// only if this implication is responsible for a conflict.</span> <a name="l02567"></a>02567 !<a class="code" href="classMiniSat_1_1Solver.html#a7884b17f0f740781df424864717efac2">enqueue</a>(lit, <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(), <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) <a name="l02568"></a>02568 ) { <a name="l02569"></a>02569 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#ab7a85a15823cb0771d1e9bb4c0ce0703" title="Get an explanation for a literal that was implied.">getExplanation</a>(literal, clauses); <a name="l02570"></a>02570 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02571"></a>02571 cout << <span class="stringliteral">"theory implication reason: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02572"></a>02572 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02573"></a>02573 } <a name="l02574"></a>02574 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">false</span>); <a name="l02575"></a>02575 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02576"></a>02576 } <a name="l02577"></a>02577 <span class="keywordflow">continue</span>; <a name="l02578"></a>02578 } <a name="l02579"></a>02579 } <a name="l02580"></a>02580 <a name="l02581"></a>02581 <span class="comment">// add a theory clause</span> <a name="l02582"></a>02582 <a name="l02583"></a>02583 <span class="comment">// if (push_theory_clause && d_theoryAPI->getNewClauses(clauses)) {</span> <a name="l02584"></a>02584 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a80083d75f5d5e9233b5696497a549713">push_theory_clause</a> ) { <a name="l02585"></a>02585 <span class="keywordtype">bool</span> hasNewClauses = <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a7d4bf4b22f7e9f19174a4f2813294acd" title="Get new clauses from the theory.">getNewClauses</a>(clauses); <a name="l02586"></a>02586 <span class="keywordflow">if</span>(hasNewClauses){ <a name="l02587"></a>02587 <span class="keywordflow">if</span> (<a class="code" href="minisat__solver_8cpp.html#a5dfd3e1de3e1f004f3174a54f41584a2">protocol</a>) { <a name="l02588"></a>02588 cout << <span class="stringliteral">"theory clauses: "</span> << <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>; <a name="l02589"></a>02589 clauses.<a class="code" href="classSAT_1_1CNF__Formula.html#a7d85ca3c21713ab64142ecda50bf8476">print</a>(); <a name="l02590"></a>02590 <a class="code" href="classMiniSat_1_1Solver.html#af8254dba6facc2d13c85202d9d09b3f9">printState</a>(); <a name="l02591"></a>02591 } <a name="l02592"></a>02592 <a class="code" href="classMiniSat_1_1Solver.html#ab7ceeed839df517256ce77c126f28e00">addFormula</a>(clauses, <span class="keyword">false</span>); <a name="l02593"></a>02593 clauses.<a class="code" href="classSAT_1_1CNF__Formula__Impl.html#a6bc99606944e873ded2b37c954b18170">reset</a>(); <a name="l02594"></a>02594 <span class="keywordflow">continue</span>; <a name="l02595"></a>02595 } <a name="l02596"></a>02596 } <a name="l02597"></a>02597 } <a name="l02598"></a>02598 } <a name="l02599"></a>02599 <span class="comment">// do propositional propagation to exhaustion, but only on the propositional level</span> <a name="l02600"></a>02600 <span class="keywordflow">else</span> { <a name="l02601"></a>02601 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() && <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> < <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size()) { <a name="l02602"></a>02602 <a class="code" href="classMiniSat_1_1Solver.html#a776adc363c0056e2077fbe659ae6f709">protocolPropagation</a>(); <a name="l02603"></a>02603 <a class="code" href="classMiniSat_1_1Solver.html#aace9125740233af99f0de4e0288b075e">propagate</a>(); <a name="l02604"></a>02604 } <a name="l02605"></a>02605 } <a name="l02606"></a>02606 <a name="l02607"></a>02607 <a name="l02608"></a>02608 <a class="code" href="classMiniSat_1_1Solver.html#a4e6b8a057747d66f650e6e785f8fc334">simplifyDB</a>(); <a name="l02609"></a>02609 <a name="l02610"></a>02610 <span class="comment">// can happen that conflict is detected in propagate</span> <a name="l02611"></a>02611 <span class="comment">// but d_ok is not immediately set to false</span> <a name="l02612"></a>02612 <a name="l02613"></a>02613 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>()) <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> = <span class="keyword">false</span>; <a name="l02614"></a>02614 <a name="l02615"></a>02615 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a>-><a class="code" href="classMiniSat_1_1Derivation.html#a9b35e97fb7ff5de171eeb68bfe4dda6b">push</a>(<a class="code" href="classMiniSat_1_1Solver.html#ad6e3d6a97a4ae9dda9ac7b9bed97bed8" title="Clauses.">d_clauseIDCounter</a> - 1); <a name="l02616"></a>02616 <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.push_back(<a class="code" href="structMiniSat_1_1PushEntry.html">PushEntry</a>(<a class="code" href="classMiniSat_1_1Solver.html#ad6e3d6a97a4ae9dda9ac7b9bed97bed8" title="Clauses.">d_clauseIDCounter</a> - 1, <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(), <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>, <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a>, <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>)); <a name="l02617"></a>02617 } <a name="l02618"></a>02618 <a name="l02619"></a>02619 <a name="l02620"></a>02620 <a name="l02621"></a><a class="code" href="classMiniSat_1_1Solver.html#a8be8edbecd5a07bd39990ee7ba0918e3">02621</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a8be8edbecd5a07bd39990ee7ba0918e3">Solver::requestPop</a>() { <a name="l02622"></a>02622 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a1bcf27269a8286f82b3235d982e4724e">inPush</a>(), <span class="stringliteral">"MiniSat::Solver::requestPop: no more pushes"</span>); <a name="l02623"></a>02623 <a name="l02624"></a>02624 <span class="comment">// pop theories on first pop of consistent solver,</span> <a name="l02625"></a>02625 <span class="comment">// for inconsistent solver this is done in dpllt_minisat before the pop</span> <a name="l02626"></a>02626 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a> == 0 && <a class="code" href="classMiniSat_1_1Solver.html#a7eb95fc222427a795a3b5ae48e94518e">isConsistent</a>()) <a class="code" href="classMiniSat_1_1Solver.html#a80f70ef105eabcf61758427d041281d6">popTheories</a>(); <a name="l02627"></a>02627 ++<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a>; <a name="l02628"></a>02628 } <a name="l02629"></a>02629 <a name="l02630"></a><a class="code" href="classMiniSat_1_1Solver.html#a8cc5207e3580ab0f09c6e9c225eaebff">02630</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a8cc5207e3580ab0f09c6e9c225eaebff">Solver::doPops</a>() { <a name="l02631"></a>02631 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a> == 0) <span class="keywordflow">return</span>; <a name="l02632"></a>02632 <a name="l02633"></a>02633 <span class="keywordflow">while</span> (<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a> > 1) { <a name="l02634"></a>02634 --<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a>; <a name="l02635"></a>02635 <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.pop_back(); <a name="l02636"></a>02636 } <a name="l02637"></a>02637 <a name="l02638"></a>02638 <a class="code" href="classMiniSat_1_1Solver.html#a2f75013fed205f5b38cd23b9d87dcd1a">pop</a>(); <a name="l02639"></a>02639 } <a name="l02640"></a>02640 <a name="l02641"></a><a class="code" href="classMiniSat_1_1Solver.html#a80f70ef105eabcf61758427d041281d6">02641</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a80f70ef105eabcf61758427d041281d6">Solver::popTheories</a>() { <a name="l02642"></a>02642 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>; i < <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>(); ++i) { <a name="l02643"></a>02643 <a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>-><a class="code" href="classSAT_1_1DPLLT_1_1TheoryAPI.html#a51a08aab04c2185513676a316aee14b4" title="Restore most recent checkpoint.">pop</a>(); <a name="l02644"></a>02644 } <a name="l02645"></a>02645 } <a name="l02646"></a>02646 <a name="l02647"></a><a class="code" href="classMiniSat_1_1Solver.html#a6662641d5c0dea8d89041f5cf9dbc4af">02647</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a6662641d5c0dea8d89041f5cf9dbc4af">Solver::popClauses</a>(<span class="keyword">const</span> <a class="code" href="structMiniSat_1_1PushEntry.html">PushEntry</a>& pushEntry, vector<Clause*>& clauses) { <a name="l02648"></a>02648 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; <a name="l02649"></a>02649 <span class="keywordflow">while</span> (i != clauses.size()) { <a name="l02650"></a>02650 <span class="comment">// keep clause</span> <a name="l02651"></a>02651 <span class="keywordflow">if</span> (clauses[i]->pushID() >= 0 <a name="l02652"></a>02652 && <a name="l02653"></a>02653 clauses[i]->pushID() <= pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>) { <a name="l02654"></a>02654 <span class="comment">// cout << "solver keep : " << clauses[i]->id() << endl;</span> <a name="l02655"></a>02655 <span class="comment">// cout << "solver keep2 : " << clauses[i]->pushID() << endl;</span> <a name="l02656"></a>02656 ++i; <a name="l02657"></a>02657 } <a name="l02658"></a>02658 <span class="comment">// remove clause</span> <a name="l02659"></a>02659 <span class="keywordflow">else</span> { <a name="l02660"></a>02660 <span class="comment">// cout << "solver pop : " << clauses[i]->id() << endl;</span> <a name="l02661"></a>02661 <span class="keyword">remove</span>(clauses[i]); <a name="l02662"></a>02662 clauses[i] = clauses.back(); <a name="l02663"></a>02663 clauses.pop_back(); <a name="l02664"></a>02664 } <a name="l02665"></a>02665 } <a name="l02666"></a>02666 } <a name="l02667"></a>02667 <a name="l02668"></a><a class="code" href="classMiniSat_1_1Solver.html#a2f75013fed205f5b38cd23b9d87dcd1a">02668</a> <span class="keywordtype">void</span> <a class="code" href="classMiniSat_1_1Solver.html#a2f75013fed205f5b38cd23b9d87dcd1a">Solver::pop</a>() { <a name="l02669"></a>02669 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a> == 1, <span class="stringliteral">"Minisat::Solver::pop: d_popRequests != 1"</span>); <a name="l02670"></a>02670 <a name="l02671"></a>02671 --<a class="code" href="classMiniSat_1_1Solver.html#acb6671d85d64f00c04ea17b3b6e144f6">d_popRequests</a>; <a name="l02672"></a>02672 <a class="code" href="structMiniSat_1_1PushEntry.html">PushEntry</a> pushEntry = <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.back(); <a name="l02673"></a>02673 <a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.pop_back(); <a name="l02674"></a>02674 <a name="l02675"></a>02675 <span class="comment">// solver was already inconsistent before the push</span> <a name="l02676"></a>02676 <span class="keywordflow">if</span> (pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a> == -1) { <a name="l02677"></a>02677 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>, <span class="stringliteral">"Minisat::Solver::pop: inconsistent push, but d_ok == true"</span>); <a name="l02678"></a>02678 <span class="keywordflow">return</span>; <a name="l02679"></a>02679 } <a name="l02680"></a>02680 <a name="l02681"></a>02681 <span class="comment">// backtrack trail</span> <a name="l02682"></a>02682 <span class="comment">//</span> <a name="l02683"></a>02683 <span class="comment">// Note:</span> <a name="l02684"></a>02684 <span class="comment">// the entries that were added to the trail after the push,</span> <a name="l02685"></a>02685 <span class="comment">// and are kept over the pop,</span> <a name="l02686"></a>02686 <span class="comment">// are all based on propagating clauses/lemmas also kept after the push.</span> <a name="l02687"></a>02687 <span class="comment">// as they are not yet propagated yet, but only in the propagation queue,</span> <a name="l02688"></a>02688 <span class="comment">// watched literals will work fine.</span> <a name="l02689"></a>02689 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> first_invalid = pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a799580d161aced43d1b5f1bbfc61d76e">d_trailSize</a>; <a name="l02690"></a>02690 <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a799580d161aced43d1b5f1bbfc61d76e">d_trailSize</a>; i != <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size(); ++i) { <a name="l02691"></a>02691 <a class="code" href="namespaceMiniSat.html#a0d9722420b2afd308dceda22c1b05a5e">Var</a> x = <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>[i].var(); <a name="l02692"></a>02692 <span class="comment">//setLevel(x, -1);</span> <a name="l02693"></a>02693 <a class="code" href="classMiniSat_1_1Solver.html#a8fd906b3d57929f47f9a6eb6740e35e9">d_assigns</a>[x] = <a class="code" href="namespaceMiniSat.html#a4c585f2e8db13de83607a0d22761e91d">toInt</a>(<a class="code" href="namespaceMiniSat.html#aa6f5310857da28f01311aebd650a531f">l_Undef</a>); <a name="l02694"></a>02694 <a class="code" href="classMiniSat_1_1Solver.html#a4405fbaba3ed712f704d5c85a390b558">d_reason</a> [x] = NULL; <a name="l02695"></a>02695 <span class="comment">//d_pushIDs[x] = -1;</span> <a name="l02696"></a>02696 <a class="code" href="classMiniSat_1_1Solver.html#aab79cd4bf5792f72c191d8149e77bc93">d_order</a>.<a class="code" href="classMiniSat_1_1VarOrder.html#a9a5913c635dc1c57cd1127a8af30eefb">undo</a>(x); <a name="l02697"></a>02697 } <a name="l02698"></a>02698 <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.resize(first_invalid); <a name="l02699"></a>02699 <a class="code" href="classMiniSat_1_1Solver.html#abf42fb28430f7b099c65c4e9b28ffb09">d_trail_lim</a>.resize(0); <a name="l02700"></a>02700 <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> = pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#acb3db7998ba23df03c6dafa9062c8f6e">d_qhead</a>; <a name="l02701"></a>02701 <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> = pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a9d77c6f6c6add1891b0f683638319719">d_thead</a>; <a name="l02702"></a>02702 <a name="l02703"></a>02703 <span class="comment">// remove clauses added after push</span> <a name="l02704"></a>02704 <a class="code" href="classMiniSat_1_1Solver.html#a6662641d5c0dea8d89041f5cf9dbc4af">popClauses</a>(pushEntry, <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>); <a name="l02705"></a>02705 <a name="l02706"></a>02706 <a name="l02707"></a>02707 <span class="comment">// move all lemmas that are not already the reason for an implication</span> <a name="l02708"></a>02708 <span class="comment">// to pending lemmas - these are to be added when the next push is done.</span> <a name="l02709"></a>02709 <a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 0; <a name="l02710"></a>02710 <span class="keywordflow">while</span> (i != <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.size()) { <a name="l02711"></a>02711 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>[i]->pushID() <= pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>) { <a name="l02712"></a>02712 ++i; <a name="l02713"></a>02713 } <span class="keywordflow">else</span> { <a name="l02714"></a>02714 <span class="keyword">remove</span>(<a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>[i], <span class="keyword">true</span>); <a name="l02715"></a>02715 <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>[i] = <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.back(); <a name="l02716"></a>02716 <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.pop_back(); <a name="l02717"></a>02717 } <a name="l02718"></a>02718 } <a name="l02719"></a>02719 <a name="l02720"></a>02720 i = 0; <a name="l02721"></a>02721 <span class="keywordflow">while</span> (i != <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size()) { <a name="l02722"></a>02722 <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>* lemma = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]; <a name="l02723"></a>02723 <span class="comment">// lemma is propagating, so it was already present before the push</span> <a name="l02724"></a>02724 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a344d9206f065425f276b408e86b7e1d3">isReason</a>(lemma)) { <a name="l02725"></a>02725 <span class="comment">// cout << "solver keep lemma reason : " << lemma->id() << endl;</span> <a name="l02726"></a>02726 <span class="comment">// cout << "solver keep lemma reason2 : " << lemma->pushID() << endl;</span> <a name="l02727"></a>02727 ++i; <a name="l02728"></a>02728 } <a name="l02729"></a>02729 <span class="comment">// keep lemma?</span> <a name="l02730"></a>02730 <span class="keywordflow">else</span> { <a name="l02731"></a>02731 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#a94a5728db8ce10e76aadd2436de76b16">learnts_literals</a> -= lemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>(); <a name="l02732"></a>02732 <span class="comment">// lemma ok after push, mark it for reinsertion in the next push</span> <a name="l02733"></a>02733 <span class="keywordflow">if</span> (lemma-><a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>() <= pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>) { <a name="l02734"></a>02734 <span class="comment">// cout << "solver keep lemma : " << lemma->id() << endl;</span> <a name="l02735"></a>02735 <span class="comment">// cout << "solver keep lemma2 : " << lemma->pushID() << endl;</span> <a name="l02736"></a>02736 <span class="keywordflow">if</span> (lemma-><a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() >= 2) { <a name="l02737"></a>02737 <a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5" title="Conflict handling.">removeWatch</a>(<a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~(*lemma)[0]), lemma); <a name="l02738"></a>02738 <a class="code" href="classMiniSat_1_1Solver.html#a94c3f4932f4c9d17b4a6dc1839c813f5" title="Conflict handling.">removeWatch</a>(<a class="code" href="classMiniSat_1_1Solver.html#ac8d866ffb2253fdc01fe310558871da3" title="unit propagation">getWatches</a>(~(*lemma)[1]), lemma); <a name="l02739"></a>02739 } <a name="l02740"></a>02740 <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.push_back(lemma); <a name="l02741"></a>02741 } <a name="l02742"></a>02742 <span class="comment">// lemma needs to be removed</span> <a name="l02743"></a>02743 <span class="keywordflow">else</span> { <a name="l02744"></a>02744 <span class="comment">// cout << "solver pop lemma : " << lemma->id() << endl;</span> <a name="l02745"></a>02745 <span class="keyword">remove</span>(lemma); <a name="l02746"></a>02746 } <a name="l02747"></a>02747 <a name="l02748"></a>02748 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i] = <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.back(); <a name="l02749"></a>02749 <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.pop_back(); <a name="l02750"></a>02750 } <a name="l02751"></a>02751 } <a name="l02752"></a>02752 <a class="code" href="classMiniSat_1_1Solver.html#ac2c0d8b62a85616add0930b4947c8f96">d_stats</a>.<a class="code" href="structMiniSat_1_1SolverStats.html#aa10f0f08361269825bc6b784fdf4af6f">debug</a> += <a class="code" href="classMiniSat_1_1Solver.html#a99b8d67e03c83f148906ff00e8e88851">d_popLemmas</a>.size(); <a name="l02753"></a>02753 <a name="l02754"></a>02754 <a name="l02755"></a>02755 <span class="comment">// remove all pending clauses and explanations</span> <a name="l02756"></a>02756 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.empty()) { <a name="l02757"></a>02757 <span class="keyword">remove</span>(<a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.front(), <span class="keyword">true</span>); <a name="l02758"></a>02758 <a class="code" href="classMiniSat_1_1Solver.html#adbae4eb042f37351c6cac493e6743813" title="Temporary clauses.">d_pendingClauses</a>.pop(); <a name="l02759"></a>02759 } <a name="l02760"></a>02760 <span class="keywordflow">while</span> (!<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.empty()) { <a name="l02761"></a>02761 <span class="keyword">remove</span>(<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.top().second, <span class="keyword">true</span>); <a name="l02762"></a>02762 <a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.pop(); <a name="l02763"></a>02763 } <a name="l02764"></a>02764 <a name="l02765"></a>02765 <a name="l02766"></a>02766 <span class="comment">// backtrack registered variables</span> <a name="l02767"></a>02767 <a class="code" href="classMiniSat_1_1Solver.html#afc17e3fc6c5eb525504acbe000d9c5ca">d_registeredVars</a>.resize(<a class="code" href="classMiniSat_1_1Solver.html#a6f9c67d77e57b99fef5de801623245a4" title="Push / Pop.">d_pushes</a>.size() + 1); <a name="l02768"></a>02768 <a name="l02769"></a>02769 <span class="keywordflow">if</span> (pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#adea074c679c082080b807b0e2a38dfd1">d_ok</a>) { <a name="l02770"></a>02770 <span class="comment">// this needs to be done _after_ clauses have been removed above,</span> <a name="l02771"></a>02771 <span class="comment">// as it might deallocate removed clauses</span> <a name="l02772"></a>02772 <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a> != NULL) <a class="code" href="classMiniSat_1_1Solver.html#ad2d7fa92335dfd68f8598a5a41d17e93" title="proof logging">d_derivation</a>-><a class="code" href="classMiniSat_1_1Derivation.html#af3782033a2412734e9a018877f71ce5d">pop</a>(pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>); <a name="l02773"></a>02773 <a name="l02774"></a>02774 <span class="comment">// not conflicting or in search anymore</span> <a name="l02775"></a>02775 <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> = NULL; <a name="l02776"></a>02776 <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> = <span class="keyword">true</span>; <a name="l02777"></a>02777 <a class="code" href="classMiniSat_1_1Solver.html#a53dec8ba9fc22afeeef701f1a329a669" title="status">d_inSearch</a> = <span class="keyword">false</span>; <a name="l02778"></a>02778 } <span class="keywordflow">else</span> { <a name="l02779"></a>02779 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a> != NULL, <span class="stringliteral">"MiniSat::Solver::pop: not in conflict 1"</span>); <a name="l02780"></a>02780 <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a>, <span class="stringliteral">"MiniSat::Solver::pop: not in conflict 2"</span>); <a name="l02781"></a>02781 } <a name="l02782"></a>02782 } </pre></div></div> </div> <hr class="footer"/><address class="footer"><small>Generated on Wed Sep 7 2011 for CVC3 by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address> </body> </html>