Files
ortools-clone/docs/cpp/simplification_8cc_source.html
2021-02-26 14:48:18 +01:00

1658 lines
320 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: simplification.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">8.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('simplification_8cc_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">simplification.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="simplification_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2010-2018 Google LLC</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// limitations under the License.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="simplification_8h.html">ortools/sat/simplification.h</a>&quot;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;set&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;absl/memory/memory.h&quot;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="dynamic__partition_8h.html">ortools/algorithms/dynamic_partition.h</a>&quot;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="adjustable__priority__queue-inl_8h.html">ortools/base/adjustable_priority_queue-inl.h</a>&quot;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="random_8h.html">ortools/base/random.h</a>&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="strong__vector_8h.html">ortools/base/strong_vector.h</a>&quot;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="timer_8h.html">ortools/base/timer.h</a>&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="strongly__connected__components_8h.html">ortools/graph/strongly_connected_components.h</a>&quot;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="probing_8h.html">ortools/sat/probing.h</a>&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat__inprocessing_8h.html">ortools/sat/sat_inprocessing.h</a>&quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat_2util_8h.html">ortools/sat/util.h</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="time__limit_8h.html">ortools/util/time_limit.h</a>&quot;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a3b174af81ff48a2cf33d23179125b356"> 38</a></span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a3b174af81ff48a2cf33d23179125b356">SatPostsolver::SatPostsolver</a>(<span class="keywordtype">int</span> num_variables)</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; : initial_num_variables_(num_variables), num_variables_(num_variables) {</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(num_variables);</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_variables; ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; reverse_mapping_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; }</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#af7fbbd00f0e631ce361b5ce6636b2017">Resize</a>(num_variables);</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;}</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab"> 47</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">SatPostsolver::Add</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x, absl::Span&lt;const Literal&gt; clause) {</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!clause.empty());</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::find(clause.begin(), clause.end(), x) != clause.end());</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; associated_literal_.push_back(ApplyReverseMapping(x));</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; clauses_start_.push_back(clauses_literals_.size());</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>&amp; l : clause) {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; clauses_literals_.push_back(ApplyReverseMapping(l));</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; }</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;}</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a40432775821777983c4df6b4f2a71d92"> 57</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a40432775821777983c4df6b4f2a71d92">SatPostsolver::FixVariable</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x) {</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = ApplyReverseMapping(x);</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a945bb6c1e83f281fdde5778473a12b37">AssignFromTrueLiteral</a>(l);</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;}</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; </div>
<div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8155216960c6e1f5d476e1c28b2d34fa"> 62</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8155216960c6e1f5d476e1c28b2d34fa">SatPostsolver::ApplyMapping</a>(</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;BooleanVariable, BooleanVariable&gt;</a>&amp; mapping) {</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;BooleanVariable, BooleanVariable&gt;</a> new_mapping;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">if</span> (reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>() &lt; mapping.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// We have new variables.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">while</span> (reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>() &lt; mapping.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(BooleanVariable(num_variables_++));</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; }</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#af7fbbd00f0e631ce361b5ce6636b2017">Resize</a>(num_variables_);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; }</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordflow">for</span> (BooleanVariable v(0); v &lt; mapping.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>(); ++v) {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">const</span> BooleanVariable image = mapping[v];</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">if</span> (image != <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) {</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">if</span> (image &gt;= new_mapping.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; new_mapping.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(image.value() + 1, <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; new_mapping[image] = reverse_mapping_[v];</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(new_mapping[image], <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; }</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; }</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; std::swap(new_mapping, reverse_mapping_);</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;}</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> SatPostsolver::ApplyReverseMapping(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l) {</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">if</span> (l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>() &gt;= reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">// We have new variables.</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordflow">while</span> (l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>() &gt;= reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(BooleanVariable(num_variables_++));</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; }</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#af7fbbd00f0e631ce361b5ce6636b2017">Resize</a>(num_variables_);</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; }</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(reverse_mapping_[l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()], <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">const</span> Literal result(reverse_mapping_[l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()], l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#ab76ca9049d6f3f1948d7120a98765107">IsPositive</a>());</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(result));</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;}</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="keywordtype">void</span> SatPostsolver::Postsolve(VariablesAssignment* assignment)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// First, we set all unassigned variable to true.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="comment">// This will be a valid assignment of the presolved problem.</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; assignment-&gt;NumberOfVariables(); ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">if</span> (!assignment-&gt;VariableIsAssigned(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; assignment-&gt;AssignFromTrueLiteral(Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>));</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; }</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; }</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordtype">int</span> previous_start = clauses_literals_.size();</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(clauses_start_.size()) - 1; i &gt;= 0; --i) {</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordtype">bool</span> set_associated_var = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_start = clauses_start_[i];</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = new_start; j &lt; previous_start; ++j) {</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">if</span> (assignment-&gt;LiteralIsTrue(clauses_literals_[j])) {</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; set_associated_var = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; }</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; previous_start = new_start;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">if</span> (set_associated_var) {</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; assignment-&gt;UnassignLiteral(associated_literal_[i].Negated());</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; assignment-&gt;AssignFromTrueLiteral(associated_literal_[i]);</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; }</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; </div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// Ignore the value of any variables added by the presolve.</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; assignment-&gt;Resize(initial_num_variables_);</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;}</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
<div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#ac6f385a340d67f08c9f3d8e686ebf571"> 129</a></span>&#160;std::vector&lt;bool&gt; <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#ac6f385a340d67f08c9f3d8e686ebf571">SatPostsolver::ExtractAndPostsolveSolution</a>(</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&amp; solver) {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; std::vector&lt;bool&gt; solution(solver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>());</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; solver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(); ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(solver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">Assignment</a>().<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a49e751eb6f0e9babd957889bb8e7472d">VariableIsAssigned</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; solution[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value()] =</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; solver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">Assignment</a>().<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">LiteralIsTrue</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>));</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8995563af871eb8c2b05bf99bd89344a">PostsolveSolution</a>(solution);</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;}</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
<div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8995563af871eb8c2b05bf99bd89344a"> 140</a></span>&#160;std::vector&lt;bool&gt; <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8995563af871eb8c2b05bf99bd89344a">SatPostsolver::PostsolveSolution</a>(</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keyword">const</span> std::vector&lt;bool&gt;&amp; solution) {</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; solution.size(); ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <a class="code" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, reverse_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>());</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(reverse_mapping_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>], <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a49e751eb6f0e9babd957889bb8e7472d">VariableIsAssigned</a>(reverse_mapping_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>]));</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a945bb6c1e83f281fdde5778473a12b37">AssignFromTrueLiteral</a>(</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(reverse_mapping_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>], solution[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value()]));</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; }</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; Postsolve(&amp;assignment_);</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; std::vector&lt;bool&gt; postsolved_solution;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; postsolved_solution.reserve(initial_num_variables_);</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; initial_num_variables_; ++i) {</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; postsolved_solution.push_back(</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; assignment_.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">LiteralIsTrue</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(BooleanVariable(i), <span class="keyword">true</span>)));</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">return</span> postsolved_solution;</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;}</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a26fc07b3630b79be6914e6387b63a073"> 159</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a26fc07b3630b79be6914e6387b63a073">SatPresolver::AddBinaryClause</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) { <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>({<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>}); }</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
<div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a98bacf41c50979896b4a5f5e41fb0ccf"> 161</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a98bacf41c50979896b4a5f5e41fb0ccf">SatPresolver::AddClause</a>(absl::Span&lt;const Literal&gt; clause) {</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <a class="code" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(clause.size(), 0) &lt;&lt; <span class="stringliteral">&quot;Added an empty clause to the presolver&quot;</span>;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci(clauses_.size());</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; clauses_.push_back(std::vector&lt;Literal&gt;(clause.begin(), clause.end()));</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; in_clause_to_process_.push_back(<span class="keyword">true</span>);</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; clause_to_process_.push_back(ci);</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; std::vector&lt;Literal&gt;&amp; clause_ref = clauses_.back();</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">if</span> (!equiv_mapping_.<a class="code" href="classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc">empty</a>()) {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; clause_ref.size(); ++i) {</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> old_literal = clause_ref[i];</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; clause_ref[i] = <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(equiv_mapping_[clause_ref[i].<a class="code" href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">Index</a>()]);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">if</span> (old_literal != clause_ref[i]) changed = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; }</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; std::sort(clause_ref.begin(), clause_ref.end());</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; clause_ref.erase(std::unique(clause_ref.begin(), clause_ref.end()),</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; clause_ref.end());</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; </div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="comment">// Check for trivial clauses:</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; clause_ref.size(); ++i) {</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">if</span> (clause_ref[i] == clause_ref[i - 1].Negated()) {</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// The clause is trivial!</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; ++num_trivial_clauses_;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; clause_to_process_.pop_back();</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; clauses_.pop_back();</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; in_clause_to_process_.pop_back();</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; }</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; </div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// This needs to be done after the basic canonicalization above.</span></div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; signatures_.push_back(ComputeSignatureOfClauseVariables(ci));</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(signatures_.size(), clauses_.size());</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span> &amp;&amp; changed) {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>(clause_ref);</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a18349231154d0f5eaee94fe213f347e6">DeleteClause</a>(clause);</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; }</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> max_literal = clause_ref.back();</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> required_size = <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(max_literal.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>().value(),</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; max_literal.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>().value()) +</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; 1;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">if</span> (required_size &gt; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(required_size);</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; literal_to_clause_sizes_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(required_size);</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; }</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> e : clause_ref) {</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; literal_to_clauses_[e.Index()].<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(ci);</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; literal_to_clause_sizes_[e.Index()]++;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;}</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a0b58ef3a397720b272662f8bc45585cb"> 216</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a0b58ef3a397720b272662f8bc45585cb">SatPresolver::SetNumVariables</a>(<span class="keywordtype">int</span> num_variables) {</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> required_size = 2 * num_variables;</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (required_size &gt; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>()) {</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(required_size);</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; literal_to_clause_sizes_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(required_size);</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; }</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;}</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;<span class="keywordtype">void</span> SatPresolver::AddClauseInternal(std::vector&lt;Literal&gt;* clause) {</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span>) drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>(*clause);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(clause-&gt;begin(), clause-&gt;end()));</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <a class="code" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(clause-&gt;size(), 0) &lt;&lt; <span class="stringliteral">&quot;TODO(fdid): Unsat during presolve?&quot;</span>;</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci(clauses_.size());</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; clauses_.push_back(std::vector&lt;Literal&gt;());</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; clauses_.back().swap(*clause);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; in_clause_to_process_.push_back(<span class="keyword">true</span>);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; clause_to_process_.push_back(ci);</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> e : clauses_.back()) {</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; literal_to_clauses_[e.Index()].<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(ci);</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; literal_to_clause_sizes_[e.Index()]++;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; UpdatePriorityQueue(e.Variable());</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; UpdateBvaPriorityQueue(e.Index());</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; }</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; </div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; signatures_.push_back(ComputeSignatureOfClauseVariables(ci));</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(signatures_.size(), clauses_.size());</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;}</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160;<a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;BooleanVariable, BooleanVariable&gt;</a></div>
<div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37"> 246</a></span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37">SatPresolver::VariableMapping</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;BooleanVariable, BooleanVariable&gt;</a> result;</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; BooleanVariable new_var(0);</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(); ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">if</span> (literal_to_clause_sizes_[<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()] &gt; 0 ||</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; literal_to_clause_sizes_[<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()] &gt; 0) {</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; result.<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(new_var);</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; ++new_var;</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; result.<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; }</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;}</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; </div>
<div class="line"><a name="l00261"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a11c34313bd8d2e6ac75054fd4bc51a8a"> 261</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a11c34313bd8d2e6ac75054fd4bc51a8a">SatPresolver::LoadProblemIntoSatSolver</a>(<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* solver) {</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// Cleanup some memory that is not needed anymore. Note that we do need</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="comment">// literal_to_clause_sizes_ for VariableMapping() to work.</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; var_pq_.<a class="code" href="class_adjustable_priority_queue.html#aa71d36872f416feaa853788a7a7a7ef8">Clear</a>();</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; var_pq_elements_.<a class="code" href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>();</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; in_clause_to_process_.clear();</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; clause_to_process_.clear();</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>();</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; signatures_.clear();</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;BooleanVariable, BooleanVariable&gt;</a> mapping =</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37">VariableMapping</a>();</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> : mapping) {</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> != <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) ++new_size;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; }</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; </div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; std::vector&lt;Literal&gt; temp;</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a0b58ef3a397720b272662f8bc45585cb">SetNumVariables</a>(new_size);</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">for</span> (std::vector&lt;Literal&gt;&amp; clause_ref : clauses_) {</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; temp.clear();</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l : clause_ref) {</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(mapping[l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()], <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; temp.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(mapping[l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()], l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#ab76ca9049d6f3f1948d7120a98765107">IsPositive</a>()));</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; }</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordflow">if</span> (!temp.empty()) solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#af67fe279478772a6d1492a7f673bda5d">AddProblemClause</a>(temp);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <a class="code" href="namespacegtl.html#a92a0e7b0e74024284adc849a4499940f">gtl::STLClearObject</a>(&amp;clause_ref);</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; }</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;}</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; </div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;<span class="keywordtype">bool</span> SatPresolver::ProcessAllClauses() {</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordtype">int</span> num_skipped_checks = 0;</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> kCheckFrequency = 1000;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; </div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// Because on large problem we don&#39;t have a budget to process all clauses,</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// lets start by the smallest ones first.</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; std::sort(clause_to_process_.begin(), clause_to_process_.end(),</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; [<span class="keyword">this</span>](<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> c1, <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> c2) {</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; return clauses_[c1].size() &lt; clauses_[c2].size();</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; });</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordflow">while</span> (!clause_to_process_.empty()) {</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci = clause_to_process_.front();</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; in_clause_to_process_[ci] = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; clause_to_process_.pop_front();</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ac36d4cd02bbf1501a134d61fc510ad68">ProcessClauseToSimplifyOthers</a>(ci)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">if</span> (++num_skipped_checks &gt;= kCheckFrequency) {</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keywordflow">if</span> (num_inspected_signatures_ + num_inspected_literals_ &gt; 1e9) {</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Aborting ProcessAllClauses() because work limit has been &quot;</span></div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="stringliteral">&quot;reached&quot;</span>;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; }</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">if</span> (time_limit_ != <span class="keyword">nullptr</span> &amp;&amp; time_limit_-&gt;<a class="code" href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">LimitReached</a>()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; num_skipped_checks = 0;</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; }</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;}</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; </div>
<div class="line"><a name="l00319"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f"> 319</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f">SatPresolver::Presolve</a>() {</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="comment">// This is slighlty inefficient, but the presolve algorithm is</span></div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="comment">// a lot more costly anyway.</span></div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; std::vector&lt;bool&gt; can_be_removed(<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(), <span class="keyword">true</span>);</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f">Presolve</a>(can_be_removed);</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;}</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; </div>
<div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a3b636dc06cf5ebfd4d592aec34cf1994"> 326</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f">SatPresolver::Presolve</a>(<span class="keyword">const</span> std::vector&lt;bool&gt;&amp; can_be_removed,</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordtype">bool</span> log_info) {</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; log_info |= <a class="code" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1);</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; </div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <a class="code" href="class_wall_timer.html">WallTimer</a> timer;</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; timer.<a class="code" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (log_info) {</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_removable = 0;</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a> : can_be_removed) {</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) ++num_removable;</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; }</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) &lt;&lt; <span class="stringliteral">&quot;num removable Booleans: &quot;</span> &lt;&lt; num_removable &lt;&lt; <span class="stringliteral">&quot; / &quot;</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; &lt;&lt; can_be_removed.size();</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <a class="code" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) &lt;&lt; <span class="stringliteral">&quot;num trivial clauses: &quot;</span> &lt;&lt; num_trivial_clauses_;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; DisplayStats(0);</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; </div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// TODO(user): When a clause is strengthened, add it to a queue so it can</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// be processed again?</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">if</span> (!ProcessAllClauses()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">if</span> (log_info) DisplayStats(timer.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>());</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; </div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span> (time_limit_ != <span class="keyword">nullptr</span> &amp;&amp; time_limit_-&gt;<a class="code" href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">LimitReached</a>()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">if</span> (num_inspected_signatures_ + num_inspected_literals_ &gt; 1e9) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; </div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; InitializePriorityQueue();</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">while</span> (var_pq_.<a class="code" href="class_adjustable_priority_queue.html#a24926108b770033792d015cb86aeffb3">Size</a>() &gt; 0) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keyword">const</span> BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = var_pq_.<a class="code" href="class_adjustable_priority_queue.html#a8e7578f2135632c4d0ce66fd5936231e">Top</a>()-&gt;variable;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; var_pq_.<a class="code" href="class_adjustable_priority_queue.html#a701a584ce72cccbcce9cb0656b6c898b">Pop</a>();</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">if</span> (!can_be_removed[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ae39cbe1919d9200f3f41cf96b7eee703">CrossProduct</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>))) {</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">if</span> (!ProcessAllClauses()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; }</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">if</span> (time_limit_ != <span class="keyword">nullptr</span> &amp;&amp; time_limit_-&gt;<a class="code" href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">LimitReached</a>()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keywordflow">if</span> (num_inspected_signatures_ + num_inspected_literals_ &gt; 1e9) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; }</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (log_info) DisplayStats(timer.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>());</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; </div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="comment">// We apply BVA after a pass of the other algorithms.</span></div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">if</span> (parameters_.presolve_use_bva()) {</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a5ddcb2924990b8dbcf375f7c19846218">PresolveWithBva</a>();</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">if</span> (log_info) DisplayStats(timer.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>());</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; </div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;}</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; </div>
<div class="line"><a name="l00373"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a5ddcb2924990b8dbcf375f7c19846218"> 373</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a5ddcb2924990b8dbcf375f7c19846218">SatPresolver::PresolveWithBva</a>() {</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; var_pq_elements_.<a class="code" href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>(); <span class="comment">// so we don&#39;t update it.</span></div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; InitializeBvaPriorityQueue();</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">while</span> (bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a24926108b770033792d015cb86aeffb3">Size</a>() &gt; 0) {</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keyword">const</span> LiteralIndex lit = bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a8e7578f2135632c4d0ce66fd5936231e">Top</a>()-&gt;literal;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a701a584ce72cccbcce9cb0656b6c898b">Pop</a>();</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; SimpleBva(lit);</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;}</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; </div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;<span class="comment">// We use the same notation as in the article mentionned in the .h</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;<span class="keywordtype">void</span> SatPresolver::SimpleBva(LiteralIndex l) {</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; literal_to_p_size_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>(), 0);</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::all_of(literal_to_p_size_.<a class="code" href="classabsl_1_1_strong_vector.html#ad69bd11391be1a1dba5c8202259664f8">begin</a>(), literal_to_p_size_.<a class="code" href="classabsl_1_1_strong_vector.html#acad38d52497a975bfb6f2f6acd76631f">end</a>(),</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; [](<span class="keywordtype">int</span> v) { return v == 0; }));</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; </div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// We will try to add a literal to m_lit_ and take a subset of m_cls_ such</span></div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// that |m_lit_| * |m_cls_| - |m_lit_| - |m_cls_| is maximized.</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; m_lit_ = {l};</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; m_cls_ = literal_to_clauses_[l];</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; </div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordtype">int</span> reduction = 0;</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">while</span> (<span class="keyword">true</span>) {</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; LiteralIndex lmax = <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordtype">int</span> max_size = 0;</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; </div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; flattened_p_.clear();</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> c : m_cls_) {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause = clauses_[c];</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">if</span> (clause.empty()) <span class="keywordflow">continue</span>; <span class="comment">// It has been deleted.</span></div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; </div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// Find a literal different from l that occur in the less number of</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="comment">// clauses.</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keyword">const</span> LiteralIndex l_min =</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; FindLiteralWithShortestOccurrenceListExcluding(clause, Literal(l));</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (l_min == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; </div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="comment">// Find all the clauses of the form &quot;clause \ {l} + {l&#39;}&quot;, for a literal</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="comment">// l&#39; that is not in the clause.</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> d : literal_to_clauses_[l_min]) {</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">if</span> (clause.size() != clauses_[d].size()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keyword">const</span> LiteralIndex l_diff =</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a7cc19650ad546aee24b7abe12910437c">DifferAtGivenLiteral</a>(clause, clauses_[d], Literal(l));</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keywordflow">if</span> (l_diff == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a> || m_lit_.count(l_diff) &gt; 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="keywordflow">if</span> (l_diff == Literal(l).NegatedIndex()) {</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">// Self-subsumbtion!</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="comment">// TODO(user): Not sure this can happen after the presolve we did</span></div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// before calling SimpleBva().</span></div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;self-subsumbtion&quot;</span>;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; }</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; </div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; flattened_p_.push_back({l_diff, c});</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_size = ++literal_to_p_size_[l_diff];</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (new_size &gt; max_size) {</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; lmax = l_diff;</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; max_size = new_size;</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; }</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; }</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; </div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="keywordflow">if</span> (lmax == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_m_lit_size = m_lit_.size() + 1;</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_m_cls_size = max_size;</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_reduction =</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; new_m_lit_size * new_m_cls_size - new_m_cls_size - new_m_lit_size;</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; </div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">if</span> (new_reduction &lt;= reduction) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(1, new_m_lit_size);</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(1, new_m_cls_size);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; </div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="comment">// TODO(user): Instead of looping and recomputing p_ again, we can instead</span></div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="comment">// simply intersect the clause indices in p_. This should be a lot faster.</span></div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="comment">// That said, we loop again only when we have a reduction, so this happens</span></div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="comment">// not that often compared to the initial computation of p.</span></div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; reduction = new_reduction;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; m_lit_.insert(lmax);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; </div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">// Set m_cls_ to p_[lmax].</span></div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; m_cls_.clear();</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> entry : flattened_p_) {</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; literal_to_p_size_[entry.first] = 0;</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="keywordflow">if</span> (entry.first == lmax) m_cls_.<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(entry.second);</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; flattened_p_.clear();</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; }</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; </div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// Make sure literal_to_p_size_ is all zero.</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> entry : flattened_p_) literal_to_p_size_[entry.first] = 0;</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; flattened_p_.<a class="code" href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>();</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="comment">// A strictly positive reduction means that applying the BVA transform will</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="comment">// reduce the overall number of clauses by that much. Here we can control</span></div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="comment">// what kind of reduction we want to apply.</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordflow">if</span> (reduction &lt;= parameters_.presolve_bva_threshold()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <a class="code" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(m_lit_.size(), 1);</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; </div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// Create a new variable.</span></div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> old_size = literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>();</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keyword">const</span> LiteralIndex x_true = LiteralIndex(old_size);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keyword">const</span> LiteralIndex x_false = LiteralIndex(old_size + 1);</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; literal_to_clauses_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(old_size + 2);</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; literal_to_clause_sizes_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(old_size + 2);</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; bva_pq_elements_.resize(old_size + 2);</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; bva_pq_elements_[x_true.value()].literal = x_true;</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; bva_pq_elements_[x_false.value()].literal = x_false;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; </div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// Add the new clauses.</span></div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span>) drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#af78b6dc2106ca6744f8d69cf5a70dfa4">AddOneVariable</a>();</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> LiteralIndex lit : m_lit_) {</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; tmp_new_clause_ = {Literal(lit), Literal(x_true)};</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; AddClauseInternal(&amp;tmp_new_clause_);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; }</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci : m_cls_) {</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; tmp_new_clause_ = clauses_[ci];</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!tmp_new_clause_.empty());</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">for</span> (Literal&amp; ref : tmp_new_clause_) {</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <span class="keywordflow">if</span> (ref.Index() == l) {</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; ref = Literal(x_false);</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; }</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; </div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="comment">// TODO(user): we can be more efficient here since the clause used to</span></div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="comment">// derive this one is already sorted. We just need to insert x_false in</span></div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="comment">// the correct place and remove l.</span></div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; std::sort(tmp_new_clause_.begin(), tmp_new_clause_.end());</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; AddClauseInternal(&amp;tmp_new_clause_);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; }</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; </div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">// Delete the old clauses.</span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="comment">// TODO(user): do that more efficiently? we can simply store the clause d</span></div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="comment">// instead of finding it again. That said, this is executed only when a</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="comment">// reduction occur, whereas the start of this function occur all the time, so</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="comment">// we want it to be as fast as possible.</span></div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> c : m_cls_) {</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause = clauses_[c];</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!clause.empty());</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keyword">const</span> LiteralIndex l_min =</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; FindLiteralWithShortestOccurrenceListExcluding(clause, Literal(l));</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> LiteralIndex lit : m_lit_) {</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">if</span> (lit == l) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> d : literal_to_clauses_[l_min]) {</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordflow">if</span> (clause.size() != clauses_[d].size()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">const</span> LiteralIndex l_diff =</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a7cc19650ad546aee24b7abe12910437c">DifferAtGivenLiteral</a>(clause, clauses_[d], Literal(l));</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">if</span> (l_diff == lit) {</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; Remove(d);</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; }</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; }</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; Remove(c);</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="comment">// Add these elements to the priority queue.</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="comment">// TODO(user): It seems some of the element already processed could benefit</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="comment">// from being processed again by SimpleBva(). It is unclear if it is worth the</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="comment">// extra time though.</span></div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; AddToBvaPriorityQueue(x_true);</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; AddToBvaPriorityQueue(x_false);</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; AddToBvaPriorityQueue(l);</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;}</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; </div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;<a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> SatPresolver::ComputeSignatureOfClauseVariables(ClauseIndex ci) {</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> signature = 0;</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Literal l : clauses_[ci]) {</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; signature |= (<a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a>{1} &lt;&lt; (l.Variable().value() % 64));</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; }</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(signature == 0, clauses_[ci].empty());</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">return</span> signature;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;}</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; </div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;<span class="comment">// We are looking for clause that contains lit and contains a superset of the</span></div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;<span class="comment">// literals in clauses_[clauses_index] or a superset with just one literal of</span></div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;<span class="comment">// clauses_[clause_index] negated.</span></div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;<span class="keywordtype">bool</span> SatPresolver::ProcessClauseToSimplifyOthersUsingLiteral(</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; ClauseIndex clause_index, Literal lit) {</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause = clauses_[clause_index];</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> clause_signature = signatures_[clause_index];</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; LiteralIndex opposite_literal;</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; </div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="comment">// Try to simplify the clauses containing &#39;lit&#39;. We take advantage of this</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">// loop to also detect if there is any empty clause, in which case we will</span></div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="comment">// trigger a &quot;cleaning&quot; below.</span></div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordtype">bool</span> need_cleaning = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; num_inspected_signatures_ += literal_to_clauses_[lit.Index()].<a class="code" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>();</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci : literal_to_clauses_[lit.Index()]) {</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> ci_signature = signatures_[ci];</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; </div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="comment">// This allows to check for empty clause without fetching the memory at</span></div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">// clause_[ci]. It can have a huge time impact on large problems.</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(ci_signature, ComputeSignatureOfClauseVariables(ci));</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">if</span> (ci_signature == 0) {</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; need_cleaning = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; }</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; </div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="comment">// Note that SimplifyClause() can return true only if the variables in</span></div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="comment">// &#39;a&#39; are a subset of the one in &#39;b&#39;. We use the signatures to abort</span></div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="comment">// early as a speed optimization.</span></div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordflow">if</span> (ci != clause_index &amp;&amp; (clause_signature &amp; ~ci_signature) == 0 &amp;&amp;</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ae8b3a53c4ac6b35d00a4b7282442d1d0">SimplifyClause</a>(clause, &amp;clauses_[ci], &amp;opposite_literal,</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; &amp;num_inspected_literals_)) {</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="keywordflow">if</span> (opposite_literal == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; need_cleaning = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; Remove(ci);</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(opposite_literal, lit.Index());</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">if</span> (clauses_[ci].empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// UNSAT.</span></div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="comment">// TODO(user): remove the old clauses_[ci] afterwards.</span></div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>(clauses_[ci]);</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; }</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; </div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="comment">// Recompute signature.</span></div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; signatures_[ci] = ComputeSignatureOfClauseVariables(ci);</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; </div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="comment">// Remove ci from the occurrence list. Note that opposite_literal</span></div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="comment">// cannot be literal or literal.Negated().</span></div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <a class="code" href="namespacegtl.html#a82eb98ee939aaa7b64a85fa63453689e">gtl::STLEraseAllFromSequence</a>(&amp;literal_to_clauses_[opposite_literal],</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; ci);</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; --literal_to_clause_sizes_[opposite_literal];</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; UpdatePriorityQueue(Literal(opposite_literal).Variable());</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; </div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordflow">if</span> (!in_clause_to_process_[ci]) {</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; in_clause_to_process_[ci] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; clause_to_process_.push_back(ci);</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; }</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; }</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; }</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordflow">if</span> (need_cleaning) {</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keywordtype">int</span> new_index = 0;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keyword">auto</span>&amp; occurrence_list_ref = literal_to_clauses_[lit.Index()];</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci : occurrence_list_ref) {</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordflow">if</span> (signatures_[ci] != 0) occurrence_list_ref[new_index++] = ci;</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; }</div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; occurrence_list_ref.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(new_index);</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(literal_to_clause_sizes_[lit.Index()], new_index);</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; }</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; </div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;}</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; </div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;<span class="comment">// TODO(user): Binary clauses are really common, and we can probably do this</span></div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="comment">// more efficiently for them. For instance, we could just take the intersection</span></div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;<span class="comment">// of two sorted lists to get the simplified clauses.</span></div>
<div class="line"><a name="l00625"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ac36d4cd02bbf1501a134d61fc510ad68"> 625</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ac36d4cd02bbf1501a134d61fc510ad68">SatPresolver::ProcessClauseToSimplifyOthers</a>(<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> clause_index) {</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause = clauses_[clause_index];</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keywordflow">if</span> (clause.empty()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(clause.begin(), clause.end()));</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; </div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; LiteralIndex opposite_literal;</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> lit = FindLiteralWithShortestOccurrenceList(clause);</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; </div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="keywordflow">if</span> (!ProcessClauseToSimplifyOthersUsingLiteral(clause_index, lit)) {</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; }</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; </div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="comment">// If there is another &quot;short&quot; occurrence list, use it. Otherwise use the</span></div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="comment">// one corresponding to the negation of lit.</span></div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; <span class="keyword">const</span> LiteralIndex other_lit_index =</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; FindLiteralWithShortestOccurrenceListExcluding(clause, lit);</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">if</span> (other_lit_index != <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a> &amp;&amp;</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; literal_to_clause_sizes_[other_lit_index] &lt;</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; literal_to_clause_sizes_[lit.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()]) {</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="keywordflow">return</span> ProcessClauseToSimplifyOthersUsingLiteral(clause_index,</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(other_lit_index));</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="comment">// Treat the clauses containing lit.Negated().</span></div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordtype">int</span> new_index = 0;</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordtype">bool</span> something_removed = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keyword">auto</span>&amp; occurrence_list_ref = literal_to_clauses_[lit.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()];</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> clause_signature = signatures_[clause_index];</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> ci : occurrence_list_ref) {</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a> ci_signature = signatures_[ci];</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(ci_signature, ComputeSignatureOfClauseVariables(ci));</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="keywordflow">if</span> (ci_signature == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; </div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="comment">// TODO(user): not super optimal since we could abort earlier if</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="comment">// opposite_literal is not the negation of shortest_list. Note that this</span></div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="comment">// applies to the second call to</span></div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// ProcessClauseToSimplifyOthersUsingLiteral() above too.</span></div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span> ((clause_signature &amp; ~ci_signature) == 0 &amp;&amp;</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ae8b3a53c4ac6b35d00a4b7282442d1d0">SimplifyClause</a>(clause, &amp;clauses_[ci], &amp;opposite_literal,</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; &amp;num_inspected_literals_)) {</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(opposite_literal, lit.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>());</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="keywordflow">if</span> (clauses_[ci].empty()) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// UNSAT.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="comment">// TODO(user): remove the old clauses_[ci] afterwards.</span></div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>(clauses_[ci]);</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; }</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; </div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="comment">// Recompute signature.</span></div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; signatures_[ci] = ComputeSignatureOfClauseVariables(ci);</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; </div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="keywordflow">if</span> (!in_clause_to_process_[ci]) {</div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; in_clause_to_process_[ci] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; clause_to_process_.push_back(ci);</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; }</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; something_removed = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; }</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; occurrence_list_ref[new_index] = ci;</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; ++new_index;</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; }</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; occurrence_list_ref.resize(new_index);</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; literal_to_clause_sizes_[lit.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()] = new_index;</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keywordflow">if</span> (something_removed) {</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; UpdatePriorityQueue(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(lit.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>());</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; }</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160;}</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; </div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160;<span class="keywordtype">void</span> SatPresolver::RemoveAndRegisterForPostsolveAllClauseContaining(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x) {</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> i : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) {</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keywordflow">if</span> (!clauses_[i].empty()) RemoveAndRegisterForPostsolve(i, x);</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; }</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <a class="code" href="namespacegtl.html#a92a0e7b0e74024284adc849a4499940f">gtl::STLClearObject</a>(&amp;literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]);</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; literal_to_clause_sizes_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()] = 0;</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160;}</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; </div>
<div class="line"><a name="l00701"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ae39cbe1919d9200f3f41cf96b7eee703"> 701</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#ae39cbe1919d9200f3f41cf96b7eee703">SatPresolver::CrossProduct</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x) {</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> s1 = literal_to_clause_sizes_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()];</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> s2 = literal_to_clause_sizes_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()];</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; </div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="comment">// Note that if s1 or s2 is equal to 0, this function will implicitely just</span></div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="comment">// fix the variable x.</span></div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="keywordflow">if</span> (s1 == 0 &amp;&amp; s2 == 0) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; </div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="comment">// Heuristic. Abort if the work required to decide if x should be removed</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="comment">// seems to big.</span></div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">if</span> (s1 &gt; 1 &amp;&amp; s2 &gt; 1 &amp;&amp; s1 * s2 &gt; parameters_.presolve_bve_threshold()) {</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; }</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; </div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="comment">// Compute the threshold under which we don&#39;t remove x.Variable().</span></div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="keywordtype">int</span> threshold = 0;</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> clause_weight = parameters_.presolve_bve_clause_weight();</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> i : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) {</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="keywordflow">if</span> (!clauses_[i].empty()) {</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; threshold += clause_weight + clauses_[i].size();</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; }</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; }</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> i : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()]) {</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <span class="keywordflow">if</span> (!clauses_[i].empty()) {</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; threshold += clause_weight + clauses_[i].size();</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; }</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; }</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; </div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="comment">// For the BCE, we prefer s2 to be small.</span></div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (s1 &lt; s2) x = x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; </div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="comment">// Test whether we should remove the x.Variable().</span></div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keywordtype">int</span> size = 0;</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> i : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) {</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keywordflow">if</span> (clauses_[i].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordtype">bool</span> no_resolvant = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> j : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()]) {</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="keywordflow">if</span> (clauses_[j].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> rs = <a class="code" href="namespaceoperations__research_1_1sat.html#a2bf59c05d95db86f40a3d1577429683b">ComputeResolvantSize</a>(x, clauses_[i], clauses_[j]);</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keywordflow">if</span> (rs &gt;= 0) {</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; no_resolvant = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; size += clause_weight + rs;</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; </div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="comment">// Abort early if the &quot;size&quot; become too big.</span></div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="keywordflow">if</span> (size &gt; threshold) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; }</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; }</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <span class="keywordflow">if</span> (no_resolvant &amp;&amp; parameters_.presolve_blocked_clause()) {</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="comment">// This is an incomplete heuristic for blocked clause detection. Here,</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <span class="comment">// the clause i is &quot;blocked&quot;, so we can remove it. Note that the code</span></div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="comment">// below already do that if we decide to eliminate x.</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="comment">// For more details, see the paper &quot;Blocked clause elimination&quot;, Matti</span></div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <span class="comment">// Jarvisalo, Armin Biere, Marijn Heule. TACAS, volume 6015 of Lecture</span></div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="comment">// Notes in Computer Science, pages 129144. Springer, 2010.</span></div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="comment">// TODO(user): Choose if we use x or x.Negated() depending on the list</span></div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="comment">// sizes? The function achieve the same if x = x.Negated(), however the</span></div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="comment">// loops are not done in the same order which may change this incomplete</span></div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <span class="comment">// &quot;blocked&quot; clause detection.</span></div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; RemoveAndRegisterForPostsolve(i, x);</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; }</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; }</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; </div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="comment">// Add all the resolvant clauses.</span></div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; <span class="comment">// Note that the variable priority queue will only be updated during the</span></div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; <span class="comment">// deletion.</span></div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; std::vector&lt;Literal&gt; temp;</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> i : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) {</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="keywordflow">if</span> (clauses_[i].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">ClauseIndex</a> j : literal_to_clauses_[x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()]) {</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="keywordflow">if</span> (clauses_[j].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a93ca885a2ad18527fab730188104771a">ComputeResolvant</a>(x, clauses_[i], clauses_[j], &amp;temp)) {</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; AddClauseInternal(&amp;temp);</div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; }</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; }</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; }</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; </div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="comment">// Deletes the old clauses.</span></div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="comment">// TODO(user): We could only update the priority queue once for each variable</span></div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="comment">// instead of doing it many times.</span></div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; RemoveAndRegisterForPostsolveAllClauseContaining(x);</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; RemoveAndRegisterForPostsolveAllClauseContaining(x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; </div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="comment">// TODO(user): At this point x.Variable() is added back to the priority queue.</span></div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; <span class="comment">// Avoid doing that.</span></div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160;}</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; </div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;<span class="keywordtype">void</span> SatPresolver::Remove(ClauseIndex ci) {</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; signatures_[ci] = 0;</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> e : clauses_[ci]) {</div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; literal_to_clause_sizes_[e.Index()]--;</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; UpdatePriorityQueue(e.Variable());</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; UpdateBvaPriorityQueue(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.Variable(), <span class="keyword">true</span>).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>());</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; UpdateBvaPriorityQueue(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.Variable(), <span class="keyword">false</span>).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>());</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; }</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler_ != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; drat_proof_handler_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a18349231154d0f5eaee94fe213f347e6">DeleteClause</a>(clauses_[ci]);</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; }</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <a class="code" href="namespacegtl.html#a92a0e7b0e74024284adc849a4499940f">gtl::STLClearObject</a>(&amp;clauses_[ci]);</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160;}</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; </div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;<span class="keywordtype">void</span> SatPresolver::RemoveAndRegisterForPostsolve(ClauseIndex ci, Literal x) {</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; postsolver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">Add</a>(x, clauses_[ci]);</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; Remove(ci);</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160;}</div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; </div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160;Literal SatPresolver::FindLiteralWithShortestOccurrenceList(</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause) {</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!clause.empty());</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; Literal result = clause.front();</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keywordtype">int</span> best_size = literal_to_clause_sizes_[result.Index()];</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Literal l : clause) {</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> size = literal_to_clause_sizes_[l.Index()];</div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="keywordflow">if</span> (size &lt; best_size) {</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; result = l;</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; best_size = size;</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; }</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; }</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160;}</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; </div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160;LiteralIndex SatPresolver::FindLiteralWithShortestOccurrenceListExcluding(</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; clause, Literal to_exclude) {</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!clause.empty());</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; LiteralIndex result = <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordtype">int</span> num_occurrences = <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::numeric_limits&lt;int&gt;::max</a>();</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Literal l : clause) {</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; <span class="keywordflow">if</span> (l == to_exclude) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keywordflow">if</span> (literal_to_clause_sizes_[l.Index()] &lt; num_occurrences) {</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; result = l.Index();</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; num_occurrences = literal_to_clause_sizes_[l.Index()];</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; }</div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; }</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160;}</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; </div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160;<span class="keywordtype">void</span> SatPresolver::UpdatePriorityQueue(BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keywordflow">if</span> (var_pq_elements_.<a class="code" href="classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc">empty</a>()) <span class="keywordflow">return</span>; <span class="comment">// not initialized.</span></div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; PQElement* element = &amp;var_pq_elements_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; element-&gt;weight = literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>).Index()] +</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>).Index()];</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <span class="keywordflow">if</span> (var_pq_.<a class="code" href="class_adjustable_priority_queue.html#a7d1005d75f40525f91a2acb84348bc3c">Contains</a>(element)) {</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; var_pq_.<a class="code" href="class_adjustable_priority_queue.html#a506169056c5f470fabdf77aa1934a5a3">NoteChangedPriority</a>(element);</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; var_pq_.<a class="code" href="class_adjustable_priority_queue.html#ac312fa979ea8afd5deabd6b581b3bb1f">Add</a>(element);</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; }</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;}</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; </div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160;<span class="keywordtype">void</span> SatPresolver::InitializePriorityQueue() {</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; var_pq_elements_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(num_vars);</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_vars; ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; PQElement* element = &amp;var_pq_elements_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; element-&gt;variable = <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; element-&gt;weight = literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>).Index()] +</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>).Index()];</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; var_pq_.<a class="code" href="class_adjustable_priority_queue.html#ac312fa979ea8afd5deabd6b581b3bb1f">Add</a>(element);</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; }</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160;}</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; </div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160;<span class="keywordtype">void</span> SatPresolver::UpdateBvaPriorityQueue(LiteralIndex lit) {</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <span class="keywordflow">if</span> (bva_pq_elements_.empty()) <span class="keywordflow">return</span>; <span class="comment">// not initialized.</span></div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <a class="code" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(lit, bva_pq_elements_.size());</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; BvaPqElement* element = &amp;bva_pq_elements_[lit.value()];</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; element-&gt;weight = literal_to_clause_sizes_[lit];</div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="keywordflow">if</span> (bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a7d1005d75f40525f91a2acb84348bc3c">Contains</a>(element)) {</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a506169056c5f470fabdf77aa1934a5a3">NoteChangedPriority</a>(element);</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; }</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160;}</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; </div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160;<span class="keywordtype">void</span> SatPresolver::AddToBvaPriorityQueue(LiteralIndex lit) {</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keywordflow">if</span> (bva_pq_elements_.empty()) <span class="keywordflow">return</span>; <span class="comment">// not initialized.</span></div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(lit, bva_pq_elements_.size());</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; BvaPqElement* element = &amp;bva_pq_elements_[lit.value()];</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; element-&gt;weight = literal_to_clause_sizes_[lit];</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#a7d1005d75f40525f91a2acb84348bc3c">Contains</a>(element));</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">if</span> (element-&gt;weight &gt; 2) bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#ac312fa979ea8afd5deabd6b581b3bb1f">Add</a>(element);</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160;}</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; </div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160;<span class="keywordtype">void</span> SatPresolver::InitializeBvaPriorityQueue() {</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_literals = 2 * <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#aa71d36872f416feaa853788a7a7a7ef8">Clear</a>();</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; bva_pq_elements_.assign(num_literals, BvaPqElement());</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <span class="keywordflow">for</span> (LiteralIndex lit(0); lit &lt; num_literals; ++lit) {</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; BvaPqElement* element = &amp;bva_pq_elements_[lit.value()];</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; element-&gt;literal = lit;</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; element-&gt;weight = literal_to_clause_sizes_[lit];</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; </div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="comment">// If a literal occur only in two clauses, then there is no point calling</span></div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; <span class="comment">// SimpleBva() on it.</span></div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keywordflow">if</span> (element-&gt;weight &gt; 2) bva_pq_.<a class="code" href="class_adjustable_priority_queue.html#ac312fa979ea8afd5deabd6b581b3bb1f">Add</a>(element);</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; }</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160;}</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; </div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160;<span class="keywordtype">void</span> SatPresolver::DisplayStats(<span class="keywordtype">double</span> elapsed_seconds) {</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <span class="keywordtype">int</span> num_literals = 0;</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordtype">int</span> num_clauses = 0;</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="keywordtype">int</span> num_singleton_clauses = 0;</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; c : clauses_) {</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordflow">if</span> (!c.empty()) {</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="keywordflow">if</span> (c.size() == 1) ++num_singleton_clauses;</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; ++num_clauses;</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; num_literals += c.size();</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; }</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; }</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordtype">int</span> num_one_side = 0;</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; <span class="keywordtype">int</span> num_simple_definition = 0;</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <span class="keywordtype">int</span> num_vars = 0;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(); ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> s1 = literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>).Index()];</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> s2 = literal_to_clause_sizes_[Literal(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>).Index()];</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <span class="keywordflow">if</span> (s1 == 0 &amp;&amp; s2 == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; </div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; ++num_vars;</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">if</span> (s1 == 0 || s2 == 0) {</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; num_one_side++;</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (s1 == 1 || s2 == 1) {</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; num_simple_definition++;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; }</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; }</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <a class="code" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) &lt;&lt; <span class="stringliteral">&quot; [&quot;</span> &lt;&lt; elapsed_seconds &lt;&lt; <span class="stringliteral">&quot;s]&quot;</span></div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; &lt;&lt; <span class="stringliteral">&quot; clauses:&quot;</span> &lt;&lt; num_clauses &lt;&lt; <span class="stringliteral">&quot; literals:&quot;</span> &lt;&lt; num_literals</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; &lt;&lt; <span class="stringliteral">&quot; vars:&quot;</span> &lt;&lt; num_vars &lt;&lt; <span class="stringliteral">&quot; one_side_vars:&quot;</span> &lt;&lt; num_one_side</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; &lt;&lt; <span class="stringliteral">&quot; simple_definition:&quot;</span> &lt;&lt; num_simple_definition</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; &lt;&lt; <span class="stringliteral">&quot; singleton_clauses:&quot;</span> &lt;&lt; num_singleton_clauses;</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160;}</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; </div>
<div class="line"><a name="l00931"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ae8b3a53c4ac6b35d00a4b7282442d1d0"> 931</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ae8b3a53c4ac6b35d00a4b7282442d1d0">SimplifyClause</a>(<span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, std::vector&lt;Literal&gt;* <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>,</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; LiteralIndex* opposite_literal,</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a>* num_inspected_literals) {</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;size() &lt; <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()));</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;begin(), <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;end()));</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keywordflow">if</span> (num_inspected_literals != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; *num_inspected_literals += <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.size();</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; *num_inspected_literals += <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;size();</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; }</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; </div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; *opposite_literal = LiteralIndex(-1);</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; </div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="keywordtype">int</span> num_diff = 0;</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; std::vector&lt;Literal&gt;::const_iterator ia = <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin();</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; std::vector&lt;Literal&gt;::const_iterator ib = <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;begin();</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; std::vector&lt;Literal&gt;::const_iterator to_remove;</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; </div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <span class="comment">// Because we abort early when size_diff becomes negative, the second test</span></div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="comment">// in the while loop is not needed.</span></div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <span class="keywordtype">int</span> size_diff = <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;size() - <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.size();</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <span class="keywordflow">while</span> (ia != <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end() <span class="comment">/* &amp;&amp; ib != b-&gt;end() */</span>) {</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; <span class="keywordflow">if</span> (*ia == *ib) { <span class="comment">// Same literal.</span></div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; ++ia;</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; ++ib;</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia == ib-&gt;Negated()) { <span class="comment">// Opposite literal.</span></div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; ++num_diff;</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keywordflow">if</span> (num_diff &gt; 1) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Too much difference.</span></div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; to_remove = ib;</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; ++ia;</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; ++ib;</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia &lt; *ib) {</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// A literal of a is not in b.</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; } <span class="keywordflow">else</span> { <span class="comment">// *ia &gt; *ib</span></div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; ++ib;</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; </div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; <span class="comment">// A literal of b is not in a, we can abort early by comparing the sizes</span></div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="comment">// left.</span></div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="keywordflow">if</span> (--size_diff &lt; 0) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; }</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; }</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; <span class="keywordflow">if</span> (num_diff == 1) {</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; *opposite_literal = to_remove-&gt;Index();</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>-&gt;erase(to_remove);</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; }</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;}</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; </div>
<div class="line"><a name="l00979"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a7cc19650ad546aee24b7abe12910437c"> 979</a></span>&#160;LiteralIndex <a class="code" href="namespaceoperations__research_1_1sat.html#a7cc19650ad546aee24b7abe12910437c">DifferAtGivenLiteral</a>(<span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>,</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l) {</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.size(), <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.size());</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()));</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end()));</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; LiteralIndex result = <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; std::vector&lt;Literal&gt;::const_iterator ia = <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin();</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; std::vector&lt;Literal&gt;::const_iterator ib = <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin();</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <span class="keywordflow">while</span> (ia != <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end() &amp;&amp; ib != <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end()) {</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="keywordflow">if</span> (*ia == *ib) { <span class="comment">// Same literal.</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; ++ia;</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; ++ib;</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia &lt; *ib) {</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <span class="comment">// A literal of a is not in b, it must be l.</span></div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="comment">// Note that this can only happen once.</span></div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; <span class="keywordflow">if</span> (*ia != l) <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; ++ia;</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; <span class="comment">// A literal of b is not in a, save it.</span></div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="comment">// We abort if this happen twice.</span></div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; result = (*ib).Index();</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; ++ib;</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; }</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; }</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <span class="comment">// Check the corner case of the difference at the end.</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="keywordflow">if</span> (ia != <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end() &amp;&amp; *ia != l) <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <span class="keywordflow">if</span> (ib != <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end()) {</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; result = (*ib).Index();</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; }</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;}</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; </div>
<div class="line"><a name="l01013"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a93ca885a2ad18527fab730188104771a"> 1013</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a93ca885a2ad18527fab730188104771a">ComputeResolvant</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x, <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>,</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>,</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; std::vector&lt;Literal&gt;* out) {</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()));</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end()));</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; </div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; out-&gt;clear();</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; std::vector&lt;Literal&gt;::const_iterator ia = <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin();</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; std::vector&lt;Literal&gt;::const_iterator ib = <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin();</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="keywordflow">while</span> ((ia != <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()) &amp;&amp; (ib != <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end())) {</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; <span class="keywordflow">if</span> (*ia == *ib) {</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; out-&gt;push_back(*ia);</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; ++ia;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; ++ib;</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia == ib-&gt;Negated()) {</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="keywordflow">if</span> (*ia != x) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Trivially true.</span></div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(*ib, x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; ++ia;</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; ++ib;</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia &lt; *ib) {</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; out-&gt;push_back(*ia);</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; ++ia;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; } <span class="keywordflow">else</span> { <span class="comment">// *ia &gt; *ib</span></div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; out-&gt;push_back(*ib);</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; ++ib;</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; }</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; }</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; </div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="comment">// Copy remaining literals.</span></div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; out-&gt;insert(out-&gt;end(), ia, <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end());</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; out-&gt;insert(out-&gt;end(), ib, <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end());</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;}</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; </div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;<span class="comment">// Note that this function takes a big chunk of the presolve running time.</span></div>
<div class="line"><a name="l01048"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a2bf59c05d95db86f40a3d1577429683b"> 1048</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a2bf59c05d95db86f40a3d1577429683b">ComputeResolvantSize</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> x, <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>,</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) {</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()));</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::is_sorted(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin(), <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end()));</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; </div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <span class="keywordtype">int</span> size = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.size() + <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.size()) - 2;</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; std::vector&lt;Literal&gt;::const_iterator ia = <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.begin();</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; std::vector&lt;Literal&gt;::const_iterator ib = <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.begin();</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keywordflow">while</span> ((ia != <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>.end()) &amp;&amp; (ib != <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>.end())) {</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; <span class="keywordflow">if</span> (*ia == *ib) {</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; --size;</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; ++ia;</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; ++ib;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia == ib-&gt;Negated()) {</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <span class="keywordflow">if</span> (*ia != x) <span class="keywordflow">return</span> -1; <span class="comment">// Trivially true.</span></div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(*ib, x.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; ++ia;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; ++ib;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ia &lt; *ib) {</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; ++ia;</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; } <span class="keywordflow">else</span> { <span class="comment">// *ia &gt; *ib</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; ++ib;</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; }</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; }</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <a class="code" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(size, 0);</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <span class="keywordflow">return</span> size;</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;}</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; </div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;<span class="comment">// A simple graph where the nodes are the literals and the nodes adjacent to a</span></div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="comment">// literal l are the propagated literal when l is assigned in the underlying</span></div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;<span class="comment">// sat solver.</span></div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;<span class="comment">// This can be used to do a strong component analysis while probing all the</span></div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;<span class="comment">// literals of a solver. Note that this can be expensive, hence the support</span></div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;<span class="comment">// for a deterministic time limit.</span></div>
<div class="line"><a name="l01083"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_propagation_graph.html"> 1083</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1sat_1_1_propagation_graph.html">PropagationGraph</a> {</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l01085"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac481d486ad0e802f0dc6d891cd07a4a7"> 1085</a></span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac481d486ad0e802f0dc6d891cd07a4a7">PropagationGraph</a>(<span class="keywordtype">double</span> deterministic_time_limit, <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* solver)</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; : solver_(solver),</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; deterministic_time_limit(solver-&gt;deterministic_time() +</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; deterministic_time_limit) {}</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; </div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; <span class="comment">// Returns the set of node adjacent to the given one.</span></div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <span class="comment">// Interface needed by FindStronglyConnectedComponents(), note that it needs</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="comment">// to be const.</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac1f6c6297c6537f4c71536ade8cb2651"> 1093</a></span>&#160; <span class="keyword">const</span> std::vector&lt;int32&gt;&amp; <a class="code" href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac1f6c6297c6537f4c71536ade8cb2651">operator[]</a>(<a class="code" href="integral__types_8h.html#a56f1a81c92849566ae864511088eb7e8">int32</a> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; scratchpad_.clear();</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">Backtrack</a>(0);</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; </div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; <span class="comment">// Note that when the time limit is reached, we just keep returning empty</span></div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="comment">// adjacency list. This way, the SCC algorithm will terminate quickly and</span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <span class="comment">// the equivalent literals detection will be incomplete but correct. Note</span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <span class="comment">// also that thanks to the SCC algorithm, we will explore the connected</span></div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="comment">// components first.</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <span class="keywordflow">if</span> (solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ae525d235b02bcfc962d845e28f5f0125">deterministic_time</a>() &gt; deterministic_time_limit) {</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="keywordflow">return</span> scratchpad_;</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; }</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; </div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(LiteralIndex(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>));</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">if</span> (!solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">Assignment</a>().<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(l)) {</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> trail_index = solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9ae69b015a43c1a94e8815ab0dd8189c">EnqueueDecisionAndBackjumpOnConflict</a>(l);</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; <span class="keywordflow">if</span> (solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) {</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; <span class="comment">// Note that the +1 is to avoid adding a =&gt; a.</span></div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = trail_index + 1; i &lt; solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">Index</a>();</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; ++i) {</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; scratchpad_.push_back(solver_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>()[i].<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>().value());</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; }</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; }</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; }</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="keywordflow">return</span> scratchpad_;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; }</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; </div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keyword">mutable</span> std::vector&lt;int32&gt; scratchpad_;</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* <span class="keyword">const</span> solver_;</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> deterministic_time_limit;</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; </div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; DISALLOW_COPY_AND_ASSIGN(<a class="code" href="classoperations__research_1_1sat_1_1_propagation_graph.html">PropagationGraph</a>);</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;};</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; </div>
<div class="line"><a name="l01129"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ac75d30c113a2b2628f0d77e403467815"> 1129</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ac75d30c113a2b2628f0d77e403467815">ProbeAndFindEquivalentLiteral</a>(</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* solver, <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html">SatPostsolver</a>* postsolver,</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html">DratProofHandler</a>* drat_proof_handler,</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;LiteralIndex, LiteralIndex&gt;</a>* mapping) {</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <a class="code" href="class_wall_timer.html">WallTimer</a> timer;</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; timer.<a class="code" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; </div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">Backtrack</a>(0);</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; mapping-&gt;<a class="code" href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>();</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_already_fixed_vars = solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; </div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_propagation_graph.html">PropagationGraph</a> graph(</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a1a5e26554d014197de9434d2c39e07e9">parameters</a>().presolve_probing_deterministic_time_limit(), solver);</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a56f1a81c92849566ae864511088eb7e8">int32</a> size = solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>() * 2;</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; std::vector&lt;std::vector&lt;int32&gt;&gt; scc;</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <a class="code" href="strongly__connected__components_8h.html#aafab5785b250e1013c13511ce478f36b">FindStronglyConnectedComponents</a>(size, graph, &amp;scc);</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; </div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="comment">// We have no guarantee that the cycle of x and not(x) touch the same</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <span class="comment">// variables. This is because we may have more info for the literal probed</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <span class="comment">// later or the propagation may go only in one direction. For instance if we</span></div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; <span class="comment">// have two clauses (not(x1) v x2) and (not(x1) v not(x2) v x3) then x1</span></div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="comment">// implies x2 and x3 but not(x3) doesn&#39;t imply anything by unit propagation.</span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <span class="comment">// TODO(user): Add some constraint so that it does?</span></div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="comment">// Because of this, we &quot;merge&quot; the cycles.</span></div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <a class="code" href="classoperations__research_1_1_merging_partition.html">MergingPartition</a> partition(size);</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;int32&gt;&amp; component : scc) {</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <span class="keywordflow">if</span> (component.size() &gt; 1) {</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; <span class="keywordflow">if</span> (mapping-&gt;<a class="code" href="classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc">empty</a>()) mapping-&gt;<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(size, LiteralIndex(-1));</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code" href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a>((LiteralIndex(component[0])));</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; component.size(); ++i) {</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l((LiteralIndex(component[i])));</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="comment">// TODO(user): check compatibility? if x ~ not(x) =&gt; unsat.</span></div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; <span class="comment">// but probably, the solver would have found this too? not sure...</span></div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#a612bd8d97219124a8d6fbac721bcdbc6">MergePartsOf</a>(<a class="code" href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a>.Index().value(),</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>().value());</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#a612bd8d97219124a8d6fbac721bcdbc6">MergePartsOf</a>(<a class="code" href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a>.NegatedIndex().value(),</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>().value());</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; }</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; </div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; <span class="comment">// We rely on the fact that the representative of a literal x and the one</span></div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; <span class="comment">// of its negation are the same variable.</span></div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <a class="code" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(LiteralIndex(partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#ac64dbed5d9196b941f3f53862f77309d">GetRootAndCompressPath</a>(</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; <a class="code" href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a>.Index().value()))),</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(LiteralIndex(partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#ac64dbed5d9196b941f3f53862f77309d">GetRootAndCompressPath</a>(</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; <a class="code" href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a>.NegatedIndex().value())))</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; .<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; }</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; }</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; </div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">Backtrack</a>(0);</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="keywordtype">int</span> num_equiv = 0;</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keywordflow">if</span> (!mapping-&gt;<a class="code" href="classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc">empty</a>()) {</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; <span class="comment">// If a variable in a cycle is fixed. We want to fix all of them.</span></div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <span class="comment">// We first fix all representative if one variable of the cycle is fixed. In</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; <span class="comment">// a second pass we fix all the variable of a cycle whose representative is</span></div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; <span class="comment">// fixed.</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; <span class="comment">// TODO(user): Fixing a variable might fix more of them by propagation, so</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; <span class="comment">// we might not fix everything possible with these loops.</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html">VariablesAssignment</a>&amp; assignment = solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">Assignment</a>();</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; <span class="keywordflow">for</span> (LiteralIndex i(0); i &lt; size; ++i) {</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; <span class="keyword">const</span> LiteralIndex rep(partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#ac64dbed5d9196b941f3f53862f77309d">GetRootAndCompressPath</a>(i.value()));</div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; <span class="keywordflow">if</span> (assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i)) &amp;&amp;</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; !assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep))) {</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> true_lit = assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">LiteralIsTrue</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i))</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; ? <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep)</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; : <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">AddUnitClause</a>(true_lit);</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; drat_proof_handler-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>({true_lit});</div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; }</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; }</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; }</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; <span class="keywordflow">for</span> (LiteralIndex i(0); i &lt; size; ++i) {</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; <span class="keyword">const</span> LiteralIndex rep(partition.<a class="code" href="classoperations__research_1_1_merging_partition.html#ac64dbed5d9196b941f3f53862f77309d">GetRootAndCompressPath</a>(i.value()));</div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; (*mapping)[i] = rep;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; <span class="keywordflow">if</span> (assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep))) {</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <span class="keywordflow">if</span> (!assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i))) {</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> true_lit = assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">LiteralIsTrue</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep))</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; ? <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i)</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; : <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">AddUnitClause</a>(true_lit);</div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; drat_proof_handler-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>({true_lit});</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; }</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; }</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i))) {</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; <span class="keywordflow">if</span> (!assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep))) {</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> true_lit = assignment.<a class="code" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">LiteralIsTrue</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i))</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; ? <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep)</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; : <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">AddUnitClause</a>(true_lit);</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; drat_proof_handler-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>({true_lit});</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; }</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; }</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rep != i) {</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160; ++num_equiv;</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; postsolver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">Add</a>(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i), {<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i), <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()});</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; drat_proof_handler-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">AddClause</a>({<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(i), <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(rep).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()});</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; }</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; }</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; }</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; }</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; </div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> log_info =</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a1a5e26554d014197de9434d2c39e07e9">parameters</a>().log_search_progress() || <a class="code" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1);</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; <a class="code" href="base_2logging_8h.html#a09f7d88282cf92c9f231270ac113e5c6">LOG_IF</a>(<a class="code" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>, log_info) &lt;&lt; <span class="stringliteral">&quot;Probing. fixed &quot;</span> &lt;&lt; num_already_fixed_vars &lt;&lt; <span class="stringliteral">&quot; + &quot;</span></div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; &lt;&lt; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>() -</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; num_already_fixed_vars</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; &lt;&lt; <span class="stringliteral">&quot; equiv &quot;</span> &lt;&lt; num_equiv / 2 &lt;&lt; <span class="stringliteral">&quot; total &quot;</span></div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160; &lt;&lt; solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>() &lt;&lt; <span class="stringliteral">&quot; wtime: &quot;</span> &lt;&lt; timer.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>();</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;}</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160; </div>
<div class="line"><a name="l01247"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a38c2801a1b4798693c3a425b41e0356b"> 1247</a></span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a38c2801a1b4798693c3a425b41e0356b">SolveWithPresolve</a>(std::unique_ptr&lt;SatSolver&gt;* solver,</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160; <a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>,</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160; std::vector&lt;bool&gt;* solution,</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html">DratProofHandler</a>* drat_proof_handler) {</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; <span class="comment">// We save the initial parameters.</span></div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; <span class="keyword">const</span> SatParameters <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a> = (*solver)-&gt;parameters();</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html">SatPostsolver</a> postsolver((*solver)-&gt;NumVariables());</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; </div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> log_info = <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_search_progress() || <a class="code" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1);</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; </div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; <span class="comment">// Some problems are formulated in such a way that our SAT heuristics</span></div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; <span class="comment">// simply works without conflict. Get them out of the way first because it</span></div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; <span class="comment">// is possible that the presolve lose this &quot;lucky&quot; ordering. This is in</span></div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; <span class="comment">// particular the case on the SAT14.crafted.complete-xxx-... problems.</span></div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; {</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = (*solver)-&gt;model();</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> dtime = <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">std::min</a>(1.0, <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetDeterministicTimeLeft());</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a20296d1a269e973b66b403c8b1cd5785">LookForTrivialSatSolution</a>(dtime, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, log_info)) {</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;UNSAT during probing.&quot;</span>;</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">SatSolver::INFEASIBLE</a>;</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160; }</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = (*solver)-&gt;NumVariables();</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160; <span class="keywordflow">if</span> ((*solver)-&gt;LiteralTrail().Index() == num_variables) {</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Problem solved by trivial heuristic!&quot;</span>;</div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160; solution-&gt;clear();</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; (*solver)-&gt;NumVariables(); ++i) {</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160; solution-&gt;push_back((*solver)-&gt;Assignment().LiteralIsTrue(</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(BooleanVariable(i), <span class="keyword">true</span>)));</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160; }</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">SatSolver::FEASIBLE</a>;</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; }</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; }</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160; </div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; <span class="comment">// We use a new block so the memory used by the presolver can be</span></div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160; <span class="comment">// reclaimed as soon as it is no longer needed.</span></div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> max_num_passes = 4;</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; max_num_passes &amp;&amp; !<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached(); ++i) {</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> saved_num_variables = (*solver)-&gt;NumVariables();</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160; </div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160; <span class="comment">// Run the new preprocessing code. Note that the probing that it does is</span></div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; <span class="comment">// faster than the ProbeAndFindEquivalentLiteral() call below, but does not</span></div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160; <span class="comment">// do equivalence detection as completely, so we still apply the other</span></div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160; <span class="comment">// &quot;probing&quot; code afterwards even if it will not fix more literals, but it</span></div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160; <span class="comment">// will do one pass of proper equivalence detection.</span></div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160; {</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = (*solver)-&gt;model();</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>&gt;()-&gt;MergeWithGlobalTimeLimit(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html">SatPresolveOptions</a> options;</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a> = log_info;</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#ac68dd5a27fd973b215de47442bacf1ac">extract_binary_clauses_in_probing</a> = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a9251c24a19aaef6f5134a615eff02277">use_transitive_reduction</a> = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#afac11ce59af8fa30ab784cfa4fb36297">deterministic_time_limit</a> =</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.presolve_probing_deterministic_time_limit();</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; </div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_inprocessing.html">Inprocessing</a>&gt;()-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_inprocessing.html#a33abe26c0696a328c36dd0aa9f0b0f00">PresolveLoop</a>(options)) {</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;UNSAT during probing.&quot;</span>;</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">SatSolver::INFEASIBLE</a>;</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; }</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; c : <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="structoperations__research_1_1sat_1_1_postsolve_clauses.html">PostsolveClauses</a>&gt;()-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_postsolve_clauses.html#a8cc6d9f1059f26a873442045a72e651e">clauses</a>) {</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160; postsolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">Add</a>(c[0], c);</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; }</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; }</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; </div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160; <span class="comment">// Probe + find equivalent literals.</span></div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160; <span class="comment">// TODO(user): Use a derived time limit in the probing phase.</span></div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;LiteralIndex, LiteralIndex&gt;</a> equiv_map;</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac75d30c113a2b2628f0d77e403467815">ProbeAndFindEquivalentLiteral</a>((*solver).get(), &amp;postsolver,</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; drat_proof_handler, &amp;equiv_map);</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160; <span class="keywordflow">if</span> ((*solver)-&gt;IsModelUnsat()) {</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;UNSAT during probing.&quot;</span>;</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">SatSolver::INFEASIBLE</a>;</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; }</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160; </div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; <span class="comment">// The rest of the presolve only work on pure SAT problem.</span></div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160; <span class="keywordflow">if</span> (!(*solver)-&gt;ProblemIsPureSat()) {</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;The problem is not a pure SAT problem, skipping the SAT &quot;</span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; <span class="stringliteral">&quot;specific presolve.&quot;</span>;</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; }</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160; </div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160; <span class="comment">// Register the fixed variables with the postsolver.</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160; <span class="comment">// TODO(user): Find a better place for this?</span></div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160; (*solver)-&gt;Backtrack(0);</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; (*solver)-&gt;LiteralTrail().<a class="code" href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">Index</a>(); ++i) {</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; postsolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a40432775821777983c4df6b4f2a71d92">FixVariable</a>((*solver)-&gt;LiteralTrail()[i]);</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160; }</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; </div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; <span class="comment">// TODO(user): Pass the time_limit to the presolver.</span></div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html">SatPresolver</a> presolver(&amp;postsolver);</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a687eb5f7ae0e0268094f954adff08d8d">SetParameters</a>(<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a75f1d17f36330a1c8a96e43fe8805598">SetDratProofHandler</a>(drat_proof_handler);</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a3f9bc2c396e3354ce7a6cf09427474a8">SetEquivalentLiteralMapping</a>(equiv_map);</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; (*solver)-&gt;ExtractClauses(&amp;presolver);</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; (*solver)-&gt;AdvanceDeterministicTime(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; </div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; <span class="comment">// Tricky: the model local time limit is updated by the new functions, but</span></div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; <span class="comment">// the old ones update time_limit directly.</span></div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime((*solver)</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; -&gt;<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>()</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160; -&gt;GetOrCreate&lt;TimeLimit&gt;()</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160; -&gt;GetElapsedDeterministicTime());</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160; </div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160; (*solver).reset(<span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; std::vector&lt;bool&gt; can_be_removed(presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(), <span class="keyword">true</span>);</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160; <span class="keywordflow">if</span> (!presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f">Presolve</a>(can_be_removed, log_info)) {</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;UNSAT during presolve.&quot;</span>;</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; </div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160; <span class="comment">// This is just here to reset the SatSolver::Solve() satistics.</span></div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160; (*solver) = absl::make_unique&lt;SatSolver&gt;();</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">SatSolver::INFEASIBLE</a>;</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160; }</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; </div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; postsolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8155216960c6e1f5d476e1c28b2d34fa">ApplyMapping</a>(presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37">VariableMapping</a>());</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; <span class="keywordflow">if</span> (drat_proof_handler != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160; drat_proof_handler-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a8155216960c6e1f5d476e1c28b2d34fa">ApplyMapping</a>(presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37">VariableMapping</a>());</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; }</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; </div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160; <span class="comment">// Load the presolved problem in a new solver.</span></div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160; (*solver) = absl::make_unique&lt;SatSolver&gt;();</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160; (*solver)-&gt;SetDratProofHandler(drat_proof_handler);</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160; (*solver)-&gt;SetParameters(<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160; presolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_presolver.html#a11c34313bd8d2e6ac75054fd4bc51a8a">LoadProblemIntoSatSolver</a>((*solver).get());</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; </div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; <span class="comment">// Stop if a fixed point has been reached.</span></div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; <span class="keywordflow">if</span> ((*solver)-&gt;NumVariables() == saved_num_variables) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; }</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160; </div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160; <span class="comment">// Before solving, we use the new probing code that adds all new binary</span></div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160; <span class="comment">// implication it can find to the binary implication graph. This gives good</span></div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; <span class="comment">// benefits. Note that we currently do not do it before presolve because then</span></div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160; <span class="comment">// the current presolve code does not work too well with the potential huge</span></div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; <span class="comment">// number of binary clauses added.</span></div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; <span class="comment">// TODO(user): Revisit the situation when we simplify better all the clauses</span></div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; <span class="comment">// using binary ones. Or if/when we support at most one better in pure SAT</span></div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160; <span class="comment">// solving and presolve.</span></div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; {</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = (*solver)-&gt;model();</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>&gt;()-&gt;MergeWithGlobalTimeLimit(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html">SatPresolveOptions</a> options;</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a> = log_info;</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a9251c24a19aaef6f5134a615eff02277">use_transitive_reduction</a> = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#ac68dd5a27fd973b215de47442bacf1ac">extract_binary_clauses_in_probing</a> = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#afac11ce59af8fa30ab784cfa4fb36297">deterministic_time_limit</a> =</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;SatParameters&gt;()</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; -&gt;presolve_probing_deterministic_time_limit();</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_inprocessing.html">Inprocessing</a>&gt;()-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_inprocessing.html#a33abe26c0696a328c36dd0aa9f0b0f00">PresolveLoop</a>(options)) {</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">SatSolver::INFEASIBLE</a>;</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160; }</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; c : <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="structoperations__research_1_1sat_1_1_postsolve_clauses.html">PostsolveClauses</a>&gt;()-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_postsolve_clauses.html#a8cc6d9f1059f26a873442045a72e651e">clauses</a>) {</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; postsolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">Add</a>(c[0], c);</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; }</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160; }</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; </div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; <span class="comment">// Solve.</span></div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> result = (*solver)-&gt;SolveWithTimeLimit(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160; <span class="keywordflow">if</span> (result == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">SatSolver::FEASIBLE</a>) {</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160; *solution = postsolver.<a class="code" href="classoperations__research_1_1sat_1_1_sat_postsolver.html#ac6f385a340d67f08c9f3d8e686ebf571">ExtractAndPostsolveSolution</a>(**solver);</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160; }</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;}</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; </div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;} <span class="comment">// namespace sat</span></div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;} <span class="comment">// namespace operations_research</span></div>
<div class="ttc" id="aadjustable__priority__queue-inl_8h_html"><div class="ttname"><a href="adjustable__priority__queue-inl_8h.html">adjustable_priority_queue-inl.h</a></div></div>
<div class="ttc" id="aalldiff__cst_8cc_html_a021e695f54a13bd809c34b2f4ca87c37"><div class="ttname"><a href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a></div><div class="ttdeci">int64 min</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00138">alldiff_cst.cc:138</a></div></div>
<div class="ttc" id="aalldiff__cst_8cc_html_a9d0c202d5fdd62f4fa2c613339ff168a"><div class="ttname"><a href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a></div><div class="ttdeci">int64 max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a09f7d88282cf92c9f231270ac113e5c6"><div class="ttname"><a href="base_2logging_8h.html#a09f7d88282cf92c9f231270ac113e5c6">LOG_IF</a></div><div class="ttdeci">#define LOG_IF(severity, condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00479">base/logging.h:479</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a46e69120fbd3b36e6960e096d23b66f0"><div class="ttname"><a href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a></div><div class="ttdeci">#define DCHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00886">base/logging.h:886</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_aae2dc65d9ea248d54bf39daa986dd295"><div class="ttname"><a href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a></div><div class="ttdeci">#define DCHECK_GE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00889">base/logging.h:889</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab4f56aa24c4c9cddc47a6abd2d747f9a"><div class="ttname"><a href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a></div><div class="ttdeci">#define DCHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00890">base/logging.h:890</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab62f5ed8f2d48e29802be0cbbcd1359a"><div class="ttname"><a href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a></div><div class="ttdeci">#define DCHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00888">base/logging.h:888</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_accad43a85d781d53381cd53a9894b6ae"><div class="ttname"><a href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a></div><div class="ttdeci">#define LOG(severity)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00420">base/logging.h:420</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ae17f8119c108cf3070bad3449c7e0006"><div class="ttname"><a href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a></div><div class="ttdeci">#define DCHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00884">base/logging.h:884</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ae89df3243bbb8341130c7b3f44145ea0"><div class="ttname"><a href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a></div><div class="ttdeci">#define DCHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00885">base/logging.h:885</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927"><div class="ttname"><a href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a></div><div class="ttdeci">#define VLOG(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00978">base/logging.h:978</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_a24926108b770033792d015cb86aeffb3"><div class="ttname"><a href="class_adjustable_priority_queue.html#a24926108b770033792d015cb86aeffb3">AdjustablePriorityQueue::Size</a></div><div class="ttdeci">int Size() const</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00119">adjustable_priority_queue.h:119</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_a506169056c5f470fabdf77aa1934a5a3"><div class="ttname"><a href="class_adjustable_priority_queue.html#a506169056c5f470fabdf77aa1934a5a3">AdjustablePriorityQueue::NoteChangedPriority</a></div><div class="ttdeci">void NoteChangedPriority(T *val)</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00074">adjustable_priority_queue.h:74</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_a701a584ce72cccbcce9cb0656b6c898b"><div class="ttname"><a href="class_adjustable_priority_queue.html#a701a584ce72cccbcce9cb0656b6c898b">AdjustablePriorityQueue::Pop</a></div><div class="ttdeci">void Pop()</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00117">adjustable_priority_queue.h:117</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_a7d1005d75f40525f91a2acb84348bc3c"><div class="ttname"><a href="class_adjustable_priority_queue.html#a7d1005d75f40525f91a2acb84348bc3c">AdjustablePriorityQueue::Contains</a></div><div class="ttdeci">bool Contains(const T *val) const</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00069">adjustable_priority_queue.h:69</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_a8e7578f2135632c4d0ce66fd5936231e"><div class="ttname"><a href="class_adjustable_priority_queue.html#a8e7578f2135632c4d0ce66fd5936231e">AdjustablePriorityQueue::Top</a></div><div class="ttdeci">T * Top()</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00087">adjustable_priority_queue.h:87</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_aa71d36872f416feaa853788a7a7a7ef8"><div class="ttname"><a href="class_adjustable_priority_queue.html#aa71d36872f416feaa853788a7a7a7ef8">AdjustablePriorityQueue::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00129">adjustable_priority_queue.h:129</a></div></div>
<div class="ttc" id="aclass_adjustable_priority_queue_html_ac312fa979ea8afd5deabd6b581b3bb1f"><div class="ttname"><a href="class_adjustable_priority_queue.html#ac312fa979ea8afd5deabd6b581b3bb1f">AdjustablePriorityQueue::Add</a></div><div class="ttdeci">void Add(T *val)</div><div class="ttdef"><b>Definition:</b> <a href="adjustable__priority__queue_8h_source.html#l00049">adjustable_priority_queue.h:49</a></div></div>
<div class="ttc" id="aclass_wall_timer_html"><div class="ttname"><a href="class_wall_timer.html">WallTimer</a></div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00023">timer.h:23</a></div></div>
<div class="ttc" id="aclass_wall_timer_html_a07aaf1227e4d645f15e0a964f54ef291"><div class="ttname"><a href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">WallTimer::Start</a></div><div class="ttdeci">void Start()</div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00031">timer.h:31</a></div></div>
<div class="ttc" id="aclass_wall_timer_html_aec56fe080959ecebec3feaed9dafde84"><div class="ttname"><a href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">WallTimer::Get</a></div><div class="ttdeci">double Get() const</div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00045">timer.h:45</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html"><div class="ttname"><a href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt; BooleanVariable, BooleanVariable &gt;</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a4e3670a285a3642eaa07f66766cffa72"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">absl::StrongVector::resize</a></div><div class="ttdeci">void resize(size_type new_size)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00150">strong_vector.h:150</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a60304b65bf89363bcc3165d3cde67f86"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">absl::StrongVector::size</a></div><div class="ttdeci">size_type size() const</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00147">strong_vector.h:147</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a644718bb2fb240de962dc3c9a1fdf0dc"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc">absl::StrongVector::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00156">strong_vector.h:156</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a9263000d449fdccb6cb70b303063e60b"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">absl::StrongVector::push_back</a></div><div class="ttdeci">void push_back(const value_type &amp;x)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00158">strong_vector.h:158</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_ac8bb3912a3ce86b15842e79d0b421204"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#ac8bb3912a3ce86b15842e79d0b421204">absl::StrongVector::clear</a></div><div class="ttdeci">void clear()</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00170">strong_vector.h:170</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_acad38d52497a975bfb6f2f6acd76631f"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#acad38d52497a975bfb6f2f6acd76631f">absl::StrongVector::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00140">strong_vector.h:140</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_ad69bd11391be1a1dba5c8202259664f8"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#ad69bd11391be1a1dba5c8202259664f8">absl::StrongVector::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00138">strong_vector.h:138</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_merging_partition_html"><div class="ttname"><a href="classoperations__research_1_1_merging_partition.html">operations_research::MergingPartition</a></div><div class="ttdef"><b>Definition:</b> <a href="dynamic__partition_8h_source.html#l00203">dynamic_partition.h:203</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_merging_partition_html_a612bd8d97219124a8d6fbac721bcdbc6"><div class="ttname"><a href="classoperations__research_1_1_merging_partition.html#a612bd8d97219124a8d6fbac721bcdbc6">operations_research::MergingPartition::MergePartsOf</a></div><div class="ttdeci">int MergePartsOf(int node1, int node2)</div><div class="ttdef"><b>Definition:</b> <a href="dynamic__partition_8cc_source.html#l00213">dynamic_partition.cc:213</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_merging_partition_html_ac64dbed5d9196b941f3f53862f77309d"><div class="ttname"><a href="classoperations__research_1_1_merging_partition.html#ac64dbed5d9196b941f3f53862f77309d">operations_research::MergingPartition::GetRootAndCompressPath</a></div><div class="ttdeci">int GetRootAndCompressPath(int node)</div><div class="ttdef"><b>Definition:</b> <a href="dynamic__partition_8cc_source.html#l00237">dynamic_partition.cc:237</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html">operations_research::TimeLimit</a></div><div class="ttdoc">A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00105">time_limit.h:105</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html_a810d5f7aaf80cc09cf5a094e20c1aaca"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">operations_research::TimeLimit::LimitReached</a></div><div class="ttdeci">bool LimitReached()</div><div class="ttdoc">Returns true when the external limit is true, or the deterministic time is over the deterministic lim...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00532">time_limit.h:532</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_drat_proof_handler_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_drat_proof_handler.html">operations_research::sat::DratProofHandler</a></div><div class="ttdef"><b>Definition:</b> <a href="drat__proof__handler_8h_source.html#l00040">drat_proof_handler.h:40</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_drat_proof_handler_html_a18349231154d0f5eaee94fe213f347e6"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a18349231154d0f5eaee94fe213f347e6">operations_research::sat::DratProofHandler::DeleteClause</a></div><div class="ttdeci">void DeleteClause(absl::Span&lt; const Literal &gt; clause)</div><div class="ttdef"><b>Definition:</b> <a href="drat__proof__handler_8cc_source.html#l00082">drat_proof_handler.cc:82</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_drat_proof_handler_html_a8155216960c6e1f5d476e1c28b2d34fa"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a8155216960c6e1f5d476e1c28b2d34fa">operations_research::sat::DratProofHandler::ApplyMapping</a></div><div class="ttdeci">void ApplyMapping(const absl::StrongVector&lt; BooleanVariable, BooleanVariable &gt; &amp;mapping)</div><div class="ttdef"><b>Definition:</b> <a href="drat__proof__handler_8cc_source.html#l00038">drat_proof_handler.cc:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_drat_proof_handler_html_a98bacf41c50979896b4a5f5e41fb0ccf"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#a98bacf41c50979896b4a5f5e41fb0ccf">operations_research::sat::DratProofHandler::AddClause</a></div><div class="ttdeci">void AddClause(absl::Span&lt; const Literal &gt; clause)</div><div class="ttdef"><b>Definition:</b> <a href="drat__proof__handler_8cc_source.html#l00072">drat_proof_handler.cc:72</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_drat_proof_handler_html_af78b6dc2106ca6744f8d69cf5a70dfa4"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_drat_proof_handler.html#af78b6dc2106ca6744f8d69cf5a70dfa4">operations_research::sat::DratProofHandler::AddOneVariable</a></div><div class="ttdeci">void AddOneVariable()</div><div class="ttdef"><b>Definition:</b> <a href="drat__proof__handler_8cc_source.html#l00062">drat_proof_handler.cc:62</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_inprocessing_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_inprocessing.html">operations_research::sat::Inprocessing</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00087">sat_inprocessing.h:87</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_inprocessing_html_a33abe26c0696a328c36dd0aa9f0b0f00"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_inprocessing.html#a33abe26c0696a328c36dd0aa9f0b0f00">operations_research::sat::Inprocessing::PresolveLoop</a></div><div class="ttdeci">bool PresolveLoop(SatPresolveOptions options)</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8cc_source.html#l00043">sat_inprocessing.cc:43</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html">operations_research::sat::Literal</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00064">sat_base.h:64</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a239e1315c4e975a35537790ba0d913a7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">operations_research::sat::Literal::NegatedIndex</a></div><div class="ttdeci">LiteralIndex NegatedIndex() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00085">sat_base.h:85</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a4a11c7c4d7706c09de5e18707c3b5c62"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">operations_research::sat::Literal::Index</a></div><div class="ttdeci">LiteralIndex Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00084">sat_base.h:84</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a6a5dcff82096cd7a7147bf996dbaa5a8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">operations_research::sat::Literal::Variable</a></div><div class="ttdeci">BooleanVariable Variable() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00080">sat_base.h:80</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a886e9c024f7209181c0a850b6e90c644"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">operations_research::sat::Literal::Negated</a></div><div class="ttdeci">Literal Negated() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00091">sat_base.h:91</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_ab76ca9049d6f3f1948d7120a98765107"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#ab76ca9049d6f3f1948d7120a98765107">operations_research::sat::Literal::IsPositive</a></div><div class="ttdeci">bool IsPositive() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00081">sat_base.h:81</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html">operations_research::sat::Model</a></div><div class="ttdoc">Class that owns everything related to a particular optimization model.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00038">sat/model.h:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_propagation_graph_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_propagation_graph.html">operations_research::sat::PropagationGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01083">simplification.cc:1083</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_propagation_graph_html_ac1f6c6297c6537f4c71536ade8cb2651"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac1f6c6297c6537f4c71536ade8cb2651">operations_research::sat::PropagationGraph::operator[]</a></div><div class="ttdeci">const std::vector&lt; int32 &gt; &amp; operator[](int32 index) const</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01093">simplification.cc:1093</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_propagation_graph_html_ac481d486ad0e802f0dc6d891cd07a4a7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_propagation_graph.html#ac481d486ad0e802f0dc6d891cd07a4a7">operations_research::sat::PropagationGraph::PropagationGraph</a></div><div class="ttdeci">PropagationGraph(double deterministic_time_limit, SatSolver *solver)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01085">simplification.cc:1085</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html">operations_research::sat::SatPostsolver</a></div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00047">simplification.h:47</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_a024e94c6e22e2fe747bb4355b52a8eab"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a024e94c6e22e2fe747bb4355b52a8eab">operations_research::sat::SatPostsolver::Add</a></div><div class="ttdeci">void Add(Literal x, const absl::Span&lt; const Literal &gt; clause)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00047">simplification.cc:47</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_a3b174af81ff48a2cf33d23179125b356"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a3b174af81ff48a2cf33d23179125b356">operations_research::sat::SatPostsolver::SatPostsolver</a></div><div class="ttdeci">SatPostsolver(int num_variables)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00038">simplification.cc:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_a40432775821777983c4df6b4f2a71d92"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a40432775821777983c4df6b4f2a71d92">operations_research::sat::SatPostsolver::FixVariable</a></div><div class="ttdeci">void FixVariable(Literal x)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00057">simplification.cc:57</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_a8155216960c6e1f5d476e1c28b2d34fa"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8155216960c6e1f5d476e1c28b2d34fa">operations_research::sat::SatPostsolver::ApplyMapping</a></div><div class="ttdeci">void ApplyMapping(const absl::StrongVector&lt; BooleanVariable, BooleanVariable &gt; &amp;mapping)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00062">simplification.cc:62</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_a8995563af871eb8c2b05bf99bd89344a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#a8995563af871eb8c2b05bf99bd89344a">operations_research::sat::SatPostsolver::PostsolveSolution</a></div><div class="ttdeci">std::vector&lt; bool &gt; PostsolveSolution(const std::vector&lt; bool &gt; &amp;solution)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00140">simplification.cc:140</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_postsolver_html_ac6f385a340d67f08c9f3d8e686ebf571"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_postsolver.html#ac6f385a340d67f08c9f3d8e686ebf571">operations_research::sat::SatPostsolver::ExtractAndPostsolveSolution</a></div><div class="ttdeci">std::vector&lt; bool &gt; ExtractAndPostsolveSolution(const SatSolver &amp;solver)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00129">simplification.cc:129</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html">operations_research::sat::SatPresolver</a></div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00143">simplification.h:143</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a0b58ef3a397720b272662f8bc45585cb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a0b58ef3a397720b272662f8bc45585cb">operations_research::sat::SatPresolver::SetNumVariables</a></div><div class="ttdeci">void SetNumVariables(int num_variables)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00216">simplification.cc:216</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a11c34313bd8d2e6ac75054fd4bc51a8a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a11c34313bd8d2e6ac75054fd4bc51a8a">operations_research::sat::SatPresolver::LoadProblemIntoSatSolver</a></div><div class="ttdeci">void LoadProblemIntoSatSolver(SatSolver *solver)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00261">simplification.cc:261</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a26fc07b3630b79be6914e6387b63a073"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a26fc07b3630b79be6914e6387b63a073">operations_research::sat::SatPresolver::AddBinaryClause</a></div><div class="ttdeci">void AddBinaryClause(Literal a, Literal b)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00159">simplification.cc:159</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a3f9bc2c396e3354ce7a6cf09427474a8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a3f9bc2c396e3354ce7a6cf09427474a8">operations_research::sat::SatPresolver::SetEquivalentLiteralMapping</a></div><div class="ttdeci">void SetEquivalentLiteralMapping(const absl::StrongVector&lt; LiteralIndex, LiteralIndex &gt; &amp;mapping)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00158">simplification.h:158</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a4357280dffaba15fcb7f932afe0aea3f"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4357280dffaba15fcb7f932afe0aea3f">operations_research::sat::SatPresolver::Presolve</a></div><div class="ttdeci">bool Presolve()</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00319">simplification.cc:319</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a4cacc255fc3a68daa594ec6f32757c95"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a4cacc255fc3a68daa594ec6f32757c95">operations_research::sat::SatPresolver::ClauseIndex</a></div><div class="ttdeci">int32 ClauseIndex</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00146">simplification.h:146</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a5ddcb2924990b8dbcf375f7c19846218"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a5ddcb2924990b8dbcf375f7c19846218">operations_research::sat::SatPresolver::PresolveWithBva</a></div><div class="ttdeci">void PresolveWithBva()</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00373">simplification.cc:373</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a687eb5f7ae0e0268094f954adff08d8d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a687eb5f7ae0e0268094f954adff08d8d">operations_research::sat::SatPresolver::SetParameters</a></div><div class="ttdeci">void SetParameters(const SatParameters &amp;params)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00153">simplification.h:153</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a69b55d318122f02f0fb03fb1c070ab37"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a69b55d318122f02f0fb03fb1c070ab37">operations_research::sat::SatPresolver::VariableMapping</a></div><div class="ttdeci">absl::StrongVector&lt; BooleanVariable, BooleanVariable &gt; VariableMapping() const</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00246">simplification.cc:246</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a75f1d17f36330a1c8a96e43fe8805598"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a75f1d17f36330a1c8a96e43fe8805598">operations_research::sat::SatPresolver::SetDratProofHandler</a></div><div class="ttdeci">void SetDratProofHandler(DratProofHandler *drat_proof_handler)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00222">simplification.h:222</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a98bacf41c50979896b4a5f5e41fb0ccf"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a98bacf41c50979896b4a5f5e41fb0ccf">operations_research::sat::SatPresolver::AddClause</a></div><div class="ttdeci">void AddClause(absl::Span&lt; const Literal &gt; clause)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00161">simplification.cc:161</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_a9d3beb2afe4ae647674b054bf29290e2"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#a9d3beb2afe4ae647674b054bf29290e2">operations_research::sat::SatPresolver::NumVariables</a></div><div class="ttdeci">int NumVariables() const</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8h_source.html#l00189">simplification.h:189</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_ac36d4cd02bbf1501a134d61fc510ad68"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#ac36d4cd02bbf1501a134d61fc510ad68">operations_research::sat::SatPresolver::ProcessClauseToSimplifyOthers</a></div><div class="ttdeci">bool ProcessClauseToSimplifyOthers(ClauseIndex clause_index)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00625">simplification.cc:625</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_presolver_html_ae39cbe1919d9200f3f41cf96b7eee703"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_presolver.html#ae39cbe1919d9200f3f41cf96b7eee703">operations_research::sat::SatPresolver::CrossProduct</a></div><div class="ttdeci">bool CrossProduct(Literal x)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00701">simplification.cc:701</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html">operations_research::sat::SatSolver</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00057">sat_solver.h:57</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a01fd4c9f5286534866c6c5ee2c160fe9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">operations_research::sat::SatSolver::LiteralTrail</a></div><div class="ttdeci">const Trail &amp; LiteralTrail() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00361">sat_solver.h:361</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a0b58ef3a397720b272662f8bc45585cb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a0b58ef3a397720b272662f8bc45585cb">operations_research::sat::SatSolver::SetNumVariables</a></div><div class="ttdeci">void SetNumVariables(int num_variables)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00064">sat_solver.cc:64</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a1a5e26554d014197de9434d2c39e07e9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a1a5e26554d014197de9434d2c39e07e9">operations_research::sat::SatSolver::parameters</a></div><div class="ttdeci">const SatParameters &amp; parameters() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00110">sat_solver.cc:110</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">operations_research::sat::SatSolver::Status</a></div><div class="ttdeci">Status</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00180">sat_solver.h:180</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">operations_research::sat::SatSolver::FEASIBLE</a></div><div class="ttdeci">@ FEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00183">sat_solver.h:183</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">operations_research::sat::SatSolver::INFEASIBLE</a></div><div class="ttdeci">@ INFEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00182">sat_solver.h:182</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9789bf03dba611e9be5679d6e902d0c8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">operations_research::sat::SatSolver::Assignment</a></div><div class="ttdeci">const VariablesAssignment &amp; Assignment() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00362">sat_solver.h:362</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9ae69b015a43c1a94e8815ab0dd8189c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9ae69b015a43c1a94e8815ab0dd8189c">operations_research::sat::SatSolver::EnqueueDecisionAndBackjumpOnConflict</a></div><div class="ttdeci">int EnqueueDecisionAndBackjumpOnConflict(Literal true_literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00499">sat_solver.cc:499</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9d3beb2afe4ae647674b054bf29290e2"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">operations_research::sat::SatSolver::NumVariables</a></div><div class="ttdeci">int NumVariables() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00082">sat_solver.h:82</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ac035378cea0ed7b0978105547402faa8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">operations_research::sat::SatSolver::Backtrack</a></div><div class="ttdeci">void Backtrack(int target_level)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00888">sat_solver.cc:888</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ad63c4461a1384629cb99413c6df8b9ca"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">operations_research::sat::SatSolver::CurrentDecisionLevel</a></div><div class="ttdeci">int CurrentDecisionLevel() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00360">sat_solver.h:360</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ae525d235b02bcfc962d845e28f5f0125"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ae525d235b02bcfc962d845e28f5f0125">operations_research::sat::SatSolver::deterministic_time</a></div><div class="ttdeci">double deterministic_time() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00092">sat_solver.cc:92</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_af67fe279478772a6d1492a7f673bda5d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#af67fe279478772a6d1492a7f673bda5d">operations_research::sat::SatSolver::AddProblemClause</a></div><div class="ttdeci">bool AddProblemClause(absl::Span&lt; const Literal &gt; literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00203">sat_solver.cc:203</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_afbbbc2f0845a82a5a5cfb3f00a61abe9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">operations_research::sat::SatSolver::AddUnitClause</a></div><div class="ttdeci">bool AddUnitClause(Literal true_literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00164">sat_solver.cc:164</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html_a8ef12397d1682615bc3108c397734179"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">operations_research::sat::Trail::Index</a></div><div class="ttdeci">int Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00378">sat_base.h:378</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html">operations_research::sat::VariablesAssignment</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00122">sat_base.h:122</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_a142694366986039454f53b38e8378815"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">operations_research::sat::VariablesAssignment::LiteralIsAssigned</a></div><div class="ttdeci">bool LiteralIsAssigned(Literal literal) const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00153">sat_base.h:153</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_a49e751eb6f0e9babd957889bb8e7472d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#a49e751eb6f0e9babd957889bb8e7472d">operations_research::sat::VariablesAssignment::VariableIsAssigned</a></div><div class="ttdeci">bool VariableIsAssigned(BooleanVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00158">sat_base.h:158</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_a5300129913f51dcb0b1c531e3248490e"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#a5300129913f51dcb0b1c531e3248490e">operations_research::sat::VariablesAssignment::LiteralIsTrue</a></div><div class="ttdeci">bool LiteralIsTrue(Literal literal) const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00150">sat_base.h:150</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_a945bb6c1e83f281fdde5778473a12b37"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#a945bb6c1e83f281fdde5778473a12b37">operations_research::sat::VariablesAssignment::AssignFromTrueLiteral</a></div><div class="ttdeci">void AssignFromTrueLiteral(Literal literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00133">sat_base.h:133</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_af7fbbd00f0e631ce361b5ce6636b2017"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#af7fbbd00f0e631ce361b5ce6636b2017">operations_research::sat::VariablesAssignment::Resize</a></div><div class="ttdeci">void Resize(int num_variables)</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00126">sat_base.h:126</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_a344010e26426d6a13411648d988bc9b6"><div class="ttname"><a href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a></div><div class="ttdeci">int64 b</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00043">constraint_solver/table.cc:43</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_af730895c6c6ef6e03caaf6251192dfd2"><div class="ttname"><a href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a></div><div class="ttdeci">int64 a</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00042">constraint_solver/table.cc:42</a></div></div>
<div class="ttc" id="acp__model__fz__solver_8cc_html_a10a1eab179b472c030bdc2a2efef7219"><div class="ttname"><a href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a></div><div class="ttdeci">SatParameters parameters</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__fz__solver_8cc_source.html#l00108">cp_model_fz_solver.cc:108</a></div></div>
<div class="ttc" id="acp__model__solver_8cc_html_ac3cf9db02b23ea1455b5ae6955d03e47"><div class="ttname"><a href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a></div><div class="ttdeci">SharedTimeLimit * time_limit</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02116">cp_model_solver.cc:2116</a></div></div>
<div class="ttc" id="adynamic__partition_8h_html"><div class="ttname"><a href="dynamic__partition_8h.html">dynamic_partition.h</a></div></div>
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01858">expr_array.cc:1858</a></div></div>
<div class="ttc" id="agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf"><div class="ttname"><a href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a></div><div class="ttdeci">GRBmodel * model</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00272">gurobi_interface.cc:272</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_a56f1a81c92849566ae864511088eb7e8"><div class="ttname"><a href="integral__types_8h.html#a56f1a81c92849566ae864511088eb7e8">int32</a></div><div class="ttdeci">int int32</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00033">integral_types.h:33</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_a7cde0074dfd288f2d70c0e035dacb28a"><div class="ttname"><a href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a></div><div class="ttdeci">int64_t int64</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00034">integral_types.h:34</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_abc0f5bc07737e498f287334775dff2b6"><div class="ttname"><a href="integral__types_8h.html#abc0f5bc07737e498f287334775dff2b6">uint64</a></div><div class="ttdeci">uint64_t uint64</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00039">integral_types.h:39</a></div></div>
<div class="ttc" id="alog__severity_8h_html_ab4a2cbab234914b320b7fae11b6e8cb9"><div class="ttname"><a href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a></div><div class="ttdeci">const int INFO</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
<div class="ttc" id="anamespacegtl_html_a82eb98ee939aaa7b64a85fa63453689e"><div class="ttname"><a href="namespacegtl.html#a82eb98ee939aaa7b64a85fa63453689e">gtl::STLEraseAllFromSequence</a></div><div class="ttdeci">void STLEraseAllFromSequence(T *v, const E &amp;e)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00093">stl_util.h:93</a></div></div>
<div class="ttc" id="anamespacegtl_html_a92a0e7b0e74024284adc849a4499940f"><div class="ttname"><a href="namespacegtl.html#a92a0e7b0e74024284adc849a4499940f">gtl::STLClearObject</a></div><div class="ttdeci">void STLClearObject(T *obj)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00123">stl_util.h:123</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_abec9e934a51aa2ab519684cc0f446a41"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">operations_research::glop::Index</a></div><div class="ttdeci">int32 Index</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00037">lp_types.h:37</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a20296d1a269e973b66b403c8b1cd5785"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a20296d1a269e973b66b403c8b1cd5785">operations_research::sat::LookForTrivialSatSolution</a></div><div class="ttdeci">bool LookForTrivialSatSolution(double deterministic_time_limit, Model *model, bool log_info)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00270">probing.cc:270</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2bf59c05d95db86f40a3d1577429683b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2bf59c05d95db86f40a3d1577429683b">operations_research::sat::ComputeResolvantSize</a></div><div class="ttdeci">int ComputeResolvantSize(Literal x, const std::vector&lt; Literal &gt; &amp;a, const std::vector&lt; Literal &gt; &amp;b)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01048">simplification.cc:1048</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2dbcb7017d468a17bdb30252af5c6c31"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">operations_research::sat::kNoLiteralIndex</a></div><div class="ttdeci">const LiteralIndex kNoLiteralIndex(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a38c2801a1b4798693c3a425b41e0356b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a38c2801a1b4798693c3a425b41e0356b">operations_research::sat::SolveWithPresolve</a></div><div class="ttdeci">SatSolver::Status SolveWithPresolve(std::unique_ptr&lt; SatSolver &gt; *solver, TimeLimit *time_limit, std::vector&lt; bool &gt; *solution, DratProofHandler *drat_proof_handler)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01247">simplification.cc:1247</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7cc19650ad546aee24b7abe12910437c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7cc19650ad546aee24b7abe12910437c">operations_research::sat::DifferAtGivenLiteral</a></div><div class="ttdeci">LiteralIndex DifferAtGivenLiteral(const std::vector&lt; Literal &gt; &amp;a, const std::vector&lt; Literal &gt; &amp;b, Literal l)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00979">simplification.cc:979</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a93ca885a2ad18527fab730188104771a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a93ca885a2ad18527fab730188104771a">operations_research::sat::ComputeResolvant</a></div><div class="ttdeci">bool ComputeResolvant(Literal x, const std::vector&lt; Literal &gt; &amp;a, const std::vector&lt; Literal &gt; &amp;b, std::vector&lt; Literal &gt; *out)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01013">simplification.cc:1013</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac75d30c113a2b2628f0d77e403467815"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac75d30c113a2b2628f0d77e403467815">operations_research::sat::ProbeAndFindEquivalentLiteral</a></div><div class="ttdeci">void ProbeAndFindEquivalentLiteral(SatSolver *solver, SatPostsolver *postsolver, DratProofHandler *drat_proof_handler, absl::StrongVector&lt; LiteralIndex, LiteralIndex &gt; *mapping)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l01129">simplification.cc:1129</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_add67896a84f6372a648154c5770a0ae0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">operations_research::sat::kNoBooleanVariable</a></div><div class="ttdeci">const BooleanVariable kNoBooleanVariable(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae8b3a53c4ac6b35d00a4b7282442d1d0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae8b3a53c4ac6b35d00a4b7282442d1d0">operations_research::sat::SimplifyClause</a></div><div class="ttdeci">bool SimplifyClause(const std::vector&lt; Literal &gt; &amp;a, std::vector&lt; Literal &gt; *b, LiteralIndex *opposite_literal, int64 *num_inspected_literals)</div><div class="ttdef"><b>Definition:</b> <a href="simplification_8cc_source.html#l00931">simplification.cc:931</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<div class="ttc" id="apack_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00508">pack.cc:508</a></div></div>
<div class="ttc" id="apreprocessor_8cc_html_abcdbe46fb8451a69d42c17abdb920021"><div class="ttname"><a href="preprocessor_8cc.html#abcdbe46fb8451a69d42c17abdb920021">representative</a></div><div class="ttdeci">ColIndex representative</div><div class="ttdef"><b>Definition:</b> <a href="preprocessor_8cc_source.html#l00430">preprocessor.cc:430</a></div></div>
<div class="ttc" id="aprobing_8h_html"><div class="ttname"><a href="probing_8h.html">probing.h</a></div></div>
<div class="ttc" id="arandom_8h_html"><div class="ttname"><a href="random_8h.html">random.h</a></div></div>
<div class="ttc" id="asat_2util_8h_html"><div class="ttname"><a href="sat_2util_8h.html">util.h</a></div></div>
<div class="ttc" id="asat__inprocessing_8h_html"><div class="ttname"><a href="sat__inprocessing_8h.html">sat_inprocessing.h</a></div></div>
<div class="ttc" id="asimplification_8h_html"><div class="ttname"><a href="simplification_8h.html">simplification.h</a></div></div>
<div class="ttc" id="astl__util_8h_html"><div class="ttname"><a href="stl__util_8h.html">stl_util.h</a></div></div>
<div class="ttc" id="astrong__vector_8h_html"><div class="ttname"><a href="strong__vector_8h.html">strong_vector.h</a></div></div>
<div class="ttc" id="astrongly__connected__components_8h_html"><div class="ttname"><a href="strongly__connected__components_8h.html">strongly_connected_components.h</a></div></div>
<div class="ttc" id="astrongly__connected__components_8h_html_aafab5785b250e1013c13511ce478f36b"><div class="ttname"><a href="strongly__connected__components_8h.html#aafab5785b250e1013c13511ce478f36b">FindStronglyConnectedComponents</a></div><div class="ttdeci">void FindStronglyConnectedComponents(const NodeIndex num_nodes, const Graph &amp;graph, SccOutput *components)</div><div class="ttdef"><b>Definition:</b> <a href="strongly__connected__components_8h_source.html#l00211">strongly_connected_components.h:211</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_postsolve_clauses_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_postsolve_clauses.html">operations_research::sat::PostsolveClauses</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00041">sat_inprocessing.h:41</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_postsolve_clauses_html_a8cc6d9f1059f26a873442045a72e651e"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_postsolve_clauses.html#a8cc6d9f1059f26a873442045a72e651e">operations_research::sat::PostsolveClauses::clauses</a></div><div class="ttdeci">std::deque&lt; std::vector&lt; Literal &gt; &gt; clauses</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00047">sat_inprocessing.h:47</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_sat_presolve_options_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_sat_presolve_options.html">operations_research::sat::SatPresolveOptions</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00054">sat_inprocessing.h:54</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_sat_presolve_options_html_a54320231778412ca00e50eb821c95aa6"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a54320231778412ca00e50eb821c95aa6">operations_research::sat::SatPresolveOptions::log_info</a></div><div class="ttdeci">bool log_info</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00060">sat_inprocessing.h:60</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_sat_presolve_options_html_a9251c24a19aaef6f5134a615eff02277"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#a9251c24a19aaef6f5134a615eff02277">operations_research::sat::SatPresolveOptions::use_transitive_reduction</a></div><div class="ttdeci">bool use_transitive_reduction</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00071">sat_inprocessing.h:71</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_sat_presolve_options_html_ac68dd5a27fd973b215de47442bacf1ac"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#ac68dd5a27fd973b215de47442bacf1ac">operations_research::sat::SatPresolveOptions::extract_binary_clauses_in_probing</a></div><div class="ttdeci">bool extract_binary_clauses_in_probing</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00063">sat_inprocessing.h:63</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_sat_presolve_options_html_afac11ce59af8fa30ab784cfa4fb36297"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_sat_presolve_options.html#afac11ce59af8fa30ab784cfa4fb36297">operations_research::sat::SatPresolveOptions::deterministic_time_limit</a></div><div class="ttdeci">double deterministic_time_limit</div><div class="ttdef"><b>Definition:</b> <a href="sat__inprocessing_8h_source.html#l00056">sat_inprocessing.h:56</a></div></div>
<div class="ttc" id="atime__limit_8h_html"><div class="ttname"><a href="time__limit_8h.html">time_limit.h</a></div></div>
<div class="ttc" id="atimer_8h_html"><div class="ttname"><a href="timer_8h.html">timer.h</a></div></div>
<div class="ttc" id="avlog__is__on_8h_html_a956152cad330225654d128f35c00efce"><div class="ttname"><a href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a></div><div class="ttdeci">#define VLOG_IS_ON(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="vlog__is__on_8h_source.html#l00041">vlog_is_on.h:41</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_dddac007a45022d9da6ea1dee012c3b9.html">sat</a></li><li class="navelem"><a class="el" href="simplification_8cc.html">simplification.cc</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.1 </li>
</ul>
</div>
</body>
</html>