Files
ortools-clone/docs/cpp/probing_8cc_source.html
Mizux Seiha 3b7ffd12b0 Update doc
2020-10-09 12:01:52 +02:00

912 lines
162 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.8.20"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: probing.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.0</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.20 -->
<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');
/* @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('probing_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">probing.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="probing_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="probing_8h.html">ortools/sat/probing.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;set&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="iterator__adaptors_8h.html">ortools/base/iterator_adaptors.h</a>&quot;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</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="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="clause_8h.html">ortools/sat/clause.h</a>&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="implied__bounds_8h.html">ortools/sat/implied_bounds.h</a>&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="integer_8h.html">ortools/sat/integer.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="sat__base_8h.html">ortools/sat/sat_base.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="sat__solver_8h.html">ortools/sat/sat_solver.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="sat_2util_8h.html">ortools/sat/util.h</a>&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a33bff3781b729e27219201cf5a05a140"> 30</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a33bff3781b729e27219201cf5a05a140">ProbeBooleanVariables</a>(<span class="keyword">const</span> <span class="keywordtype">double</span> deterministic_time_limit, <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>,</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <span class="keywordtype">bool</span> log_info) {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keyword">auto</span>* sat_solver = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keyword">auto</span>* implication_graph = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>&gt;();</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; std::vector&lt;BooleanVariable&gt; bool_vars;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="keywordflow">for</span> (BooleanVariable <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>(0); <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a> &lt; num_variables; ++<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</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="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, <span class="keyword">true</span>);</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keywordflow">if</span> (implication_graph-&gt;RepresentativeOf(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) != <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; }</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; bool_vars.push_back(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>);</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; }</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a33bff3781b729e27219201cf5a05a140">ProbeBooleanVariables</a>(deterministic_time_limit, bool_vars, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; log_info);</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="namespaceoperations__research_1_1sat.html#ab76e111fb4a1b70ddb063a60890b7468"> 47</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a33bff3781b729e27219201cf5a05a140">ProbeBooleanVariables</a>(<span class="keyword">const</span> <span class="keywordtype">double</span> deterministic_time_limit,</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; absl::Span&lt;const BooleanVariable&gt; bool_vars,</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</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>, <span class="keywordtype">bool</span> log_info) {</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; log_info |= VLOG_IS_ON(1);</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <a class="code" href="class_wall_timer.html">WallTimer</a> <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="comment">// Reset the solver in case it was already used.</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">auto</span>* sat_solver = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; sat_solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; </div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keyword">auto</span>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a> = <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;();</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; assignment = sat_solver-&gt;LiteralTrail().Assignment();</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"> 62</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver-&gt;LiteralTrail().Index();</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> initial_deterministic_time =</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime();</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> limit = initial_deterministic_time + deterministic_time_limit;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="comment">// For the new direct implication detected.</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_new_binary = 0;</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; std::vector&lt;std::pair&lt;Literal, Literal&gt;&gt; new_binary_clauses;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">auto</span>* implication_graph = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>&gt;();</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <span class="keywordtype">id</span> = implication_graph-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">PropagatorId</a>();</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; </div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// This is used to tighten the integer variable bounds.</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordtype">int</span> num_new_holes = 0;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordtype">int</span> num_new_integer_bounds = 0;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">auto</span>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;Mutable&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>* implied_bounds = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keywordflow">if</span> (integer_trail != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; implied_bounds = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>&gt;();</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; std::vector&lt;IntegerLiteral&gt; new_integer_bounds;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">// To detect literal x that must be true because b =&gt; x and not(b) =&gt; x.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="comment">// When probing b, we add all propagated literal to propagated, and when</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// probing not(b) we check if any are already there.</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; std::vector&lt;Literal&gt; to_fix_at_true;</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver-&gt;NumVariables();</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classoperations__research_1_1_sparse_bitset.html">SparseBitset&lt;LiteralIndex&gt;</a> propagated(LiteralIndex(2 * num_variables));</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; </div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordtype">bool</span> limit_reached = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordtype">int</span> num_probed = 0;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; trail = *(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;Get&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;());</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a> : bool_vars) {</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</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="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, <span class="keyword">true</span>);</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordflow">if</span> (implication_graph-&gt;RepresentativeOf(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) != <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) {</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordflow">continue</span>;</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="comment">// TODO(user): Instead of an hard deterministic limit, we should probably</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// use a lower one, but reset it each time we have found something useful.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached() ||</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime() &gt; limit) {</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; limit_reached = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">break</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; <span class="comment">// Propagate b=1 and then b=0.</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; ++num_probed;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; new_integer_bounds.clear();</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; propagated.<a class="code" href="classoperations__research_1_1_sparse_bitset.html#ab4bc8236a9bfe59526e353800a0f0470">SparseClearAll</a>();</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</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> decision : {<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>, <span class="keyword">true</span>), <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>, <span class="keyword">false</span>)}) {</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(decision)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; CHECK_EQ(sat_solver-&gt;CurrentDecisionLevel(), 0);</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> saved_index = trail.Index();</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; sat_solver-&gt;EnqueueDecisionAndBackjumpOnConflict(decision);</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; sat_solver-&gt;AdvanceDeterministicTime(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;CurrentDecisionLevel() == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; </div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">if</span> (integer_trail != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; implied_bounds-&gt;ProcessIntegerTrail(decision);</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; integer_trail-&gt;AppendNewBounds(&amp;new_integer_bounds);</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; }</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = saved_index + 1; i &lt; trail.Index(); ++i) {</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = trail[i];</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"> 129</span>&#160; <span class="comment">// We mark on the first run (b.IsPositive()) and check on the second.</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">if</span> (decision.IsPositive()) {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; propagated.<a class="code" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>());</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">if</span> (propagated[l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; to_fix_at_true.push_back(l);</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; }</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; </div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="comment">// Anything not propagated by the BinaryImplicationGraph is a &quot;new&quot;</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="comment">// binary clause. This is becaue the BinaryImplicationGraph has the</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="comment">// highest priority of all propagators.</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordflow">if</span> (trail.AssignmentType(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()) != <span class="keywordtype">id</span>) {</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; new_binary_clauses.push_back({decision.Negated(), l});</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="comment">// Fix variable and add new binary clauses.</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</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> l : to_fix_at_true) {</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; sat_solver-&gt;AddUnitClause(l);</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; }</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; to_fix_at_true.clear();</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; num_new_binary += new_binary_clauses.size();</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> binary : new_binary_clauses) {</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; sat_solver-&gt;AddBinaryClause(binary.first, binary.second);</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; }</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; new_binary_clauses.clear();</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; }</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"> 161</span>&#160; <span class="comment">// We have at most two lower bounds for each variables (one for b==0 and one</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="comment">// for b==1), so the min of the two is a valid level zero bound! More</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="comment">// generally, the domain of a variable can be intersected with the union</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="comment">// of the two propagated domains. This also allow to detect &quot;holes&quot;.</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="comment">// TODO(user): More generally, for any clauses (b or not(b) is one), we</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="comment">// could probe all the literal inside, and for any integer variable, we can</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="comment">// take the union of the propagated domain as a new domain.</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="comment">// TODO(user): fix binary variable in the same way? It might not be as</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="comment">// useful since probing on such variable will also fix it. But then we might</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="comment">// abort probing early, so it might still be good.</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; std::sort(new_integer_bounds.begin(), new_integer_bounds.end(),</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; [](<a class="code" href="structoperations__research_1_1sat_1_1_integer_literal.html">IntegerLiteral</a> <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="structoperations__research_1_1sat_1_1_integer_literal.html">IntegerLiteral</a> <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) { return a.var &lt; b.var; });</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; <span class="comment">// This is used for the hole detection.</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; IntegerVariable prev_var = <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; IntegerValue lb_max = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; IntegerValue ub_min = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; new_integer_bounds.push_back(<a class="code" href="structoperations__research_1_1sat_1_1_integer_literal.html">IntegerLiteral</a>()); <span class="comment">// Sentinel.</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; </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 = 0; i &lt; new_integer_bounds.size(); ++i) {</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = new_integer_bounds[i].var;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// Hole detection.</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">if</span> (i &gt; 0 &amp;&amp; <a class="code" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != prev_var) {</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">if</span> (ub_min + 1 &lt; lb_max) {</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="comment">// The variable cannot take value in (ub_min, lb_max) !</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// TODO(user): do not create domain with a complexity that is too</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="comment">// large?</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1_domain.html">Domain</a> old_domain =</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; integer_trail-&gt;InitialVariableDomain(prev_var);</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1_domain.html">Domain</a> new_domain = old_domain.<a class="code" href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <a class="code" href="classoperations__research_1_1_domain.html">Domain</a>(ub_min.value() + 1, lb_max.value() - 1).<a class="code" href="classoperations__research_1_1_domain.html#a1f1de3874966a137f140748498f43e0c">Complement</a>());</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">if</span> (new_domain != old_domain) {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; ++num_new_holes;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (!integer_trail-&gt;UpdateInitialDomain(prev_var, new_domain)) {</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; }</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; </div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// Reinitialize.</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; lb_max = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; ub_min = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; }</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; prev_var = <a class="code" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#ae2544d2a3a5ef4c78f8e5891f104ab41">VariableIsPositive</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; lb_max = <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(lb_max, new_integer_bounds[i].<a class="code" href="routing__search_8cc.html#a204f9b990226e8288e1aaecbb496cbf8">bound</a>);</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; ub_min = <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">std::min</a>(ub_min, -new_integer_bounds[i].<a class="code" href="routing__search_8cc.html#a204f9b990226e8288e1aaecbb496cbf8">bound</a>);</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"> 216</span>&#160; <span class="comment">// Bound tightening.</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">if</span> (i == 0 || new_integer_bounds[i - 1].<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> != <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keyword">const</span> IntegerValue new_bound = <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">std::min</a>(new_integer_bounds[i - 1].<a class="code" href="routing__search_8cc.html#a204f9b990226e8288e1aaecbb496cbf8">bound</a>,</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; new_integer_bounds[i].<a class="code" href="routing__search_8cc.html#a204f9b990226e8288e1aaecbb496cbf8">bound</a>);</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">if</span> (new_bound &gt; integer_trail-&gt;LowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; ++num_new_integer_bounds;</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">if</span> (!integer_trail-&gt;Enqueue(</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">IntegerLiteral::GreaterOrEqual</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, new_bound), {}, {})) {</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</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; }</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; </div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="comment">// We might have updates some integer domain, lets propagate.</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="comment">// Display stats.</span></div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">if</span> (log_info) {</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> time_diff =</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime() - initial_deterministic_time;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver-&gt;LiteralTrail().Index();</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_newly_fixed = num_fixed - initial_num_fixed;</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; LOG(INFO) &lt;&lt; <span class="stringliteral">&quot;Probing deterministic_time: &quot;</span> &lt;&lt; time_diff</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; &lt;&lt; <span class="stringliteral">&quot; (limit: &quot;</span> &lt;&lt; deterministic_time_limit</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; &lt;&lt; <span class="stringliteral">&quot;) wall_time: &quot;</span> &lt;&lt; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>() &lt;&lt; <span class="stringliteral">&quot; (&quot;</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; &lt;&lt; (limit_reached ? <span class="stringliteral">&quot;Aborted &quot;</span> : <span class="stringliteral">&quot;&quot;</span>) &lt;&lt; num_probed &lt;&lt; <span class="stringliteral">&quot;/&quot;</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; &lt;&lt; num_variables &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; LOG_IF(INFO, num_newly_fixed &gt; 0)</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Probing new fixed Boolean: &quot;</span> &lt;&lt; num_newly_fixed &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; num_fixed</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; &lt;&lt; <span class="stringliteral">&quot;/&quot;</span> &lt;&lt; num_variables &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; LOG_IF(INFO, num_new_holes &gt; 0)</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Probing new integer holes: &quot;</span> &lt;&lt; num_new_holes;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; LOG_IF(INFO, num_new_integer_bounds &gt; 0)</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Probing new integer bounds: &quot;</span> &lt;&lt; num_new_integer_bounds;</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; LOG_IF(INFO, num_new_binary &gt; 0)</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Probing new binary clause: &quot;</span> &lt;&lt; num_new_binary;</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; }</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; </div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</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"><a class="line" href="namespaceoperations__research_1_1sat.html#a20296d1a269e973b66b403c8b1cd5785"> 258</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a20296d1a269e973b66b403c8b1cd5785">LookForTrivialSatSolution</a>(<span class="keywordtype">double</span> deterministic_time_limit, <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>,</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keywordtype">bool</span> log_info) {</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; log_info |= VLOG_IS_ON(1);</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <a class="code" href="class_wall_timer.html">WallTimer</a> <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// Reset the solver in case it was already used.</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keyword">auto</span>* sat_solver = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; sat_solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; </div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keyword">auto</span>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a> = <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;();</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver-&gt;LiteralTrail().Index();</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// Note that this code do not care about the non-Boolean part and just try to</span></div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// assign the existing Booleans.</span></div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; SatParameters initial_params = *<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;SatParameters&gt;();</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; SatParameters new_params = initial_params;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; new_params.set_log_search_progress(<span class="keyword">false</span>);</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; new_params.set_max_number_of_conflicts(1);</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; new_params.set_max_deterministic_time(deterministic_time_limit);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; </div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordtype">double</span> elapsed_dtime = 0.0;</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; </div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_times = 1000;</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keywordtype">bool</span> limit_reached = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keyword">auto</span>* random = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="structoperations__research_1_1sat_1_1_model_random_generator.html">ModelRandomGenerator</a>&gt;();</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_times; ++i) {</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached() ||</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; elapsed_dtime &gt; deterministic_time_limit) {</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; limit_reached = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">break</span>;</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; </div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">// SetParameters() reset the deterministic time to zero inside time_limit.</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; sat_solver-&gt;SetParameters(new_params);</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; sat_solver-&gt;ResetDecisionHeuristic();</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</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 = sat_solver-&gt;SolveWithTimeLimit(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; elapsed_dtime += <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime();</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; </div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</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="l00299"></a><span class="lineno"> 299</span>&#160; LOG_IF(INFO, log_info) &lt;&lt; <span class="stringliteral">&quot;Trivial exploration found feasible solution!&quot;</span>;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(elapsed_dtime);</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; </div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) {</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; LOG_IF(INFO, log_info) &lt;&lt; <span class="stringliteral">&quot;UNSAT during trivial exploration heuristic.&quot;</span>;</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(elapsed_dtime);</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; }</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; </div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="comment">// We randomize at the end so that the default params is executed</span></div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="comment">// at least once.</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aef1ea7e6296a28c0fa0752328d8cb900">RandomizeDecisionHeuristic</a>(random, &amp;new_params);</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; new_params.set_random_seed(i);</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; new_params.set_max_deterministic_time(deterministic_time_limit -</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; elapsed_dtime);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</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; <span class="comment">// Restore the initial parameters.</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; sat_solver-&gt;SetParameters(initial_params);</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; sat_solver-&gt;ResetDecisionHeuristic();</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(elapsed_dtime);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; </div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">if</span> (log_info) {</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver-&gt;LiteralTrail().Index();</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_newly_fixed = num_fixed - initial_num_fixed;</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver-&gt;NumVariables();</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; LOG(INFO) &lt;&lt; <span class="stringliteral">&quot;Random exploration.&quot;</span></div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; &lt;&lt; <span class="stringliteral">&quot; num_fixed: +&quot;</span> &lt;&lt; num_newly_fixed &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; num_fixed &lt;&lt; <span class="stringliteral">&quot;/&quot;</span></div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; &lt;&lt; num_variables &lt;&lt; <span class="stringliteral">&quot;)&quot;</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; &lt;&lt; <span class="stringliteral">&quot; dtime: &quot;</span> &lt;&lt; elapsed_dtime &lt;&lt; <span class="stringliteral">&quot;/&quot;</span> &lt;&lt; deterministic_time_limit</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; &lt;&lt; <span class="stringliteral">&quot; wtime: &quot;</span> &lt;&lt; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>()</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; &lt;&lt; (limit_reached ? <span class="stringliteral">&quot; (Aborted)&quot;</span> : <span class="stringliteral">&quot;&quot;</span>);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; }</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">return</span> sat_solver-&gt;FinishPropagation();</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; </div>
<div class="line"><a name="l00338"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2"> 338</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2">FailedLiteralProbingRound</a>(<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html">ProbingOptions</a> options, <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>) {</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <a class="code" href="class_wall_timer.html">WallTimer</a> <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a> |= VLOG_IS_ON(1);</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">// Reset the solver in case it was already used.</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keyword">auto</span>* sat_solver = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; sat_solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="comment">// When called from Inprocessing, the implication graph should already be a</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// DAG, so these two calls should return right away. But we do need them to</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">// get the topological order if this is used in isolation.</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keyword">auto</span>* implication_graph = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>&gt;();</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (!implication_graph-&gt;DetectEquivalences()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; </div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keyword">auto</span>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a> = <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;();</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver-&gt;LiteralTrail().Index();</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> initial_deterministic_time =</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime();</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> limit = initial_deterministic_time + options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a4f572c68b7bf3aac70b3f5292398ff7b">deterministic_limit</a>;</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; </div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver-&gt;NumVariables();</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <a class="code" href="classoperations__research_1_1_sparse_bitset.html">SparseBitset&lt;LiteralIndex&gt;</a> processed(LiteralIndex(2 * num_variables));</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; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_probed = 0;</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_explicit_fix = 0;</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_conflicts = 0;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_new_binary = 0;</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_subsumed = 0;</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="keyword">const</span> <span class="keyword">auto</span>&amp; trail = *(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;Get&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;());</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; assignment = trail.Assignment();</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keyword">auto</span>* clause_manager = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_literal_watchers.html">LiteralWatchers</a>&gt;();</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <span class="keywordtype">id</span> = implication_graph-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">PropagatorId</a>();</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> clause_id = clause_manager-&gt;PropagatorId();</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; </div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="comment">// This is only needed when options.use_queue is true.</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keyword">struct </span>SavedNextLiteral {</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; LiteralIndex literal_index; <span class="comment">// kNoLiteralIndex if we need to backtrack.</span></div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordtype">int</span> rank; <span class="comment">// Cached position_in_order, we prefer lower positions.</span></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; <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> SavedNextLiteral&amp; o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rank &lt; o.rank; }</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; std::vector&lt;SavedNextLiteral&gt; queue;</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <a class="code" href="classgtl_1_1_i_t_i_vector.html">gtl::ITIVector&lt;LiteralIndex, int&gt;</a> position_in_order;</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; </div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="comment">// This is only needed when options use_queue is false;</span></div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <a class="code" href="classgtl_1_1_i_t_i_vector.html">gtl::ITIVector&lt;LiteralIndex, int&gt;</a> starts;</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">if</span> (!options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) starts.<a class="code" href="classgtl_1_1_i_t_i_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(2 * num_variables, 0);</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; </div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// We delay fixing of already assigned literal once we go back to level</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="comment">// zero.</span></div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; std::vector&lt;Literal&gt; to_fix;</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="comment">// Depending on the options. we do not use the same order.</span></div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="comment">// With tree look, it is better to start with &quot;leaf&quot; first since we try</span></div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="comment">// to reuse propagation as much as possible. This is also interesting to</span></div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="comment">// do when extracting binary clauses since we will need to propagate</span></div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="comment">// everyone anyway, and this should result in less clauses that can be</span></div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// removed later by transitive reduction.</span></div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="comment">// However, without tree-look and without the need to extract all binary</span></div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="comment">// clauses, it is better to just probe the root of the binary implication</span></div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="comment">// graph. This is exactly what happen when we probe using the topological</span></div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// order.</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordtype">int</span> order_index(0);</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; std::vector&lt;LiteralIndex&gt; probing_order =</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; implication_graph-&gt;ReverseTopologicalOrder();</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (!options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">use_tree_look</a> &amp;&amp; !options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">extract_binary_clauses</a>) {</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; std::reverse(probing_order.begin(), probing_order.end());</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; }</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; </div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="comment">// We only use this for the queue version.</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) {</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; position_in_order.<a class="code" href="classgtl_1_1_i_t_i_vector.html#a184fe69018ae421dcf31c964bfe40576">assign</a>(2 * num_variables, -1);</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; probing_order.size(); ++i) {</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; position_in_order[probing_order[i]] = i;</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; }</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">while</span> (!<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached() &amp;&amp;</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime() &lt;= limit) {</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// We only enqueue literal at level zero if we don&#39;t use &quot;tree look&quot;.</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordflow">if</span> (!options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">use_tree_look</a>) sat_solver-&gt;Backtrack(0);</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; LiteralIndex next_decision = <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a> &amp;&amp; sat_solver-&gt;CurrentDecisionLevel() &gt; 0) {</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// TODO(user): Instead of minimizing index in topo order (which might be</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="comment">// nice for binary extraction), we could try to maximize reusability in</span></div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// some way.</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> prev_decision =</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; sat_solver-&gt;Decisions()[sat_solver-&gt;CurrentDecisionLevel() - 1]</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; .literal;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; list =</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; implication_graph-&gt;Implications(prev_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> saved_queue_size = queue.size();</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</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> l : list) {</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate = l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">if</span> (processed[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keywordflow">if</span> (position_in_order[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()] == -1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) {</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; to_fix.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</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="keywordflow">continue</span>;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; }</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; queue.push_back(</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; {candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>(), -position_in_order[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]});</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; }</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; std::sort(queue.begin() + saved_queue_size, queue.end());</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">// Probe a literal that implies previous decision.</span></div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordflow">while</span> (!queue.empty()) {</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="keyword">const</span> LiteralIndex <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = queue.back().literal_index;</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; queue.pop_back();</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</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#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="comment">// This is a backtrack marker, go back one level.</span></div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; CHECK_GT(sat_solver-&gt;CurrentDecisionLevel(), 0);</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; sat_solver-&gt;Backtrack(sat_solver-&gt;CurrentDecisionLevel() - 1);</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; }</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordflow">if</span> (processed[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) {</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; to_fix.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; }</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; }</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; next_decision = candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; }</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; }</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; </div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;CurrentDecisionLevel() == 0) {</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// Fix any delayed fixed literal.</span></div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</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> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : to_fix) {</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordflow">if</span> (!assignment.LiteralIsTrue(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>)) {</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; ++num_explicit_fix;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; sat_solver-&gt;AddUnitClause(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; }</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; }</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; to_fix.clear();</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; </div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="comment">// Probe an unexplored node.</span></div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">for</span> (; order_index &lt; probing_order.size(); ++order_index) {</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate(probing_order[order_index]);</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">if</span> (processed[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; next_decision = candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</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; <span class="comment">// The pass is finished.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="keywordflow">if</span> (next_decision == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (next_decision == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> level = sat_solver-&gt;CurrentDecisionLevel();</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> prev_decision = sat_solver-&gt;Decisions()[level - 1].literal;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; list =</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; implication_graph-&gt;Implications(prev_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</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; <span class="comment">// Probe a literal that implies previous decision.</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">// Note that contrary to the queue based implementation, this do not</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="comment">// process them in a particular order.</span></div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordtype">int</span> j = starts[prev_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()];</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; list.size(); ++i, ++j) {</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; j %= list.<a class="code" href="classgtl_1_1_i_t_i_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>();</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate = <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(list[j]).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keywordflow">if</span> (processed[candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="comment">// candidate =&gt; previous =&gt; not(candidate), so we can fix it.</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; to_fix.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="comment">// This shouldn&#39;t happen if extract_binary_clauses is false.</span></div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="comment">// We have an equivalence.</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsTrue(candidate)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; next_decision = candidate.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; }</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; starts[prev_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()] = j;</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">if</span> (next_decision == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; sat_solver-&gt;Backtrack(level - 1);</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; }</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; ++num_probed;</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; processed.<a class="code" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(next_decision);</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; CHECK_NE(next_decision, <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>);</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; queue.push_back({<a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>, 0}); <span class="comment">// Backtrack marker.</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> level = sat_solver-&gt;CurrentDecisionLevel();</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> first_new_trail_index =</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; sat_solver-&gt;EnqueueDecisionAndBackjumpOnConflict(</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision));</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> new_level = sat_solver-&gt;CurrentDecisionLevel();</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; sat_solver-&gt;AdvanceDeterministicTime(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">if</span> (new_level &lt;= level) {</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; ++num_conflicts;</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// Sync the queue with the new level.</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) {</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">if</span> (new_level == 0) {</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; queue.clear();</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordtype">int</span> queue_level = level + 1;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">while</span> (queue_level &gt; new_level) {</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; CHECK(!queue.empty());</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">if</span> (queue.back().literal_index == <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) --queue_level;</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; queue.pop_back();</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; }</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; }</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; }</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">// Fix next_decision to false if not already done.</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="comment">// Even if we fixed something at evel zero, next_decision might not be</span></div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="comment">// fixed! But we can fix it. It can happen because when we propagate</span></div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="comment">// with clauses, we might have a =&gt; b but not not(b) =&gt; not(a). Like a</span></div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="comment">// =&gt; b and clause (not(a), not(b), c), propagating a will set c, but</span></div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="comment">// propagating not(c) will not do anything.</span></div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="comment">// We &quot;delay&quot; the fixing if we are not at level zero so that we can</span></div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">// still reuse the current propagation work via tree look.</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="comment">// TODO(user): Can we be smarter here? Maybe we can still fix the</span></div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="comment">// literal without going back to level zero by simply enqueing it with</span></div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="comment">// no reason? it will be bactracked over, but we will still lazily fix</span></div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="comment">// it later.</span></div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;CurrentDecisionLevel() != 0 ||</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; assignment.LiteralIsFalse(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision))) {</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; to_fix.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision).Negated());</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; }</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; }</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; </div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="comment">// Inspect the newly propagated literals. Depending on the options, try to</span></div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="comment">// extract binary clauses via hyper binary resolution and/or mark the</span></div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="comment">// literals on the trail so that they do not need to be probed later.</span></div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">if</span> (new_level == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> last_decision =</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; sat_solver-&gt;Decisions()[new_level - 1].literal;</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordtype">int</span> num_new_subsumed = 0;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = first_new_trail_index; i &lt; trail.Index(); ++i) {</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = trail[i];</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span> (l == last_decision) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; </div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="comment">// If we can extract a binary clause that subsume the reason clause, we</span></div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// do add the binary and remove the subsumed clause.</span></div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="comment">// TODO(user): We could be slightly more generic and subsume some</span></div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="comment">// clauses that do not contains last_decision.Negated().</span></div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordtype">bool</span> subsumed = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">subsume_with_binary_clause</a> &amp;&amp;</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; trail.AssignmentType(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()) == clause_id) {</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</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> lit : trail.Reason(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>())) {</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <span class="keywordflow">if</span> (lit == last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) {</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; subsumed = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; }</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; }</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">if</span> (subsumed) {</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; ++num_new_subsumed;</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; ++num_new_binary;</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; implication_graph-&gt;AddBinaryClause(last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(), l);</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> trail_index = trail.Info(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()).trail_index;</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="keywordtype">int</span> test = 0;</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</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> lit :</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; clause_manager-&gt;ReasonClause(trail_index)-&gt;AsSpan()) {</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">if</span> (lit == l) ++test;</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordflow">if</span> (lit == last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) ++test;</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; CHECK_EQ(test, 2);</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; clause_manager-&gt;LazyDetach(clause_manager-&gt;ReasonClause(trail_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; <span class="comment">// We need to change the reason now that the clause is cleared.</span></div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; implication_graph-&gt;ChangeReason(trail_index, last_decision);</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; </div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">extract_binary_clauses</a>) {</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="comment">// Anything not propagated by the BinaryImplicationGraph is a &quot;new&quot;</span></div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="comment">// binary clause. This is because the BinaryImplicationGraph has the</span></div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="comment">// highest priority of all propagators.</span></div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="comment">// Note(user): This is not 100% true, since when we launch the clause</span></div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <span class="comment">// propagation for one literal we do finish it before calling again</span></div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="comment">// the binary propagation.</span></div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="comment">// TODO(user): Think about trying to extract clause that will not</span></div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="comment">// get removed by transitive reduction later. If we can both extract</span></div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="comment">// a =&gt; c and b =&gt; c , ideally we don&#39;t want to extract a =&gt; c first</span></div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="comment">// if we already know that a =&gt; b.</span></div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="comment">// TODO(user): Similar to previous point, we could find the LCA</span></div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="comment">// of all literals in the reason for this propagation. And use this</span></div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; <span class="comment">// as a reason for later hyber binary resolution. Like we do when</span></div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; <span class="comment">// this clause subsume the reason.</span></div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">if</span> (!subsumed &amp;&amp; trail.AssignmentType(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()) != <span class="keywordtype">id</span>) {</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; ++num_new_binary;</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; implication_graph-&gt;AddBinaryClause(last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(), l);</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; }</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="comment">// If we don&#39;t extract binary, we don&#39;t need to explore any of</span></div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="comment">// these literal until more variables are fixed.</span></div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; processed.<a class="code" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>());</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; }</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; }</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; </div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="comment">// Inspect the watcher list for last_decision, If we have a blocking</span></div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="comment">// literal at true (implied by last decision), then we have subsumptions.</span></div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="comment">// The intuition behind this is that if a binary clause (a,b) subsume a</span></div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; <span class="comment">// clause, and we watch a.Negated() for this clause with a blocking</span></div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="comment">// literal b, then this watch entry will never change because we always</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="comment">// propagate binary clauses first and the blocking literal will always be</span></div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="comment">// true. So after many propagations, we hope to have such configuration</span></div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// which is quite cheap to test here.</span></div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span> (options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">subsume_with_binary_clause</a>) {</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; w :</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; clause_manager-&gt;WatcherListOnFalse(last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>())) {</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keywordflow">if</span> (assignment.LiteralIsTrue(w.blocking_literal)) {</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="keywordflow">if</span> (w.clause-&gt;empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; CHECK_NE(w.blocking_literal, last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; </div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="comment">// Add the binary clause if needed. Note that we change the reason</span></div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="comment">// to a binary one so that we never add the same clause twice.</span></div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="comment">// Tricky: while last_decision would be a valid reason, we need a</span></div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="comment">// reason that was assigned before this literal, so we use the</span></div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <span class="comment">// decision at the level where this literal was assigne which is an</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="comment">// even better reasony. Maybe it is just better to change all the</span></div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="comment">// reason above to a binary one so we don&#39;t have an issue here.</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="keywordflow">if</span> (trail.AssignmentType(w.blocking_literal.Variable()) != <span class="keywordtype">id</span>) {</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; ++num_new_binary;</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; implication_graph-&gt;AddBinaryClause(last_decision.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(),</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; w.blocking_literal);</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; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; info = trail.Info(w.blocking_literal.Variable());</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <span class="keywordflow">if</span> (info.level &gt; 0) {</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> d = sat_solver-&gt;Decisions()[info.level - 1].literal;</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keywordflow">if</span> (d != w.blocking_literal) {</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; implication_graph-&gt;ChangeReason(info.trail_index, d);</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; }</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; }</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; ++num_new_subsumed;</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; clause_manager-&gt;LazyDetach(w.clause);</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; }</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; }</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; </div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keywordflow">if</span> (num_new_subsumed &gt; 0) {</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="comment">// TODO(user): We might just want to do that even more lazily by</span></div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="comment">// checking for detached clause while propagating here? and do a big</span></div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="comment">// cleanup at the end.</span></div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; clause_manager-&gt;CleanUpWatchers();</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; num_subsumed += num_new_subsumed;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; }</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; }</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="keywordflow">if</span> (!sat_solver-&gt;ResetToLevelZero()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</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> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : to_fix) {</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; ++num_explicit_fix;</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; sat_solver-&gt;AddUnitClause(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; }</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; to_fix.clear();</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">if</span> (!sat_solver-&gt;FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; </div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="comment">// Display stats.</span></div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver-&gt;LiteralTrail().<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_newly_fixed = num_fixed - initial_num_fixed;</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> time_diff =</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime() - initial_deterministic_time;</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> limit_reached = <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached() ||</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetElapsedDeterministicTime() &gt; limit;</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; LOG_IF(INFO, options.<a class="code" href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a>)</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Probing. &quot;</span></div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; &lt;&lt; <span class="stringliteral">&quot; num_probed: &quot;</span> &lt;&lt; num_probed &lt;&lt; <span class="stringliteral">&quot; num_fixed: +&quot;</span> &lt;&lt; num_newly_fixed</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; num_fixed &lt;&lt; <span class="stringliteral">&quot;/&quot;</span> &lt;&lt; num_variables &lt;&lt; <span class="stringliteral">&quot;)&quot;</span></div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; &lt;&lt; <span class="stringliteral">&quot; explicit_fix:&quot;</span> &lt;&lt; num_explicit_fix</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; &lt;&lt; <span class="stringliteral">&quot; num_conflicts:&quot;</span> &lt;&lt; num_conflicts</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; &lt;&lt; <span class="stringliteral">&quot; new_binary_clauses: &quot;</span> &lt;&lt; num_new_binary</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; &lt;&lt; <span class="stringliteral">&quot; subsumed: &quot;</span> &lt;&lt; num_subsumed &lt;&lt; <span class="stringliteral">&quot; dtime: &quot;</span> &lt;&lt; time_diff</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; &lt;&lt; <span class="stringliteral">&quot; wtime: &quot;</span> &lt;&lt; <a class="code" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>() &lt;&lt; (limit_reached ? <span class="stringliteral">&quot; (Aborted)&quot;</span> : <span class="stringliteral">&quot;&quot;</span>);</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordflow">return</span> sat_solver-&gt;FinishPropagation();</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160;}</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">// namespace sat</span></div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160;} <span class="comment">// namespace operations_research</span></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a865df3eeca0b96bf7fda22b016b80bc2"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2">operations_research::sat::FailedLiteralProbingRound</a></div><div class="ttdeci">bool FailedLiteralProbingRound(ProbingOptions options, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00338">probing.cc:338</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="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_sat_solver_html_a5ca47674a4a0b5e7f40eb430ab474440"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">operations_research::sat::SatSolver::SetAssumptionLevel</a></div><div class="ttdeci">void SetAssumptionLevel(int assumption_level)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00957">sat_solver.cc:957</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#l00181">sat_solver.h:181</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_binary_implication_graph_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">operations_research::sat::BinaryImplicationGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00456">clause.h:456</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="aclassoperations__research_1_1sat_1_1_integer_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00523">integer.h:523</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5bd8c44473618b7eafd33ba978db2f06"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">operations_research::sat::kNoIntegerVariable</a></div><div class="ttdeci">const IntegerVariable kNoIntegerVariable(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae2544d2a3a5ef4c78f8e5891f104ab41"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae2544d2a3a5ef4c78f8e5891f104ab41">operations_research::sat::VariableIsPositive</a></div><div class="ttdeci">bool VariableIsPositive(IntegerVariable i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00130">integer.h:130</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="arouting__search_8cc_html_a204f9b990226e8288e1aaecbb496cbf8"><div class="ttname"><a href="routing__search_8cc.html#a204f9b990226e8288e1aaecbb496cbf8">bound</a></div><div class="ttdeci">int64 bound</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l00972">routing_search.cc:972</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="astructoperations__research_1_1sat_1_1_probing_options_html_a9d4ed6726cbb0ec29c0d62faec4b6405"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">operations_research::sat::ProbingOptions::extract_binary_clauses</a></div><div class="ttdeci">bool extract_binary_clauses</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00124">probing.h:124</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="aclassoperations__research_1_1sat_1_1_sat_propagator_html_a5298758773353d79435345e19a7b3a38"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">operations_research::sat::SatPropagator::PropagatorId</a></div><div class="ttdeci">int PropagatorId() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00452">sat_base.h:452</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html">operations_research::sat::ProbingOptions</a></div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00083">probing.h:83</a></div></div>
<div class="ttc" id="aclassgtl_1_1_i_t_i_vector_html"><div class="ttname"><a href="classgtl_1_1_i_t_i_vector.html">gtl::ITIVector&lt; LiteralIndex, int &gt;</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#l00058">sat_solver.h:58</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_model_random_generator_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_model_random_generator.html">operations_research::sat::ModelRandomGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2util_8h_source.html#l00033">sat/util.h:33</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="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#l00184">sat_solver.h:184</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html_a6c233aafac25ea66d69de93a83c9be63"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">operations_research::sat::IntegerLiteral::GreaterOrEqual</a></div><div class="ttdeci">static IntegerLiteral GreaterOrEqual(IntegerVariable i, IntegerValue bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01208">integer.h:1208</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html"><div class="ttname"><a href="classoperations__research_1_1_domain.html">operations_research::Domain</a></div><div class="ttdoc">We call domain any subset of Int64 = [kint64min, kint64max].</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00081">sorted_interval_list.h:81</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7f1ac774d4646a83631f8117f4ea03f5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">operations_research::sat::PositiveVariable</a></div><div class="ttdeci">IntegerVariable PositiveVariable(IntegerVariable i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00134">integer.h:134</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="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_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="asat__solver_8h_html"><div class="ttname"><a href="sat__solver_8h.html">sat_solver.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a835826c4c5129b74553042a357a721ff"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">operations_research::Domain::IntersectionWith</a></div><div class="ttdeci">Domain IntersectionWith(const Domain &amp;domain) const</div><div class="ttdoc">Returns the intersection of D and domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00282">sorted_interval_list.cc:282</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="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="asat__base_8h_html"><div class="ttname"><a href="sat__base_8h.html">sat_base.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a1f1de3874966a137f140748498f43e0c"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a1f1de3874966a137f140748498f43e0c">operations_research::Domain::Complement</a></div><div class="ttdeci">Domain Complement() const</div><div class="ttdoc">Returns the set Int64 D.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00245">sorted_interval_list.cc:245</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a4f572c68b7bf3aac70b3f5292398ff7b"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a4f572c68b7bf3aac70b3f5292398ff7b">operations_research::sat::ProbingOptions::deterministic_limit</a></div><div class="ttdeci">double deterministic_limit</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00104">probing.h:104</a></div></div>
<div class="ttc" id="aclause_8h_html"><div class="ttname"><a href="clause_8h.html">clause.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html_a41f798a04019147982b29c576ff9d8b7"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">operations_research::SparseBitset::Set</a></div><div class="ttdeci">void Set(IntegerType index)</div><div class="ttdef"><b>Definition:</b> <a href="bitset_8h_source.html#l00805">bitset.h:805</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#l00258">probing.cc:258</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="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="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="aclassoperations__research_1_1_sparse_bitset_html"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html">operations_research::SparseBitset&lt; LiteralIndex &gt;</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a54320231778412ca00e50eb821c95aa6"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">operations_research::sat::ProbingOptions::log_info</a></div><div class="ttdeci">bool log_info</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00146">probing.h:146</a></div></div>
<div class="ttc" id="acp__model__solver_8cc_html_ace0951799e72ee99fc07d5e509bc7cbf"><div class="ttname"><a href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a></div><div class="ttdeci">WallTimer * wall_timer</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02062">cp_model_solver.cc:2062</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#l02063">cp_model_solver.cc:2063</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html_ab4bc8236a9bfe59526e353800a0f0470"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html#ab4bc8236a9bfe59526e353800a0f0470">operations_research::SparseBitset::SparseClearAll</a></div><div class="ttdeci">void SparseClearAll()</div><div class="ttdef"><b>Definition:</b> <a href="bitset_8h_source.html#l00772">bitset.h:772</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="anamespaceoperations__research_1_1sat_html_a33bff3781b729e27219201cf5a05a140"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a33bff3781b729e27219201cf5a05a140">operations_research::sat::ProbeBooleanVariables</a></div><div class="ttdeci">bool ProbeBooleanVariables(const double deterministic_time_limit, Model *model, bool log_info)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00030">probing.cc:30</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_watchers_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal_watchers.html">operations_research::sat::LiteralWatchers</a></div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00160">clause.h:160</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1227e67513602591fb959e35c9de66e8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">operations_research::sat::kMaxIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMaxIntegerValue(std::numeric_limits&lt; IntegerValue::ValueType &gt;::max() - 1)</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_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="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="astructoperations__research_1_1sat_1_1_integer_literal_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.html">operations_research::sat::IntegerLiteral</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00153">integer.h:153</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds.html">operations_research::sat::ImpliedBounds</a></div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8h_source.html#l00077">implied_bounds.h:77</a></div></div>
<div class="ttc" id="aimplied__bounds_8h_html"><div class="ttname"><a href="implied__bounds_8h.html">implied_bounds.h</a></div></div>
<div class="ttc" id="aclassgtl_1_1_i_t_i_vector_html_a60304b65bf89363bcc3165d3cde67f86"><div class="ttname"><a href="classgtl_1_1_i_t_i_vector.html#a60304b65bf89363bcc3165d3cde67f86">gtl::ITIVector::size</a></div><div class="ttdeci">size_type size() const</div><div class="ttdef"><b>Definition:</b> <a href="int__type__indexed__vector_8h_source.html#l00146">int_type_indexed_vector.h:146</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#l00195">gurobi_interface.cc:195</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="anamespaceoperations__research_1_1sat_html_a355a62f25cfadeccfb164ab9fb867c81"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">operations_research::sat::kMinIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue)</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="aiterator__adaptors_8h_html"><div class="ttname"><a href="iterator__adaptors_8h.html">iterator_adaptors.h</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a63d303690279f2933007e2dde7f28541"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">operations_research::sat::ProbingOptions::subsume_with_binary_clause</a></div><div class="ttdeci">bool subsume_with_binary_clause</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00143">probing.h:143</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="aclassgtl_1_1_i_t_i_vector_html_a4e3670a285a3642eaa07f66766cffa72"><div class="ttname"><a href="classgtl_1_1_i_t_i_vector.html#a4e3670a285a3642eaa07f66766cffa72">gtl::ITIVector::resize</a></div><div class="ttdeci">void resize(size_type new_size)</div><div class="ttdef"><b>Definition:</b> <a href="int__type__indexed__vector_8h_source.html#l00149">int_type_indexed_vector.h:149</a></div></div>
<div class="ttc" id="aclassgtl_1_1_i_t_i_vector_html_a184fe69018ae421dcf31c964bfe40576"><div class="ttname"><a href="classgtl_1_1_i_t_i_vector.html#a184fe69018ae421dcf31c964bfe40576">gtl::ITIVector::assign</a></div><div class="ttdeci">void assign(size_type n, const value_type &amp;val)</div><div class="ttdef"><b>Definition:</b> <a href="int__type__indexed__vector_8h_source.html#l00130">int_type_indexed_vector.h:130</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a19601d926c1322ba3e11da2a386397dd"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">operations_research::sat::ProbingOptions::use_queue</a></div><div class="ttdeci">bool use_queue</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00137">probing.h:137</a></div></div>
<div class="ttc" id="aoptimization_8cc_html_af63dcc00f2023fdf498e0829e6fb8a6b"><div class="ttname"><a href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a></div><div class="ttdeci">Literal literal</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00084">optimization.cc:84</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aef1ea7e6296a28c0fa0752328d8cb900"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aef1ea7e6296a28c0fa0752328d8cb900">operations_research::sat::RandomizeDecisionHeuristic</a></div><div class="ttdeci">void RandomizeDecisionHeuristic(URBG *random, SatParameters *parameters)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2util_8h_source.html#l00076">sat/util.h:76</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#l00083">sat_solver.h:83</a></div></div>
<div class="ttc" id="ainteger_8h_html"><div class="ttname"><a href="integer_8h.html">integer.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html">operations_research::sat::Trail</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00233">sat_base.h:233</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a935644a2da13a1ac84cb06649b840283"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">operations_research::sat::ProbingOptions::use_tree_look</a></div><div class="ttdeci">bool use_tree_look</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00131">probing.h:131</a></div></div>
<!-- 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="probing_8cc.html">probing.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.8.20 </li>
</ul>
</div>
</body>
</html>