Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 583ffa4ba069126c3ba0bc565dc0485a > files > 1426

cvc3-doc-2.4.1-1.fc15.noarch.rpm

<!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&#160;<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&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;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&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;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"> * &lt;hr&gt;</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"> * &lt;hr&gt;</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 &quot;Software&quot;), 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 &quot;AS IS&quot;, 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 &quot;<a class="code" href="minisat__solver_8h.html" title="Adaptation of MiniSat to DPLL(T)">minisat_solver.h</a>&quot;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &quot;<a class="code" href="minisat__types_8h.html" title="MiniSat internal types.">minisat_types.h</a>&quot;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;iostream&gt;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &lt;algorithm&gt;</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&lt;Var&gt;::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>&amp; clause, std::vector&lt;Lit&gt;&amp; 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>&amp; 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>&amp; clause, <span class="keywordtype">int</span> <span class="keywordtype">id</span>) {
<a name="l00140"></a>00140   vector&lt;MiniSat::Lit&gt; 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&lt;Lit&gt; literals;
<a name="l00195"></a>00195   lemma-&gt;<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&lt;Lit&gt;::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-&gt;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>()-&gt;<a class="code" href="classMiniSat_1_1Derivation.html#a86b49978f3ea0aa72cd4815e241ff7ad">registerClause</a>(newLemma);
<a name="l00223"></a>00223 
<a name="l00224"></a>00224     newLemma-&gt;<a class="code" href="classMiniSat_1_1Clause.html#a013f54f33ca6995dea2c116725d34258">setActivity</a>(lemma-&gt;<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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() &gt;= 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-&gt;<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-&gt;<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-&gt;<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">&quot;MiniSat::Solver::insertLemma: conflicting/implying lemma&quot;</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-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a8336c93fe51668a8cd322f9a059d5137" title="CVC interface.">d_theoryAPI</a>,
<a name="l00250"></a>00250                oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a18b5a09a43e43ae4bde40537e652e987">d_decider</a>, oldSolver-&gt;<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-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a> = oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a5b10958ebb6b146f8cfb2d6ec08ab667" title="heuristics">d_cla_inc</a>;
<a name="l00256"></a>00256   solver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#aa9cba0f1df8f31b5ae94f2ce0ccb290f">d_var_inc</a> = oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#aa9cba0f1df8f31b5ae94f2ce0ccb290f">d_var_inc</a>;
<a name="l00257"></a>00257   solver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a0765ad8a98718bb5523e487e32d66ae1">d_activity</a> = oldSolver-&gt;<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&lt;MiniSat::Lit&gt;&amp; trail = oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a16a71aec47f38eed46547c52ca9b152b">getTrail</a>();
<a name="l00268"></a>00268   <span class="keywordflow">for</span> (vector&lt;MiniSat::Lit&gt;::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-&gt;<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&lt;MiniSat::Clause*&gt;&amp; clauses = oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a70a7ffd14675ce9d3f1d445a79505278">getClauses</a>();
<a name="l00275"></a>00275   <span class="keywordflow">for</span> (vector&lt;MiniSat::Clause*&gt;::const_iterator i = clauses.begin(); i != clauses.end(); ++i) {
<a name="l00276"></a>00276     solver-&gt;<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&lt;MiniSat::Clause*&gt;&amp; lemmas = oldSolver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#aadbf5bfce16879745ac1fc7e5226957c">getLemmas</a>();
<a name="l00281"></a>00281   <span class="keywordflow">for</span> (vector&lt;MiniSat::Clause*&gt;::const_iterator i = lemmas.begin();
<a name="l00282"></a>00282        !solver-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a41ac244ff15b83ca4a863ee85cf27814">isConflicting</a>() &amp;&amp; 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-&gt;<a class="code" href="classMiniSat_1_1Solver.html#a7323aff4aaa93c01e6008e8e033d2b8f">nextClauseID</a>();
<a name="l00286"></a>00286     solver-&gt;<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&lt;Clause*&gt;::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&lt;Clause*&gt;::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 &lt;&lt; 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 &lt;&lt; <span class="stringliteral">&quot;(+)&quot;</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 &lt;&lt; <span class="stringliteral">&quot;(-)&quot;</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&lt;Lit&gt;&amp; 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 &lt; clause.size(); ++j) {
<a name="l00337"></a>00337     buffer &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause[j], showAssignment) &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;
<a name="l00338"></a>00338   }
<a name="l00339"></a>00339   buffer &lt;&lt; <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>&amp; clause, <span class="keywordtype">bool</span> showAssignment)<span class="keyword"> const </span>{
<a name="l00345"></a>00345   std::vector&lt;Lit&gt; 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&lt;SAT::Lit&gt; <a class="code" href="classMiniSat_1_1Solver.html#aac50fbefa27ff761747fe0873722f927">Solver::curAssigns</a>(){
<a name="l00352"></a>00352   vector&lt;SAT::Lit&gt; res;
<a name="l00353"></a>00353   cout &lt;&lt; <span class="stringliteral">&quot;current Assignment: &quot;</span> &lt;&lt; <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 &lt; <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&lt;std::vector&lt;SAT::Lit&gt; &gt; <a class="code" href="classMiniSat_1_1Solver.html#afb1410338334a3220d95ec28e5a68f71">Solver::curClauses</a>(){
<a name="l00361"></a>00361   std::vector&lt;std::vector&lt; SAT::Lit&gt; &gt; res;
<a name="l00362"></a>00362   cout &lt;&lt; <span class="stringliteral">&quot;current Clauses: &quot;</span> &lt;&lt; <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 &lt; <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) {
<a name="l00364"></a>00364     std::vector&lt;SAT::Lit&gt; 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 &lt; (*<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 &lt;&lt; <span class="stringliteral">&quot;Lemmas: &quot;</span> &lt;&lt; <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 &lt; <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>.size(); ++i) {
<a name="l00378"></a>00378     cout &lt;&lt; <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 &lt;&lt; <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 &lt;&lt; <span class="stringliteral">&quot;Clauses: &quot;</span> &lt;&lt; <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 &lt; <a class="code" href="classMiniSat_1_1Solver.html#ae4d0195d229b334f9d9c2f3122e41bd1">d_clauses</a>.size(); ++i) {
<a name="l00385"></a>00385     cout &lt;&lt; <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 &lt;&lt; <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 &lt;&lt; <span class="stringliteral">&quot;Assignment: &quot;</span> &lt;&lt; <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 &lt; 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 &lt; <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">&quot;&quot;</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">&quot;(S)&quot;</span>;
<a name="l00396"></a>00396     }
<a name="l00397"></a>00397     cout &lt;&lt; <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>) &lt;&lt; split &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;
<a name="l00398"></a>00398   }
<a name="l00399"></a>00399   cout &lt;&lt; <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 &lt;&lt; <span class="stringliteral">&quot;c minisat test&quot;</span> &lt;&lt; <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>;
<a name="l00411"></a>00411   cout &lt;&lt; <span class="stringliteral">&quot;p cnf &quot;</span> &lt;&lt; max_id &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; num_clauses &lt;&lt; <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 &lt; <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>&amp; 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 &lt; 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 &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;
<a name="l00419"></a>00419     }
<a name="l00420"></a>00420     cout &lt;&lt; <span class="stringliteral">&quot;0&quot;</span> &lt;&lt; <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 &lt; learnts.size(); ++i) {</span>
<a name="l00425"></a>00425   <span class="comment">//  Clause&amp; clause = *learnts[i];</span>
<a name="l00426"></a>00426   <span class="comment">//  for (int j = 0; j &lt; 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 &lt;&lt; toString(lit, false) &lt;&lt; &quot; &quot;;</span>
<a name="l00429"></a>00429   <span class="comment">//  }</span>
<a name="l00430"></a>00430   <span class="comment">//  cout &lt;&lt; &quot;0&quot; &lt;&lt; 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&lt;Lit&gt;::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 &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) &lt;&lt; <span class="stringliteral">&quot; 0&quot;</span> &lt;&lt; <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 &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">false</span>) &lt;&lt; <span class="stringliteral">&quot; 0&quot;</span> &lt;&lt; <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&lt;<a class="code" href="classHash_1_1hash__set.html">Hash::hash_set&lt;Var&gt;</a> &gt;::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) &gt; 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>() &lt;= 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">&quot;MiniSat::Solver::registerVar: d_registeredVars is empty&quot;</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&lt;Lit&gt; 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>&amp; clause, <span class="keywordtype">bool</span> isTheoryClause) {
<a name="l00489"></a>00489   vector&lt;MiniSat::Lit&gt; 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>()-&gt;<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>&amp; clause, <span class="keywordtype">bool</span> keepClauseID) {
<a name="l00508"></a>00508   vector&lt;Lit&gt; literals;
<a name="l00509"></a>00509   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 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&#39;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 &#39;groups&#39;,</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>&amp; 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-&gt;d_reason.isNull()){</span>
<a name="l00535"></a>00535 <span class="comment">//       cout&lt;&lt;&quot;found null thm in Solver::addFormula&quot;&lt;&lt;endl&lt;&lt;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&lt;Lit&gt;&amp; 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 &lt; 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 &lt; 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       &amp;&amp; <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 &amp;&amp; (<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 &amp;&amp; (<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&lt;Lit&gt;&amp; literals)<span class="keyword"> const </span>{
<a name="l00589"></a>00589   <span class="keywordflow">if</span> (literals.size() &gt;= 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 &lt; 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>) &amp;&amp; !(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>) &amp;&amp; (valueSecond == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) {
<a name="l00608"></a>00608     <span class="keywordflow">if</span> (levelFirst &gt; 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>) &amp;&amp; (valueSecond == <a class="code" href="namespaceMiniSat.html#a810166165364a8a8262d24b13d7b1da9">l_False</a>)) {
<a name="l00624"></a>00624     <span class="keywordflow">if</span> ((levelNew &gt; levelFirst) &amp;&amp; (levelNew &gt; levelSecond)) {
<a name="l00625"></a>00625       <span class="keywordflow">if</span> (levelSecond &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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>) &amp;&amp; (<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&lt;Lit&gt;&amp; 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&lt;Lit&gt;::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&lt;Lit&gt;::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-&gt;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&lt;Lit&gt; 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 &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(literals[0].var())-&gt;<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 &amp;&amp; simplified.size() &lt; 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>()-&gt;<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>()-&gt;<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 &lt; 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 &gt;= simplified.size() || literals[i] != simplified[j]) {
<a name="l00717"></a>00717   inference-&gt;<a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(literals[i], <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-&gt;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>()-&gt;<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() &lt; 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&lt;&lt;&quot;clause size&quot; &lt;&lt; c-&gt;size() &lt;&lt; endl &lt;&lt; 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&lt;&lt;&quot;after clause size&quot; &lt;&lt; c-&gt;size() &lt;&lt; endl &lt;&lt; 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&lt;&lt;&quot;after after clause size&quot; &lt;&lt; c-&gt;size() &lt;&lt; endl &lt;&lt; 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>()-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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">&quot;MiniSat::Solver::insertClause: first literal of new lemma not undefined&quot;</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 &lt; c-&gt;<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">&quot;MiniSat::Solver::insertClause: lemma literal not false&quot;</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 &lt; c-&gt;<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]) &gt; <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 &lt; c-&gt;<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">&quot;MiniSat::Solver::insertClause: bogus conflicting clause&quot;</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">&quot;MiniSat::Solver::insertClause: bogus propagating clause&quot;</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 &lt; c-&gt;<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">&quot;MiniSat::Solver::insertClause: bogus propagating clause&quot;</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">&quot;MiniSat::Solver::insertClause: conflicting/implying clause&quot;</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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>();
<a name="l00855"></a>00855   <span class="keywordflow">if</span> (!c-&gt;<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-&gt;<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-&gt;<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 &#39;clauses&#39; and &#39;learnts&#39; 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 &lt; 2</span>
<a name="l00871"></a>00871   <span class="keywordflow">if</span> (!just_dealloc &amp;&amp; c-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() &gt;= 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-&gt;<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-&gt;<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-&gt;<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>()-&gt;<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: &#39;elem&#39; must exists in &#39;ws&#39; OR &#39;ws&#39; 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&lt;Clause*&gt;&amp; 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 &lt; ws.size(), <span class="stringliteral">&quot;MiniSat::Solver::removeWatch: elem not in watched list&quot;</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>&amp; 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 &lt; 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">&quot;MiniSat::Solver::getImplicationLevelFull: literal not false&quot;</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 &gt; 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>&amp; 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 &lt; 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">&quot;MiniSat::Solver::getConflictLevel: literal not false&quot;</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 &gt; 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">&quot;MiniSat::getReason: reason[var] == NULL.&quot;</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">&quot;MiniSat::getReason: reason[var] == TheoryImplication.&quot;</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">&quot;MiniSat::updateConflict: clause == NULL.&quot;</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 &lt; clause-&gt;<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">&quot;MiniSat::Solver::updateConflict: literal not false&quot;</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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() &lt; <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>-&gt;<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&lt;Lit&gt; toRegress;
<a name="l01006"></a>01006     stack&lt;Clause*&gt; 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">&quot;MiniSat::Solver::resolveTheoryImplication: literal is not true&quot;</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">&quot;Not implemented yet&quot;</span>);
<a name="l01017"></a>01017       <span class="comment">//      d_theoryAPI-&gt;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 &lt; (*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">&quot;MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 1&quot;</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">&quot;MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 2&quot;</span>);
<a name="l01035"></a>01035         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; (*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">&quot;MiniSat::Solver::resolveTheoryImplication: literal not implied by clause 3&quot;</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 &lt; (*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&lt;Lit, Clause*&gt; 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 &lt; explanation-&gt;<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">&quot;MiniSat::Solver::resolveTheoryImplication: not done to completion&quot;</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>&amp; 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">&quot;MiniSat::Solver::analyze called when no conflict was detected&quot;</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&#39; 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&#39;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&#39;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 &lt; <a class="code" href="classMiniSat_1_1Solver.html#a431f60a202eee24b3928ca6c6195baa5">d_conflict</a>-&gt;<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 &lt; <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">&quot;MiniSat::Solver::analyze: analyze_seen is not clear at: &quot;</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&lt;Lit&gt; 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>-&gt;<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-&gt;<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-&gt;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">&quot;MiniSat::Solver::analyze: no reason for conflict&quot;</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">&quot;MiniSat::Solver::analyze: theory implication not resolved&quot;</span>);
<a name="l01181"></a>01181 
<a name="l01182"></a>01182     <span class="keywordflow">if</span> (confl-&gt;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 &lt; confl-&gt;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">&quot;MiniSat::Solver::analyze: literal to regress is not false&quot;</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) &lt;= UIPLevel, <span class="stringliteral">&quot;MiniSat::Solver::analyze: literal above UIP level&quot;</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 &gt;= -1, <span class="stringliteral">&quot;MiniSat::Solver::analyze: index out of bound&quot;</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-&gt;pushID());
<a name="l01237"></a>01237     <span class="keywordflow">if</span> (<a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>() != NULL &amp;&amp; pathC &gt; 0) inference-&gt;<a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(~p, confl);
<a name="l01238"></a>01238   } <span class="keywordflow">while</span> (pathC &gt; 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 &amp;&amp; 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">&quot;MiniSat::Solver::analyze: backtracked past UIP level.&quot;</span>);
<a name="l01248"></a>01248     <span class="keywordflow">for</span> (<a class="code" href="namespaceMiniSat.html#ad579041894c169fecdeb319f9aa5948d">size_type</a> i = 1; i &lt; 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]) &lt; UIPLevel,
<a name="l01250"></a>01250        <span class="stringliteral">&quot;MiniSat::Solver::analyze: conflict clause contains literal from UIP level or higher.&quot;</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&lt;Lit&gt;::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-&gt;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>()-&gt;<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 &#39;analyze&#39; -- order literals from last to first occurance in &#39;trail[]&#39;.</span>
<a name="l01269"></a><a class="code" href="classlastToFirst__lt.html#aba54c1f94b132b69e8ccde70245d9cc4">01269</a>   <span class="keyword">const</span> vector&lt;MiniSat::size_type&gt;&amp; <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&lt;MiniSat::size_type&gt;&amp; 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>()] &gt; 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&lt;Lit&gt;&amp; out_learnt, <a class="code" href="classMiniSat_1_1Inference.html">Inference</a>* inference, <span class="keywordtype">int</span>&amp; 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() &gt; 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 &lt; out_learnt.size(); i++)
<a name="l01294"></a>01294       min_level |= 1 &lt;&lt; (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(out_learnt[i]) &amp; 31);
<a name="l01295"></a>01295     
<a name="l01296"></a>01296     <span class="keywordflow">for</span> (i = j = 1; i &lt; 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 &lt; 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>&amp; c = *<a class="code" href="classMiniSat_1_1Solver.html#a8660c6ceafa236f5533e432bb859aeba">getReason</a>(lit);
<a name="l01310"></a>01310       <span class="keywordflow">if</span> (&amp;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 &amp;&amp; k &lt; 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         &amp;&amp;
<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&#39;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&lt;Lit&gt;::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&#39;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&#39;t hurt performance.</span>
<a name="l01357"></a>01357     <span class="keywordflow">if</span> (out_learnt.size() &gt; 0 <span class="comment">// found the empty clause, so remove all literals</span>
<a name="l01358"></a>01358   &amp;&amp;
<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   &amp;&amp;
<a name="l01361"></a>01361   <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) &gt; pushID
<a name="l01362"></a>01362   &amp;&amp;
<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   &amp;&amp;
<a name="l01365"></a>01365   <a class="code" href="classMiniSat_1_1Solver.html#a4f5805d21238ad316845059fb378a05f">getPushID</a>(lit) &gt; <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-&gt;<a class="code" href="classMiniSat_1_1Inference.html#a61184032373fe3049198f8e3a71e436f">add</a>(lit, <a class="code" href="classMiniSat_1_1Solver.html#a82e89493435ed86eb83f6af47fc78379">getDerivation</a>()-&gt;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-&gt;<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 &#39;p&#39; can be removed. &#39;min_level&#39; 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">// &#39;p&#39; 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">&quot;MiniSat::Solver::analyze_removable: p is a decision.&quot;</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() &gt; 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">&quot;MiniSat::Solver::analyze_removable: stack var is a decision.&quot;</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">&quot;MiniSat::Solver::analyze_removable: stack var is an unresolved theory implication.&quot;</span>);
<a name="l01407"></a>01407     <a class="code" href="classMiniSat_1_1Clause.html">Clause</a>&amp; 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 &lt; 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>() &amp;&amp; ((1 &lt;&lt; (<a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(p) &amp; 31)) &amp; 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 &lt; <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) &lt;= <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) &lt; 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 &lt; c-&gt;<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   &amp;&amp; <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   &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a871c1c054262f9673518c46f7efc8450">isImpliedAt</a>(lit, c-&gt;<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>() &gt; toLevel, <span class="stringliteral">&quot;MiniSat::Solver::backtrack: backtrack not to previous level&quot;</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 &gt;= <a class="code" href="classMiniSat_1_1Solver.html#a160ccfc80ff29cd6947b0d009400e434" title="variables">d_rootLevel</a>, <span class="stringliteral">&quot;MiniSat::Solver::backtrack: backtrack beyond root level&quot;</span>);
<a name="l01486"></a>01486   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = toLevel; i &lt; <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>-&gt;<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 &lt; 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) &gt; 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>() &amp;&amp; !<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 &amp;&amp; !<a class="code" href="classMiniSat_1_1Solver.html#a587104e3c6bb31d2bc7942bc1fde8b1e">d_theoryExplanations</a>.empty()) {
<a name="l01542"></a>01542     std::pair&lt;int, Clause*&gt; 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 &gt; 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*)  -&gt;  [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&#39;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 &#39;reason[]&#39;.</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]  -&gt;  [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&#39;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&#39;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 &gt;= 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 &lt;= FALSE,</span>
<a name="l01659"></a>01659 <span class="comment">// but now FALSE is set to a level &lt; 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&#39;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">// &#39;p&#39; is enqueued fact to propagate.</span>
<a name="l01691"></a>01691   vector&lt;Clause*&gt;&amp;  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>-&gt;<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&lt;Clause*&gt;::iterator j = ws.begin();
<a name="l01704"></a>01704   vector&lt;Clause*&gt;::iterator i = ws.begin();
<a name="l01705"></a>01705   vector&lt;Clause*&gt;::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>&amp; 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> &amp;&amp; <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">&quot;MiniSat::Solver:::propagate: True/False&quot;</span>);
<a name="l01724"></a>01724       *j = &amp;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 &lt; 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], &amp;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 &lt; 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">&quot;MiniSat::Solver:::propagate: Unit Propagation&quot;</span>);
<a name="l01744"></a>01744   }
<a name="l01745"></a>01745       )
<a name="l01746"></a>01746 
<a name="l01747"></a>01747       *j = &amp;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), &amp;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>(&amp;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 : ()  -&gt;  [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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() &gt; 2 &amp;&amp; (y-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() == 2 || x-&gt;<a class="code" href="classMiniSat_1_1Clause.html#af64021472c748c6adbfb88238cae5a9d">activity</a>() &lt; y-&gt;<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 &lt; <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]-&gt;size() &gt; 2 &amp;&amp; !<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 &lt; <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]-&gt;size() &gt; 2 &amp;&amp; !<a class="code" href="classMiniSat_1_1Solver.html#a344d9206f065425f276b408e86b7e1d3">isReason</a>(<a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]) &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a0c9270be1c0980e631de98b3408a8031">d_learnts</a>[i]-&gt;activity() &lt; 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]  -&gt;  [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 &lt;- 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">&quot;MiniSat::Solver::simplifyDB: called while propagation queue was not empty&quot;</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&#39;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&lt;Lit&gt;::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">  &amp;&amp;</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) &lt;= 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 &lt; 2; type++){
<a name="l01858"></a>01858     vector&lt;Clause*&gt;&amp; 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&lt;Clause*&gt;::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-&gt;<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     &amp;&amp;
<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 &gt; 0,
<a name="l01881"></a>01881           <span class="stringliteral">&quot;MiniSat::Solver::simplifyDB: permanently falsified clause found&quot;</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 &lt; 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-&gt;<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 &gt; 1 &amp;&amp; <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) &amp;&amp; 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 &lt;&lt; <span class="stringliteral">&quot;propagate: &quot;</span> &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() &lt;&lt; <span class="stringliteral">&quot; : &quot;</span> &lt;&lt; lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() &lt;&lt; <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>;
<a name="l01941"></a>01941     cout &lt;&lt; <span class="stringliteral">&quot;propagate: &quot;</span> &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#a18c18c858ec2b635eede59e396f3b102" title="Search:">decisionLevel</a>() &lt;&lt; <span class="stringliteral">&quot; : &quot;</span> &lt;&lt; <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    &lt;&lt; <span class="stringliteral">&quot; at: &quot;</span> &lt;&lt; <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 &lt;&lt;  <span class="stringliteral">&quot; from: &quot;</span>  &lt;&lt; <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 &lt;&lt; <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>&amp; params) {
<a name="l01951"></a>01951   <span class="comment">// retrieve the best vars according to the heuristic</span>
<a name="l01952"></a>01952   vector&lt;Var&gt; 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&lt;Var&gt;::size_type</a> fetchedVars = 0;
<a name="l01954"></a>01954   <span class="keywordflow">while</span> (fetchedVars &lt; 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&lt;Var&gt;::size_type</a> i = 0; i &lt; 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&lt;Var&gt;::size_type</a> i = 0; i &lt; 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 &lt; 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> &lt; <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() &amp;&amp; !<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 &gt;= 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">&quot;MiniSat::Solver::search: pop requests pending&quot;</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">&quot;MiniSat::Solver::search: no push before search&quot;</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>()-&gt;<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 &amp;&amp; decisionLevel() == 3) printState();</span>
<a name="l02030"></a>02030     <span class="comment">// -1 needed if the current &#39;propagation&#39; 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> &lt;= <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a>, <span class="stringliteral">&quot;MiniSat::Solver::search: thead &lt;= qhead&quot;</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> &gt;= (<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">&quot;MiniSat::Solver::search: qhead &gt;= trail_lim[decisionLevel()&quot;</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> &gt;= (<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">&quot;MiniSat::Solver::search: thead &gt;= trail_lim[decisionLevel()&quot;</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>()-&gt;<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>-&gt;<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>()-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;conflict clause: &quot;</span> &lt;&lt; <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 &lt;&lt; <span class="stringliteral">&quot;backtrack to: &quot;</span> &lt;&lt; backtrack_level &lt;&lt; <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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory inconsistency: &quot;</span> &lt;&lt; <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>() &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() &amp;&amp; !<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">&quot;expected conflict&quot;</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> &lt; <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> &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() &amp;&amp; !<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> &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> &lt; <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> &lt; <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>-&gt;<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">&quot;MiniSat::Solver::search: d_qhead != d_thead&quot;</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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory clauses: &quot;</span> &lt;&lt; <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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory implication: &quot;</span> &lt;&lt; lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() &lt;&lt; <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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory implication reason: &quot;</span> &lt;&lt; <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 &amp;&amp; d_thead &lt; d_qhead) {</span>
<a name="l02164"></a>02164 <span class="comment">//  d_theoryAPI-&gt;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, &quot;MiniSat::Solver::search: d_qhead != d_thead&quot;);</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>-&gt;<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&#39;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> &amp;&amp; d_simpDB_props &lt;= 0 &amp;&amp; d_simpDB_assigns &gt; (<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">&quot;MiniSat::Solver::search: simplifyDB resulted in conflict&quot;</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 &gt;= 0 &amp;&amp; learnts.size()-nAssigns() &gt;= nof_learnts)</span>
<a name="l02199"></a>02199   <span class="comment">//if (learnts.size()-nAssigns() &gt;= nClauses() / 3)</span>
<a name="l02200"></a>02200   <span class="comment">// don&#39;t remove lemmas unless there are a significant number</span>
<a name="l02201"></a>02201   <span class="comment">//if (d_learnts.size() - nAssigns() &lt; nClauses() / 3)</span>
<a name="l02202"></a>02202   <span class="comment">//return;</span>
<a name="l02203"></a>02203   <span class="comment">// don&#39;t remove lemmas unless there are lots of new ones</span>
<a name="l02204"></a>02204   <span class="comment">//  if (d_learnts.size() - nAssigns() &lt; 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>-&gt;<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">&quot;MiniSat::Solver::search not undefined split variable chosen.&quot;</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 &lt;&lt; <span class="stringliteral">&quot;Split: &quot;</span> &lt;&lt; next.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() &lt;&lt; <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&#39;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">&quot;MiniSat::Solver::search contradictory split variable chosen.&quot;</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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory conflict (FULL): &quot;</span> &lt;&lt; <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>() &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a813826a370752a20165602e79b18f7c6">d_ok</a> &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <a class="code" href="classMiniSat_1_1Solver.html#af092e4552ff6a34e5fcb5f67de96c845">d_trail</a>.size() &amp;&amp; !<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">&quot;expected conflict&quot;</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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory clauses: &quot;</span> &lt;&lt; <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>-&gt;<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">&quot;DPLLTMiniSat::search: consistent result, but decider not done yet.&quot;</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">&quot;DPLLTMiniSat::search: consistent result, but not all clauses satisfied.&quot;</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">&quot;DPLLTMiniSat::search: unreachable&quot;</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 &lt; <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&lt;Clause*&gt;::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)-&gt;setActivity((*i)-&gt;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 &lt; <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>&amp; 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 &lt; 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 &lt;&lt; <span class="stringliteral">&quot;Clause not satisfied:&quot;</span> &lt;&lt; <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>;
<a name="l02328"></a>02328       cout &lt;&lt; <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 &lt; 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&lt;Clause*&gt;&amp; 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 &amp;&amp; j &lt; ws.size(); ++j) {
<a name="l02338"></a>02338       <span class="keywordflow">if</span> (ws[j] == &amp;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 &lt;&lt; <span class="stringliteral">&quot;    watched: &quot;</span> &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">true</span>) &lt;&lt; <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 &lt;&lt; <span class="stringliteral">&quot;not watched: &quot;</span> &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(lit, <span class="keyword">true</span>) &lt;&lt; <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>&amp; 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>() &lt; 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 &lt; 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&lt;Clause*&gt;&amp; 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 &amp;&amp; j &lt; ws.size(); ++j) {
<a name="l02373"></a>02373       <span class="keywordflow">if</span> (ws[j] == &amp;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 &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause, <span class="keyword">true</span>) &lt;&lt; <span class="stringliteral">&quot; : &quot;</span> &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause[i], <span class="keyword">false</span>) &lt;&lt; <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">&quot;MiniSat::Solver::checkWatched&quot;</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 &lt; <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 &lt; <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>&amp; 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>() &lt; 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> &amp;&amp; <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 &amp;&amp; j &lt; 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 &lt;&lt; <a class="code" href="group__ExprStream__Manip.html#ga05b0ea7353ec24fa8e7e272d7a7875d8" title="Print the end-of-line.">endl</a>;
<a name="l02428"></a>02428   cout &lt;&lt; <a class="code" href="classMiniSat_1_1Solver.html#ac4949ee43735e3de2869ff606ccc197c" title="String representation:">toString</a>(clause, <span class="keyword">true</span>) &lt;&lt; <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">&quot;MiniSat::Solver::checkClause&quot;</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 &lt; <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 &lt; <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 &lt; <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>&amp; 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>() &gt; 0, <span class="stringliteral">&quot;MiniSat::Solver::checkTrail: empty clause as reason for &quot;</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">&quot;MiniSat::Solver::checkTrail: incorrect reason for &quot;</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">&quot;MiniSat::Solver::checkTrail: incorrect value for &quot;</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&#39;s level</span>
<a name="l02468"></a>02468       <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 1; j &lt; 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) &gt;= <a class="code" href="classMiniSat_1_1Solver.html#a68a7d96223af2e9b67d8b25d047284e4">getLevel</a>(clauseVar),
<a name="l02472"></a>02472         <span class="stringliteral">&quot;MiniSat::Solver::checkTrail: depends on later asserted literal &quot;</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 &lt; 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">&quot;MiniSat::Solver::checkTrail: depends on literal not in context &quot;</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">&quot;MiniSat::Solver::setPushID: wrong reason given&quot;</span>);
<a name="l02499"></a>02499   <span class="keywordtype">int</span> pushID = <a class="code" href="namespaceMiniSat.html#aa07ebe3ac704ce3a2a931d5dc9d69b7a">std::numeric_limits&lt;int&gt;::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>() &amp;&amp; from != <a class="code" href="classMiniSat_1_1Clause.html#a4cfd439574f68c6138f4814015a0392b">Clause::TheoryImplication</a>()) {
<a name="l02501"></a>02501     pushID = from-&gt;<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 &lt; from-&gt;<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">&quot;MiniSat::Solver::push: already in search&quot;</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&lt;Clause*&gt;::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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#aeb8881da1f982f5bc58bac190ab2f2a4">id</a>(), lemma-&gt;<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-&gt;<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>() &amp;&amp; (<a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <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> &lt; <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>() &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <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>() &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#ad9d115b0ec2a84ce5ab3f1de19683f06">d_thead</a> &lt; <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>-&gt;<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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory implication: &quot;</span> &lt;&lt; lit.<a class="code" href="classMiniSat_1_1Lit.html#a91d2d44275fe1e43cee4ce673b2ab41d">index</a>() &lt;&lt; <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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory implication reason: &quot;</span> &lt;&lt; <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 &amp;&amp; d_theoryAPI-&gt;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>-&gt;<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 &lt;&lt; <span class="stringliteral">&quot;theory clauses: &quot;</span> &lt;&lt; <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>() &amp;&amp; <a class="code" href="classMiniSat_1_1Solver.html#a22427732a96158ab53c2ffc61714fca4">d_qhead</a> &lt; <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>-&gt;<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">&quot;MiniSat::Solver::requestPop: no more pushes&quot;</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 &amp;&amp; <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> &gt; 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 &lt; <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>-&gt;<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>&amp; pushEntry, vector&lt;Clause*&gt;&amp; 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]-&gt;pushID() &gt;= 0
<a name="l02652"></a>02652   &amp;&amp;
<a name="l02653"></a>02653   clauses[i]-&gt;pushID() &lt;= pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>) {
<a name="l02654"></a>02654       <span class="comment">//      cout &lt;&lt; &quot;solver keep : &quot; &lt;&lt; clauses[i]-&gt;id() &lt;&lt; endl;</span>
<a name="l02655"></a>02655       <span class="comment">//      cout &lt;&lt; &quot;solver keep2 : &quot; &lt;&lt; clauses[i]-&gt;pushID() &lt;&lt; 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 &lt;&lt; &quot;solver pop : &quot; &lt;&lt; clauses[i]-&gt;id() &lt;&lt; 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">&quot;Minisat::Solver::pop: d_popRequests != 1&quot;</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">&quot;Minisat::Solver::pop: inconsistent push, but d_ok == true&quot;</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]-&gt;pushID() &lt;= 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 &lt;&lt; &quot;solver keep lemma reason : &quot; &lt;&lt; lemma-&gt;id() &lt;&lt; endl;</span>
<a name="l02726"></a>02726       <span class="comment">//      cout &lt;&lt; &quot;solver keep lemma reason2 : &quot; &lt;&lt; lemma-&gt;pushID() &lt;&lt; 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-&gt;<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-&gt;<a class="code" href="classMiniSat_1_1Clause.html#ad5cd6daece979cb23f3c52ee0df63a0b">pushID</a>() &lt;= pushEntry.<a class="code" href="structMiniSat_1_1PushEntry.html#a4b43018d1e0983ca3db78e9ffbe54061">d_clauseID</a>) {
<a name="l02734"></a>02734   <span class="comment">//      cout &lt;&lt; &quot;solver keep lemma : &quot; &lt;&lt; lemma-&gt;id() &lt;&lt; endl;</span>
<a name="l02735"></a>02735       <span class="comment">//      cout &lt;&lt; &quot;solver keep lemma2 : &quot; &lt;&lt; lemma-&gt;pushID() &lt;&lt; endl;</span>
<a name="l02736"></a>02736   <span class="keywordflow">if</span> (lemma-&gt;<a class="code" href="classMiniSat_1_1Clause.html#adf5aa50a639b4b5bb71e5ea76d45b8e2">size</a>() &gt;= 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 &lt;&lt; &quot;solver pop lemma : &quot; &lt;&lt; lemma-&gt;id() &lt;&lt; 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>-&gt;<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">&quot;MiniSat::Solver::pop: not in conflict 1&quot;</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">&quot;MiniSat::Solver::pop: not in conflict 2&quot;</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&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>