Files
ortools-clone/docs/cpp/cp__model__loader_8cc_source.html
2020-09-01 16:01:06 +02:00

2112 lines
435 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.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: cp_model_loader.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.18 -->
<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('cp__model__loader_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">cp_model_loader.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="cp__model__loader_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="cp__model__loader_8h.html">ortools/sat/cp_model_loader.h</a>&quot;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &lt;set&gt;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;absl/container/flat_hash_map.h&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;absl/container/flat_hash_set.h&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="int__type_8h.html">ortools/base/int_type.h</a>&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="int__type__indexed__vector_8h.html">ortools/base/int_type_indexed_vector.h</a>&quot;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="map__util_8h.html">ortools/base/map_util.h</a>&quot;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="all__different_8h.html">ortools/sat/all_different.h</a>&quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="circuit_8h.html">ortools/sat/circuit.h</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__constraints_8h.html">ortools/sat/cp_constraints.h</a>&quot;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model_8pb_8h.html">ortools/sat/cp_model.pb.h</a>&quot;</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model__utils_8h.html">ortools/sat/cp_model_utils.h</a>&quot;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cumulative_8h.html">ortools/sat/cumulative.h</a>&quot;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="diffn_8h.html">ortools/sat/diffn.h</a>&quot;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="disjunctive_8h.html">ortools/sat/disjunctive.h</a>&quot;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</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="l00040"></a><span class="lineno"> 40</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="l00041"></a><span class="lineno"> 41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="integer__expr_8h.html">ortools/sat/integer_expr.h</a>&quot;</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="intervals_8h.html">ortools/sat/intervals.h</a>&quot;</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="pb__constraint_8h.html">ortools/sat/pb_constraint.h</a>&quot;</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="precedences_8h.html">ortools/sat/precedences.h</a>&quot;</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</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="l00046"></a><span class="lineno"> 46</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat__parameters_8pb_8h.html">ortools/sat/sat_parameters.pb.h</a>&quot;</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</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="l00048"></a><span class="lineno"> 48</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="table_8h.html">ortools/sat/table.h</a>&quot;</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="saturated__arithmetic_8h.html">ortools/util/saturated_arithmetic.h</a>&quot;</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sorted__interval__list_8h.html">ortools/util/sorted_interval_list.h</a>&quot;</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; </div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Values&gt;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;std::vector&lt;int64&gt; ValuesFromProto(<span class="keyword">const</span> Values&amp; values) {</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">return</span> std::vector&lt;int64&gt;(values.begin(), values.end());</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;}</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; </div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="keywordtype">void</span> ComputeLinearBounds(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>,</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; CpModelMapping* mapping, IntegerTrail* integer_trail,</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a>* sum_min, <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a>* sum_max) {</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; *sum_min = 0;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; *sum_max = 0;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size(); ++i) {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> coeff = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.coeffs(i);</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = mapping-&gt;Integer(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars(i));</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> lb = integer_trail-&gt;LowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).value();</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> ub = integer_trail-&gt;UpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).value();</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span> (coeff &gt;= 0) {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; (*sum_min) += coeff * lb;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; (*sum_max) += coeff * ub;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; (*sum_min) += coeff * ub;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; (*sum_max) += coeff * lb;</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; }</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; }</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;}</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="comment">// We check if the constraint is a sum(ax * xi) == value.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="keywordtype">bool</span> ConstraintIsEq(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>) {</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain_size() == 2 &amp;&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain(0) == <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain(1);</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;}</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment">// We check if the constraint is a sum(ax * xi) != value.</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="keywordtype">bool</span> ConstraintIsNEq(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>,</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; CpModelMapping* mapping, IntegerTrail* integer_trail,</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a>* single_value) {</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> sum_min = 0;</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> sum_max = 0;</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; ComputeLinearBounds(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>, mapping, integer_trail, &amp;sum_min, &amp;sum_max);</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">const</span> Domain complement =</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; Domain(sum_min, sum_max)</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; .IntersectionWith(<a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>).Complement());</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">if</span> (complement.IsEmpty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = complement.Min();</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (complement.Size() == 1) {</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">if</span> (single_value != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; *single_value = <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>;</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; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; }</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;}</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; </div>
<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1CpModelMapping.html#af7e0a5f102c8809cfc9c9e515c1d9118"> 113</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#af7e0a5f102c8809cfc9c9e515c1d9118">CpModelMapping::CreateVariables</a>(<span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordtype">bool</span> view_all_booleans_as_integers,</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_proto_variables = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables_size();</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// All [0, 1] variables always have a corresponding Boolean, even if it is</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="comment">// fixed to 0 (domain == [0,0]) or fixed to 1 (domain == [1,1]).</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; {</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; CHECK_EQ(sat_solver-&gt;NumVariables(), 0);</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; BooleanVariable new_var(0);</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; std::vector&lt;BooleanVariable&gt; false_variables;</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; std::vector&lt;BooleanVariable&gt; true_variables;</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; booleans_.resize(num_proto_variables, <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; reverse_boolean_map_.<a class="code" href="classgtl_1_1ITIVector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(num_proto_variables, -1);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; domain = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables(i).domain();</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">if</span> (domain.size() != 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">if</span> (domain[0] &gt;= 0 &amp;&amp; domain[1] &lt;= 1) {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; booleans_[i] = new_var;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; reverse_boolean_map_[new_var] = i;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span> (domain[1] == 0) {</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; false_variables.push_back(new_var);</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (domain[0] == 1) {</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; true_variables.push_back(new_var);</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; }</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; ++new_var;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</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; sat_solver-&gt;SetNumVariables(new_var.value());</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : true_variables) {</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>({<a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>)}));</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; }</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : false_variables) {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>({<a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>)}));</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; }</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// Compute the list of positive variable reference for which we need to</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// create an IntegerVariable.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; std::vector&lt;int&gt; var_to_instantiate_as_integer;</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">if</span> (view_all_booleans_as_integers) {</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; var_to_instantiate_as_integer.resize(num_proto_variables);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; var_to_instantiate_as_integer[i] = i;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="comment">// Compute the integer variable references used by the model.</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; absl::flat_hash_set&lt;int&gt; used_variables;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1IndexReferences.html">IndexReferences</a> refs;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints_size(); ++c) {</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints(c);</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; refs = <a class="code" href="namespaceoperations__research_1_1sat.html#aba8e3465fc58d3b287e05451d5230bae">GetReferencesUsedByConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : refs.<a class="code" href="structoperations__research_1_1sat_1_1IndexReferences.html#a0821f58cb944376b1f8919327f202443">variables</a>) {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; used_variables.insert(<a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref));</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; }</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; }</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// Add the objectives and search heuristics variables that needs to be</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="comment">// referenceable as integer even if they are only used as Booleans.</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.has_objective()) {</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> obj_var : <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.objective().vars()) {</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; used_variables.insert(<a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(obj_var));</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> DecisionStrategyProto&amp; strategy :</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.search_strategy()) {</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : strategy.variables()) {</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; used_variables.insert(<a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; }</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; }</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// Make sure any unused variable, that is not already a Boolean is</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// considered &quot;used&quot;.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">if</span> (booleans_[i] == <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) {</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; used_variables.insert(i);</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; }</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; }</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// We want the variable in the problem order.</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; var_to_instantiate_as_integer.assign(used_variables.begin(),</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; used_variables.end());</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;var_to_instantiate_as_integer);</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; integers_.resize(num_proto_variables, <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</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="keyword">auto</span>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#a267d05a02fdcc9439a5a54bf9f0ccd3c">ReserveSpaceForNumVariables</a>(</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; var_to_instantiate_as_integer.size());</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; reverse_integer_map_.<a class="code" href="classgtl_1_1ITIVector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(2 * var_to_instantiate_as_integer.size(), -1);</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> i : var_to_instantiate_as_integer) {</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; var_proto = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables(i);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; integers_[i] =</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; integer_trail-&gt;AddIntegerVariable(<a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(var_proto));</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; DCHECK_LT(integers_[i], reverse_integer_map_.<a class="code" href="classgtl_1_1ITIVector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>());</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; reverse_integer_map_[integers_[i]] = i;</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="keyword">auto</span>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">// Link any variable that has both views.</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">if</span> (integers_[i] == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">if</span> (booleans_[i] == <a class="code" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; </div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="comment">// Associate with corresponding integer variable.</span></div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html#a5d4a4c93f937463d529aabb222804816">AssociateToIntegerEqualValue</a>(<a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a>(booleans_[i], <span class="keyword">true</span>),</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; integers_[i], IntegerValue(1));</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; <span class="comment">// Create the interval variables.</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; intervals_.resize(<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints_size(), <a class="code" href="namespaceoperations__research_1_1sat.html#a5dcbeecb5d63f15f9f4c79c2ffa08777">kNoIntervalVariable</a>);</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints_size(); ++c) {</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints(c);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != ConstraintProto::ConstraintCase::kInterval) {</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; }</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a> enforcement_literal =</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a922026cbae3cd7aac276fcad53bd4278">Literal</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal(0));</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// TODO(user): Fix the constant variable situation. An optional interval</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="comment">// with constant start/end or size cannot share the same constant</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="comment">// variable if it is used in non-optional situation.</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; intervals_[c] = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3460e93c00f161146120fa1d3afa6757">NewOptionalInterval</a>(</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().start()), <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().end()),</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().size()), enforcement_literal));</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; intervals_[c] = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a5e73a3f1991b59b82c0305c56add5b2b">NewInterval</a>(<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().start()),</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().end()),</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().size())));</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; already_loaded_ct_.insert(&amp;<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; }</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;}</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; </div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160;<span class="comment">// The logic assumes that the linear constraints have been presolved, so that</span></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;<span class="comment">// equality with a domain bound have been converted to &lt;= or &gt;= and so that we</span></div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;<span class="comment">// never have any trivial inequalities.</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;<span class="comment">// TODO(user): Regroup/presolve two encoding like b =&gt; x &gt; 2 and the same</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;<span class="comment">// Boolean b =&gt; x &gt; 5. These shouldn&#39;t happen if we merge linear constraints.</span></div>
<div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1CpModelMapping.html#ad78bf6fcea4b54f750e2457e47b4f46a"> 259</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#ad78bf6fcea4b54f750e2457e47b4f46a">CpModelMapping::ExtractEncoding</a>(<span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">auto</span>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; </div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// TODO(user): Debug what makes it unsat at this point.</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; </div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="comment">// Detection of literal equivalent to (i_var == value). We collect all the</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// half-reified constraint lit =&gt; equality or lit =&gt; inequality for a given</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// variable, and we will later sort them to detect equivalence.</span></div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keyword">struct </span>EqualityDetectionHelper {</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keyword">const</span> ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordtype">bool</span> is_equality; <span class="comment">// false if != instead.</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> EqualityDetectionHelper&amp; o)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() == o.literal.Variable()) {</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> == o.value) <span class="keywordflow">return</span> is_equality &amp;&amp; !o.is_equality;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">return</span> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> &lt; o.value;</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="keywordflow">return</span> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() &lt; o.literal.Variable();</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; }</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; };</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; std::vector&lt;std::vector&lt;EqualityDetectionHelper&gt;&gt; var_to_equalities(</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables_size());</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; </div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// TODO(user): We will re-add the same implied bounds during probing, so</span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// it might not be necessary to do that here. Also, it might be too early</span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">// if some of the literal view used in the LP are created later, but that</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="comment">// should be fixable via calls to implied_bounds-&gt;NotifyNewIntegerView().</span></div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keyword">auto</span>* implied_bounds = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1ImpliedBounds.html">ImpliedBounds</a>&gt;();</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; </div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="comment">// Detection of literal equivalent to (i_var &gt;= bound). We also collect</span></div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// all the half-refied part and we will sort the vector for detection of the</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// equivalence.</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">struct </span>InequalityDetectionHelper {</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">const</span> ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>;</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1IntegerLiteral.html">IntegerLiteral</a> i_lit;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; </div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> InequalityDetectionHelper&amp; o)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() == o.literal.Variable()) {</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">return</span> i_lit.<a class="code" href="structoperations__research_1_1sat_1_1IntegerLiteral.html#ab6516f556b715738034b30d290c40214">var</a> &lt; o.i_lit.var;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; }</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">return</span> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() &lt; o.literal.Variable();</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; }</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; std::vector&lt;InequalityDetectionHelper&gt; inequalities;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; </div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="comment">// Loop over all contraints and fill var_to_equalities and inequalities.</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> : <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints()) {</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != ConstraintProto::ConstraintCase::kLinear) {</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().size() != 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() != 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; </div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="comment">// ct is a linear constraint with one term and one enforcement literal.</span></div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">sat::Literal</a> enforcement_literal = <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a922026cbae3cd7aac276fcad53bd4278">Literal</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal(0));</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> ref = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(0);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref);</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="keyword">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> domain = <a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> domain_if_enforced =</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear())</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; .<a class="code" href="classoperations__research_1_1Domain.html#a3ee4169fd7956b77331450d8c7f16bfa">InverseMultiplicationBy</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(0) *</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; (<a class="code" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(ref) ? 1 : -1));</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; </div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Detect enforcement_literal =&gt; (var &gt;= value or var &lt;= value).</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">if</span> (domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a3dcbf23ccbed61ee64ec08a934f57a9c">NumIntervals</a>() == 1) {</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>() &gt;= domain.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>() &amp;&amp;</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() &gt; domain.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>()) {</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; inequalities.push_back(</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; {&amp;<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal,</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1IntegerLiteral.html#a6c233aafac25ea66d69de93a83c9be63">IntegerLiteral::GreaterOrEqual</a>(</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), IntegerValue(domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>()))});</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; implied_bounds-&gt;Add(enforcement_literal, inequalities.back().i_lit);</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() &lt;= domain.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() &amp;&amp;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>() &lt; domain.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>()) {</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; inequalities.push_back(</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; {&amp;<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal,</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1IntegerLiteral.html#a3e2eb445631727dd4abf1d5343f16b2f">IntegerLiteral::LowerOrEqual</a>(</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), IntegerValue(domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>()))});</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; implied_bounds-&gt;Add(enforcement_literal, inequalities.back().i_lit);</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; }</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; </div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// Detect enforcement_literal =&gt; (var == value or var != value).</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="comment">// Note that for domain with 2 values like [0, 1], we will detect both ==</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// 0 and != 1. Similarly, for a domain in [min, max], we should both</span></div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="comment">// detect (== min) and (&lt;= min), and both detect (== max) and (&gt;= max).</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">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> inter = domain.<a class="code" href="classoperations__research_1_1Domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(domain_if_enforced);</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (!inter.<a class="code" href="classoperations__research_1_1Domain.html#a8e12342fc420701fbffd97025421575a">IsEmpty</a>() &amp;&amp; inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() == inter.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>()) {</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; var_to_equalities[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].push_back(</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; {&amp;<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal, inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>(), <span class="keyword">true</span>});</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">if</span> (domain.<a class="code" href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">Contains</a>(inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>())) {</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; variables_to_encoded_values_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].insert(inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>());</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; }</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; }</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; {</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> inter =</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; domain.<a class="code" href="classoperations__research_1_1Domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(domain_if_enforced.<a class="code" href="classoperations__research_1_1Domain.html#a1f1de3874966a137f140748498f43e0c">Complement</a>());</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">if</span> (!inter.<a class="code" href="classoperations__research_1_1Domain.html#a8e12342fc420701fbffd97025421575a">IsEmpty</a>() &amp;&amp; inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() == inter.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>()) {</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; var_to_equalities[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].push_back(</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; {&amp;<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal, inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>(), <span class="keyword">false</span>});</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">if</span> (domain.<a class="code" href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">Contains</a>(inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>())) {</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; variables_to_encoded_values_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].insert(inter.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>());</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; }</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</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; </div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="comment">// Detect Literal &lt;=&gt; X &gt;= value</span></div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordtype">int</span> num_inequalities = 0;</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; std::sort(inequalities.begin(), inequalities.end());</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i + 1 &lt; inequalities.size(); i++) {</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">if</span> (inequalities[i].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> != inequalities[i + 1].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Negated()) {</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; }</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; </div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="comment">// TODO(user): In these cases, we could fix the enforcement literal right</span></div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="comment">// away or ignore the constraint. Note that it will be done later anyway</span></div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// though.</span></div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;IntegerLiteralIsTrue(inequalities[i].i_lit) ||</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; integer_trail-&gt;IntegerLiteralIsFalse(inequalities[i].i_lit)) {</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; }</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;IntegerLiteralIsTrue(inequalities[i + 1].i_lit) ||</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; integer_trail-&gt;IntegerLiteralIsFalse(inequalities[i + 1].i_lit)) {</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; }</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; </div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> pair_a = encoder-&gt;Canonicalize(inequalities[i].i_lit);</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> pair_b = encoder-&gt;Canonicalize(inequalities[i + 1].i_lit);</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordflow">if</span> (pair_a.first == pair_b.second) {</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; ++num_inequalities;</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; encoder-&gt;AssociateToIntegerLiteral(inequalities[i].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>,</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; inequalities[i].i_lit);</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; already_loaded_ct_.insert(inequalities[i].<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; already_loaded_ct_.insert(inequalities[i + 1].<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; }</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; }</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; </div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="comment">// Encode the half-inequalities.</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordtype">int</span> num_half_inequalities = 0;</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> inequality : inequalities) {</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a66ee25333b0b64292cfa8731c4d4f5eb">ConstraintIsAlreadyLoaded</a>(inequality.ct)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a8a0620c105ec05f1b42bcde3a9380872">Implication</a>(inequality.literal,</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; encoder-&gt;GetOrCreateAssociatedLiteral(inequality.i_lit)));</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; </div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; ++num_half_inequalities;</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; already_loaded_ct_.insert(inequality.ct);</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; is_half_encoding_ct_.insert(inequality.ct);</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; }</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; </div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">if</span> (!inequalities.empty()) {</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; VLOG(1) &lt;&lt; num_inequalities &lt;&lt; <span class="stringliteral">&quot; literals associated to VAR &gt;= value, and &quot;</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; &lt;&lt; num_half_inequalities &lt;&lt; <span class="stringliteral">&quot; half-associations.&quot;</span>;</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; }</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; </div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// Detect Literal &lt;=&gt; X == value and associate them in the IntegerEncoder.</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// TODO(user): Fully encode variable that are almost fully encoded?</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keywordtype">int</span> num_constraints = 0;</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keywordtype">int</span> num_equalities = 0;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordtype">int</span> num_half_equalities = 0;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordtype">int</span> num_fully_encoded = 0;</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="keywordtype">int</span> num_partially_encoded = 0;</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; var_to_equalities.size(); ++i) {</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; std::vector&lt;EqualityDetectionHelper&gt;&amp; encoding = var_to_equalities[i];</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; std::sort(encoding.begin(), encoding.end());</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">if</span> (encoding.empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; num_constraints += encoding.size();</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; </div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; absl::flat_hash_set&lt;int64&gt; values;</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j + 1 &lt; encoding.size(); j++) {</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">if</span> ((encoding[j].<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> != encoding[j + 1].<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>) ||</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; (encoding[j].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> != encoding[j + 1].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Negated()) ||</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; (encoding[j].is_equality != <span class="keyword">true</span>) ||</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; (encoding[j + 1].is_equality != <span class="keyword">false</span>)) {</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">continue</span>;</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; </div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; ++num_equalities;</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; encoder-&gt;AssociateToIntegerEqualValue(encoding[j].<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>, integers_[i],</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; IntegerValue(encoding[j].<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>));</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; already_loaded_ct_.insert(encoding[j].<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; already_loaded_ct_.insert(encoding[j + 1].<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; values.insert(encoding[j].<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; </div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// TODO(user): Try to remove it. Normally we caught UNSAT above, but</span></div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="comment">// tests are very flaky (it only happens in parallel). Keeping it there for</span></div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// the time being.</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; </div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="comment">// Encode the half-equalities.</span></div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="comment">// TODO(user): delay this after PropagateEncodingFromEquivalenceRelations()?</span></div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="comment">// Otherwise we might create new Boolean variables for no reason. Note</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="comment">// however, that in the presolve, we should only use the &quot;representative&quot; in</span></div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">// linear constraints, so we should be fine.</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> equality : encoding) {</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a66ee25333b0b64292cfa8731c4d4f5eb">ConstraintIsAlreadyLoaded</a>(equality.ct)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keyword">const</span> <span class="keyword">class </span><a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> eq = encoder-&gt;GetOrCreateLiteralAssociatedToEquality(</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; integers_[i], IntegerValue(equality.value));</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">if</span> (equality.is_equality) {</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a8a0620c105ec05f1b42bcde3a9380872">Implication</a>(equality.literal, eq));</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a8a0620c105ec05f1b42bcde3a9380872">Implication</a>(equality.literal, eq.<a class="code" href="classoperations__research_1_1sat_1_1Literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; }</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; </div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; ++num_half_equalities;</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; already_loaded_ct_.insert(equality.ct);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; is_half_encoding_ct_.insert(equality.ct);</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; }</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; </div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// Update stats.</span></div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">if</span> (VLOG_IS_ON(1)) {</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">if</span> (encoder-&gt;VariableIsFullyEncoded(integers_[i])) {</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; ++num_fully_encoded;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; ++num_partially_encoded;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</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="keywordflow">if</span> (num_constraints &gt; 0) {</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; VLOG(1) &lt;&lt; num_equalities &lt;&lt; <span class="stringliteral">&quot; literals associated to VAR == value, and &quot;</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; &lt;&lt; num_half_equalities &lt;&lt; <span class="stringliteral">&quot; half-associations.&quot;</span>;</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; }</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keywordflow">if</span> (num_fully_encoded &gt; 0) {</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;num_fully_encoded_variables: &quot;</span> &lt;&lt; num_fully_encoded;</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; }</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="keywordflow">if</span> (num_partially_encoded &gt; 0) {</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;num_partially_encoded_variables: &quot;</span> &lt;&lt; num_partially_encoded;</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; }</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;}</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; </div>
<div class="line"><a name="l00506"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1CpModelMapping.html#adfbeb7391a9578a4cdba60c46b05e19e"> 506</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#adfbeb7391a9578a4cdba60c46b05e19e">CpModelMapping::PropagateEncodingFromEquivalenceRelations</a>(</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keyword">auto</span>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; </div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// Loop over all contraints and find affine ones.</span></div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_associations = 0;</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_set_to_false = 0;</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> : <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints()) {</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != ConstraintProto::kLinear) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() != 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (!ConstraintIsEq(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear())) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; </div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keyword">const</span> IntegerValue rhs(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0));</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; <span class="comment">// Make sure the coefficient are positive.</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; IntegerVariable var1 = <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(0));</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; IntegerVariable var2 = <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(1));</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; IntegerValue coeff1(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(0));</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; IntegerValue coeff2(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(1));</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">if</span> (coeff1 &lt; 0) {</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; var1 = <a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(var1);</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; coeff1 = -coeff1;</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">if</span> (coeff2 &lt; 0) {</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; var2 = <a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(var2);</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; coeff2 = -coeff2;</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; }</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; </div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="comment">// TODO(user): This is not supposed to happen, but apparently it did on</span></div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="comment">// once on routing_GCM_0001_sat.fzn. Investigate and fix.</span></div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keywordflow">if</span> (coeff1 == 0 || coeff2 == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; </div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="comment">// We first map the &gt;= literals.</span></div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="comment">// It is important to do that first, since otherwise mapping a == literal</span></div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="comment">// might creates the underlying &gt;= and &lt;= literals.</span></div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 2; ++i) {</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal :</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; encoder-&gt;PartialGreaterThanEncoding(var1)) {</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keyword">const</span> IntegerValue value1 = value_literal.first;</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keyword">const</span> IntegerValue bound2 = <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(rhs - value1 * coeff1, coeff2);</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; ++num_associations;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; encoder-&gt;AssociateToIntegerLiteral(</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; value_literal.second, <a class="code" href="structoperations__research_1_1sat_1_1IntegerLiteral.html#a3e2eb445631727dd4abf1d5343f16b2f">IntegerLiteral::LowerOrEqual</a>(var2, bound2));</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; }</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; std::swap(var1, var2);</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; std::swap(coeff1, coeff2);</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; <span class="comment">// Same for the == literals.</span></div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">// TODO(user): This is similar to LoadEquivalenceAC() for unreified</span></div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="comment">// constraints, but when the later is called, more encoding might have taken</span></div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="comment">// place.</span></div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 2; ++i) {</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : encoder-&gt;PartialDomainEncoding(var1)) {</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keyword">const</span> IntegerValue value1 = value_literal.value;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keyword">const</span> IntegerValue intermediate = rhs - value1 * coeff1;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keywordflow">if</span> (intermediate % coeff2 != 0) {</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">// Using this function deals properly with UNSAT.</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; ++num_set_to_false;</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; sat_solver-&gt;AddUnitClause(value_literal.literal.Negated());</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; }</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; ++num_associations;</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html#a5d4a4c93f937463d529aabb222804816">AssociateToIntegerEqualValue</a>(value_literal.literal, var2,</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; intermediate / coeff2);</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; }</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; std::swap(var1, var2);</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; std::swap(coeff1, coeff2);</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; }</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; </div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">if</span> (num_associations &gt; 0) {</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;Num associations from equivalences = &quot;</span> &lt;&lt; num_associations;</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; }</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keywordflow">if</span> (num_set_to_false &gt; 0) {</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;Num literals set to false from equivalences = &quot;</span></div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; &lt;&lt; num_set_to_false;</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; }</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160;}</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"><a class="line" href="classoperations__research_1_1sat_1_1CpModelMapping.html#aa3361a48335b9de95fcefa9dc5dc3e22"> 589</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#aa3361a48335b9de95fcefa9dc5dc3e22">CpModelMapping::DetectOptionalVariables</a>(<span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keyword">const</span> SatParameters&amp; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a> = *(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;SatParameters&gt;());</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.use_optional_variables()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.enumerate_all_solutions()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; </div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="comment">// The variables from the objective cannot be marked as optional!</span></div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_proto_variables = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables_size();</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; std::vector&lt;bool&gt; already_seen(num_proto_variables, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.has_objective()) {</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.objective().vars()) {</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; already_seen[<a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref)] = <span class="keyword">true</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; </div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <span class="comment">// Compute for each variables the intersection of the enforcement literals</span></div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <span class="comment">// of the constraints in which they appear.</span></div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="comment">// TODO(user): This deals with the simplest cases, but we could try to</span></div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="comment">// detect literals that implies all the constaints in which a variable</span></div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="comment">// appear to false. This can be done with a LCA computation in the tree of</span></div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="comment">// Boolean implication (once the presolve remove cycles). Not sure if we can</span></div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="comment">// properly exploit that afterwards though. Do some research!</span></div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; std::vector&lt;std::vector&lt;int&gt;&gt; enforcement_intersection(num_proto_variables);</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; std::set&lt;int&gt; literals_set;</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints_size(); ++c) {</div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.constraints(c);</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().empty()) {</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : <a class="code" href="namespaceoperations__research_1_1sat.html#a1d467595ed8fe5b85dc95328ee1c2770">UsedVariables</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; already_seen[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; enforcement_intersection[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].clear();</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; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; literals_set.clear();</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; literals_set.insert(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().begin(),</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().end());</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : <a class="code" href="namespaceoperations__research_1_1sat.html#a1d467595ed8fe5b85dc95328ee1c2770">UsedVariables</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (!already_seen[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>]) {</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; enforcement_intersection[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].assign(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().begin(),</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().end());</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="comment">// Take the intersection.</span></div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; std::vector&lt;int&gt;&amp; vector_ref = enforcement_intersection[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : vector_ref) {</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(literals_set, <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>)) {</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; vector_ref[new_size++] = <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; }</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; }</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; vector_ref.resize(new_size);</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; }</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; already_seen[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; }</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="comment">// Auto-detect optional variables.</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="keywordtype">int</span> num_optionals = 0;</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = 0; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_proto_variables; ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keyword">const</span> IntegerVariableProto&amp; var_proto = <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.variables(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a> = var_proto.domain(0);</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a> = var_proto.domain(var_proto.domain().size() - 1);</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a> == <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a> == 0 &amp;&amp; <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a> == 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="keywordflow">if</span> (enforcement_intersection[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; </div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; ++num_optionals;</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; integer_trail-&gt;MarkIntegerVariableAsOptional(</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a922026cbae3cd7aac276fcad53bd4278">Literal</a>(enforcement_intersection[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].front()));</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; }</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; VLOG(2) &lt;&lt; <span class="stringliteral">&quot;Auto-detected &quot;</span> &lt;&lt; num_optionals &lt;&lt; <span class="stringliteral">&quot; optional variables.&quot;</span>;</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;}</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; </div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160;<span class="comment">// ============================================================================</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160;<span class="comment">// A class that detects when variables should be fully encoded by computing a</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160;<span class="comment">// fixed point. It also fully encodes such variables.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160;<span class="comment">// ============================================================================</span></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"><a class="line" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html"> 668</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html">FullEncodingFixedPointComputer</a> {</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00670"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a32d32af5ccf5a40ab7e994094624153a"> 670</a></span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a32d32af5ccf5a40ab7e994094624153a">FullEncodingFixedPointComputer</a>(<span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>)</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; : model_proto_(<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>),</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; parameters_(*(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;SatParameters&gt;())),</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; model_(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; mapping_(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;()),</div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; integer_encoder_(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;()),</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; integer_trail_(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;()) {}</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; </div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a5197d1ff3e016ded015f19cda50c6f13">ComputeFixedPoint</a>();</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; </div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; DEFINE_INT_TYPE(ConstraintIndex, <a class="code" href="integral__types_8h.html#a56f1a81c92849566ae864511088eb7e8">int32</a>);</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; </div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="comment">// Constraint ct is interested by (full-encoding) state of variable.</span></div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keywordtype">void</span> Register(ConstraintIndex ct_index, <span class="keywordtype">int</span> variable) {</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; variable = <a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(variable);</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; constraint_is_registered_[ct_index] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keywordflow">if</span> (variable_watchers_.size() &lt;= variable) {</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; variable_watchers_.resize(variable + 1);</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; variable_was_added_in_to_propagate_.resize(variable + 1);</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; }</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; variable_watchers_[variable].push_back(ct_index);</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; <span class="keywordtype">void</span> AddVariableToPropagationQueue(<span class="keywordtype">int</span> variable) {</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; variable = <a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(variable);</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keywordflow">if</span> (variable_was_added_in_to_propagate_.size() &lt;= variable) {</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; variable_watchers_.resize(variable + 1);</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; variable_was_added_in_to_propagate_.resize(variable + 1);</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; }</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">if</span> (!variable_was_added_in_to_propagate_[variable]) {</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; variable_was_added_in_to_propagate_[variable] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; variables_to_propagate_.push_back(variable);</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; </div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="comment">// Note that we always consider a fixed variable to be fully encoded here.</span></div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> IsFullyEncoded(<span class="keywordtype">int</span> v) {</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="keyword">const</span> IntegerVariable variable = mapping_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(v);</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keywordflow">if</span> (v == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">return</span> integer_trail_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#a523501d854b2ca8034d37c15e7c89117">IsFixed</a>(variable) ||</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; integer_encoder_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html#ac9e262bbda19ec4b7d51bd77b70bb363">VariableIsFullyEncoded</a>(variable);</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; </div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> VariableIsFixed(<span class="keywordtype">int</span> v) {</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keyword">const</span> IntegerVariable variable = mapping_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(v);</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="keywordflow">if</span> (v == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keywordflow">return</span> integer_trail_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#a523501d854b2ca8034d37c15e7c89117">IsFixed</a>(variable);</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; }</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; </div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keywordtype">void</span> FullyEncode(<span class="keywordtype">int</span> v) {</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; v = <a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(v);</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="keyword">const</span> IntegerVariable variable = mapping_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(v);</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">if</span> (v == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <span class="keywordflow">if</span> (!integer_trail_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#a523501d854b2ca8034d37c15e7c89117">IsFixed</a>(variable)) {</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; model_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(variable));</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; }</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; AddVariableToPropagationQueue(v);</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; }</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; </div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordtype">bool</span> ProcessConstraint(ConstraintIndex ct_index);</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <span class="keywordtype">bool</span> ProcessElement(ConstraintIndex ct_index);</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="keywordtype">bool</span> ProcessTable(ConstraintIndex ct_index);</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keywordtype">bool</span> ProcessAutomaton(ConstraintIndex ct_index);</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordtype">bool</span> ProcessLinear(ConstraintIndex ct_index);</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; </div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keyword">const</span> CpModelProto&amp; model_proto_;</div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keyword">const</span> SatParameters&amp; parameters_;</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; </div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; Model* model_;</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; CpModelMapping* mapping_;</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; IntegerEncoder* integer_encoder_;</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; IntegerTrail* integer_trail_;</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; </div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; std::vector&lt;bool&gt; variable_was_added_in_to_propagate_;</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; std::vector&lt;int&gt; variables_to_propagate_;</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; std::vector&lt;std::vector&lt;ConstraintIndex&gt;&gt; variable_watchers_;</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; </div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <a class="code" href="classgtl_1_1ITIVector.html">gtl::ITIVector&lt;ConstraintIndex, bool&gt;</a> constraint_is_finished_;</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <a class="code" href="classgtl_1_1ITIVector.html">gtl::ITIVector&lt;ConstraintIndex, bool&gt;</a> constraint_is_registered_;</div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; </div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; absl::flat_hash_map&lt;int, absl::flat_hash_set&lt;int&gt;&gt;</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; variables_to_equal_or_diff_variables_;</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160;};</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; </div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160;<span class="comment">// We only add to the propagation queue variable that are fully encoded.</span></div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160;<span class="comment">// Note that if a variable was already added once, we never add it again.</span></div>
<div class="line"><a name="l00757"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a5197d1ff3e016ded015f19cda50c6f13"> 757</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a5197d1ff3e016ded015f19cda50c6f13">FullEncodingFixedPointComputer::ComputeFixedPoint</a>() {</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_constraints = model_proto_.constraints_size();</div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = model_proto_.variables_size();</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; constraint_is_finished_.<a class="code" href="classgtl_1_1ITIVector.html#a184fe69018ae421dcf31c964bfe40576">assign</a>(num_constraints, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; constraint_is_registered_.<a class="code" href="classgtl_1_1ITIVector.html#a184fe69018ae421dcf31c964bfe40576">assign</a>(num_constraints, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; </div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="comment">// Process all constraint once.</span></div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="keywordflow">for</span> (ConstraintIndex ct_index(0); ct_index &lt; num_constraints; ++ct_index) {</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; constraint_is_finished_[ct_index] = ProcessConstraint(ct_index);</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; }</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; </div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="comment">// We run a heuristics to decide if we want to fully encode a variable or not.</span></div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="comment">// We decide to fully encode a variable if:</span></div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="comment">// - a variable appears in enough a1 * x1 + a2 + x2 ==/!= value and the</span></div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="comment">// domain is small.</span></div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="comment">// - the number of values that appears in b =&gt; x ==/!= value that are not</span></div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="comment">// the bounds of the variables is more that half the size of the domain.</span></div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="comment">// . - the size of the domain is &gt; 2</span></div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; <span class="keywordtype">int</span> num_variables_fully_encoded_by_heuristics = 0;</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = 0; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_vars; ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; <span class="keywordflow">if</span> (!mapping_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a4c46b216006440e76f16d33797123b3b">IsInteger</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) || IsFullyEncoded(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keyword">const</span> IntegerVariableProto&amp; int_var_proto = model_proto_.variables(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> domain = <a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(int_var_proto);</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> domain_size = domain.<a class="code" href="classoperations__research_1_1Domain.html#a354dd8c252cf59b748602b342db6019d">Size</a>();</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_diff_or_equal_var_constraints = 0;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> num_potential_encoded_values_without_bounds = 0;</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; </div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordflow">if</span> (domain_size &lt;= 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; </div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="keyword">const</span> absl::flat_hash_set&lt;int64&gt;&amp; value_set =</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; mapping_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#ad67b08fb6b8be443da8c4427d3e83a77">PotentialEncodedValues</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> : value_set) {</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> &gt; domain.<a class="code" href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">Min</a>() &amp;&amp; <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> &lt; domain.<a class="code" href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">Max</a>() &amp;&amp;</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; domain.<a class="code" href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">Contains</a>(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)) {</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; num_potential_encoded_values_without_bounds++;</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; }</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; }</div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; </div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; it = variables_to_equal_or_diff_variables_.find(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <span class="keywordflow">if</span> (it != variables_to_equal_or_diff_variables_.end()) {</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; num_diff_or_equal_var_constraints = it-&gt;second.size();</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; }</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; </div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">if</span> (num_potential_encoded_values_without_bounds &gt;= domain_size / 2 ||</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; (num_diff_or_equal_var_constraints &gt;= domain_size / 2 &amp;&amp;</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; domain_size &lt; 16)) {</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; VLOG(3) &lt;&lt; model_proto_.variables(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).ShortDebugString()</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; &lt;&lt; <span class="stringliteral">&quot; is encoded with &quot;</span></div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; &lt;&lt; num_potential_encoded_values_without_bounds</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; &lt;&lt; <span class="stringliteral">&quot; unary constraints, and &quot;</span> &lt;&lt; num_diff_or_equal_var_constraints</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; &lt;&lt; <span class="stringliteral">&quot; binary constraints on a domain of size &quot;</span> &lt;&lt; domain_size;</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; FullyEncode(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; num_variables_fully_encoded_by_heuristics++;</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; }</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; }</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="keywordflow">if</span> (num_variables_fully_encoded_by_heuristics &gt; 0) {</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; VLOG(2) &lt;&lt; num_variables_fully_encoded_by_heuristics</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; &lt;&lt; <span class="stringliteral">&quot; variables fully encoded after model introspection.&quot;</span>;</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; }</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="comment">// Make sure all fully encoded variables of interest are in the queue.</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v &lt; variable_watchers_.size(); v++) {</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordflow">if</span> (!variable_watchers_[v].empty() &amp;&amp; IsFullyEncoded(v)) {</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; AddVariableToPropagationQueue(v);</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; }</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; }</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; </div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="comment">// Loop until no additional variable can be fully encoded.</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="keywordflow">while</span> (!variables_to_propagate_.empty()) {</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> variable = variables_to_propagate_.back();</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; variables_to_propagate_.pop_back();</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ConstraintIndex ct_index : variable_watchers_[variable]) {</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordflow">if</span> (constraint_is_finished_[ct_index]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; constraint_is_finished_[ct_index] = ProcessConstraint(ct_index);</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; }</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; }</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160;}</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; </div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160;<span class="comment">// Returns true if the constraint has finished encoding what it wants.</span></div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160;<span class="keywordtype">bool</span> FullEncodingFixedPointComputer::ProcessConstraint(</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; ConstraintIndex ct_index) {</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = model_proto_.constraints(ct_index.value());</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="keywordflow">switch</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case()) {</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kElement:</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keywordflow">return</span> ProcessElement(ct_index);</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kTable:</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keywordflow">return</span> ProcessTable(ct_index);</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kAutomaton:</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <span class="keywordflow">return</span> ProcessAutomaton(ct_index);</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kLinear:</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keywordflow">return</span> ProcessLinear(ct_index);</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; }</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160;}</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; </div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160;<span class="keywordtype">bool</span> FullEncodingFixedPointComputer::ProcessElement(ConstraintIndex ct_index) {</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = model_proto_.constraints(ct_index.value());</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; </div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="comment">// Index must always be full encoded.</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; FullyEncode(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; </div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target();</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; </div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="comment">// If target is fixed, do not encode variables.</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keywordflow">if</span> (VariableIsFixed(target)) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; </div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <span class="comment">// If target is a constant or fully encoded, variables must be fully encoded.</span></div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <span class="keywordflow">if</span> (IsFullyEncoded(target)) {</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> v : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars()) FullyEncode(v);</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; }</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; </div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="comment">// If all non-target variables are fully encoded, target must be too.</span></div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keywordtype">bool</span> all_variables_are_fully_encoded = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> v : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars()) {</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordflow">if</span> (v == target) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="keywordflow">if</span> (!IsFullyEncoded(v)) {</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; all_variables_are_fully_encoded = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; }</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; }</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; <span class="keywordflow">if</span> (all_variables_are_fully_encoded) {</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keywordflow">if</span> (!IsFullyEncoded(target)) FullyEncode(target);</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; }</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; </div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="comment">// If some variables are not fully encoded, register on those.</span></div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="keywordflow">if</span> (constraint_is_registered_[ct_index]) {</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> v : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars()) Register(ct_index, v);</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; Register(ct_index, target);</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; }</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160;}</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; </div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160;<span class="keywordtype">bool</span> FullEncodingFixedPointComputer::ProcessTable(ConstraintIndex ct_index) {</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = model_proto_.constraints(ct_index.value());</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; </div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.table().negated()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; </div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> variable : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.table().vars()) {</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; FullyEncode(variable);</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; }</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; </div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160;}</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; </div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160;<span class="keywordtype">bool</span> FullEncodingFixedPointComputer::ProcessAutomaton(</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; ConstraintIndex ct_index) {</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = model_proto_.constraints(ct_index.value());</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> variable : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().vars()) {</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; FullyEncode(variable);</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; }</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160;}</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; </div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160;<span class="keywordtype">bool</span> FullEncodingFixedPointComputer::ProcessLinear(ConstraintIndex ct_index) {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="comment">// We are only interested in linear equations of the form:</span></div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="comment">// [b =&gt;] a1 * x1 + a2 * x2 ==|!= value</span></div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = model_proto_.constraints(ct_index.value());</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="keywordflow">if</span> (parameters_.boolean_encoding_level() == 0 ||</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() != 2) {</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; }</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; </div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keywordflow">if</span> (!ConstraintIsEq(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear()) &amp;&amp;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; !ConstraintIsNEq(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear(), mapping_, integer_trail_, <span class="keyword">nullptr</span>)) {</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; }</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; </div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> var0 = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(0);</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> var1 = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(1);</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; <span class="keywordflow">if</span> (!IsFullyEncoded(var0)) {</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; variables_to_equal_or_diff_variables_[var0].insert(var1);</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; }</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <span class="keywordflow">if</span> (!IsFullyEncoded(var1)) {</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; variables_to_equal_or_diff_variables_[var1].insert(var0);</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; }</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160;}</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; </div>
<div class="line"><a name="l00937"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a27da77e2f3fc205f1b3b184db3c9bd77"> 937</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a27da77e2f3fc205f1b3b184db3c9bd77">MaybeFullyEncodeMoreVariables</a>(<span class="keyword">const</span> CpModelProto&amp; <a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html">FullEncodingFixedPointComputer</a> fixpoint(<a class="code" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, m);</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; fixpoint.<a class="code" href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a5197d1ff3e016ded015f19cda50c6f13">ComputeFixedPoint</a>();</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160;}</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; </div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160;<span class="comment">// ============================================================================</span></div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160;<span class="comment">// Constraint loading functions.</span></div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160;<span class="comment">// ============================================================================</span></div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; </div>
<div class="line"><a name="l00946"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328"> 946</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328">LoadBoolOrConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; std::vector&lt;Literal&gt; literals = mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a0f4307fe0ec0a2e2803a15a2f17aa394">Literals</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_or().literals());</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; literals.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; }</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>(literals));</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160;}</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; </div>
<div class="line"><a name="l00955"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8"> 955</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8">LoadBoolAndConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; std::vector&lt;Literal&gt; literals;</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; literals.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; }</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html">SatSolver</a>&gt;();</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_and().literals())) {</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; literals.push_back(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; sat_solver-&gt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html#af67fe279478772a6d1492a7f673bda5d">AddProblemClause</a>(literals);</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; literals.pop_back();</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; }</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160;}</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; </div>
<div class="line"><a name="l00969"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a"> 969</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a">LoadAtMostOneConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; CHECK(!<a class="code" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) &lt;&lt; <span class="stringliteral">&quot;Not supported.&quot;</span>;</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ab8221efb0cc3dd5059674845b4db7fed">AtMostOneConstraint</a>(mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.at_most_one().literals())));</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160;}</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; </div>
<div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f"> 975</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f">LoadBoolXorConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; CHECK(!<a class="code" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) &lt;&lt; <span class="stringliteral">&quot;Not supported.&quot;</span>;</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3784d1f3239b842751828e471e1886c8">LiteralXorIs</a>(mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_xor().literals()), <span class="keyword">true</span>));</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160;}</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; </div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; </div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160;<span class="comment">// Boolean encoding of:</span></div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;<span class="comment">// enforcement_literal =&gt; coeff1 * var1 + coeff2 * var2 == rhs;</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160;<span class="keywordtype">void</span> LoadEquivalenceAC(<span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literal,</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; IntegerValue coeff1, IntegerVariable var1,</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; IntegerValue coeff2, IntegerVariable var2,</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="keyword">const</span> IntegerValue rhs, Model* m) {</div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; <span class="keyword">auto</span>* encoder = m-&gt;GetOrCreate&lt;IntegerEncoder&gt;();</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; CHECK(encoder-&gt;VariableIsFullyEncoded(var1));</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; CHECK(encoder-&gt;VariableIsFullyEncoded(var2));</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; absl::flat_hash_map&lt;IntegerValue, Literal&gt; term1_value_to_literal;</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : encoder-&gt;FullDomainEncoding(var1)) {</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; term1_value_to_literal[coeff1 * value_literal.value] =</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; value_literal.literal;</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; }</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : encoder-&gt;FullDomainEncoding(var2)) {</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keyword">const</span> IntegerValue target = rhs - value_literal.value * coeff2;</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(term1_value_to_literal, target)) {</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; {value_literal.literal.Negated()}));</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <span class="keyword">const</span> Literal target_literal = term1_value_to_literal[target];</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; {value_literal.literal.Negated(), target_literal}));</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; {value_literal.literal, target_literal.Negated()}));</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; </div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; <span class="comment">// This &quot;target&quot; can never be reached again, so it is safe to remove it.</span></div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="comment">// We do that so we know the term1 values that are never reached.</span></div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; term1_value_to_literal.erase(target);</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; }</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; }</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; </div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="comment">// Exclude the values that can never be &quot;matched&quot; by coeff2 * var2.</span></div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="comment">// We need the std::sort() to be deterministic!</span></div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; std::vector&lt;Literal&gt; implied_false;</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> entry : term1_value_to_literal) {</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; implied_false.push_back(entry.second);</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; }</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; std::sort(implied_false.begin(), implied_false.end());</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Literal l : implied_false) {</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">EnforcedClause</a>(enforcement_literal, {l.Negated()}));</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; }</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;}</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; </div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;<span class="comment">// Boolean encoding of:</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;<span class="comment">// enforcement_literal =&gt; coeff1 * var1 + coeff2 * var2 != rhs;</span></div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;<span class="keywordtype">void</span> LoadEquivalenceNeqAC(<span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literal,</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; IntegerValue coeff1, IntegerVariable var1,</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; IntegerValue coeff2, IntegerVariable var2,</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="keyword">const</span> IntegerValue rhs, Model* m) {</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keyword">auto</span>* encoder = m-&gt;GetOrCreate&lt;IntegerEncoder&gt;();</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; CHECK(encoder-&gt;VariableIsFullyEncoded(var1));</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; CHECK(encoder-&gt;VariableIsFullyEncoded(var2));</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; absl::flat_hash_map&lt;IntegerValue, Literal&gt; term1_value_to_literal;</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : encoder-&gt;FullDomainEncoding(var1)) {</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; term1_value_to_literal[coeff1 * value_literal.value] =</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; value_literal.literal;</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; }</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : encoder-&gt;FullDomainEncoding(var2)) {</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; <span class="keyword">const</span> IntegerValue target_value = rhs - value_literal.value * coeff2;</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; it = term1_value_to_literal.find(target_value);</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">if</span> (it != term1_value_to_literal.end()) {</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <span class="keyword">const</span> Literal target_literal = it-&gt;second;</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">EnforcedClause</a>(</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; enforcement_literal,</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; {value_literal.literal.Negated(), target_literal.Negated()}));</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; }</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; }</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;}</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; </div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; </div>
<div class="line"><a name="l01055"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041"> 1055</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041">LoadLinearConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; </div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars().empty()) {</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> rhs = <a class="code" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear());</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="keywordflow">if</span> (rhs.<a class="code" href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">Contains</a>(0)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; std::vector&lt;Literal&gt; clause;</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; clause.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; }</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>(clause));</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;Trivially UNSAT constraint: &quot;</span> &lt;&lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString();</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1SatSolver.html">SatSolver</a>&gt;()-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; }</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; }</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; </div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars());</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; <span class="keyword">const</span> std::vector&lt;int64&gt; coeffs = ValuesFromProto(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs());</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; </div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; <span class="comment">// Compute the min/max to relax the bounds if needed.</span></div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; <span class="comment">// TODO(user): Reuse ComputeLinearBounds()? but then we need another loop</span></div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; <span class="comment">// to detect if we only have Booleans.</span></div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; IntegerValue min_sum(0);</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; IntegerValue max_sum(0);</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; IntegerValue max_domain_size(0);</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordtype">bool</span> all_booleans = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; vars.size(); ++i) {</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="keywordflow">if</span> (all_booleans &amp;&amp; !mapping-&gt;IsBoolean(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(i))) {</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; all_booleans = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; }</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <span class="keyword">const</span> IntegerValue lb = integer_trail-&gt;LowerBound(vars[i]);</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keyword">const</span> IntegerValue ub = integer_trail-&gt;UpperBound(vars[i]);</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; max_domain_size = <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(max_domain_size, ub - lb + 1);</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keyword">const</span> IntegerValue term_a = coeffs[i] * lb;</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <span class="keyword">const</span> IntegerValue term_b = coeffs[i] * ub;</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; min_sum += <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">std::min</a>(term_a, term_b);</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; max_sum += <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(term_a, term_b);</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; }</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; </div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() == 2 &amp;&amp; !integer_trail-&gt;IsFixed(vars[0]) &amp;&amp;</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; !integer_trail-&gt;IsFixed(vars[1]) &amp;&amp; max_domain_size &lt; 16) {</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <span class="keyword">const</span> SatParameters&amp; params = *m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;SatParameters&gt;();</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="keyword">auto</span>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; <span class="keywordflow">if</span> (params.boolean_encoding_level() &gt; 0 &amp;&amp; ConstraintIsEq(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear()) &amp;&amp;</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0) != min_sum &amp;&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0) != max_sum &amp;&amp;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; encoder-&gt;VariableIsFullyEncoded(vars[0]) &amp;&amp;</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; encoder-&gt;VariableIsFullyEncoded(vars[1])) {</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; VLOG(3) &lt;&lt; <span class="stringliteral">&quot;Load AC version of &quot;</span> &lt;&lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString() &lt;&lt; <span class="stringliteral">&quot;, var0 domain = &quot;</span></div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[0])</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, var1 domain = &quot;</span></div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[1]);</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">return</span> LoadEquivalenceAC(mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()),</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; IntegerValue(coeffs[0]), vars[0],</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; IntegerValue(coeffs[1]), vars[1],</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; IntegerValue(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0)), m);</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; }</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; </div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> single_value = 0;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; <span class="keywordflow">if</span> (params.boolean_encoding_level() &gt; 0 &amp;&amp;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; ConstraintIsNEq(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear(), mapping, integer_trail, &amp;single_value) &amp;&amp;</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; single_value != min_sum &amp;&amp; single_value != max_sum &amp;&amp;</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; encoder-&gt;VariableIsFullyEncoded(vars[0]) &amp;&amp;</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; encoder-&gt;VariableIsFullyEncoded(vars[1])) {</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; VLOG(3) &lt;&lt; <span class="stringliteral">&quot;Load NAC version of &quot;</span> &lt;&lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString()</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, var0 domain = &quot;</span></div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[0])</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, var1 domain = &quot;</span></div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[1])</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, value = &quot;</span> &lt;&lt; single_value;</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <span class="keywordflow">return</span> LoadEquivalenceNeqAC(mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()),</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; IntegerValue(coeffs[0]), vars[0],</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; IntegerValue(coeffs[1]), vars[1],</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; IntegerValue(single_value), m);</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; }</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; }</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; </div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain_size() == 2) {</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> lb = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0);</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> ub = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(1);</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keywordflow">if</span> (min_sum &gt;= lb) lb = <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>;</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keywordflow">if</span> (max_sum &lt;= ub) ub = <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>;</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; </div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <span class="keywordflow">if</span> (all_booleans) {</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="comment">// TODO(user): we should probably also implement an</span></div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="comment">// half-reified version of this constraint.</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; std::vector&lt;LiteralWithCoeff&gt; cst;</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; vars.size(); ++i) {</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> ref = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(i);</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; cst.push_back({mapping-&gt;Literal(ref), coeffs[i]});</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; }</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a5671353b0876a1d63e61414bd02f1081">BooleanLinearConstraint</a>(lb, ub, &amp;cst));</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="keywordflow">if</span> (lb != <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>) {</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1997882201b68c607f2aef7e7369ef67">WeightedSumGreaterOrEqual</a>(vars, coeffs, lb));</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; }</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <span class="keywordflow">if</span> (ub != <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>) {</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a949fa684e53fd6a18a2d1f79133fd80a">WeightedSumLowerOrEqual</a>(vars, coeffs, ub));</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; }</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; }</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literals =</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal());</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; <span class="keywordflow">if</span> (lb != <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>) {</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a82440fdc41975175a20f334ea8767f0a">ConditionalWeightedSumGreaterOrEqual</a>(enforcement_literals, vars,</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; coeffs, lb));</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; }</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; <span class="keywordflow">if</span> (ub != <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>) {</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a0ecd323ccf9fe1a8c2e35f7ab94674bf">ConditionalWeightedSumLowerOrEqual</a>(enforcement_literals, vars,</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; coeffs, ub));</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; }</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; }</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; std::vector&lt;Literal&gt; clause;</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain_size(); i += 2) {</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> lb = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(i);</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> ub = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(i + 1);</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; <span class="keywordflow">if</span> (min_sum &gt;= lb) lb = <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>;</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; <span class="keywordflow">if</span> (max_sum &lt;= ub) ub = <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>;</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; </div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> subdomain_literal(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a38766514ce4824ae1e093a25d7fb43b3">NewBooleanVariable</a>()), <span class="keyword">true</span>);</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; clause.push_back(subdomain_literal);</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; <span class="keywordflow">if</span> (lb != <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>) {</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a82440fdc41975175a20f334ea8767f0a">ConditionalWeightedSumGreaterOrEqual</a>({subdomain_literal}, vars,</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; coeffs, lb));</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; }</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; <span class="keywordflow">if</span> (ub != <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>) {</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a0ecd323ccf9fe1a8c2e35f7ab94674bf">ConditionalWeightedSumLowerOrEqual</a>({subdomain_literal}, vars,</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; coeffs, ub));</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; }</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; }</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; clause.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; }</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; </div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; <span class="comment">// TODO(user): In the cases where this clause only contains two literals,</span></div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; <span class="comment">// then we could have only used one literal and its negation above.</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>(clause));</div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; }</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;}</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; </div>
<div class="line"><a name="l01202"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f"> 1202</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f">LoadAllDiffConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a29dc0991abf59a6d30c457b2de0f8e0b">Integers</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.all_diff().vars());</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; <span class="comment">// If all variables are fully encoded and domains are not too large, use</span></div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; <span class="comment">// arc-consistent reasoning. Otherwise, use bounds-consistent reasoning.</span></div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="keywordtype">int</span> num_fully_encoded = 0;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> max_domain_size = 0;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable variable : vars) {</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; <span class="keywordflow">if</span> (encoder-&gt;VariableIsFullyEncoded(variable)) num_fully_encoded++;</div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160; </div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; IntegerValue lb = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">LowerBound</a>(variable);</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; IntegerValue ub = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#a8b6d5a25e6ad3d28a85b1924471e2cac">UpperBound</a>(variable);</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> domain_size = ub.value() - lb.value() + 1;</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; max_domain_size = <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(max_domain_size, domain_size);</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; }</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; </div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; <span class="keywordflow">if</span> (num_fully_encoded == vars.size() &amp;&amp; max_domain_size &lt; 1024) {</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a9d6526e2b6f684e7c3c80172b598b7cb">AllDifferentBinary</a>(vars));</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a0f570bf53aae0cd9303912d273425428">AllDifferentAC</a>(vars));</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a467d0c8bf263413aae5e5e530d4c5259">AllDifferentOnBounds</a>(vars));</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; }</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;}</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; </div>
<div class="line"><a name="l01229"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a"> 1229</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a">LoadIntProdConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; <span class="keyword">const</span> IntegerVariable prod = mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().target());</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().vars());</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; CHECK_EQ(vars.size(), 2) &lt;&lt; <span class="stringliteral">&quot;General int_prod not supported yet.&quot;</span>;</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ae3dc489becb957e8bc67715667f55407">ProductConstraint</a>(vars[0], vars[1], prod));</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;}</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; </div>
<div class="line"><a name="l01238"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949"> 1238</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949">LoadIntDivConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; <span class="keyword">const</span> IntegerVariable div = mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">Integer</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_div().target());</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_div().vars());</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[1]))) {</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160; <span class="keyword">const</span> IntegerValue denom(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(vars[1])));</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160; <span class="keywordflow">if</span> (denom == 1) {</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a607ba8d18e00b2e6dbdc8622bb74fdf5">Equality</a>(vars[0], div));</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a8a61527015742fa414f1c9e423f846ba">FixedDivisionConstraint</a>(vars[0], denom, div));</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160; }</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a21cd443822d7670052ac766e731d3ea0">DivisionConstraint</a>(vars[0], vars[1], div));</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; }</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;}</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; </div>
<div class="line"><a name="l01255"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab7778f357afa2e048d4771666747d19a"> 1255</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ab7778f357afa2e048d4771666747d19a">LoadIntMinConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_min().target());</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_min().vars());</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ab316e19c73976fdd6381a93d1458699f">IsEqualToMinOf</a>(<a class="code" href="alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37">min</a>, vars));</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;}</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160; </div>
<div class="line"><a name="l01263"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a5b41bc8ce6039029dcbd0463c9edac10"> 1263</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html">LinearExpression</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a5b41bc8ce6039029dcbd0463c9edac10">GetExprFromProto</a>(<span class="keyword">const</span> LinearExpressionProto&amp; expr_proto,</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&amp; mapping) {</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html">LinearExpression</a> expr;</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160; expr.<a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = mapping.<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a29dc0991abf59a6d30c457b2de0f8e0b">Integers</a>(expr_proto.vars());</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; expr_proto.coeffs_size(); ++j) {</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160; expr.<a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(expr_proto.coeffs(j)));</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160; }</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160; expr.<a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html#acd07f8397a2e61932c8ee17a4e300e23">offset</a> = IntegerValue(expr_proto.offset());</div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a5ec390fe1c25c7af4de7a30f84a0cd27">CanonicalizeExpr</a>(expr);</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;}</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160; </div>
<div class="line"><a name="l01274"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd"> 1274</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd">LoadLinMaxConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1LinearExpression.html">LinearExpression</a> <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a> =</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a5b41bc8ce6039029dcbd0463c9edac10">GetExprFromProto</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().target(), *mapping);</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; std::vector&lt;LinearExpression&gt; negated_exprs;</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160; negated_exprs.reserve(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs_size());</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs_size(); ++i) {</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160; negated_exprs.push_back(</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a5b41bc8ce6039029dcbd0463c9edac10">GetExprFromProto</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs(i), *mapping)));</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160; }</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160; <span class="comment">// TODO(user): Consider replacing the min propagator by max.</span></div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ab316e19c73976fdd6381a93d1458699f">IsEqualToMinOf</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a>), negated_exprs));</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;}</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; </div>
<div class="line"><a name="l01288"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9efd0c8eeb19a442913b4b3c98534a1c"> 1288</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a9efd0c8eeb19a442913b4b3c98534a1c">LoadIntMaxConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_max().target());</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_max().vars());</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a14d3bed64d7fdf5b081c349270c4cf11">IsEqualToMaxOf</a>(<a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a>, vars));</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;}</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; </div>
<div class="line"><a name="l01296"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f"> 1296</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f">LoadNoOverlapConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a93f88f728c3591678a7052bb92ee53d0">Disjunctive</a>(mapping-&gt;Intervals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap().intervals())));</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;}</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; </div>
<div class="line"><a name="l01301"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b"> 1301</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b">LoadNoOverlap2dConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().x_intervals().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; x_intervals =</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a39bcc12f6eb31e15986f6a824e9bae8c">Intervals</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().x_intervals());</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; y_intervals =</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; mapping-&gt;Intervals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().y_intervals());</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a100fd54e1f456b1645b2d306406a1ca6">NonOverlappingRectangles</a>(</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; x_intervals, y_intervals,</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160; !<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().boxes_with_null_area_can_overlap()));</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;}</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160; </div>
<div class="line"><a name="l01313"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526"> 1313</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526">LoadCumulativeConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; intervals =</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a39bcc12f6eb31e15986f6a824e9bae8c">Intervals</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().intervals());</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1AffineExpression.html">AffineExpression</a> <a class="code" href="routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf">capacity</a>(mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().capacity()));</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; std::vector&lt;AffineExpression&gt; demands;</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> :</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().demands())) {</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160; demands.push_back(<a class="code" href="structoperations__research_1_1sat_1_1AffineExpression.html">AffineExpression</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160; }</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a615085331bd86d852e84f75fcadbeaa1">Cumulative</a>(intervals, demands, <a class="code" href="routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf">capacity</a>));</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;}</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; </div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;<span class="comment">// If a variable is constant and its value appear in no other variable domains,</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;<span class="comment">// then the literal encoding the index and the one encoding the target at this</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;<span class="comment">// value are equivalent.</span></div>
<div class="line"><a name="l01329"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a4fd8d6c1278c1c56debc553d6170b795"> 1329</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a4fd8d6c1278c1c56debc553d6170b795">DetectEquivalencesInElementConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>,</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; </div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; <span class="keyword">const</span> IntegerVariable target = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; CHECK(!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)));</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; CHECK(!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target)));</div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; </div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; <a class="code" href="classoperations__research_1_1Domain.html">Domain</a> union_of_non_constant_domains;</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; std::map&lt;IntegerValue, int&gt; constant_to_num;</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> literal_value : m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i = literal_value.value.value();</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[i]))) {</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(vars[i])));</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160; constant_to_num[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>]++;</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; union_of_non_constant_domains = union_of_non_constant_domains.<a class="code" href="classoperations__research_1_1Domain.html#a5919f86aede74172b7fea05ebdb58975">UnionWith</a>(</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160; integer_trail-&gt;InitialVariableDomain(vars[i]));</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160; }</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; }</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160; </div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160; <span class="comment">// Bump the number if the constant appear in union_of_non_constant_domains.</span></div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> entry : constant_to_num) {</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160; <span class="keywordflow">if</span> (union_of_non_constant_domains.<a class="code" href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">Contains</a>(entry.first.value())) {</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; constant_to_num[entry.first]++;</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; }</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; }</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160; </div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; <span class="comment">// Use the literal from the index encoding to encode the target at the</span></div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; <span class="comment">// &quot;unique&quot; values.</span></div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160; <span class="keywordtype">bool</span> is_one_to_one_mapping = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> literal_value : m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i = literal_value.value.value();</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160; <span class="keywordflow">if</span> (!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[i]))) {</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160; is_one_to_one_mapping = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; }</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; </div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(vars[i])));</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160; <span class="keywordflow">if</span> (constant_to_num[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>] == 1) {</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> r = literal_value.literal;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160; encoder-&gt;AssociateToIntegerEqualValue(r, target, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160; is_one_to_one_mapping = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; }</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; }</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; </div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; <span class="keywordflow">return</span> is_one_to_one_mapping;</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;}</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; </div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;<span class="comment">// TODO(user): Be more efficient when the element().vars() are constants.</span></div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="comment">// Ideally we should avoid creating them as integer variable since we don&#39;t</span></div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;<span class="comment">// use them.</span></div>
<div class="line"><a name="l01387"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#af712aad69920521943174c1304a820f6"> 1387</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#af712aad69920521943174c1304a820f6">LoadElementConstraintBounds</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160; <span class="keyword">const</span> IntegerVariable target = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160; CHECK(!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)));</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; </div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160; <span class="comment">// We always fully encode the index on an element constraint.</span></div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> encoding = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>((<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)));</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; std::vector&lt;Literal&gt; selectors;</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; std::vector&lt;IntegerVariable&gt; possible_vars;</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> literal_value : encoding) {</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i = literal_value.value.value();</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; CHECK_GE(i, 0);</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; CHECK_LT(i, vars.size());</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160; possible_vars.push_back(vars[i]);</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160; selectors.push_back(literal_value.literal);</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> r = literal_value.literal;</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; </div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160; <span class="keywordflow">if</span> (vars[i] == target) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target))) {</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(target));</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a620b799ba99bb090cbaa754aaa0340b1">ImpliesInInterval</a>(r, vars[i], <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>));</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[i]))) {</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(vars[i]));</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a620b799ba99bb090cbaa754aaa0340b1">ImpliesInInterval</a>(r, target, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>));</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a38733d8aaf7083f231fc914c127f155d">ConditionalLowerOrEqualWithOffset</a>(vars[i], target, 0, r));</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a38733d8aaf7083f231fc914c127f155d">ConditionalLowerOrEqualWithOffset</a>(target, vars[i], 0, r));</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; }</div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160; }</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160; </div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160; <span class="keywordflow">if</span> (!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target))) {</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a373e6412ac911205ed63206556680bec">PartialIsOneOfVar</a>(target, possible_vars, selectors));</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160; }</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;}</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160; </div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;<span class="comment">// Arc-Consistent encoding of the element constraint as SAT clauses.</span></div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;<span class="comment">// The constraint enforces vars[index] == target.</span></div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment">// The AC propagation can be decomposed in three rules:</span></div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment">// Rule 1: dom(index) == i =&gt; dom(vars[i]) == dom(target).</span></div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;<span class="comment">// Rule 2: dom(target) \subseteq \Union_{i \in dom(index)} dom(vars[i]).</span></div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;<span class="comment">// Rule 3: dom(index) \subseteq { i | |dom(vars[i]) \inter dom(target)| &gt; 0 }.</span></div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;<span class="comment">// We encode this in a way similar to the table constraint, except that the</span></div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;<span class="comment">// set of admissible tuples is not explicit.</span></div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;<span class="comment">// First, we add Booleans selected[i][value] &lt;=&gt; (index == i /\ vars[i] ==</span></div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;<span class="comment">// value). Rules 1 and 2 are enforced by target == value &lt;=&gt; \Or_{i}</span></div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;<span class="comment">// selected[i][value]. Rule 3 is enforced by index == i &lt;=&gt; \Or_{value}</span></div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;<span class="comment">// selected[i][value].</span></div>
<div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ae5a0213a97d668b2779c39b2d52f1ebd"> 1439</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ae5a0213a97d668b2779c39b2d52f1ebd">LoadElementConstraintAC</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160; <span class="keyword">const</span> IntegerVariable target = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160; CHECK(!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)));</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160; CHECK(!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target)));</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160; </div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; absl::flat_hash_map&lt;IntegerValue, Literal&gt; target_map;</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> target_encoding = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(target));</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> literal_value : target_encoding) {</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160; target_map[literal_value.value] = literal_value.literal;</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160; }</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160; </div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160; <span class="comment">// For i \in index and value in vars[i], make (index == i /\ vars[i] == value)</span></div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160; <span class="comment">// literals and store them by value in vectors.</span></div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160; absl::flat_hash_map&lt;IntegerValue, std::vector&lt;Literal&gt;&gt; value_to_literals;</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> index_encoding = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>));</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>* integer_trail = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> literal_value : index_encoding) {</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i = literal_value.value.value();</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> i_lit = literal_value.literal;</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160; </div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160; <span class="comment">// Special case where vars[i] == value /\ i_lit is actually i_lit.</span></div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[i]))) {</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160; value_to_literals[integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">LowerBound</a>(vars[i])].push_back(i_lit);</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160; }</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160; </div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> var_encoding = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(vars[i]));</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160; std::vector&lt;Literal&gt; var_selected_literals;</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> var_literal_value : var_encoding) {</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = var_literal_value.value;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> var_is_value = var_literal_value.literal;</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160; </div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(target_map, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)) {</div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160; <span class="comment">// No need to add to value_to_literals, selected[i][value] is always</span></div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160; <span class="comment">// false.</span></div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a8a0620c105ec05f1b42bcde3a9380872">Implication</a>(i_lit, var_is_value.<a class="code" href="classoperations__research_1_1sat_1_1Literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160; }</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160; </div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> var_is_value_and_selected =</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a>(m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a38766514ce4824ae1e093a25d7fb43b3">NewBooleanVariable</a>()), <span class="keyword">true</span>);</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#aa874aee040980146062498b87e8fb956">ReifiedBoolAnd</a>({i_lit, var_is_value}, var_is_value_and_selected));</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160; value_to_literals[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>].push_back(var_is_value_and_selected);</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160; var_selected_literals.push_back(var_is_value_and_selected);</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; }</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160; <span class="comment">// index == i &lt;=&gt; \Or_{value} selected[i][value].</span></div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#affc20db163dca7cacfb4aa97cf8d72b9">ReifiedBoolOr</a>(var_selected_literals, i_lit));</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160; }</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160; </div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160; <span class="comment">// target == value &lt;=&gt; \Or_{i \in index} (vars[i] == value /\ index == i).</span></div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; entry : target_map) {</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = entry.first;</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> target_is_value = entry.second;</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160; </div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(value_to_literals, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)) {</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>({target_is_value.<a class="code" href="classoperations__research_1_1sat_1_1Literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()}));</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#affc20db163dca7cacfb4aa97cf8d72b9">ReifiedBoolOr</a>(value_to_literals[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>], target_is_value));</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160; }</div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160; }</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;}</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160; </div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160; </div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="comment">// This Boolean encoding is enough for consistency, but does not propagate as</span></div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;<span class="comment">// much as LoadElementConstraintAC(). However, setting any of the non-propagated</span></div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;<span class="comment">// Booleans to its &quot;wrong&quot; value will result directly in a conflict, so the</span></div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;<span class="comment">// solver will easily learn an AC encoding...</span></div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;<span class="comment">// The advantage is that this does not introduce extra BooleanVariables.</span></div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;<span class="keywordtype">void</span> LoadElementConstraintHalfAC(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, Model* m) {</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;GetOrCreate&lt;CpModelMapping&gt;();</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160; <span class="keyword">const</span> IntegerVariable target = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160; CHECK(!m-&gt;Get(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)));</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160; CHECK(!m-&gt;Get(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target)));</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160; </div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(target));</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i = value_literal.value.value();</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(vars[i]));</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160; LoadEquivalenceAC({value_literal.literal}, IntegerValue(1), vars[i],</div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160; IntegerValue(-1), target, IntegerValue(0), m);</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160; }</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;}</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160; </div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;<span class="keywordtype">void</span> LoadBooleanElement(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, Model* m) {</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;GetOrCreate&lt;CpModelMapping&gt;();</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160; <span class="keyword">const</span> std::vector&lt;Literal&gt; literals = mapping-&gt;Literals(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160; <span class="keyword">const</span> Literal target = mapping-&gt;Literal(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160; </div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160; <span class="keywordflow">if</span> (m-&gt;Get(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a607ba8d18e00b2e6dbdc8622bb74fdf5">Equality</a>(target, literals[m-&gt;Get(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))]));</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160; }</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160; </div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160; std::vector&lt;Literal&gt; all_true;</div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160; std::vector&lt;Literal&gt; all_false;</div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal : m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160; <span class="keyword">const</span> Literal a_lit = literals[value_literal.value.value()];</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160; <span class="keyword">const</span> Literal i_lit = value_literal.literal;</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>({i_lit.Negated(), a_lit.Negated(), target}));</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>({i_lit.Negated(), a_lit, target.Negated()}));</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160; all_true.push_back(a_lit.Negated());</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160; all_false.push_back(a_lit);</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160; }</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160; all_true.push_back(target);</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160; all_false.push_back(target.Negated());</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>(all_true));</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160; m-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">ClauseConstraint</a>(all_false));</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160; <span class="comment">// TODO(user): Investigate filtering this with active literals.</span></div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;}</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160; </div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160; </div>
<div class="line"><a name="l01561"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aabf828f361153e82c8ef068fd31012ac"> 1561</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#aabf828f361153e82c8ef068fd31012ac">LoadElementConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().index());</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160; </div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160; <span class="keywordtype">bool</span> boolean_array = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars()) {</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160; <span class="keywordflow">if</span> (!mapping-&gt;IsBoolean(ref)) {</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160; boolean_array = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160; }</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160; }</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160; <span class="keywordflow">if</span> (boolean_array &amp;&amp; !mapping-&gt;IsBoolean(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target())) {</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160; <span class="comment">// Should have been reduced but presolve.</span></div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160; VLOG(1) &lt;&lt; <span class="stringliteral">&quot;Fix boolean_element not propagated on target&quot;</span>;</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160; boolean_array = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160; }</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160; </div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160; <span class="comment">// TODO(user): Move this to presolve. Leads to a larger discussion on</span></div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160; <span class="comment">// adding full encoding to model during presolve.</span></div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160; <span class="keywordflow">if</span> (boolean_array) {</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160; LoadBooleanElement(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160; }</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160; </div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160; <span class="keyword">const</span> IntegerVariable target = mapping-&gt;Integer(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().target());</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars());</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160; </div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160; <span class="comment">// Retrict the domain of index in case there was no presolve.</span></div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160; <span class="keywordflow">if</span> (!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html">IntegerTrail</a>&gt;()-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerTrail.html#af931801f592e954a6623cab8cf9a4485">UpdateInitialDomain</a>(</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160; <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <a class="code" href="classoperations__research_1_1Domain.html">Domain</a>(0, vars.size() - 1))) {</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160; }</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160; </div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160; <span class="comment">// This returns true if there is nothing else to do after the equivalences</span></div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160; <span class="comment">// of the form (index literal &lt;=&gt; target_literal) have been added.</span></div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160; <span class="keywordflow">if</span> (!m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) &amp;&amp; !m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target)) &amp;&amp;</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a4fd8d6c1278c1c56debc553d6170b795">DetectEquivalencesInElementConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m)) {</div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160; }</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160; </div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160; <span class="comment">// Special case when index is fixed.</span></div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a607ba8d18e00b2e6dbdc8622bb74fdf5">Equality</a>(target, vars[m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))]));</div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160; }</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160; </div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160; <span class="comment">// Special case when target is fixed.</span></div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(target))) {</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#af712aad69920521943174c1304a820f6">LoadElementConstraintBounds</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160; }</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160; </div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>* encoder = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> target_is_AC = encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html#ac9e262bbda19ec4b7d51bd77b70bb363">VariableIsFullyEncoded</a>(target);</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160; </div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160; <span class="keywordtype">int</span> num_AC_variables = 0;</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars().size();</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> v : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.element().vars()) {</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160; IntegerVariable variable = mapping-&gt;Integer(v);</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> is_full =</div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(variable)) || encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html#ac9e262bbda19ec4b7d51bd77b70bb363">VariableIsFullyEncoded</a>(variable);</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160; <span class="keywordflow">if</span> (is_full) num_AC_variables++;</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160; }</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160; </div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160; <span class="keyword">const</span> SatParameters&amp; params = *m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;SatParameters&gt;();</div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160; <span class="keywordflow">if</span> (params.boolean_encoding_level() &gt; 0 &amp;&amp;</div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160; (target_is_AC || num_AC_variables &gt;= num_vars - 1)) {</div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160; <span class="keywordflow">if</span> (params.boolean_encoding_level() &gt; 1) {</div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ae5a0213a97d668b2779c39b2d52f1ebd">LoadElementConstraintAC</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160; LoadElementConstraintHalfAC(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160; }</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#af712aad69920521943174c1304a820f6">LoadElementConstraintBounds</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160; }</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;}</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160; </div>
<div class="line"><a name="l01638"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a065363842a90de5a698b26f25ebb4dcb"> 1638</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a065363842a90de5a698b26f25ebb4dcb">LoadTableConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.table().vars());</div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160; <span class="keyword">const</span> std::vector&lt;int64&gt; values = ValuesFromProto(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.table().values());</div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = vars.size();</div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_tuples = values.size() / num_vars;</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160; std::vector&lt;std::vector&lt;int64&gt;&gt; tuples(num_tuples);</div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160; <span class="keywordtype">int</span> count = 0;</div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_tuples; ++i) {</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; num_vars; ++j) {</div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160; tuples[i].push_back(values[count++]);</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160; }</div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160; }</div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.table().negated()) {</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aa933cec72d7d701242cfd600daa4a172">AddNegatedTableConstraint</a>(vars, std::move(tuples), m);</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a54ff6ea10d4aafe131b6bfa4176b334a">AddTableConstraint</a>(vars, std::move(tuples), m);</div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160; }</div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;}</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160; </div>
<div class="line"><a name="l01659"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab10c770cf73412d0e305c51ea08d8936"> 1659</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ab10c770cf73412d0e305c51ea08d8936">LoadAutomatonConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160; mapping-&gt;Integers(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().vars());</div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160; </div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_transitions = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().transition_tail_size();</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160; std::vector&lt;std::vector&lt;int64&gt;&gt; transitions;</div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160; transitions.reserve(num_transitions);</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_transitions; ++i) {</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160; transitions.push_back({<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().transition_tail(i),</div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().transition_label(i),</div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().transition_head(i)});</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160; }</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160; </div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> starting_state = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().starting_state();</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160; <span class="keyword">const</span> std::vector&lt;int64&gt; final_states =</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160; ValuesFromProto(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.automaton().final_states());</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a31ce182acd5d18c1cca240566d510666">TransitionConstraint</a>(vars, transitions, starting_state, final_states));</div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;}</div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160; </div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;<span class="comment">// From vector of n IntegerVariables, returns an n x n matrix of Literal</span></div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;<span class="comment">// such that matrix[i][j] is the Literal corresponding to vars[i] == j.</span></div>
<div class="line"><a name="l01681"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a65a415fdc0a0885f902e15fd3b063de3"> 1681</a></span>&#160;std::vector&lt;std::vector&lt;Literal&gt;&gt; <a class="code" href="namespaceoperations__research_1_1sat.html#a65a415fdc0a0885f902e15fd3b063de3">GetSquareMatrixFromIntegerVariables</a>(</div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; vars, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> n = vars.size();</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> kTrueLiteral =</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;()-&gt;GetTrueLiteral();</div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1Literal.html">Literal</a> kFalseLiteral =</div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1IntegerEncoder.html">IntegerEncoder</a>&gt;()-&gt;GetFalseLiteral();</div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160; std::vector&lt;std::vector&lt;Literal&gt;&gt; matrix(</div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160; n, std::vector&lt;Literal&gt;(n, kFalseLiteral));</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n; i++) {</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; n; j++) {</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160; <span class="keywordflow">if</span> (m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">IsFixed</a>(vars[i]))) {</div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">Get</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">Value</a>(vars[i]));</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160; DCHECK_LE(0, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160; DCHECK_LT(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, n);</div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160; matrix[i][<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>] = kTrueLiteral;</div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> encoding = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">FullyEncodeVariable</a>(vars[i]));</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; entry : encoding) {</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = entry.value.value();</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160; DCHECK_LE(0, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160; DCHECK_LT(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, n);</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160; matrix[i][<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>] = entry.literal;</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160; }</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160; }</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160; }</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160; }</div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160; <span class="keywordflow">return</span> matrix;</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;}</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160; </div>
<div class="line"><a name="l01711"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1"> 1711</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1">LoadCircuitConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; circuit = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.circuit();</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160; <span class="keywordflow">if</span> (circuit.tails().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160; </div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160; std::vector&lt;int&gt; tails(circuit.tails().begin(), circuit.tails().end());</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160; std::vector&lt;int&gt; heads(circuit.heads().begin(), circuit.heads().end());</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160; std::vector&lt;Literal&gt; literals =</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;()-&gt;Literals(circuit.literals());</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = <a class="code" href="namespaceoperations__research_1_1sat.html#a9e1e7aca479b08255d3f796816ec94bc">ReindexArcs</a>(&amp;tails, &amp;heads, &amp;literals);</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3c25e2ace66c05a1078d9d8128ca33c3">SubcircuitConstraint</a>(num_nodes, tails, heads, literals));</div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;}</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160; </div>
<div class="line"><a name="l01723"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce"> 1723</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce">LoadRoutesConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; routes = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.routes();</div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160; <span class="keywordflow">if</span> (routes.tails().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160; </div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160; std::vector&lt;int&gt; tails(routes.tails().begin(), routes.tails().end());</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160; std::vector&lt;int&gt; heads(routes.heads().begin(), routes.heads().end());</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160; std::vector&lt;Literal&gt; literals =</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;()-&gt;Literals(routes.literals());</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = <a class="code" href="namespaceoperations__research_1_1sat.html#a9e1e7aca479b08255d3f796816ec94bc">ReindexArcs</a>(&amp;tails, &amp;heads, &amp;literals);</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a3c25e2ace66c05a1078d9d8128ca33c3">SubcircuitConstraint</a>(num_nodes, tails, heads, literals,</div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160; <span class="comment">/*multiple_subcircuit_through_zero=*/</span><span class="keyword">true</span>));</div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;}</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160; </div>
<div class="line"><a name="l01736"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a4c31e4c49d45dac45728319556f4eaf9"> 1736</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a4c31e4c49d45dac45728319556f4eaf9">LoadCircuitCoveringConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160; <span class="keyword">auto</span>* mapping = m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">GetOrCreate</a>&lt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; nexts =</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160; mapping-&gt;<a class="code" href="classoperations__research_1_1sat_1_1CpModelMapping.html#a29dc0991abf59a6d30c457b2de0f8e0b">Integers</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.circuit_covering().nexts());</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160; <span class="keyword">const</span> std::vector&lt;std::vector&lt;Literal&gt;&gt; graph =</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a65a415fdc0a0885f902e15fd3b063de3">GetSquareMatrixFromIntegerVariables</a>(nexts, m);</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt; distinguished(</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.circuit_covering().distinguished_nodes().begin(),</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.circuit_covering().distinguished_nodes().end());</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a505d58583f35441cea048e6a69453099">ExactlyOnePerRowAndPerColumn</a>(graph));</div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160; m-&gt;<a class="code" href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a42094dcdae62a62bd5d269e1223f7f30">CircuitCovering</a>(graph, distinguished));</div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;}</div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160; </div>
<div class="line"><a name="l01749"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1c3fa75911c74ce485e62814484c7ae7"> 1749</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a1c3fa75911c74ce485e62814484c7ae7">LoadConstraint</a>(<span class="keyword">const</span> ConstraintProto&amp; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="classoperations__research_1_1sat_1_1Model.html">Model</a>* m) {</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160; <span class="keywordflow">switch</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case()) {</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::CONSTRAINT_NOT_SET:</div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolOr:</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328">LoadBoolOrConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolAnd:</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8">LoadBoolAndConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kAtMostOne:</div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a">LoadAtMostOneConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolXor:</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f">LoadBoolXorConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kLinear:</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041">LoadLinearConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kAllDiff:</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f">LoadAllDiffConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntProd:</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a">LoadIntProdConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntDiv:</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949">LoadIntDivConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntMin:</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ab7778f357afa2e048d4771666747d19a">LoadIntMinConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kLinMax:</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd">LoadLinMaxConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntMax:</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a9efd0c8eeb19a442913b4b3c98534a1c">LoadIntMaxConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kInterval:</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; <span class="comment">// Already dealt with.</span></div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kNoOverlap:</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f">LoadNoOverlapConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kNoOverlap2D:</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b">LoadNoOverlap2dConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kCumulative:</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526">LoadCumulativeConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kElement:</div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aabf828f361153e82c8ef068fd31012ac">LoadElementConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kTable:</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a065363842a90de5a698b26f25ebb4dcb">LoadTableConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kAutomaton:</div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ab10c770cf73412d0e305c51ea08d8936">LoadAutomatonConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kCircuit:</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1">LoadCircuitConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kRoutes:</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce">LoadRoutesConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kCircuitCovering:</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a4c31e4c49d45dac45728319556f4eaf9">LoadCircuitCoveringConstraint</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160; }</div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;}</div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160; </div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;} <span class="comment">// namespace sat</span></div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;} <span class="comment">// namespace operations_research</span></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<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="astructoperations__research_1_1sat_1_1LinearExpression_html_a73e4094f2d4e2adbe5e8d79a5b61fcd1"><div class="ttname"><a href="structoperations__research_1_1sat_1_1LinearExpression.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">operations_research::sat::LinearExpression::vars</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; vars</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8h_source.html#l00166">linear_constraint.h:166</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html_a523501d854b2ca8034d37c15e7c89117"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html#a523501d854b2ca8034d37c15e7c89117">operations_research::sat::IntegerTrail::IsFixed</a></div><div class="ttdeci">bool IsFixed(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01225">integer.h:1225</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IntegerLiteral_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IntegerLiteral.html">operations_research::sat::IntegerLiteral</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00164">integer.h:164</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="anamespaceoperations__research_1_1sat_html_a38733d8aaf7083f231fc914c127f155d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a38733d8aaf7083f231fc914c127f155d">operations_research::sat::ConditionalLowerOrEqualWithOffset</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ConditionalLowerOrEqualWithOffset(IntegerVariable a, IntegerVariable b, int64 offset, Literal is_le)</div><div class="ttdef"><b>Definition:</b> <a href="precedences_8h_source.html#l00419">precedences.h:419</a></div></div>
<div class="ttc" id="amap__util_8h_html"><div class="ttname"><a href="map__util_8h.html">map_util.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1bf9586612493e7cfcc892c54fecf49a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a">operations_research::sat::LoadIntProdConstraint</a></div><div class="ttdeci">void LoadIntProdConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01229">cp_model_loader.cc:1229</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IntegerLiteral_html_a6c233aafac25ea66d69de93a83c9be63"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IntegerLiteral.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#l01197">integer.h:1197</a></div></div>
<div class="ttc" id="acp__model_8pb_8h_html"><div class="ttname"><a href="cp__model_8pb_8h.html">cp_model.pb.h</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_a3784d1f3239b842751828e471e1886c8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3784d1f3239b842751828e471e1886c8">operations_research::sat::LiteralXorIs</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; LiteralXorIs(const std::vector&lt; Literal &gt; &amp;literals, bool value)</div><div class="ttdef"><b>Definition:</b> <a href="cp__constraints_8h_source.html#l00111">cp_constraints.h:111</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a07823d046b027c81155f8a2f322cf813"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">operations_research::sat::FloorRatio</a></div><div class="ttdeci">IntegerValue FloorRatio(IntegerValue dividend, IntegerValue positive_divisor)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00101">integer.h:101</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="anamespaceoperations__research_1_1sat_html_a4fd8d6c1278c1c56debc553d6170b795"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4fd8d6c1278c1c56debc553d6170b795">operations_research::sat::DetectEquivalencesInElementConstraint</a></div><div class="ttdeci">bool DetectEquivalencesInElementConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01329">cp_model_loader.cc:1329</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aabf828f361153e82c8ef068fd31012ac"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aabf828f361153e82c8ef068fd31012ac">operations_research::sat::LoadElementConstraint</a></div><div class="ttdeci">void LoadElementConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01561">cp_model_loader.cc:1561</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a922026cbae3cd7aac276fcad53bd4278"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a922026cbae3cd7aac276fcad53bd4278">operations_research::sat::CpModelMapping::Literal</a></div><div class="ttdeci">sat::Literal Literal(int ref) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00110">cp_model_loader.h:110</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_af7e0a5f102c8809cfc9c9e515c1d9118"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#af7e0a5f102c8809cfc9c9e515c1d9118">operations_research::sat::CpModelMapping::CreateVariables</a></div><div class="ttdeci">void CreateVariables(const CpModelProto &amp;model_proto, bool view_all_booleans_as_integers, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00113">cp_model_loader.cc:113</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IntegerLiteral_html_ab6516f556b715738034b30d290c40214"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IntegerLiteral.html#ab6516f556b715738034b30d290c40214">operations_research::sat::IntegerLiteral::var</a></div><div class="ttdeci">IntegerVariable var</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00198">integer.h:198</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5190bd84fe4e628ebde4007e970f84ce"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce">operations_research::sat::LoadRoutesConstraint</a></div><div class="ttdeci">void LoadRoutesConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01723">cp_model_loader.cc:1723</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1ImpliedBounds_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1ImpliedBounds.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="aclassoperations__research_1_1Domain_html_a3dcbf23ccbed61ee64ec08a934f57a9c"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a3dcbf23ccbed61ee64ec08a934f57a9c">operations_research::Domain::NumIntervals</a></div><div class="ttdeci">int NumIntervals() const</div><div class="ttdoc">Basic read-only std::vector&lt;&gt; wrapping to view a Domain as a sorted list of non-adjacent intervals.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00336">sorted_interval_list.h:336</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_affc20db163dca7cacfb4aa97cf8d72b9"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#affc20db163dca7cacfb4aa97cf8d72b9">operations_research::sat::ReifiedBoolOr</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ReifiedBoolOr(const std::vector&lt; Literal &gt; &amp;literals, Literal r)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00914">sat_solver.h:914</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_af712aad69920521943174c1304a820f6"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#af712aad69920521943174c1304a820f6">operations_research::sat::LoadElementConstraintBounds</a></div><div class="ttdeci">void LoadElementConstraintBounds(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01387">cp_model_loader.cc:1387</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4c31e4c49d45dac45728319556f4eaf9"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4c31e4c49d45dac45728319556f4eaf9">operations_research::sat::LoadCircuitCoveringConstraint</a></div><div class="ttdeci">void LoadCircuitCoveringConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01736">cp_model_loader.cc:1736</a></div></div>
<div class="ttc" id="aall__different_8h_html"><div class="ttname"><a href="all__different_8h.html">all_different.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html_a8b6d5a25e6ad3d28a85b1924471e2cac"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html#a8b6d5a25e6ad3d28a85b1924471e2cac">operations_research::sat::IntegerTrail::UpperBound</a></div><div class="ttdeci">IntegerValue UpperBound(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01221">integer.h:1221</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0f570bf53aae0cd9303912d273425428"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0f570bf53aae0cd9303912d273425428">operations_research::sat::AllDifferentAC</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; AllDifferentAC(const std::vector&lt; IntegerVariable &gt; &amp;variables)</div><div class="ttdef"><b>Definition:</b> <a href="all__different_8cc_source.html#l00076">all_different.cc:76</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1FullEncodingFixedPointComputer_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html">operations_research::sat::FullEncodingFixedPointComputer</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00668">cp_model_loader.cc:668</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1d467595ed8fe5b85dc95328ee1c2770"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1d467595ed8fe5b85dc95328ee1c2770">operations_research::sat::UsedVariables</a></div><div class="ttdeci">std::vector&lt; int &gt; UsedVariables(const ConstraintProto &amp;ct)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8cc_source.html#l00441">cp_model_utils.cc:441</a></div></div>
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="adisjunctive_8h_html"><div class="ttname"><a href="disjunctive_8h.html">disjunctive.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a354dd8c252cf59b748602b342db6019d"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a354dd8c252cf59b748602b342db6019d">operations_research::Domain::Size</a></div><div class="ttdeci">int64 Size() const</div><div class="ttdoc">Returns the number of elements in the domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00194">sorted_interval_list.cc:194</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1SatSolver_html_af67fe279478772a6d1492a7f673bda5d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1SatSolver.html#af67fe279478772a6d1492a7f673bda5d">operations_research::sat::SatSolver::AddProblemClause</a></div><div class="ttdeci">bool AddProblemClause(absl::Span&lt; const Literal &gt; literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00201">sat_solver.cc:201</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a4c46b216006440e76f16d33797123b3b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a4c46b216006440e76f16d33797123b3b">operations_research::sat::CpModelMapping::IsInteger</a></div><div class="ttdeci">bool IsInteger(int ref) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00105">cp_model_loader.h:105</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a5919f86aede74172b7fea05ebdb58975"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a5919f86aede74172b7fea05ebdb58975">operations_research::Domain::UnionWith</a></div><div class="ttdeci">Domain UnionWith(const Domain &amp;domain) const</div><div class="ttdoc">Returns the union of D and domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00321">sorted_interval_list.cc:321</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a100fd54e1f456b1645b2d306406a1ca6"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a100fd54e1f456b1645b2d306406a1ca6">operations_research::sat::NonOverlappingRectangles</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; NonOverlappingRectangles(const std::vector&lt; IntervalVariable &gt; &amp;x, const std::vector&lt; IntervalVariable &gt; &amp;y, bool is_strict)</div><div class="ttdef"><b>Definition:</b> <a href="diffn_8h_source.html#l00155">diffn.h:155</a></div></div>
<div class="ttc" id="acp__model__solver_8cc_html_a6ac76d8a372013f67c4973012948ec84"><div class="ttname"><a href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a></div><div class="ttdeci">CpModelProto const * model_proto</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02023">cp_model_solver.cc:2023</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_a21edc7ca4cc5802c8779d68556bc09cf"><div class="ttname"><a href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a></div><div class="ttdeci">int64 value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00043">demon_profiler.cc:43</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1LinearExpression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1LinearExpression.html">operations_research::sat::LinearExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8h_source.html#l00165">linear_constraint.h:165</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a505d58583f35441cea048e6a69453099"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a505d58583f35441cea048e6a69453099">operations_research::sat::ExactlyOnePerRowAndPerColumn</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ExactlyOnePerRowAndPerColumn(const std::vector&lt; std::vector&lt; Literal &gt;&gt; &amp;graph)</div><div class="ttdef"><b>Definition:</b> <a href="circuit_8cc_source.html#l00452">circuit.cc:452</a></div></div>
<div class="ttc" id="aclassgtl_1_1ITIVector_html_a4e3670a285a3642eaa07f66766cffa72"><div class="ttname"><a href="classgtl_1_1ITIVector.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="anamespaceoperations__research_1_1sat_html_aa933cec72d7d701242cfd600daa4a172"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa933cec72d7d701242cfd600daa4a172">operations_research::sat::AddNegatedTableConstraint</a></div><div class="ttdeci">void AddNegatedTableConstraint(absl::Span&lt; const IntegerVariable &gt; vars, std::vector&lt; std::vector&lt; int64 &gt;&gt; tuples, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2table_8cc_source.html#l00457">sat/table.cc:457</a></div></div>
<div class="ttc" id="asaturated__arithmetic_8h_html"><div class="ttname"><a href="saturated__arithmetic_8h.html">saturated_arithmetic.h</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="acircuit_8h_html"><div class="ttname"><a href="circuit_8h.html">circuit.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aba8e3465fc58d3b287e05451d5230bae"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aba8e3465fc58d3b287e05451d5230bae">operations_research::sat::GetReferencesUsedByConstraint</a></div><div class="ttdeci">IndexReferences GetReferencesUsedByConstraint(const ConstraintProto &amp;ct)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8cc_source.html#l00046">cp_model_utils.cc:46</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aae43e784db06c0974ce59ebbe8dd2b22"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">operations_research::sat::NegationOf</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; NegationOf(const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00042">integer.cc:42</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_af458164b470cbba416d5ed579e00ff60"><div class="ttname"><a href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a></div><div class="ttdeci">static const int64 kint64min</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00060">integral_types.h:60</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a9e1e7aca479b08255d3f796816ec94bc"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9e1e7aca479b08255d3f796816ec94bc">operations_research::sat::ReindexArcs</a></div><div class="ttdeci">int ReindexArcs(std::vector&lt; int &gt; *tails, std::vector&lt; int &gt; *heads, std::vector&lt; Literal &gt; *literals)</div><div class="ttdef"><b>Definition:</b> <a href="circuit_8cc_source.html#l00471">circuit.cc:471</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00534">integer.h:534</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a66ee25333b0b64292cfa8731c4d4f5eb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a66ee25333b0b64292cfa8731c4d4f5eb">operations_research::sat::CpModelMapping::ConstraintIsAlreadyLoaded</a></div><div class="ttdeci">bool ConstraintIsAlreadyLoaded(const ConstraintProto *ct) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00153">cp_model_loader.h:153</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1LinearExpression_html_a4053d5aed2a34995e0aeb2042878ca7a"><div class="ttname"><a href="structoperations__research_1_1sat_1_1LinearExpression.html#a4053d5aed2a34995e0aeb2042878ca7a">operations_research::sat::LinearExpression::coeffs</a></div><div class="ttdeci">std::vector&lt; IntegerValue &gt; coeffs</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8h_source.html#l00167">linear_constraint.h:167</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a0f4307fe0ec0a2e2803a15a2f17aa394"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a0f4307fe0ec0a2e2803a15a2f17aa394">operations_research::sat::CpModelMapping::Literals</a></div><div class="ttdeci">std::vector&lt; sat::Literal &gt; Literals(const ProtoIndices &amp;indices) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00136">cp_model_loader.h:136</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1FullEncodingFixedPointComputer_html_a5197d1ff3e016ded015f19cda50c6f13"><div class="ttname"><a href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a5197d1ff3e016ded015f19cda50c6f13">operations_research::sat::FullEncodingFixedPointComputer::ComputeFixedPoint</a></div><div class="ttdeci">void ComputeFixedPoint()</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00757">cp_model_loader.cc:757</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="anamespaceoperations__research_1_1sat_html_a64b1b8d5018080ad3e7dd7eb6df42274"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a64b1b8d5018080ad3e7dd7eb6df42274">operations_research::sat::EnforcedClause</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; EnforcedClause(absl::Span&lt; const Literal &gt; enforcement_literals, absl::Span&lt; const Literal &gt; clause)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00930">sat_solver.h:930</a></div></div>
<div class="ttc" id="aclassgtl_1_1ITIVector_html_a60304b65bf89363bcc3165d3cde67f86"><div class="ttname"><a href="classgtl_1_1ITIVector.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="anamespaceoperations__research_1_1sat_html_a6bded303c37dabc35958dcc4a22d4949"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949">operations_research::sat::LoadIntDivConstraint</a></div><div class="ttdeci">void LoadIntDivConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01238">cp_model_loader.cc:1238</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8a61527015742fa414f1c9e423f846ba"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8a61527015742fa414f1c9e423f846ba">operations_research::sat::FixedDivisionConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; FixedDivisionConstraint(IntegerVariable a, IntegerValue b, IntegerVariable c)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00805">integer_expr.h:805</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_1Domain_html"><div class="ttname"><a href="classoperations__research_1_1Domain.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_a9e9bd05a784d4b295ed4da47278990e1"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1">operations_research::sat::LoadCircuitConstraint</a></div><div class="ttdeci">void LoadCircuitConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01711">cp_model_loader.cc:1711</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Model.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="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="aintegral__types_8h_html_a56f1a81c92849566ae864511088eb7e8"><div class="ttname"><a href="integral__types_8h.html#a56f1a81c92849566ae864511088eb7e8">int32</a></div><div class="ttdeci">int int32</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00033">integral_types.h:33</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerEncoder_html_a5d4a4c93f937463d529aabb222804816"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerEncoder.html#a5d4a4c93f937463d529aabb222804816">operations_research::sat::IntegerEncoder::AssociateToIntegerEqualValue</a></div><div class="ttdeci">void AssociateToIntegerEqualValue(Literal literal, IntegerVariable var, IntegerValue value)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00323">integer.cc:323</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a55c57c1725f5333ffe73f0fefc377bb8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8">operations_research::sat::LoadBoolAndConstraint</a></div><div class="ttdeci">void LoadBoolAndConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00955">cp_model_loader.cc:955</a></div></div>
<div class="ttc" id="apb__constraint_8h_html"><div class="ttname"><a href="pb__constraint_8h.html">pb_constraint.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Model_html_a37eb53a23cb596ef5d2e3bbc0fab70dc"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Model.html#a37eb53a23cb596ef5d2e3bbc0fab70dc">operations_research::sat::Model::Get</a></div><div class="ttdeci">T Get(std::function&lt; T(const Model &amp;)&gt; f) const</div><div class="ttdoc">Similar to Add() but this is const.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00087">sat/model.h:87</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1SatSolver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1SatSolver.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="anamespaceoperations__research_1_1sat_html_a596a1b4122eff430a59beb743ed942cd"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd">operations_research::sat::LoadLinMaxConstraint</a></div><div class="ttdeci">void LoadLinMaxConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01274">cp_model_loader.cc:1274</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a3c25e2ace66c05a1078d9d8128ca33c3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3c25e2ace66c05a1078d9d8128ca33c3">operations_research::sat::SubcircuitConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; SubcircuitConstraint(int num_nodes, const std::vector&lt; int &gt; &amp;tails, const std::vector&lt; int &gt; &amp;heads, const std::vector&lt; Literal &gt; &amp;literals, bool multiple_subcircuit_through_zero)</div><div class="ttdef"><b>Definition:</b> <a href="circuit_8cc_source.html#l00498">circuit.cc:498</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a9a75e5a5c8a2be39edaf66f75618704a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a">operations_research::sat::LoadAtMostOneConstraint</a></div><div class="ttdeci">void LoadAtMostOneConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00969">cp_model_loader.cc:969</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IndexReferences_html_a0821f58cb944376b1f8919327f202443"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IndexReferences.html#a0821f58cb944376b1f8919327f202443">operations_research::sat::IndexReferences::variables</a></div><div class="ttdeci">std::vector&lt; int &gt; variables</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00053">cp_model_utils.h:53</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Literal_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Literal.html">operations_research::sat::Literal</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00064">sat_base.h:64</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a835826c4c5129b74553042a357a721ff"><div class="ttname"><a href="classoperations__research_1_1Domain.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="anamespaceoperations__research_1_1sat_html_acdbc8ad33149d45a6e6fcd8b72fd68ed"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">operations_research::sat::PositiveRef</a></div><div class="ttdeci">int PositiveRef(int ref)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00033">cp_model_utils.h:33</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1e0082b201a54cee7bf210998888c328"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328">operations_research::sat::LoadBoolOrConstraint</a></div><div class="ttdeci">void LoadBoolOrConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00946">cp_model_loader.cc:946</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1FullEncodingFixedPointComputer_html_a32d32af5ccf5a40ab7e994094624153a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1FullEncodingFixedPointComputer.html#a32d32af5ccf5a40ab7e994094624153a">operations_research::sat::FullEncodingFixedPointComputer::FullEncodingFixedPointComputer</a></div><div class="ttdeci">FullEncodingFixedPointComputer(const CpModelProto &amp;model_proto, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00670">cp_model_loader.cc:670</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1997882201b68c607f2aef7e7369ef67"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1997882201b68c607f2aef7e7369ef67">operations_research::sat::WeightedSumGreaterOrEqual</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; WeightedSumGreaterOrEqual(const std::vector&lt; IntegerVariable &gt; &amp;vars, const VectorInt &amp;coefficients, int64 lower_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00371">integer_expr.h:371</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a29dc0991abf59a6d30c457b2de0f8e0b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a29dc0991abf59a6d30c457b2de0f8e0b">operations_research::sat::CpModelMapping::Integers</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; Integers(const List &amp;list) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00129">cp_model_loader.h:129</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1c3fa75911c74ce485e62814484c7ae7"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1c3fa75911c74ce485e62814484c7ae7">operations_research::sat::LoadConstraint</a></div><div class="ttdeci">bool LoadConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01749">cp_model_loader.cc:1749</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a38766514ce4824ae1e093a25d7fb43b3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a38766514ce4824ae1e093a25d7fb43b3">operations_research::sat::NewBooleanVariable</a></div><div class="ttdeci">std::function&lt; BooleanVariable(Model *)&gt; NewBooleanVariable()</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01315">integer.h:1315</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a8e12342fc420701fbffd97025421575a"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a8e12342fc420701fbffd97025421575a">operations_research::Domain::IsEmpty</a></div><div class="ttdeci">bool IsEmpty() const</div><div class="ttdoc">Returns true if this is the empty set.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00190">sorted_interval_list.cc:190</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a39bcc12f6eb31e15986f6a824e9bae8c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a39bcc12f6eb31e15986f6a824e9bae8c">operations_research::sat::CpModelMapping::Intervals</a></div><div class="ttdeci">std::vector&lt; IntervalVariable &gt; Intervals(const ProtoIndices &amp;indices) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00143">cp_model_loader.h:143</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5671353b0876a1d63e61414bd02f1081"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5671353b0876a1d63e61414bd02f1081">operations_research::sat::BooleanLinearConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; BooleanLinearConstraint(int64 lower_bound, int64 upper_bound, std::vector&lt; LiteralWithCoeff &gt; *cst)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00832">sat_solver.h:832</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0ecd323ccf9fe1a8c2e35f7ab94674bf"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0ecd323ccf9fe1a8c2e35f7ab94674bf">operations_research::sat::ConditionalWeightedSumLowerOrEqual</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ConditionalWeightedSumLowerOrEqual(const std::vector&lt; Literal &gt; &amp;enforcement_literals, const std::vector&lt; IntegerVariable &gt; &amp;vars, const VectorInt &amp;coefficients, int64 upper_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00393">integer_expr.h:393</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa5832284102731626af241e30ed9134f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f">operations_research::sat::LoadAllDiffConstraint</a></div><div class="ttdeci">void LoadAllDiffConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01202">cp_model_loader.cc:1202</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerEncoder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerEncoder.html">operations_research::sat::IntegerEncoder</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00278">integer.h:278</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Literal_html_a886e9c024f7209181c0a850b6e90c644"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Literal.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="asat__parameters_8pb_8h_html"><div class="ttname"><a href="sat__parameters_8pb_8h.html">sat_parameters.pb.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a31ce182acd5d18c1cca240566d510666"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a31ce182acd5d18c1cca240566d510666">operations_research::sat::TransitionConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; TransitionConstraint(const std::vector&lt; IntegerVariable &gt; &amp;vars, const std::vector&lt; std::vector&lt; int64 &gt;&gt; &amp;automaton, int64 initial_state, const std::vector&lt; int64 &gt; &amp;final_states)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2table_8cc_source.html#l00591">sat/table.cc:591</a></div></div>
<div class="ttc" id="aint__type_8h_html"><div class="ttname"><a href="int__type_8h.html">int_type.h</a></div></div>
<div class="ttc" id="aprecedences_8h_html"><div class="ttname"><a href="precedences_8h.html">precedences.h</a></div></div>
<div class="ttc" id="aintervals_8h_html"><div class="ttname"><a href="intervals_8h.html">intervals.h</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IndexReferences_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IndexReferences.html">operations_research::sat::IndexReferences</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00052">cp_model_utils.h:52</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1AffineExpression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1AffineExpression.html">operations_research::sat::AffineExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00214">integer.h:214</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_aa3361a48335b9de95fcefa9dc5dc3e22"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#aa3361a48335b9de95fcefa9dc5dc3e22">operations_research::sat::CpModelMapping::DetectOptionalVariables</a></div><div class="ttdeci">void DetectOptionalVariables(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00589">cp_model_loader.cc:589</a></div></div>
<div class="ttc" id="anamespacegtl_html_a288a1dc92da5d3ad62d4bc4cec9e8b1d"><div class="ttname"><a href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a></div><div class="ttdeci">void STLSortAndRemoveDuplicates(T *v, const LessFunc &amp;less_func)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00058">stl_util.h:58</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a54ff6ea10d4aafe131b6bfa4176b334a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a54ff6ea10d4aafe131b6bfa4176b334a">operations_research::sat::AddTableConstraint</a></div><div class="ttdeci">void AddTableConstraint(absl::Span&lt; const IntegerVariable &gt; vars, std::vector&lt; std::vector&lt; int64 &gt;&gt; tuples, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2table_8cc_source.html#l00248">sat/table.cc:248</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5ec390fe1c25c7af4de7a30f84a0cd27"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5ec390fe1c25c7af4de7a30f84a0cd27">operations_research::sat::CanonicalizeExpr</a></div><div class="ttdeci">LinearExpression CanonicalizeExpr(const LinearExpression &amp;expr)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8cc_source.html#l00271">linear_constraint.cc:271</a></div></div>
<div class="ttc" id="ainteger__expr_8h_html"><div class="ttname"><a href="integer__expr_8h.html">integer_expr.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a615085331bd86d852e84f75fcadbeaa1"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a615085331bd86d852e84f75fcadbeaa1">operations_research::sat::Cumulative</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; Cumulative(const std::vector&lt; IntervalVariable &gt; &amp;vars, const std::vector&lt; AffineExpression &gt; &amp;demands, AffineExpression capacity, SchedulingConstraintHelper *helper)</div><div class="ttdef"><b>Definition:</b> <a href="cumulative_8cc_source.html#l00035">cumulative.cc:35</a></div></div>
<div class="ttc" id="aint__type__indexed__vector_8h_html"><div class="ttname"><a href="int__type__indexed__vector_8h.html">int_type_indexed_vector.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a373e6412ac911205ed63206556680bec"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a373e6412ac911205ed63206556680bec">operations_research::sat::PartialIsOneOfVar</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; PartialIsOneOfVar(IntegerVariable target_var, const std::vector&lt; IntegerVariable &gt; &amp;vars, const std::vector&lt; Literal &gt; &amp;selectors)</div><div class="ttdef"><b>Definition:</b> <a href="cp__constraints_8h_source.html#l00159">cp_constraints.h:159</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a42a3b266d8c6dfab1c14baa6c04e2333"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">operations_research::sat::HasEnforcementLiteral</a></div><div class="ttdeci">bool HasEnforcementLiteral(const ConstraintProto &amp;ct)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00037">cp_model_utils.h:37</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a85f779432cdf63a07905deaae7fd0041"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041">operations_research::sat::LoadLinearConstraint</a></div><div class="ttdeci">void LoadLinearConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01055">cp_model_loader.cc:1055</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a42094dcdae62a62bd5d269e1223f7f30"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a42094dcdae62a62bd5d269e1223f7f30">operations_research::sat::CircuitCovering</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; CircuitCovering(const std::vector&lt; std::vector&lt; Literal &gt;&gt; &amp;graph, const std::vector&lt; int &gt; &amp;distinguished_nodes)</div><div class="ttdef"><b>Definition:</b> <a href="circuit_8cc_source.html#l00540">circuit.cc:540</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_a05da18ca9c7b657a4a6ea24e07c9b695"><div class="ttname"><a href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a></div><div class="ttdeci">const Constraint * ct</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00042">demon_profiler.cc:42</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html_a267d05a02fdcc9439a5a54bf9f0ccd3c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html#a267d05a02fdcc9439a5a54bf9f0ccd3c">operations_research::sat::IntegerTrail::ReserveSpaceForNumVariables</a></div><div class="ttdeci">void ReserveSpaceForNumVariables(int num_vars)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00580">integer.cc:580</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a3f1a1b8a7a1a488e263a2e74f45d2a59"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59">operations_research::sat::Value</a></div><div class="ttdeci">std::function&lt; int64(const Model &amp;)&gt; Value(IntegerVariable v)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01396">integer.h:1396</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_add67896a84f6372a648154c5770a0ae0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">operations_research::sat::kNoBooleanVariable</a></div><div class="ttdeci">const BooleanVariable kNoBooleanVariable(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a949fa684e53fd6a18a2d1f79133fd80a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a949fa684e53fd6a18a2d1f79133fd80a">operations_research::sat::WeightedSumLowerOrEqual</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; WeightedSumLowerOrEqual(const std::vector&lt; IntegerVariable &gt; &amp;vars, const VectorInt &amp;coefficients, int64 upper_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00266">integer_expr.h:266</a></div></div>
<div class="ttc" id="acp__constraints_8h_html"><div class="ttname"><a href="cp__constraints_8h.html">cp_constraints.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ace76b216f012cbdf1443670080329f6d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ace76b216f012cbdf1443670080329f6d">operations_research::sat::IsFixed</a></div><div class="ttdeci">std::function&lt; bool(const Model &amp;)&gt; IsFixed(IntegerVariable v)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01388">integer.h:1388</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a467d0c8bf263413aae5e5e530d4c5259"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a467d0c8bf263413aae5e5e530d4c5259">operations_research::sat::AllDifferentOnBounds</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; AllDifferentOnBounds(const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="all__different_8cc_source.html#l00065">all_different.cc:65</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="anamespaceoperations__research_1_1sat_html_a5e73a3f1991b59b82c0305c56add5b2b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5e73a3f1991b59b82c0305c56add5b2b">operations_research::sat::NewInterval</a></div><div class="ttdeci">std::function&lt; IntervalVariable(Model *)&gt; NewInterval(int64 min_start, int64 max_end, int64 size)</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00546">intervals.h:546</a></div></div>
<div class="ttc" id="aclassgtl_1_1ITIVector_html_a184fe69018ae421dcf31c964bfe40576"><div class="ttname"><a href="classgtl_1_1ITIVector.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="aclassoperations__research_1_1sat_1_1CpModelMapping_html_adfbeb7391a9578a4cdba60c46b05e19e"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#adfbeb7391a9578a4cdba60c46b05e19e">operations_research::sat::CpModelMapping::PropagateEncodingFromEquivalenceRelations</a></div><div class="ttdeci">void PropagateEncodingFromEquivalenceRelations(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00506">cp_model_loader.cc:506</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_a877d019ee57a306f9dc8da11efcb4c82"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#a877d019ee57a306f9dc8da11efcb4c82">operations_research::sat::CpModelMapping::Integer</a></div><div class="ttdeci">IntegerVariable Integer(int ref) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00115">cp_model_loader.h:115</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a620b799ba99bb090cbaa754aaa0340b1"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a620b799ba99bb090cbaa754aaa0340b1">operations_research::sat::ImpliesInInterval</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ImpliesInInterval(Literal in_interval, IntegerVariable v, int64 lb, int64 ub)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01473">integer.h:1473</a></div></div>
<div class="ttc" id="adiffn_8h_html"><div class="ttname"><a href="diffn_8h.html">diffn.h</a></div></div>
<div class="ttc" id="asorted__interval__list_8h_html"><div class="ttname"><a href="sorted__interval__list_8h.html">sorted_interval_list.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab7778f357afa2e048d4771666747d19a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab7778f357afa2e048d4771666747d19a">operations_research::sat::LoadIntMinConstraint</a></div><div class="ttdeci">void LoadIntMinConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01255">cp_model_loader.cc:1255</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1655a9b9673e7c4de940ca6e5e3cf936"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1655a9b9673e7c4de940ca6e5e3cf936">operations_research::sat::ClauseConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ClauseConstraint(absl::Span&lt; const Literal &gt; literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00884">sat_solver.h:884</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab716457062d8500d7315cfe29646de6b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b">operations_research::sat::LoadNoOverlap2dConstraint</a></div><div class="ttdeci">void LoadNoOverlap2dConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01301">cp_model_loader.cc:1301</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_1Domain_html_a3ee4169fd7956b77331450d8c7f16bfa"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a3ee4169fd7956b77331450d8c7f16bfa">operations_research::Domain::InverseMultiplicationBy</a></div><div class="ttdeci">Domain InverseMultiplicationBy(const int64 coeff) const</div><div class="ttdoc">Returns {x ∈ Int64, ∃ e ∈ D, x * coeff = e}.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00433">sorted_interval_list.cc:433</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a9f7dc553b18e0a44b713b2513f29a26f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f">operations_research::sat::LoadNoOverlapConstraint</a></div><div class="ttdeci">void LoadNoOverlapConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01296">cp_model_loader.cc:1296</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1LinearExpression_html_acd07f8397a2e61932c8ee17a4e300e23"><div class="ttname"><a href="structoperations__research_1_1sat_1_1LinearExpression.html#acd07f8397a2e61932c8ee17a4e300e23">operations_research::sat::LinearExpression::offset</a></div><div class="ttdeci">IntegerValue offset</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8h_source.html#l00168">linear_constraint.h:168</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a59ba67bcf20a8657c8d0e6c3f120121f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f">operations_research::sat::LoadBoolXorConstraint</a></div><div class="ttdeci">void LoadBoolXorConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00975">cp_model_loader.cc:975</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a217338425de4389014563f1f24331713"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">operations_research::sat::RefIsPositive</a></div><div class="ttdeci">bool RefIsPositive(int ref)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00034">cp_model_utils.h:34</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html">operations_research::sat::CpModelMapping</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00063">cp_model_loader.h:63</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html_ab857cd2aead68952d9fe92a8ad8d3ac9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">operations_research::sat::IntegerTrail::LowerBound</a></div><div class="ttdeci">IntegerValue LowerBound(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01217">integer.h:1217</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerTrail_html_af931801f592e954a6623cab8cf9a4485"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerTrail.html#af931801f592e954a6623cab8cf9a4485">operations_research::sat::IntegerTrail::UpdateInitialDomain</a></div><div class="ttdeci">bool UpdateInitialDomain(IntegerVariable var, Domain domain)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00636">integer.cc:636</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab8221efb0cc3dd5059674845b4db7fed"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab8221efb0cc3dd5059674845b4db7fed">operations_research::sat::AtMostOneConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; AtMostOneConstraint(const std::vector&lt; Literal &gt; &amp;literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00870">sat_solver.h:870</a></div></div>
<div class="ttc" id="astl__util_8h_html"><div class="ttname"><a href="stl__util_8h.html">stl_util.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae5a0213a97d668b2779c39b2d52f1ebd"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae5a0213a97d668b2779c39b2d52f1ebd">operations_research::sat::LoadElementConstraintAC</a></div><div class="ttdeci">void LoadElementConstraintAC(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01439">cp_model_loader.cc:1439</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a9d6526e2b6f684e7c3c80172b598b7cb"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9d6526e2b6f684e7c3c80172b598b7cb">operations_research::sat::AllDifferentBinary</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; AllDifferentBinary(const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="all__different_8cc_source.html#l00031">all_different.cc:31</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a82440fdc41975175a20f334ea8767f0a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a82440fdc41975175a20f334ea8767f0a">operations_research::sat::ConditionalWeightedSumGreaterOrEqual</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ConditionalWeightedSumGreaterOrEqual(const std::vector&lt; Literal &gt; &amp;enforcement_literals, const std::vector&lt; IntegerVariable &gt; &amp;vars, const VectorInt &amp;coefficients, int64 lower_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00470">integer_expr.h:470</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a27da77e2f3fc205f1b3b184db3c9bd77"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a27da77e2f3fc205f1b3b184db3c9bd77">operations_research::sat::MaybeFullyEncodeMoreVariables</a></div><div class="ttdeci">void MaybeFullyEncodeMoreVariables(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00937">cp_model_loader.cc:937</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a065363842a90de5a698b26f25ebb4dcb"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a065363842a90de5a698b26f25ebb4dcb">operations_research::sat::LoadTableConstraint</a></div><div class="ttdeci">void LoadTableConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01638">cp_model_loader.cc:1638</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a1f1de3874966a137f140748498f43e0c"><div class="ttname"><a href="classoperations__research_1_1Domain.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="anamespaceoperations__research_1_1sat_html_a93f88f728c3591678a7052bb92ee53d0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a93f88f728c3591678a7052bb92ee53d0">operations_research::sat::Disjunctive</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; Disjunctive(const std::vector&lt; IntervalVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="disjunctive_8cc_source.html#l00030">disjunctive.cc:30</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_ad78bf6fcea4b54f750e2457e47b4f46a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#ad78bf6fcea4b54f750e2457e47b4f46a">operations_research::sat::CpModelMapping::ExtractEncoding</a></div><div class="ttdeci">void ExtractEncoding(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00259">cp_model_loader.cc:259</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1IntegerLiteral_html_a3e2eb445631727dd4abf1d5343f16b2f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1IntegerLiteral.html#a3e2eb445631727dd4abf1d5343f16b2f">operations_research::sat::IntegerLiteral::LowerOrEqual</a></div><div class="ttdeci">static IntegerLiteral LowerOrEqual(IntegerVariable i, IntegerValue bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01203">integer.h:1203</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab316e19c73976fdd6381a93d1458699f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab316e19c73976fdd6381a93d1458699f">operations_research::sat::IsEqualToMinOf</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; IsEqualToMinOf(IntegerVariable min_var, const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00628">integer_expr.h:628</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a50082c82c7d605e10de47911f0485526"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526">operations_research::sat::LoadCumulativeConstraint</a></div><div class="ttdeci">void LoadCumulativeConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01313">cp_model_loader.cc:1313</a></div></div>
<div class="ttc" id="acp__model__loader_8h_html"><div class="ttname"><a href="cp__model__loader_8h.html">cp_model_loader.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a21cd443822d7670052ac766e731d3ea0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a21cd443822d7670052ac766e731d3ea0">operations_research::sat::DivisionConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; DivisionConstraint(IntegerVariable a, IntegerVariable b, IntegerVariable c)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00792">integer_expr.h:792</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8a0620c105ec05f1b42bcde3a9380872"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8a0620c105ec05f1b42bcde3a9380872">operations_research::sat::Implication</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; Implication(const std::vector&lt; Literal &gt; &amp;enforcement_literals, IntegerLiteral i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01446">integer.h:1446</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a607ba8d18e00b2e6dbdc8622bb74fdf5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a607ba8d18e00b2e6dbdc8622bb74fdf5">operations_research::sat::Equality</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; Equality(IntegerVariable v, int64 value)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01433">integer.h:1433</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1CpModelMapping_html_ad67b08fb6b8be443da8c4427d3e83a77"><div class="ttname"><a href="classoperations__research_1_1sat_1_1CpModelMapping.html#ad67b08fb6b8be443da8c4427d3e83a77">operations_research::sat::CpModelMapping::PotentialEncodedValues</a></div><div class="ttdeci">const absl::flat_hash_set&lt; int64 &gt; &amp; PotentialEncodedValues(int var)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00200">cp_model_loader.h:200</a></div></div>
<div class="ttc" id="aclassgtl_1_1ITIVector_html"><div class="ttname"><a href="classgtl_1_1ITIVector.html">gtl::ITIVector&lt; ConstraintIndex, bool &gt;</a></div></div>
<div class="ttc" id="arouting__flow_8cc_html_adf3be22c64f10c0783c0cf277e857adf"><div class="ttname"><a href="routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf">capacity</a></div><div class="ttdeci">int64 capacity</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00129">routing_flow.cc:129</a></div></div>
<div class="ttc" id="acp__model__fz__solver_8cc_html_aed003f5eb5197bc586b7ef2c36a63da2"><div class="ttname"><a href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a></div><div class="ttdeci">CpModelProto proto</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__fz__solver_8cc_source.html#l00106">cp_model_fz_solver.cc:106</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5b41bc8ce6039029dcbd0463c9edac10"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5b41bc8ce6039029dcbd0463c9edac10">operations_research::sat::GetExprFromProto</a></div><div class="ttdeci">LinearExpression GetExprFromProto(const LinearExpressionProto &amp;expr_proto, const CpModelMapping &amp;mapping)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01263">cp_model_loader.cc:1263</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1IntegerEncoder_html_ac9e262bbda19ec4b7d51bd77b70bb363"><div class="ttname"><a href="classoperations__research_1_1sat_1_1IntegerEncoder.html#ac9e262bbda19ec4b7d51bd77b70bb363">operations_research::sat::IntegerEncoder::VariableIsFullyEncoded</a></div><div class="ttdeci">bool VariableIsFullyEncoded(IntegerVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00083">integer.cc:83</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Model_html_a8d72645353ea6770911c4e0724995ed6"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Model.html#a8d72645353ea6770911c4e0724995ed6">operations_research::sat::Model::GetOrCreate</a></div><div class="ttdeci">T * GetOrCreate()</div><div class="ttdoc">Returns an object of type T that is unique to this model (like a &quot;local&quot; singleton).</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00106">sat/model.h:106</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a5fa627799e723b650fe562b05e1fef5f"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a5fa627799e723b650fe562b05e1fef5f">operations_research::Domain::Max</a></div><div class="ttdeci">int64 Max() const</div><div class="ttdoc">Returns the max value of the domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00211">sorted_interval_list.cc:211</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_a53e9735282c0bf0769962bd1b6a643bc"><div class="ttname"><a href="classoperations__research_1_1Domain.html#a53e9735282c0bf0769962bd1b6a643bc">operations_research::Domain::Min</a></div><div class="ttdeci">int64 Min() const</div><div class="ttdoc">Returns the min value of the domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00206">sorted_interval_list.cc:206</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1Model_html_a7b8d774b566431b8932ba0f3c921ec7d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1Model.html#a7b8d774b566431b8932ba0f3c921ec7d">operations_research::sat::Model::Add</a></div><div class="ttdeci">T Add(std::function&lt; T(Model *)&gt; f)</div><div class="ttdoc">This makes it possible to have a nicer API on the client side, and it allows both of these forms:</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00081">sat/model.h:81</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab10c770cf73412d0e305c51ea08d8936"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab10c770cf73412d0e305c51ea08d8936">operations_research::sat::LoadAutomatonConstraint</a></div><div class="ttdeci">void LoadAutomatonConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01659">cp_model_loader.cc:1659</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a14d3bed64d7fdf5b081c349270c4cf11"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a14d3bed64d7fdf5b081c349270c4cf11">operations_research::sat::IsEqualToMaxOf</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; IsEqualToMaxOf(IntegerVariable max_var, const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00697">integer_expr.h:697</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_a3460e93c00f161146120fa1d3afa6757"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3460e93c00f161146120fa1d3afa6757">operations_research::sat::NewOptionalInterval</a></div><div class="ttdeci">std::function&lt; IntervalVariable(Model *)&gt; NewOptionalInterval(int64 min_start, int64 max_end, int64 size, Literal is_present)</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00576">intervals.h:576</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab1240060466ba48a36a4b36379bce26a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">operations_research::sat::ReadDomainFromProto</a></div><div class="ttdeci">Domain ReadDomainFromProto(const ProtoWithDomain &amp;proto)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00102">cp_model_utils.h:102</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa874aee040980146062498b87e8fb956"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa874aee040980146062498b87e8fb956">operations_research::sat::ReifiedBoolAnd</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ReifiedBoolAnd(const std::vector&lt; Literal &gt; &amp;literals, Literal r)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00948">sat_solver.h:948</a></div></div>
<div class="ttc" id="acumulative_8h_html"><div class="ttname"><a href="cumulative_8h.html">cumulative.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a65a415fdc0a0885f902e15fd3b063de3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a65a415fdc0a0885f902e15fd3b063de3">operations_research::sat::GetSquareMatrixFromIntegerVariables</a></div><div class="ttdeci">std::vector&lt; std::vector&lt; Literal &gt; &gt; GetSquareMatrixFromIntegerVariables(const std::vector&lt; IntegerVariable &gt; &amp;vars, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01681">cp_model_loader.cc:1681</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae3dc489becb957e8bc67715667f55407"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae3dc489becb957e8bc67715667f55407">operations_research::sat::ProductConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ProductConstraint(IntegerVariable a, IntegerVariable b, IntegerVariable p)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00751">integer_expr.h:751</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a9efd0c8eeb19a442913b4b3c98534a1c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a9efd0c8eeb19a442913b4b3c98534a1c">operations_research::sat::LoadIntMaxConstraint</a></div><div class="ttdeci">void LoadIntMaxConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01288">cp_model_loader.cc:1288</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4ae75bf9ab807bf21ce2caebb7321be0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4ae75bf9ab807bf21ce2caebb7321be0">operations_research::sat::FullyEncodeVariable</a></div><div class="ttdeci">std::function&lt; std::vector&lt; IntegerEncoder::ValueLiteralPair &gt;Model *)&gt; FullyEncodeVariable(IntegerVariable var)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01496">integer.h:1496</a></div></div>
<div class="ttc" id="acp__model__fz__solver_8cc_html_a10a1eab179b472c030bdc2a2efef7219"><div class="ttname"><a href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a></div><div class="ttdeci">SatParameters parameters</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__fz__solver_8cc_source.html#l00107">cp_model_fz_solver.cc:107</a></div></div>
<div class="ttc" id="atable_8h_html"><div class="ttname"><a href="table_8h.html">table.h</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="aintegral__types_8h_html_a74ea76ea27f48fb1b6e148e1577b3719"><div class="ttname"><a href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a></div><div class="ttdeci">static const int64 kint64max</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00062">integral_types.h:62</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1Domain_html_ab5228a93ebd3b866fc792ad8e5fe8fdc"><div class="ttname"><a href="classoperations__research_1_1Domain.html#ab5228a93ebd3b866fc792ad8e5fe8fdc">operations_research::Domain::Contains</a></div><div class="ttdeci">bool Contains(int64 value) const</div><div class="ttdoc">Returns true iff value is in Domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00221">sorted_interval_list.cc:221</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5dcbeecb5d63f15f9f4c79c2ffa08777"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5dcbeecb5d63f15f9f4c79c2ffa08777">operations_research::sat::kNoIntervalVariable</a></div><div class="ttdeci">const IntervalVariable kNoIntervalVariable(-1)</div></div>
<div class="ttc" id="acp__model__utils_8h_html"><div class="ttname"><a href="cp__model__utils_8h.html">cp_model_utils.h</a></div></div>
<div class="ttc" id="anamespacegtl_html_aae28e97bd1fa93cb0032642550da7455"><div class="ttname"><a href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a></div><div class="ttdeci">bool ContainsKey(const Collection &amp;collection, const Key &amp;key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00170">map_util.h:170</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="cp__model__loader_8cc.html">cp_model_loader.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.18 </li>
</ul>
</div>
</body>
</html>