Files
ortools-clone/docs/cpp/cp__model__loader_8cc_source.html
Laurent Perron 5615fe9c61 regenerate docs
2022-01-17 21:42:14 +01:00

1602 lines
356 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.3"/>
<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">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(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:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(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 id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><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 id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;map&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;set&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;absl/container/flat_hash_map.h&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;absl/container/flat_hash_set.h&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><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 id="l00029" name="l00029"></a><span class="lineno"> 29</span><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 id="l00030" name="l00030"></a><span class="lineno"> 30</span><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 id="l00031" name="l00031"></a><span class="lineno"> 31</span><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 id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &quot;<a class="code" href="strong__vector_8h.html">ortools/base/strong_vector.h</a>&quot;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &quot;<a class="code" href="vlog__is__on_8h.html">ortools/base/vlog_is_on.h</a>&quot;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><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 id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;<a class="code" href="circuit_8h.html">ortools/sat/circuit.h</a>&quot;</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><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 id="l00037" name="l00037"></a><span class="lineno"> 37</span><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 id="l00038" name="l00038"></a><span class="lineno"> 38</span><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 id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#include &quot;<a class="code" href="cumulative_8h.html">ortools/sat/cumulative.h</a>&quot;</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#include &quot;<a class="code" href="diffn_8h.html">ortools/sat/diffn.h</a>&quot;</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#include &quot;<a class="code" href="disjunctive_8h.html">ortools/sat/disjunctive.h</a>&quot;</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><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 id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#include &quot;<a class="code" href="integer_8h.html">ortools/sat/integer.h</a>&quot;</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><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 id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#include &quot;<a class="code" href="intervals_8h.html">ortools/sat/intervals.h</a>&quot;</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><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 id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="preprocessor">#include &quot;<a class="code" href="precedences_8h.html">ortools/sat/precedences.h</a>&quot;</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><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 id="l00049" name="l00049"></a><span class="lineno"> 49</span><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 id="l00050" name="l00050"></a><span class="lineno"> 50</span><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 id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#include &quot;<a class="code" href="symmetry_8h.html">ortools/sat/symmetry.h</a>&quot;</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#include &quot;<a class="code" href="table_8h.html">ortools/sat/table.h</a>&quot;</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#include &quot;<a class="code" href="timetable_8h.html">ortools/sat/timetable.h</a>&quot;</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#include &quot;<a class="code" href="util_2logging_8h.html">ortools/util/logging.h</a>&quot;</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><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 id="l00056" name="l00056"></a><span class="lineno"> 56</span><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 id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="keyword">namespace </span>sat {</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> </div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Values&gt;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>std::vector&lt;int64_t&gt; ValuesFromProto(<span class="keyword">const</span> Values&amp; values) {</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">return</span> std::vector&lt;int64_t&gt;(values.begin(), values.end());</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>}</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="keywordtype">void</span> ComputeLinearBounds(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>,</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> CpModelMapping* mapping, IntegerTrail* integer_trail,</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> int64_t* sum_min, int64_t* sum_max) {</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> *sum_min = 0;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> *sum_max = 0;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size(); ++i) {</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> = <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.coeffs(i);</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keyword">const</span> IntegerVariable <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = mapping-&gt;Integer(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars(i));</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keyword">const</span> int64_t lb = integer_trail-&gt;LowerBound(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).value();</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">const</span> int64_t ub = integer_trail-&gt;UpperBound(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).value();</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> &gt;= 0) {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> (*sum_min) += <a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> * lb;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> (*sum_max) += <a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> * ub;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> (*sum_min) += <a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> * ub;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> (*sum_max) += <a class="code hl_variable" href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a> * lb;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> }</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> }</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>}</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment">// We check if the constraint is a sum(ax * xi) == value.</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="keywordtype">bool</span> ConstraintIsEq(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>) {</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain_size() == 2 &amp;&amp; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain(0) == <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.domain(1);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span>}</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="comment">// We check if the constraint is a sum(ax * xi) != value.</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="keywordtype">bool</span> ConstraintIsNEq(<span class="keyword">const</span> LinearConstraintProto&amp; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>,</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> CpModelMapping* mapping, IntegerTrail* integer_trail,</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> int64_t* single_value) {</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> int64_t sum_min = 0;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> int64_t sum_max = 0;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> ComputeLinearBounds(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>, mapping, integer_trail, &amp;sum_min, &amp;sum_max);</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="keyword">const</span> Domain complement =</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> Domain(sum_min, sum_max)</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> .IntersectionWith(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>).Complement());</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">if</span> (complement.IsEmpty()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> = complement.Min();</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">if</span> (complement.Size() == 1) {</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">if</span> (single_value != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> *single_value = <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> }</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> }</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span>}</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a1a6eefe7a5bfd8bdf83407c9e6af56f5"> 119</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1a6eefe7a5bfd8bdf83407c9e6af56f5">LoadVariables</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordtype">bool</span> view_all_booleans_as_integers, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_proto_variables = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#abef5f55c3278c137faca92b8e433f8ea">variables_size</a>();</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> </div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="comment">// All [0, 1] variables always have a corresponding Boolean, even if it is</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="comment">// fixed to 0 (domain == [0,0]) or fixed to 1 (domain == [1,1]).</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(sat_solver-&gt;NumVariables(), 0);</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> BooleanVariable new_var(0);</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> std::vector&lt;BooleanVariable&gt; false_variables;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> std::vector&lt;BooleanVariable&gt; true_variables;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> mapping-&gt;booleans_.resize(num_proto_variables, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> mapping-&gt;reverse_boolean_map_.resize(num_proto_variables, -1);</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; domain = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">variables</a>(i).<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_variable_proto.html#a7d8011ca186f4ad850fcd0e2278d278c">domain</a>();</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">if</span> (domain.size() != 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">if</span> (domain[0] &gt;= 0 &amp;&amp; domain[1] &lt;= 1) {</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> mapping-&gt;booleans_[i] = new_var;</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> mapping-&gt;reverse_boolean_map_[new_var] = i;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">if</span> (domain[1] == 0) {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> false_variables.push_back(new_var);</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (domain[0] == 1) {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> true_variables.push_back(new_var);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> }</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> ++new_var;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> }</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> }</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> sat_solver-&gt;SetNumVariables(new_var.value());</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : true_variables) {</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">ClauseConstraint</a>({<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">true</span>)}));</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> }</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : false_variables) {</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">ClauseConstraint</a>({<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <span class="keyword">false</span>)}));</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> }</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> }</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="comment">// Compute the list of positive variable reference for which we need to</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="comment">// create an IntegerVariable.</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> std::vector&lt;int&gt; var_to_instantiate_as_integer;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keywordflow">if</span> (view_all_booleans_as_integers) {</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> var_to_instantiate_as_integer.resize(num_proto_variables);</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> var_to_instantiate_as_integer[i] = i;</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> }</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="comment">// Compute the integer variable references used by the model.</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> absl::flat_hash_set&lt;int&gt; used_variables;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_index_references.html">IndexReferences</a> refs;</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">constraints_size</a>(); ++c) {</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>(c);</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> refs = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aba8e3465fc58d3b287e05451d5230bae">GetReferencesUsedByConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : refs.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_index_references.html#a0821f58cb944376b1f8919327f202443">variables</a>) {</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> used_variables.insert(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref));</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> }</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> }</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="comment">// Add the objectives variables that needs to be referenceable as integer</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="comment">// even if they are only used as Booleans.</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a777a6e330a22a8889389cb9b9c9f12d6">has_objective</a>()) {</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> obj_var : <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a2787b866382b560920d55ce5cf129920">objective</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_objective_proto.html#a81a65d7e582fb45427e0ffe69666bad9">vars</a>()) {</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> used_variables.insert(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(obj_var));</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> }</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> }</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="comment">// Make sure any unused variable, that is not already a Boolean is</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="comment">// considered &quot;used&quot;.</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keywordflow">if</span> (mapping-&gt;booleans_[i] == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) {</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> used_variables.insert(i);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> }</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> }</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="comment">// We want the variable in the problem order.</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> var_to_instantiate_as_integer.assign(used_variables.begin(),</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> used_variables.end());</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;var_to_instantiate_as_integer);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> }</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> mapping-&gt;integers_.resize(num_proto_variables, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a267d05a02fdcc9439a5a54bf9f0ccd3c">ReserveSpaceForNumVariables</a>(</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> var_to_instantiate_as_integer.size());</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> mapping-&gt;reverse_integer_map_.resize(2 * var_to_instantiate_as_integer.size(),</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> -1);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <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 id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; var_proto = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">variables</a>(i);</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> mapping-&gt;integers_[i] =</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> integer_trail-&gt;AddIntegerVariable(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(var_proto));</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(mapping-&gt;integers_[i], mapping-&gt;reverse_integer_map_.size());</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> mapping-&gt;reverse_integer_map_[mapping-&gt;integers_[i]] = i;</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> }</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">auto</span>* encoder = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keyword">auto</span>* intervals_repository = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_intervals_repository.html">IntervalsRepository</a>&gt;();</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> </div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// Link any variable that has both views.</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_proto_variables; ++i) {</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keywordflow">if</span> (mapping-&gt;integers_[i] == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">if</span> (mapping-&gt;booleans_[i] == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#add67896a84f6372a648154c5770a0ae0">kNoBooleanVariable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> </div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="comment">// Associate with corresponding integer variable.</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> encoder-&gt;AssociateToIntegerEqualValue(</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a>(mapping-&gt;booleans_[i], <span class="keyword">true</span>), mapping-&gt;integers_[i],</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> IntegerValue(1));</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> }</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> </div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="comment">// Create the interval variables.</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> mapping-&gt;intervals_.resize(<a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">constraints_size</a>(),</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5dcbeecb5d63f15f9f4c79c2ffa08777">kNoIntervalVariable</a>);</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">constraints_size</a>(); ++c) {</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>(c);</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != ConstraintProto::ConstraintCase::kInterval) {</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> }</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> enforcement_literal =</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a03f5ae0ce9819070959d97a8ba3fafeb">Literal</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal(0));</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="comment">// TODO(user): Fix the constant variable situation. An optional interval</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="comment">// with constant start/end or size cannot share the same constant</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="comment">// variable if it is used in non-optional situation.</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> mapping-&gt;intervals_[c] = intervals_repository-&gt;CreateInterval(</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().start()),</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().end()),</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().size()), enforcement_literal.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>(),</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="comment">/*add_linear_relation=*/</span><span class="keyword">false</span>);</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> mapping-&gt;intervals_[c] = intervals_repository-&gt;CreateInterval(</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().start()),</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().end()),</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.interval().size()), <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>,</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">/*add_linear_relation=*/</span><span class="keyword">false</span>);</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> }</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> mapping-&gt;already_loaded_ct_.insert(&amp;<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> }</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span>}</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a4af0100d434de55ff841156fdac6d180"> 261</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4af0100d434de55ff841156fdac6d180">LoadBooleanSymmetries</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_symmetry_proto.html">SymmetryProto</a>&amp; symmetry = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#ab1fa807713e298b5262f1b6085834b69">symmetry</a>();</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keywordflow">if</span> (symmetry.permutations().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="comment">// We currently can only use symmetry that touch a subset of variables.</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">variables</a>().size();</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> std::vector&lt;bool&gt; can_be_used_in_symmetry(num_vars, <span class="keyword">true</span>);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="comment">// First, we currently only support loading symmetry between Booleans.</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v &lt; num_vars; ++v) {</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="keywordflow">if</span> (!mapping-&gt;IsBoolean(v)) can_be_used_in_symmetry[v] = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> }</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> </div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">// Tricky: Moreover, some constraint will causes extra Boolean to be created</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// and linked with the Boolean in the constraints. We can&#39;t use any of the</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="comment">// symmetry that touch these since we potentially miss the component that will</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="comment">// map these extra Booleans between each other.</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="comment">//</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="comment">// TODO(user): We could add these extra Boolean during expansion/presolve so</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// that we have the symmetry involing them. Or maybe comes up with a different</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="comment">// solution.</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_constraints = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>().size();</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; num_constraints; ++c) {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>(c);</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != <a class="code hl_enumvalue" href="classoperations__research_1_1sat_1_1_constraint_proto.html#ada030f50fcddb646af448ac7c5705e35ac188c019178783e5be55110601309d7d">ConstraintProto::kLinear</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain().size() &lt;= 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// A linear with a complex domain might need extra Booleans to be loaded.</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// Note that it should be fine for the Boolean(s) in enforcement_literal</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <span class="comment">// though.</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars()) {</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> can_be_used_in_symmetry[<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref)] = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> }</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> }</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> </div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keyword">auto</span>* symmetry_handler = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_symmetry_propagator.html">SymmetryPropagator</a>&gt;();</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> sat_solver-&gt;AddPropagator(symmetry_handler);</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_literals = 2 * sat_solver-&gt;NumVariables();</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> </div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_sparse_permutation_proto.html">SparsePermutationProto</a>&amp; perm : symmetry.permutations()) {</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <span class="keywordtype">bool</span> can_be_used = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : perm.support()) {</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordflow">if</span> (!can_be_used_in_symmetry[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>]) {</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> can_be_used = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> }</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> }</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keywordflow">if</span> (!can_be_used) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="comment">// Convert the variable symmetry to a &quot;literal&quot; one.</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">auto</span> literal_permutation =</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> absl::make_unique&lt;SparsePermutation&gt;(num_literals);</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordtype">int</span> support_index = 0;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_cycle = perm.cycle_sizes().size();</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_cycle; ++i) {</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = perm.cycle_sizes(i);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keyword">const</span> <span class="keywordtype">int</span> saved_support_index = support_index;</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; size; ++j) {</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = perm.support(support_index++);</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> literal_permutation-&gt;AddToCurrentCycle(</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> mapping-&gt;Literal(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).Index().value());</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> }</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> literal_permutation-&gt;CloseCurrentCycle();</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> <span class="comment">// Note that we also need to add the corresponding cycle for the negated</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="comment">// literals.</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> support_index = saved_support_index;</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; size; ++j) {</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = perm.support(support_index++);</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> literal_permutation-&gt;AddToCurrentCycle(</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> mapping-&gt;Literal(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>).NegatedIndex().value());</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> }</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> literal_permutation-&gt;CloseCurrentCycle();</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> }</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> symmetry_handler-&gt;AddSymmetry(std::move(literal_permutation));</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> }</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> </div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1_solver_logger.html">SolverLogger</a>&gt;(), <span class="stringliteral">&quot;Added &quot;</span>,</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> symmetry_handler-&gt;num_permutations(),</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="stringliteral">&quot; symmetry to the SAT solver.&quot;</span>);</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span>}</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> </div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span><span class="comment">// The logic assumes that the linear constraints have been presolved, so that</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span><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 id="l00347" name="l00347"></a><span class="lineno"> 347</span><span class="comment">// never have any trivial inequalities.</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span><span class="comment">//</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="comment">// TODO(user): Regroup/presolve two encoding like b =&gt; x &gt; 2 and the same</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span><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 id="l00351" name="l00351"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#ad78bf6fcea4b54f750e2457e47b4f46a"> 351</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ad78bf6fcea4b54f750e2457e47b4f46a">ExtractEncoding</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="keyword">auto</span>* encoder = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> </div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="comment">// TODO(user): Debug what makes it unsat at this point.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> </div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> <span class="comment">// Detection of literal equivalent to (i_var == value). We collect all the</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="comment">// half-reified constraint lit =&gt; equality or lit =&gt; inequality for a given</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="comment">// variable, and we will later sort them to detect equivalence.</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="keyword">struct </span>EqualityDetectionHelper {</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>* <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>;</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> int64_t <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> <span class="keywordtype">bool</span> is_equality; <span class="comment">// false if != instead.</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> </div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <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 id="l00370" name="l00370"></a><span class="lineno"> 370</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() == o.literal.Variable()) {</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> == o.value) <span class="keywordflow">return</span> is_equality &amp;&amp; !o.is_equality;</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> &lt; o.value;</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> }</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() &lt; o.literal.Variable();</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> }</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> };</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> std::vector&lt;std::vector&lt;EqualityDetectionHelper&gt;&gt; var_to_equalities(</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#abef5f55c3278c137faca92b8e433f8ea">variables_size</a>());</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> </div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <span class="comment">// TODO(user): We will re-add the same implied bounds during probing, so</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="comment">// it might not be necessary to do that here. Also, it might be too early</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <span class="comment">// if some of the literal view used in the LP are created later, but that</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="comment">// should be fixable via calls to implied_bounds-&gt;NotifyNewIntegerView().</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keyword">auto</span>* implied_bounds = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>&gt;();</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="comment">// Detection of literal equivalent to (i_var &gt;= bound). We also collect</span></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="comment">// all the half-refied part and we will sort the vector for detection of the</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="comment">// equivalence.</span></div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keyword">struct </span>InequalityDetectionHelper {</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>* <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_integer_literal.html">IntegerLiteral</a> i_lit;</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> <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 id="l00395" name="l00395"></a><span class="lineno"> 395</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() == o.literal.Variable()) {</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="keywordflow">return</span> i_lit.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_integer_literal.html#ab6516f556b715738034b30d290c40214">var</a> &lt; o.i_lit.var;</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> }</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable() &lt; o.literal.Variable();</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> }</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> };</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> std::vector&lt;InequalityDetectionHelper&gt; inequalities;</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> </div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="comment">// Loop over all constraints and fill var_to_equalities and inequalities.</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> : <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>()) {</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != ConstraintProto::ConstraintCase::kLinear) {</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> }</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().size() != 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() != 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> </div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="comment">// ct is a linear constraint with one term and one enforcement literal.</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> enforcement_literal =</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a03f5ae0ce9819070959d97a8ba3fafeb">Literal</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal(0));</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (sat_solver-&gt;Assignment().LiteralIsFalse(enforcement_literal)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> </div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="keyword">const</span> <span class="keywordtype">int</span> ref = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(0);</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref);</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> </div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> domain = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">variables</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> domain_if_enforced =</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear())</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> .<a class="code hl_function" href="classoperations__research_1_1_domain.html#a1341b29865c5167a64de30c797672e4c">InverseMultiplicationBy</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(0) *</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(ref) ? 1 : -1));</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> </div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8e12342fc420701fbffd97025421575a">IsEmpty</a>()) {</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="keywordflow">if</span> (!sat_solver-&gt;AddUnitClause(enforcement_literal.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>())) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> }</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> </div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="comment">// Detect enforcement_literal =&gt; (var &gt;= value or var &lt;= value).</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a3dcbf23ccbed61ee64ec08a934f57a9c">NumIntervals</a>() == 1) {</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>() &gt;= domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>() &amp;&amp;</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() &gt; domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>()) {</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> inequalities.push_back({&amp;<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal,</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">IntegerLiteral::GreaterOrEqual</a>(</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> mapping-&gt;Integer(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> IntegerValue(domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>()))});</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() &lt;= domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() &amp;&amp;</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>() &lt; domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>()) {</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> inequalities.push_back({&amp;<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal,</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a3e2eb445631727dd4abf1d5343f16b2f">IntegerLiteral::LowerOrEqual</a>(</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> mapping-&gt;Integer(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> IntegerValue(domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>()))});</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> }</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> }</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> </div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="comment">// Detect implied bounds. The test is less strict than the above</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <span class="comment">// test.</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() &gt; domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>()) {</div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> implied_bounds-&gt;Add(</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> enforcement_literal,</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">IntegerLiteral::GreaterOrEqual</a>(</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> mapping-&gt;Integer(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), IntegerValue(domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>())));</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> }</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="keywordflow">if</span> (domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>() &lt; domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>()) {</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> implied_bounds-&gt;Add(</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> enforcement_literal,</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a3e2eb445631727dd4abf1d5343f16b2f">IntegerLiteral::LowerOrEqual</a>(mapping-&gt;Integer(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> IntegerValue(domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>())));</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> }</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> </div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="comment">// Detect enforcement_literal =&gt; (var == value or var != value).</span></div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> <span class="comment">//</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="comment">// Note that for domain with 2 values like [0, 1], we will detect both ==</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="comment">// 0 and != 1. Similarly, for a domain in [min, max], we should both</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="comment">// detect (== min) and (&lt;= min), and both detect (== max) and (&gt;= max).</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> {</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> inter = domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(domain_if_enforced);</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keywordflow">if</span> (!inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8e12342fc420701fbffd97025421575a">IsEmpty</a>() &amp;&amp; inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() == inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>()) {</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> var_to_equalities[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].push_back(</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> {&amp;<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal, inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>(), <span class="keyword">true</span>});</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <span class="keywordflow">if</span> (domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a22c6c2f121586b5d76feb4b0e536dfde">Contains</a>(inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>())) {</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> mapping-&gt;variables_to_encoded_values_[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].insert(inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>());</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> }</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> }</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> }</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> {</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> inter =</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(domain_if_enforced.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a1f1de3874966a137f140748498f43e0c">Complement</a>());</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">if</span> (!inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8e12342fc420701fbffd97025421575a">IsEmpty</a>() &amp;&amp; inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>() == inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">Max</a>()) {</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> var_to_equalities[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].push_back(</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> {&amp;<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, enforcement_literal, inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>(), <span class="keyword">false</span>});</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> <span class="keywordflow">if</span> (domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a22c6c2f121586b5d76feb4b0e536dfde">Contains</a>(inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>())) {</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> mapping-&gt;variables_to_encoded_values_[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].insert(inter.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">Min</a>());</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> }</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> }</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> }</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> }</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> </div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="comment">// Detect Literal &lt;=&gt; X &gt;= value</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keywordtype">int</span> num_inequalities = 0;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> std::sort(inequalities.begin(), inequalities.end());</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i + 1 &lt; inequalities.size(); i++) {</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">if</span> (inequalities[i].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> != inequalities[i + 1].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) {</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> }</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> </div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="comment">// TODO(user): In these cases, we could fix the enforcement literal right</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="comment">// away or ignore the constraint. Note that it will be done later anyway</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="comment">// though.</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keywordflow">if</span> (integer_trail-&gt;IntegerLiteralIsTrue(inequalities[i].i_lit) ||</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> integer_trail-&gt;IntegerLiteralIsFalse(inequalities[i].i_lit)) {</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> }</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">if</span> (integer_trail-&gt;IntegerLiteralIsTrue(inequalities[i + 1].i_lit) ||</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> integer_trail-&gt;IntegerLiteralIsFalse(inequalities[i + 1].i_lit)) {</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> }</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keyword">const</span> <span class="keyword">auto</span> pair_a = encoder-&gt;Canonicalize(inequalities[i].i_lit);</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <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 id="l00512" name="l00512"></a><span class="lineno"> 512</span> <span class="keywordflow">if</span> (pair_a.first == pair_b.second) {</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> ++num_inequalities;</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> encoder-&gt;AssociateToIntegerLiteral(inequalities[i].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>,</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> inequalities[i].i_lit);</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> mapping-&gt;already_loaded_ct_.insert(inequalities[i].<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> mapping-&gt;already_loaded_ct_.insert(inequalities[i + 1].<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> }</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> }</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> </div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="comment">// Encode the half-inequalities.</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="keywordtype">int</span> num_half_inequalities = 0;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> inequality : inequalities) {</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="keywordflow">if</span> (mapping-&gt;ConstraintIsAlreadyLoaded(inequality.ct)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6e056f4efb99b080ae5bdb7267339f59">Implication</a>(inequality.literal,</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> encoder-&gt;GetOrCreateAssociatedLiteral(inequality.i_lit)));</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> ++num_half_inequalities;</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> mapping-&gt;already_loaded_ct_.insert(inequality.ct);</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> mapping-&gt;is_half_encoding_ct_.insert(inequality.ct);</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> }</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> </div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordflow">if</span> (!inequalities.empty()) {</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(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 id="l00537" name="l00537"></a><span class="lineno"> 537</span> &lt;&lt; num_half_inequalities &lt;&lt; <span class="stringliteral">&quot; half-associations.&quot;</span>;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> }</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> </div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="comment">// Detect Literal &lt;=&gt; X == value and associate them in the IntegerEncoder.</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <span class="comment">//</span></div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> <span class="comment">// TODO(user): Fully encode variable that are almost fully encoded?</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keywordtype">int</span> num_constraints = 0;</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordtype">int</span> num_equalities = 0;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="keywordtype">int</span> num_half_equalities = 0;</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> <span class="keywordtype">int</span> num_fully_encoded = 0;</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> <span class="keywordtype">int</span> num_partially_encoded = 0;</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; var_to_equalities.size(); ++i) {</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> std::vector&lt;EqualityDetectionHelper&gt;&amp; encoding = var_to_equalities[i];</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> std::sort(encoding.begin(), encoding.end());</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> <span class="keywordflow">if</span> (encoding.empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> num_constraints += encoding.size();</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> </div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> absl::flat_hash_set&lt;int64_t&gt; values;</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j + 1 &lt; encoding.size(); j++) {</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <span class="keywordflow">if</span> ((encoding[j].<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> != encoding[j + 1].<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>) ||</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> (encoding[j].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> != encoding[j + 1].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) ||</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> (encoding[j].is_equality != <span class="keyword">true</span>) ||</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> (encoding[j + 1].is_equality != <span class="keyword">false</span>)) {</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> }</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> </div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> ++num_equalities;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> encoder-&gt;AssociateToIntegerEqualValue(encoding[j].<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>,</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> mapping-&gt;integers_[i],</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> IntegerValue(encoding[j].<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>));</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> mapping-&gt;already_loaded_ct_.insert(encoding[j].<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> mapping-&gt;already_loaded_ct_.insert(encoding[j + 1].<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> values.insert(encoding[j].<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>);</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> }</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> </div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> <span class="comment">// TODO(user): Try to remove it. Normally we caught UNSAT above, but</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="comment">// tests are very flaky (it only happens in parallel). Keeping it there for</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="comment">// the time being.</span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> <span class="keywordflow">if</span> (sat_solver-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> </div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="comment">// Encode the half-equalities.</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="comment">//</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="comment">// TODO(user): delay this after PropagateEncodingFromEquivalenceRelations()?</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <span class="comment">// Otherwise we might create new Boolean variables for no reason. Note</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="comment">// however, that in the presolve, we should only use the &quot;representative&quot; in</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> <span class="comment">// linear constraints, so we should be fine.</span></div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> equality : encoding) {</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> <span class="keywordflow">if</span> (mapping-&gt;ConstraintIsAlreadyLoaded(equality.ct)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> <span class="keyword">const</span> <span class="keyword">class </span><a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> eq = encoder-&gt;GetOrCreateLiteralAssociatedToEquality(</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> mapping-&gt;integers_[i], IntegerValue(equality.value));</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="keywordflow">if</span> (equality.is_equality) {</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6e056f4efb99b080ae5bdb7267339f59">Implication</a>(equality.literal, eq));</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6e056f4efb99b080ae5bdb7267339f59">Implication</a>(equality.literal, eq.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> }</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> </div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> ++num_half_equalities;</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> mapping-&gt;already_loaded_ct_.insert(equality.ct);</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> mapping-&gt;is_half_encoding_ct_.insert(equality.ct);</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> }</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> </div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="comment">// Update stats.</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1)) {</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> <span class="keywordflow">if</span> (encoder-&gt;VariableIsFullyEncoded(mapping-&gt;integers_[i])) {</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> ++num_fully_encoded;</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> ++num_partially_encoded;</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> }</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> }</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> }</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> </div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> <span class="keywordflow">if</span> (num_constraints &gt; 0) {</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; num_equalities &lt;&lt; <span class="stringliteral">&quot; literals associated to VAR == value, and &quot;</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> &lt;&lt; num_half_equalities &lt;&lt; <span class="stringliteral">&quot; half-associations.&quot;</span>;</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> }</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="keywordflow">if</span> (num_fully_encoded &gt; 0) {</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;num_fully_encoded_variables: &quot;</span> &lt;&lt; num_fully_encoded;</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> }</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="keywordflow">if</span> (num_partially_encoded &gt; 0) {</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;num_partially_encoded_variables: &quot;</span> &lt;&lt; num_partially_encoded;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> }</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span>}</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> </div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a238dd948ee65a553d4617753c0d44d7b"> 620</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a238dd948ee65a553d4617753c0d44d7b">ExtractElementEncoding</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="keywordtype">int</span> num_element_encoded = 0;</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keyword">auto</span>* implied_bounds = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>&gt;();</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> </div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> <span class="comment">// Scan all exactly_one constraints and look for literal =&gt; var == value to</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> <span class="comment">// detect element encodings.</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">constraints_size</a>(); ++c) {</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>(c);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> </div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != <a class="code hl_enumvalue" href="classoperations__research_1_1sat_1_1_constraint_proto.html#ada030f50fcddb646af448ac7c5705e35ad60570d9bed938f8b11385a7ba7f3508">ConstraintProto::kExactlyOne</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> </div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="comment">// Project the implied values onto each integer variable.</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> absl::flat_hash_map&lt;IntegerVariable, std::vector&lt;ValueLiteralPair&gt;&gt;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> var_to_value_literal_list;</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> l : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.exactly_one().literals()) {</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> = mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a03f5ae0ce9819070959d97a8ba3fafeb">Literal</a>(l);</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; var_value : implied_bounds-&gt;GetImpliedValues(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>)) {</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> var_to_value_literal_list[var_value.first].push_back(</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> {var_value.second, <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>});</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> }</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> }</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> </div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <span class="comment">// VLOG info.</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> std::vector&lt;IntegerVariable&gt; encoded_variables;</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> std::string encoded_variables_str;</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> </div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> <span class="comment">// Search for variable fully covered by the literals of the exactly_one.</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; [<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, literal_value_list] : var_to_value_literal_list) {</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> <span class="keywordflow">if</span> (literal_value_list.size() &lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.exactly_one().literals_size()) {</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;X&quot;</span> &lt;&lt; <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value() &lt;&lt; <span class="stringliteral">&quot; has &quot;</span> &lt;&lt; literal_value_list.size()</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> &lt;&lt; <span class="stringliteral">&quot; implied values, and a domain of size &quot;</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> &lt;&lt; m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;()</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> -&gt;InitialVariableDomain(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> .Size();</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> }</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> </div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="comment">// We use the order of literals of the exactly_one.</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> implied_bounds-&gt;AddElementEncoding(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, literal_value_list, c);</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1)) {</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> encoded_variables.push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> absl::StrAppend(&amp;encoded_variables_str, <span class="stringliteral">&quot; X&quot;</span>, <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value());</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> num_element_encoded++;</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> }</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> }</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="keywordflow">if</span> (encoded_variables.size() &gt; 1 &amp;&amp; <a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1)) {</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;exactly_one(&quot;</span> &lt;&lt; c &lt;&lt; <span class="stringliteral">&quot;) encodes &quot;</span> &lt;&lt; encoded_variables.size()</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> &lt;&lt; <span class="stringliteral">&quot; variables at the same time: &quot;</span> &lt;&lt; encoded_variables_str;</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> }</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> }</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> </div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> <span class="keywordflow">if</span> (num_element_encoded &gt; 0) {</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;num_element_encoded: &quot;</span> &lt;&lt; num_element_encoded;</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> }</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span>}</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> </div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#adfbeb7391a9578a4cdba60c46b05e19e"> 677</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#adfbeb7391a9578a4cdba60c46b05e19e">PropagateEncodingFromEquivalenceRelations</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> <span class="keyword">auto</span>* encoder = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> </div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="comment">// Loop over all constraints and find affine ones.</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> int64_t num_associations = 0;</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> int64_t num_set_to_false = 0;</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> : <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>()) {</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case() != <a class="code hl_enumvalue" href="classoperations__research_1_1sat_1_1_constraint_proto.html#ada030f50fcddb646af448ac7c5705e35ac188c019178783e5be55110601309d7d">ConstraintProto::kLinear</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars_size() != 2) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="keywordflow">if</span> (!ConstraintIsEq(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear())) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> </div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keyword">const</span> IntegerValue rhs(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0));</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> </div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="comment">// Make sure the coefficient are positive.</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> IntegerVariable var1 = mapping-&gt;Integer(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(0));</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> IntegerVariable var2 = mapping-&gt;Integer(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(1));</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> IntegerValue coeff1(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(0));</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> IntegerValue coeff2(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs(1));</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="keywordflow">if</span> (coeff1 &lt; 0) {</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> var1 = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(var1);</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> coeff1 = -coeff1;</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> }</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="keywordflow">if</span> (coeff2 &lt; 0) {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> var2 = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(var2);</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> coeff2 = -coeff2;</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> }</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> </div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="comment">// TODO(user): This is not supposed to happen, but apparently it did on</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> <span class="comment">// once on routing_GCM_0001_sat.fzn. Investigate and fix.</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="keywordflow">if</span> (coeff1 == 0 || coeff2 == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> </div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="comment">// We first map the &gt;= literals.</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// It is important to do that first, since otherwise mapping a == literal</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="comment">// might creates the underlying &gt;= and &lt;= literals.</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 2; ++i) {</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> value_literal :</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> encoder-&gt;PartialGreaterThanEncoding(var1)) {</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <span class="keyword">const</span> IntegerValue value1 = value_literal.first;</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> <span class="keyword">const</span> IntegerValue bound2 = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(rhs - value1 * coeff1, coeff2);</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> ++num_associations;</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> encoder-&gt;AssociateToIntegerLiteral(</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> value_literal.second, <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a3e2eb445631727dd4abf1d5343f16b2f">IntegerLiteral::LowerOrEqual</a>(var2, bound2));</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> }</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(var1, var2);</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(coeff1, coeff2);</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> }</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> </div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <span class="comment">// Same for the == literals.</span></div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> <span class="comment">//</span></div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="comment">// TODO(user): This is similar to LoadEquivalenceAC() for unreified</span></div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <span class="comment">// constraints, but when the later is called, more encoding might have taken</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <span class="comment">// place.</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 2; ++i) {</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> <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 id="l00735" name="l00735"></a><span class="lineno"> 735</span> <span class="keyword">const</span> IntegerValue value1 = value_literal.value;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> <span class="keyword">const</span> IntegerValue intermediate = rhs - value1 * coeff1;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordflow">if</span> (intermediate % coeff2 != 0) {</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="comment">// Using this function deals properly with UNSAT.</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> ++num_set_to_false;</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> sat_solver-&gt;AddUnitClause(value_literal.literal.Negated());</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> }</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> ++num_associations;</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> encoder-&gt;AssociateToIntegerEqualValue(value_literal.literal, var2,</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> intermediate / coeff2);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> }</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(var1, var2);</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(coeff1, coeff2);</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> }</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> }</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> </div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="keywordflow">if</span> (num_associations &gt; 0) {</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Num associations from equivalences = &quot;</span> &lt;&lt; num_associations;</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> }</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> <span class="keywordflow">if</span> (num_set_to_false &gt; 0) {</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Num literals set to false from equivalences = &quot;</span></div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> &lt;&lt; num_set_to_false;</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> }</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span>}</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> </div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aa3361a48335b9de95fcefa9dc5dc3e22"> 761</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa3361a48335b9de95fcefa9dc5dc3e22">DetectOptionalVariables</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_parameters.html">SatParameters</a>&amp; <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a> = *(m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_parameters.html">SatParameters</a>&gt;());</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#af31c9504e00da3cb14683cf746c309b9">use_optional_variables</a>()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#a180d2b6ac73a2f0e7c2162f1083d34eb">enumerate_all_solutions</a>()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> </div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <span class="comment">// The variables from the objective cannot be marked as optional!</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_proto_variables = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#abef5f55c3278c137faca92b8e433f8ea">variables_size</a>();</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> std::vector&lt;bool&gt; already_seen(num_proto_variables, <span class="keyword">false</span>);</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a777a6e330a22a8889389cb9b9c9f12d6">has_objective</a>()) {</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a2787b866382b560920d55ce5cf129920">objective</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_objective_proto.html#a81a65d7e582fb45427e0ffe69666bad9">vars</a>()) {</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> already_seen[<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref)] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> }</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> }</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> </div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> <span class="comment">// Compute for each variables the intersection of the enforcement literals</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="comment">// of the constraints in which they appear.</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="comment">//</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="comment">// TODO(user): This deals with the simplest cases, but we could try to</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="comment">// detect literals that implies all the constraints in which a variable</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="comment">// appear to false. This can be done with a LCA computation in the tree of</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="comment">// Boolean implication (once the presolve remove cycles). Not sure if we can</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="comment">// properly exploit that afterwards though. Do some research!</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> std::vector&lt;std::vector&lt;int&gt;&gt; enforcement_intersection(num_proto_variables);</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> std::set&lt;int&gt; literals_set;</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c &lt; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">constraints_size</a>(); ++c) {</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">constraints</a>(c);</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().empty()) {</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1d467595ed8fe5b85dc95328ee1c2770">UsedVariables</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> already_seen[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> enforcement_intersection[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].clear();</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> }</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> literals_set.clear();</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> literals_set.insert(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().begin(),</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().end());</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1d467595ed8fe5b85dc95328ee1c2770">UsedVariables</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> <span class="keywordflow">if</span> (!already_seen[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>]) {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> enforcement_intersection[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].assign(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().begin(),</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().end());</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <span class="comment">// Take the intersection.</span></div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> std::vector&lt;int&gt;&amp; vector_ref = enforcement_intersection[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : vector_ref) {</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(literals_set, <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>)) {</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> vector_ref[new_size++] = <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>;</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> }</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> }</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> vector_ref.resize(new_size);</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> }</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> already_seen[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> }</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> }</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> }</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> </div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> <span class="comment">// Auto-detect optional variables.</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="keywordtype">int</span> num_optionals = 0;</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = 0; <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_proto_variables; ++<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_variable_proto.html">IntegerVariableProto</a>&amp; var_proto = <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">variables</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a> = var_proto.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_variable_proto.html#a7d8011ca186f4ad850fcd0e2278d278c">domain</a>(0);</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a> = var_proto.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_variable_proto.html#a7d8011ca186f4ad850fcd0e2278d278c">domain</a>(var_proto.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_variable_proto.html#a7d8011ca186f4ad850fcd0e2278d278c">domain</a>().size() - 1);</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a> == <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a> == 0 &amp;&amp; <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a> == 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> <span class="keywordflow">if</span> (enforcement_intersection[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> </div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> ++num_optionals;</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> integer_trail-&gt;MarkIntegerVariableAsOptional(</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> mapping-&gt;Integer(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> mapping-&gt;Literal(enforcement_intersection[<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>].front()));</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> }</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> </div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> <span class="keywordflow">if</span> (num_optionals &gt; 0) {</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1_solver_logger.html">SolverLogger</a>&gt;(), <span class="stringliteral">&quot;Auto-detected &quot;</span>, num_optionals,</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> <span class="stringliteral">&quot; optional variables.&quot;</span>);</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> }</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span>}</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> </div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#acbee1df94bc06fb7ca19708cd82a21e3"> 840</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acbee1df94bc06fb7ca19708cd82a21e3">AddFullEncodingFromSearchBranching</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_proto.html">CpModelProto</a>&amp; <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>,</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6e5a7240e89f8a6665de1da5554603ec">search_strategy</a>().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> </div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_decision_strategy_proto.html">DecisionStrategyProto</a>&amp; strategy : <a class="code hl_variable" href="cp__model__solver_8cc.html#a6ac76d8a372013f67c4973012948ec84">model_proto</a>.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6e5a7240e89f8a6665de1da5554603ec">search_strategy</a>()) {</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="keywordflow">if</span> (strategy.domain_reduction_strategy() ==</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <a class="code hl_variable" href="classoperations__research_1_1sat_1_1_decision_strategy_proto.html#a714ed0d3d67bec4d88cadc7f32e59f3e">DecisionStrategyProto::SELECT_MEDIAN_VALUE</a>) {</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : strategy.variables()) {</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keywordflow">if</span> (!mapping-&gt;IsInteger(ref)) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keyword">const</span> IntegerVariable variable = mapping-&gt;Integer(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(ref));</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <span class="keywordflow">if</span> (!integer_trail-&gt;IsFixed(variable)) {</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a0185d084af6ad784edced90f45174133">FullyEncodeVariable</a>(variable));</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> }</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> }</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> }</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> }</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span>}</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> </div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span><span class="comment">// ============================================================================</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span><span class="comment">// Constraint loading functions.</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span><span class="comment">// ============================================================================</span></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> </div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328"> 864</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328">LoadBoolOrConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> std::vector&lt;Literal&gt; literals = mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#af95d44da268450fcb634bb1ae3732527">Literals</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_or().literals());</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> literals.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> }</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">ClauseConstraint</a>(literals));</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span>}</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> </div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8"> 873</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8">LoadBoolAndConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> std::vector&lt;Literal&gt; literals;</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> literals.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> }</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> <span class="keyword">auto</span>* sat_solver = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;();</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_and().literals())) {</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> literals.push_back(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> sat_solver-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#af67fe279478772a6d1492a7f673bda5d">AddProblemClause</a>(literals);</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> literals.pop_back();</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> }</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span>}</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a"> 887</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a">LoadAtMostOneConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) &lt;&lt; <span class="stringliteral">&quot;Not supported.&quot;</span>;</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a8a759583ee01f89ea955f23368976482">AtMostOneConstraint</a>(mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.at_most_one().literals())));</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span>}</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> </div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1537797d4a741397c8630b739c021ddd"> 893</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1537797d4a741397c8630b739c021ddd">LoadExactlyOneConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) &lt;&lt; <span class="stringliteral">&quot;Not supported.&quot;</span>;</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#accfda9e32067da0a88da8e325cf39c7c">ExactlyOneConstraint</a>(mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.exactly_one().literals())));</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span>}</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> </div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f"> 899</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f">LoadBoolXorConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) &lt;&lt; <span class="stringliteral">&quot;Not supported.&quot;</span>;</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1281483ec40c05251f937bf10b25603d">LiteralXorIs</a>(mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.bool_xor().literals()), <span class="keyword">true</span>));</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span>}</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> </div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span><span class="comment">// Boolean encoding of:</span></div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span><span class="comment">// enforcement_literal =&gt; coeff1 * var1 + coeff2 * var2 == rhs;</span></div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span><span class="keywordtype">void</span> LoadEquivalenceAC(<span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literal,</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> IntegerValue coeff1, IntegerVariable var1,</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> IntegerValue coeff2, IntegerVariable var2,</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> <span class="keyword">const</span> IntegerValue rhs, Model* m) {</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> <span class="keyword">auto</span>* encoder = m-&gt;GetOrCreate&lt;IntegerEncoder&gt;();</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(encoder-&gt;VariableIsFullyEncoded(var1));</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(encoder-&gt;VariableIsFullyEncoded(var2));</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> absl::flat_hash_map&lt;IntegerValue, Literal&gt; term1_value_to_literal;</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> <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 id="l00918" name="l00918"></a><span class="lineno"> 918</span> term1_value_to_literal[coeff1 * value_literal.value] =</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> value_literal.literal;</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> }</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <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 id="l00922" name="l00922"></a><span class="lineno"> 922</span> <span class="keyword">const</span> IntegerValue target = rhs - value_literal.value * coeff2;</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <span class="keywordflow">if</span> (!term1_value_to_literal.contains(target)) {</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> m-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> {value_literal.literal.Negated()}));</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> <span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a9784d5d367dedd98ed04e2fa348f074f">Literal</a> target_literal = term1_value_to_literal[target];</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> m-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> {value_literal.literal.Negated(), target_literal}));</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> m-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">EnforcedClause</a>(enforcement_literal,</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> {value_literal.literal, target_literal.Negated()}));</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> </div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> <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 id="l00934" name="l00934"></a><span class="lineno"> 934</span> <span class="comment">// We do that so we know the term1 values that are never reached.</span></div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> term1_value_to_literal.erase(target);</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> }</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> }</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> </div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> <span class="comment">// Exclude the values that can never be &quot;matched&quot; by coeff2 * var2.</span></div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> <span class="comment">// We need the std::sort() to be deterministic!</span></div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> std::vector&lt;Literal&gt; implied_false;</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> <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 id="l00943" name="l00943"></a><span class="lineno"> 943</span> implied_false.push_back(entry.second);</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> }</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> std::sort(implied_false.begin(), implied_false.end());</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a9784d5d367dedd98ed04e2fa348f074f">Literal</a> l : implied_false) {</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> m-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">EnforcedClause</a>(enforcement_literal, {l.Negated()}));</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> }</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span>}</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> </div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span><span class="comment">// Boolean encoding of:</span></div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span><span class="comment">// enforcement_literal =&gt; coeff1 * var1 + coeff2 * var2 != rhs;</span></div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span><span class="keywordtype">void</span> LoadEquivalenceNeqAC(<span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literal,</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> IntegerValue coeff1, IntegerVariable var1,</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> IntegerValue coeff2, IntegerVariable var2,</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> <span class="keyword">const</span> IntegerValue rhs, Model* m) {</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> <span class="keyword">auto</span>* encoder = m-&gt;GetOrCreate&lt;IntegerEncoder&gt;();</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(encoder-&gt;VariableIsFullyEncoded(var1));</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(encoder-&gt;VariableIsFullyEncoded(var2));</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> absl::flat_hash_map&lt;IntegerValue, Literal&gt; term1_value_to_literal;</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> <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 id="l00962" name="l00962"></a><span class="lineno"> 962</span> term1_value_to_literal[coeff1 * value_literal.value] =</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> value_literal.literal;</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> }</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> <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 id="l00966" name="l00966"></a><span class="lineno"> 966</span> <span class="keyword">const</span> IntegerValue target_value = rhs - value_literal.value * coeff2;</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; it = term1_value_to_literal.find(target_value);</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> <span class="keywordflow">if</span> (it != term1_value_to_literal.end()) {</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> <span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a9784d5d367dedd98ed04e2fa348f074f">Literal</a> target_literal = it-&gt;second;</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> m-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">EnforcedClause</a>(</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> enforcement_literal,</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> {value_literal.literal.Negated(), target_literal.Negated()}));</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> }</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> }</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span>}</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> </div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> </div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041"> 979</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041">LoadLinearConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars().empty()) {</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> rhs = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab1240060466ba48a36a4b36379bce26a">ReadDomainFromProto</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear());</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> <span class="keywordflow">if</span> (rhs.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a22c6c2f121586b5d76feb4b0e536dfde">Contains</a>(0)) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> std::vector&lt;Literal&gt; clause;</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> clause.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> }</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">ClauseConstraint</a>(clause));</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Trivially UNSAT constraint: &quot;</span> &lt;&lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString();</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;()-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> }</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> }</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> </div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars =</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> mapping-&gt;Integers(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars());</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> <span class="keyword">const</span> std::vector&lt;int64_t&gt; coeffs = ValuesFromProto(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().coeffs());</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> </div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> <span class="comment">// Compute the min/max to relax the bounds if needed.</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> <span class="comment">//</span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> <span class="comment">// TODO(user): Reuse ComputeLinearBounds()? but then we need another loop</span></div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> <span class="comment">// to detect if we only have Booleans.</span></div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> IntegerValue min_sum(0);</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> IntegerValue max_sum(0);</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> IntegerValue max_domain_size(0);</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> <span class="keywordtype">bool</span> all_booleans = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; vars.size(); ++i) {</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> <span class="keywordflow">if</span> (all_booleans &amp;&amp; !mapping-&gt;IsBoolean(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(i))) {</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> all_booleans = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> }</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> <span class="keyword">const</span> IntegerValue lb = integer_trail-&gt;LowerBound(vars[i]);</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> <span class="keyword">const</span> IntegerValue ub = integer_trail-&gt;UpperBound(vars[i]);</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> max_domain_size = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_domain_size, ub - lb + 1);</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> <span class="keyword">const</span> IntegerValue term_a = coeffs[i] * lb;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> <span class="keyword">const</span> IntegerValue term_b = coeffs[i] * ub;</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> min_sum += <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(term_a, term_b);</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> max_sum += <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(term_a, term_b);</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> }</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> </div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_parameters.html">SatParameters</a>&amp; params = *m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_parameters.html">SatParameters</a>&gt;();</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> <span class="keyword">const</span> IntegerValue domain_size_limit(</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> params.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#ace8789134615e7fc516814ea2d6cb298">max_domain_size_when_encoding_eq_neq_constraints</a>());</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> <span class="keywordflow">if</span> (<a class="code hl_variable" 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 id="l01027" name="l01027"></a><span class="lineno"> 1027</span> !integer_trail-&gt;IsFixed(vars[1]) &amp;&amp;</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> max_domain_size &lt;= domain_size_limit) {</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> <span class="keyword">auto</span>* encoder = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="keywordflow">if</span> (params.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#a81e1f7c86b59fd7eea21210d68504efb">boolean_encoding_level</a>() &gt; 0 &amp;&amp; ConstraintIsEq(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear()) &amp;&amp;</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0) != min_sum &amp;&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0) != max_sum &amp;&amp;</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> encoder-&gt;VariableIsFullyEncoded(vars[0]) &amp;&amp;</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> encoder-&gt;VariableIsFullyEncoded(vars[1])) {</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(3) &lt;&lt; <span class="stringliteral">&quot;Load AC version of &quot;</span> &lt;&lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString() &lt;&lt; <span class="stringliteral">&quot;, var0 domain = &quot;</span></div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[0])</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> &lt;&lt; <span class="stringliteral">&quot;, var1 domain = &quot;</span></div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[1]);</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <span class="keywordflow">return</span> LoadEquivalenceAC(mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()),</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> IntegerValue(coeffs[0]), vars[0],</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> IntegerValue(coeffs[1]), vars[1],</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> IntegerValue(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0)), m);</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> }</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> </div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> int64_t single_value = 0;</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> <span class="keywordflow">if</span> (params.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#a81e1f7c86b59fd7eea21210d68504efb">boolean_encoding_level</a>() &gt; 0 &amp;&amp;</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> ConstraintIsNEq(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear(), mapping, integer_trail, &amp;single_value) &amp;&amp;</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> single_value != min_sum &amp;&amp; single_value != max_sum &amp;&amp;</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> encoder-&gt;VariableIsFullyEncoded(vars[0]) &amp;&amp;</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> encoder-&gt;VariableIsFullyEncoded(vars[1])) {</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(3) &lt;&lt; <span class="stringliteral">&quot;Load NAC version of &quot;</span> &lt;&lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString()</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> &lt;&lt; <span class="stringliteral">&quot;, var0 domain = &quot;</span></div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[0])</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> &lt;&lt; <span class="stringliteral">&quot;, var1 domain = &quot;</span></div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> &lt;&lt; integer_trail-&gt;InitialVariableDomain(vars[1])</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> &lt;&lt; <span class="stringliteral">&quot;, value = &quot;</span> &lt;&lt; single_value;</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> <span class="keywordflow">return</span> LoadEquivalenceNeqAC(mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()),</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> IntegerValue(coeffs[0]), vars[0],</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> IntegerValue(coeffs[1]), vars[1],</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> IntegerValue(single_value), m);</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> }</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> }</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> </div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain_size() == 2) {</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> int64_t lb = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(0);</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> int64_t ub = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(1);</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> <span class="keywordflow">if</span> (min_sum &gt;= lb) lb = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>();</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> <span class="keywordflow">if</span> (max_sum &lt;= ub) ub = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>();</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> </div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a42a3b266d8c6dfab1c14baa6c04e2333">HasEnforcementLiteral</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>)) {</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> <span class="keywordflow">if</span> (all_booleans) {</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="comment">// TODO(user): we should probably also implement an</span></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> <span class="comment">// half-reified version of this constraint.</span></div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> std::vector&lt;LiteralWithCoeff&gt; cst;</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; vars.size(); ++i) {</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> <span class="keyword">const</span> <span class="keywordtype">int</span> ref = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().vars(i);</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> cst.push_back({mapping-&gt;Literal(ref), coeffs[i]});</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> }</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ac341ac6090ff0bed8ad2231c94cd3bfc">BooleanLinearConstraint</a>(lb, ub, &amp;cst));</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> <span class="keywordflow">if</span> (lb != <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>()) {</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a081a97fea7610aefc53d71d4f331e184">WeightedSumGreaterOrEqual</a>(vars, coeffs, lb));</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> }</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="keywordflow">if</span> (ub != <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>()) {</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2d7fdf5a1e3a1a9f3c4b893227f2f523">WeightedSumLowerOrEqual</a>(vars, coeffs, ub));</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> }</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> }</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keyword">const</span> std::vector&lt;Literal&gt; enforcement_literals =</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> mapping-&gt;Literals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal());</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keywordflow">if</span> (lb != <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>()) {</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4e9a9e3ac315ee1254246c0fb2dfa3de">ConditionalWeightedSumGreaterOrEqual</a>(enforcement_literals, vars,</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> coeffs, lb));</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> }</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="keywordflow">if</span> (ub != <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>()) {</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5f5dfcfb781eb96e92b08d0f7f983a07">ConditionalWeightedSumLowerOrEqual</a>(enforcement_literals, vars,</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> coeffs, ub));</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> }</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> }</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">// In this case, we can create just one Boolean instead of two since one</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="comment">// is the negation of the other.</span></div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> special_case =</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal().empty() &amp;&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain_size() == 4;</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> </div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> std::vector&lt;Literal&gt; clause;</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain_size(); i += 2) {</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> int64_t lb = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(i);</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> int64_t ub = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.linear().domain(i + 1);</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> <span class="keywordflow">if</span> (min_sum &gt;= lb) lb = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>();</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> <span class="keywordflow">if</span> (max_sum &lt;= ub) ub = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>();</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> </div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> subdomain_literal(</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> special_case &amp;&amp; i &gt; 0 ? clause.back().Negated()</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> : <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a3cb95842130bc03177260ad20464bdbf">NewBooleanVariable</a>()), <span class="keyword">true</span>));</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> clause.push_back(subdomain_literal);</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> </div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> <span class="keywordflow">if</span> (lb != <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>()) {</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4e9a9e3ac315ee1254246c0fb2dfa3de">ConditionalWeightedSumGreaterOrEqual</a>({subdomain_literal}, vars,</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> coeffs, lb));</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> }</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <span class="keywordflow">if</span> (ub != <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>()) {</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5f5dfcfb781eb96e92b08d0f7f983a07">ConditionalWeightedSumLowerOrEqual</a>({subdomain_literal}, vars,</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> coeffs, ub));</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> }</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> }</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.enforcement_literal()) {</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> clause.push_back(mapping-&gt;Literal(ref).Negated());</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> }</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> <span class="keywordflow">if</span> (!special_case) m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">ClauseConstraint</a>(clause));</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> }</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span>}</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> </div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f"> 1133</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f">LoadAllDiffConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt; expressions =</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a8a12f1ca979bf89f793ddc3b9ff4538b">Affines</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.all_diff().exprs());</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aee7948e4ec576c5102f5f09028388d4c">AllDifferentOnBounds</a>(expressions));</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span>}</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> </div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a"> 1140</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a">LoadIntProdConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> prod = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().target());</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().exprs_size(), 2)</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> &lt;&lt; <span class="stringliteral">&quot;General int_prod not supported yet.&quot;</span>;</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> </div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> expr0 = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().exprs(0));</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> expr1 = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_prod().exprs(1));</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1)) {</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> builder(m);</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a8d19e8d5e074feb1e673e585b3a04266">DetectLinearEncodingOfProducts</a>(expr0, expr1, m, &amp;builder)) {</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Product &quot;</span> &lt;&lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString() &lt;&lt; <span class="stringliteral">&quot; can be linearized&quot;</span>;</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> }</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> }</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2ee7c83ad06fb9a710a64f3ff79b4289">ProductConstraint</a>(expr0, expr1, prod));</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span>}</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> </div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949"> 1157</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949">LoadIntDivConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> div = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_div().target());</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> num = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_div().exprs(0));</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> denom = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_div().exprs(1));</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> <span class="keywordflow">if</span> (integer_trail-&gt;IsFixed(denom)) {</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a41ea57d3df7b63f7be86a96eca1d0cf8">FixedDivisionConstraint</a>(num, integer_trail-&gt;FixedValue(denom), div));</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> <span class="keywordflow">if</span> (<a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1)) {</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> builder(m);</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a8d19e8d5e074feb1e673e585b3a04266">DetectLinearEncodingOfProducts</a>(num, denom, m, &amp;builder)) {</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Division &quot;</span> &lt;&lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.DebugString() &lt;&lt; <span class="stringliteral">&quot; can be linearized&quot;</span>;</div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> }</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> }</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6d8e3999c6efdf2b47d4379b3eb9c85e">DivisionConstraint</a>(num, denom, div));</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> }</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span>}</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> </div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a5a6444401c2185cb6968a3a526951d23"> 1176</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5a6444401c2185cb6968a3a526951d23">LoadIntModConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> <span class="keyword">auto</span>* integer_trail = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> </div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> target = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_mod().target());</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> expr = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_mod().exprs(0));</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> mod = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.int_mod().exprs(1));</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(integer_trail-&gt;IsFixed(mod));</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="keyword">const</span> IntegerValue fixed_modulo = integer_trail-&gt;FixedValue(mod);</div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ad9f0785106a02e030ddee919ff33bd0d">FixedModuloConstraint</a>(expr, fixed_modulo, target));</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span>}</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> </div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd"> 1188</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd">LoadLinMaxConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs().empty()) {</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>&gt;()-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> }</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> </div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_linear_expression.html">LinearExpression</a> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a> = mapping-&gt;GetExprFromProto(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().target());</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> std::vector&lt;LinearExpression&gt; negated_exprs;</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> negated_exprs.reserve(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs_size());</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs_size(); ++i) {</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> negated_exprs.push_back(</div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(mapping-&gt;GetExprFromProto(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.lin_max().exprs(i))));</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> }</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> <span class="comment">// TODO(user): Consider replacing the min propagator by max.</span></div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab0b72a1346795e18cd789a15a0d3e1fc">IsEqualToMinOf</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>), negated_exprs));</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span>}</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> </div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f"> 1206</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f">LoadNoOverlapConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a93f88f728c3591678a7052bb92ee53d0">Disjunctive</a>(mapping-&gt;Intervals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap().intervals())));</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span>}</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> </div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b"> 1211</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b">LoadNoOverlap2dConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().x_intervals().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; x_intervals =</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a619ceb25c10043ce5b356b1da14be385">Intervals</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().x_intervals());</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; y_intervals =</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> mapping-&gt;Intervals(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().y_intervals());</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#abb7876d9d4a462b0073d5b57f6e66f5b">NonOverlappingRectangles</a>(</div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> x_intervals, y_intervals,</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> !<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.no_overlap_2d().boxes_with_null_area_can_overlap(),</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_parameters.html">SatParameters</a>&gt;()-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_parameters.html#af28897bf3470dd309ece7d7451883835">use_cumulative_in_no_overlap_2d</a>()));</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span>}</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> </div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526"> 1224</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526">LoadCumulativeConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> <span class="keyword">auto</span>* mapping = m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;();</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt; intervals =</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> mapping-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a619ceb25c10043ce5b356b1da14be385">Intervals</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().intervals());</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> = mapping-&gt;Affine(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().capacity());</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt; demands =</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> mapping-&gt;Affines(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.cumulative().demands());</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a615085331bd86d852e84f75fcadbeaa1">Cumulative</a>(intervals, demands, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>));</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span>}</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> </div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1"> 1234</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1">LoadCircuitConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; circuit = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.circuit();</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> <span class="keywordflow">if</span> (circuit.tails().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> </div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> std::vector&lt;int&gt; tails(circuit.tails().begin(), circuit.tails().end());</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> std::vector&lt;int&gt; heads(circuit.heads().begin(), circuit.heads().end());</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> std::vector&lt;Literal&gt; literals =</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;()-&gt;Literals(circuit.literals());</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a8f4f9889ab3527ce5381ed32e2fae25a">ReindexArcs</a>(&amp;tails, &amp;heads);</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a3c25e2ace66c05a1078d9d8128ca33c3">SubcircuitConstraint</a>(num_nodes, tails, heads, literals));</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span>}</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> </div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce"> 1246</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce">LoadRoutesConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; routes = <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.routes();</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> <span class="keywordflow">if</span> (routes.tails().empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> </div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> std::vector&lt;int&gt; tails(routes.tails().begin(), routes.tails().end());</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> std::vector&lt;int&gt; heads(routes.heads().begin(), routes.heads().end());</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> std::vector&lt;Literal&gt; literals =</div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">GetOrCreate</a>&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">CpModelMapping</a>&gt;()-&gt;Literals(routes.literals());</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a8f4f9889ab3527ce5381ed32e2fae25a">ReindexArcs</a>(&amp;tails, &amp;heads);</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> m-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_model.html#a7b8d774b566431b8932ba0f3c921ec7d">Add</a>(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a3c25e2ace66c05a1078d9d8128ca33c3">SubcircuitConstraint</a>(num_nodes, tails, heads, literals,</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> <span class="comment">/*multiple_subcircuit_through_zero=*/</span><span class="keyword">true</span>));</div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span>}</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> </div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1c3fa75911c74ce485e62814484c7ae7"> 1259</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1c3fa75911c74ce485e62814484c7ae7">LoadConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_constraint_proto.html">ConstraintProto</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* m) {</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> <span class="keywordflow">switch</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>.constraint_case()) {</div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::CONSTRAINT_NOT_SET:</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolOr:</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1e0082b201a54cee7bf210998888c328">LoadBoolOrConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolAnd:</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a55c57c1725f5333ffe73f0fefc377bb8">LoadBoolAndConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kAtMostOne:</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9a75e5a5c8a2be39edaf66f75618704a">LoadAtMostOneConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kExactlyOne:</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1537797d4a741397c8630b739c021ddd">LoadExactlyOneConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kBoolXor:</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a59ba67bcf20a8657c8d0e6c3f120121f">LoadBoolXorConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kLinear:</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a85f779432cdf63a07905deaae7fd0041">LoadLinearConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kAllDiff:</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa5832284102731626af241e30ed9134f">LoadAllDiffConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntProd:</div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1bf9586612493e7cfcc892c54fecf49a">LoadIntProdConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntDiv:</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6bded303c37dabc35958dcc4a22d4949">LoadIntDivConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kIntMod:</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5a6444401c2185cb6968a3a526951d23">LoadIntModConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kLinMax:</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a596a1b4122eff430a59beb743ed942cd">LoadLinMaxConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kInterval:</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <span class="comment">// Already dealt with.</span></div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kNoOverlap:</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9f7dc553b18e0a44b713b2513f29a26f">LoadNoOverlapConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kNoOverlap2D:</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab716457062d8500d7315cfe29646de6b">LoadNoOverlap2dConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kCumulative:</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a50082c82c7d605e10de47911f0485526">LoadCumulativeConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kCircuit:</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a9e9bd05a784d4b295ed4da47278990e1">LoadCircuitConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> <span class="keywordflow">case</span> ConstraintProto::ConstraintProto::kRoutes:</div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5190bd84fe4e628ebde4007e970f84ce">LoadRoutesConstraint</a>(<a class="code hl_variable" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, m);</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> }</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span>}</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> </div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span>} <span class="comment">// namespace sat</span></div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span>} <span class="comment">// namespace operations_research</span></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="aalldiff__cst_8cc_html_a26e6db9bcc64b584051ecc28171ed11f"><div class="ttname"><a href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a></div><div class="ttdeci">int64_t max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00140">alldiff_cst.cc:140</a></div></div>
<div class="ttc" id="aalldiff__cst_8cc_html_ad10edae0a852d72fb76afb1c77735045"><div class="ttname"><a href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a></div><div class="ttdeci">int64_t min</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a3e1cfef60e774a81f30eaddf26a3a274"><div class="ttname"><a href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a></div><div class="ttdeci">#define CHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00495">base/logging.h:495</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a7c0ce053b28d53aa4eaf3eb7fb71663b"><div class="ttname"><a href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a></div><div class="ttdeci">#define CHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00702">base/logging.h:702</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab62f5ed8f2d48e29802be0cbbcd1359a"><div class="ttname"><a href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a></div><div class="ttdeci">#define DCHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00893">base/logging.h:893</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927"><div class="ttname"><a href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a></div><div class="ttdeci">#define VLOG(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00983">base/logging.h:983</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="aclassoperations__research_1_1_domain_html"><div class="ttname"><a href="classoperations__research_1_1_domain.html">operations_research::Domain</a></div><div class="ttdoc">We call domain any subset of Int64 = [kint64min, kint64max].</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00081">sorted_interval_list.h:81</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a1341b29865c5167a64de30c797672e4c"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a1341b29865c5167a64de30c797672e4c">operations_research::Domain::InverseMultiplicationBy</a></div><div class="ttdeci">Domain InverseMultiplicationBy(const int64_t 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#l00463">sorted_interval_list.cc:463</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a1f1de3874966a137f140748498f43e0c"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a1f1de3874966a137f140748498f43e0c">operations_research::Domain::Complement</a></div><div class="ttdeci">Domain Complement() const</div><div class="ttdoc">Returns the set Int64 D.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00266">sorted_interval_list.cc:266</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a22c6c2f121586b5d76feb4b0e536dfde"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a22c6c2f121586b5d76feb4b0e536dfde">operations_research::Domain::Contains</a></div><div class="ttdeci">bool Contains(int64_t 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#l00242">sorted_interval_list.cc:242</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a3dcbf23ccbed61ee64ec08a934f57a9c"><div class="ttname"><a href="classoperations__research_1_1_domain.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#l00425">sorted_interval_list.h:425</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a835826c4c5129b74553042a357a721ff"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">operations_research::Domain::IntersectionWith</a></div><div class="ttdeci">Domain IntersectionWith(const Domain &amp;domain) const</div><div class="ttdoc">Returns the intersection of D and domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00303">sorted_interval_list.cc:303</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a8cf21a67f7d81a800ff912239bb2db64"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a8cf21a67f7d81a800ff912239bb2db64">operations_research::Domain::Min</a></div><div class="ttdeci">int64_t 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#l00214">sorted_interval_list.cc:214</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a8e12342fc420701fbffd97025421575a"><div class="ttname"><a href="classoperations__research_1_1_domain.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#l00198">sorted_interval_list.cc:198</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_aa74ea8cd1b0767659f704b482d07c103"><div class="ttname"><a href="classoperations__research_1_1_domain.html#aa74ea8cd1b0767659f704b482d07c103">operations_research::Domain::Max</a></div><div class="ttdeci">int64_t 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#l00219">sorted_interval_list.cc:219</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_solver_logger_html"><div class="ttname"><a href="classoperations__research_1_1_solver_logger.html">operations_research::SolverLogger</a></div><div class="ttdef"><b>Definition:</b> <a href="util_2logging_8h_source.html#l00033">util/logging.h:33</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_constraint_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_constraint_proto.html">operations_research::sat::ConstraintProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l03772">cp_model.pb.h:3773</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_constraint_proto_html_ada030f50fcddb646af448ac7c5705e35ac188c019178783e5be55110601309d7d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_constraint_proto.html#ada030f50fcddb646af448ac7c5705e35ac188c019178783e5be55110601309d7d">operations_research::sat::ConstraintProto::kLinear</a></div><div class="ttdeci">@ kLinear</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l03825">cp_model.pb.h:3825</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_constraint_proto_html_ada030f50fcddb646af448ac7c5705e35ad60570d9bed938f8b11385a7ba7f3508"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_constraint_proto.html#ada030f50fcddb646af448ac7c5705e35ad60570d9bed938f8b11385a7ba7f3508">operations_research::sat::ConstraintProto::kExactlyOne</a></div><div class="ttdeci">@ kExactlyOne</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l03819">cp_model.pb.h:3819</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_mapping_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_mapping.html">operations_research::sat::CpModelMapping</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__mapping_8h_source.html#l00065">cp_model_mapping.h:65</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_mapping_html_a619ceb25c10043ce5b356b1da14be385"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a619ceb25c10043ce5b356b1da14be385">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__mapping_8h_source.html#l00132">cp_model_mapping.h:132</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_mapping_html_a8a12f1ca979bf89f793ddc3b9ff4538b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#a8a12f1ca979bf89f793ddc3b9ff4538b">operations_research::sat::CpModelMapping::Affines</a></div><div class="ttdeci">std::vector&lt; AffineExpression &gt; Affines(const List &amp;list) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__mapping_8h_source.html#l00125">cp_model_mapping.h:125</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_mapping_html_af95d44da268450fcb634bb1ae3732527"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_mapping.html#af95d44da268450fcb634bb1ae3732527">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__mapping_8h_source.html#l00118">cp_model_mapping.h:118</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html">operations_research::sat::CpModelProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l06111">cp_model.pb.h:6112</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_a2787b866382b560920d55ce5cf129920"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a2787b866382b560920d55ce5cf129920">operations_research::sat::CpModelProto::objective</a></div><div class="ttdeci">const ::operations_research::sat::CpObjectiveProto &amp; objective() const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12319">cp_model.pb.h:12319</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_a6a4544ca20489d70e302f5d6d374a012"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6a4544ca20489d70e302f5d6d374a012">operations_research::sat::CpModelProto::variables</a></div><div class="ttdeci">const ::operations_research::sat::IntegerVariableProto &amp; variables(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12243">cp_model.pb.h:12243</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_a6e5a7240e89f8a6665de1da5554603ec"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a6e5a7240e89f8a6665de1da5554603ec">operations_research::sat::CpModelProto::search_strategy</a></div><div class="ttdeci">const ::operations_research::sat::DecisionStrategyProto &amp; search_strategy(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12503">cp_model.pb.h:12503</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_a777a6e330a22a8889389cb9b9c9f12d6"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#a777a6e330a22a8889389cb9b9c9f12d6">operations_research::sat::CpModelProto::has_objective</a></div><div class="ttdeci">bool has_objective() const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12305">cp_model.pb.h:12305</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_ab1fa807713e298b5262f1b6085834b69"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#ab1fa807713e298b5262f1b6085834b69">operations_research::sat::CpModelProto::symmetry</a></div><div class="ttdeci">const ::operations_research::sat::SymmetryProto &amp; symmetry() const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12676">cp_model.pb.h:12676</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_abef5f55c3278c137faca92b8e433f8ea"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#abef5f55c3278c137faca92b8e433f8ea">operations_research::sat::CpModelProto::variables_size</a></div><div class="ttdeci">int variables_size() const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12225">cp_model.pb.h:12225</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_aeaf0da781ca9b370d96b7fbd3f74266a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#aeaf0da781ca9b370d96b7fbd3f74266a">operations_research::sat::CpModelProto::constraints_size</a></div><div class="ttdeci">int constraints_size() const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12265">cp_model.pb.h:12265</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_model_proto_html_afce66afa8ae7776a449bba7313ea3559"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_model_proto.html#afce66afa8ae7776a449bba7313ea3559">operations_research::sat::CpModelProto::constraints</a></div><div class="ttdeci">const ::operations_research::sat::ConstraintProto &amp; constraints(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l12283">cp_model.pb.h:12283</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cp_objective_proto_html_a81a65d7e582fb45427e0ffe69666bad9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cp_objective_proto.html#a81a65d7e582fb45427e0ffe69666bad9">operations_research::sat::CpObjectiveProto::vars</a></div><div class="ttdeci">int32_t vars(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l11234">cp_model.pb.h:11234</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_decision_strategy_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_decision_strategy_proto.html">operations_research::sat::DecisionStrategyProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l05108">cp_model.pb.h:5109</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_decision_strategy_proto_html_a714ed0d3d67bec4d88cadc7f32e59f3e"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_decision_strategy_proto.html#a714ed0d3d67bec4d88cadc7f32e59f3e">operations_research::sat::DecisionStrategyProto::SELECT_MEDIAN_VALUE</a></div><div class="ttdeci">static constexpr DomainReductionStrategy SELECT_MEDIAN_VALUE</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l05274">cp_model.pb.h:5274</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds.html">operations_research::sat::ImpliedBounds</a></div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8h_source.html#l00079">implied_bounds.h:79</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_encoder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_encoder.html">operations_research::sat::IntegerEncoder</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00356">integer.h:356</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00613">integer.h:613</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_a267d05a02fdcc9439a5a54bf9f0ccd3c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.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#l00611">integer.cc:611</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_variable_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_variable_proto.html">operations_research::sat::IntegerVariableProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l00272">cp_model.pb.h:273</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_variable_proto_html_a7d8011ca186f4ad850fcd0e2278d278c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_variable_proto.html#a7d8011ca186f4ad850fcd0e2278d278c">operations_research::sat::IntegerVariableProto::domain</a></div><div class="ttdeci">int64_t domain(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l07102">cp_model.pb.h:7102</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_intervals_repository_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_intervals_repository.html">operations_research::sat::IntervalsRepository</a></div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00047">intervals.h:47</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">operations_research::sat::LinearConstraintBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00153">sat/linear_constraint.h:153</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html">operations_research::sat::Literal</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00066">sat_base.h:66</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a03f5ae0ce9819070959d97a8ba3fafeb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a03f5ae0ce9819070959d97a8ba3fafeb">operations_research::sat::Literal::Literal</a></div><div class="ttdeci">Literal(int signed_value)</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00070">sat_base.h:70</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a4a11c7c4d7706c09de5e18707c3b5c62"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">operations_research::sat::Literal::Index</a></div><div class="ttdeci">LiteralIndex Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00086">sat_base.h:86</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a886e9c024f7209181c0a850b6e90c644"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">operations_research::sat::Literal::Negated</a></div><div class="ttdeci">Literal Negated() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00093">sat_base.h:93</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a9784d5d367dedd98ed04e2fa348f074f"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a9784d5d367dedd98ed04e2fa348f074f">operations_research::sat::Literal::Literal</a></div><div class="ttdeci">Literal()</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00076">sat_base.h:76</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html">operations_research::sat::Model</a></div><div class="ttdoc">Class that owns everything related to a particular optimization model.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00038">sat/model.h:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html_a7b8d774b566431b8932ba0f3c921ec7d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.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="aclassoperations__research_1_1sat_1_1_model_html_afb0c03e2a6201677c266f8a7eb77c2dc"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html#afb0c03e2a6201677c266f8a7eb77c2dc">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_1sat_1_1_sat_parameters_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html">operations_research::sat::SatParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l00347">sat_parameters.pb.h:348</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_parameters_html_a180d2b6ac73a2f0e7c2162f1083d34eb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html#a180d2b6ac73a2f0e7c2162f1083d34eb">operations_research::sat::SatParameters::enumerate_all_solutions</a></div><div class="ttdeci">bool enumerate_all_solutions() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l07238">sat_parameters.pb.h:7238</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_parameters_html_a81e1f7c86b59fd7eea21210d68504efb"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html#a81e1f7c86b59fd7eea21210d68504efb">operations_research::sat::SatParameters::boolean_encoding_level</a></div><div class="ttdeci">int32_t boolean_encoding_level() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l06201">sat_parameters.pb.h:6201</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_parameters_html_ace8789134615e7fc516814ea2d6cb298"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html#ace8789134615e7fc516814ea2d6cb298">operations_research::sat::SatParameters::max_domain_size_when_encoding_eq_neq_constraints</a></div><div class="ttdeci">int32_t max_domain_size_when_encoding_eq_neq_constraints() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l06229">sat_parameters.pb.h:6229</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_parameters_html_af28897bf3470dd309ece7d7451883835"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html#af28897bf3470dd309ece7d7451883835">operations_research::sat::SatParameters::use_cumulative_in_no_overlap_2d</a></div><div class="ttdeci">bool use_cumulative_in_no_overlap_2d() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l06145">sat_parameters.pb.h:6145</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_parameters_html_af31c9504e00da3cb14683cf746c309b9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_parameters.html#af31c9504e00da3cb14683cf746c309b9">operations_research::sat::SatParameters::use_optional_variables</a></div><div class="ttdeci">bool use_optional_variables() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__parameters_8pb_8h_source.html#l07883">sat_parameters.pb.h:7883</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html">operations_research::sat::SatSolver</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00058">sat_solver.h:58</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_af67fe279478772a6d1492a7f673bda5d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#af67fe279478772a6d1492a7f673bda5d">operations_research::sat::SatSolver::AddProblemClause</a></div><div class="ttdeci">bool AddProblemClause(absl::Span&lt; const Literal &gt; literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00204">sat_solver.cc:204</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sparse_permutation_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sparse_permutation_proto.html">operations_research::sat::SparsePermutationProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l05569">cp_model.pb.h:5570</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_symmetry_propagator_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_symmetry_propagator.html">operations_research::sat::SymmetryPropagator</a></div><div class="ttdef"><b>Definition:</b> <a href="symmetry_8h_source.html#l00061">symmetry.h:61</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_symmetry_proto_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_symmetry_proto.html">operations_research::sat::SymmetryProto</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model_8pb_8h_source.html#l05936">cp_model.pb.h:5937</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="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="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#l00120">cp_model_fz_solver.cc:120</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#l00119">cp_model_fz_solver.cc:119</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="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#l01949">cp_model_solver.cc:1949</a></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="acumulative_8h_html"><div class="ttname"><a href="cumulative_8h.html">cumulative.h</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#l00043">demon_profiler.cc:43</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_ac072af30c4ffbc834bb4c681f6ecb514"><div class="ttname"><a href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a></div><div class="ttdeci">int64_t value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00044">demon_profiler.cc:44</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="adisjunctive_8h_html"><div class="ttname"><a href="disjunctive_8h.html">disjunctive.h</a></div></div>
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01874">expr_array.cc:1874</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="aint__type_8h_html"><div class="ttname"><a href="int__type_8h.html">int_type.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="ainteger__expr_8h_html"><div class="ttname"><a href="integer__expr_8h.html">integer_expr.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="amap__util_8h_html"><div class="ttname"><a href="map__util_8h.html">map_util.h</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="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#l00200">map_util.h:200</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_a5de89a1f6e3f80a49a0d76136d8044e2"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">operations_research::math_opt::swap</a></div><div class="ttdeci">void swap(IdMap&lt; K, V &gt; &amp;a, IdMap&lt; K, V &gt; &amp;b)</div><div class="ttdef"><b>Definition:</b> <a href="id__map_8h_source.html#l00262">id_map.h:262</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0185d084af6ad784edced90f45174133"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0185d084af6ad784edced90f45174133">operations_research::sat::FullyEncodeVariable</a></div><div class="ttdeci">std::function&lt; std::vector&lt; ValueLiteralPair &gt;(Model *)&gt; FullyEncodeVariable(IntegerVariable var)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01773">integer.h:1773</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#l00092">integer.h:92</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a081a97fea7610aefc53d71d4f331e184"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a081a97fea7610aefc53d71d4f331e184">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_t lower_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00468">integer_expr.h:468</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1281483ec40c05251f937bf10b25603d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1281483ec40c05251f937bf10b25603d">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#l00112">cp_constraints.h:112</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1537797d4a741397c8630b739c021ddd"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1537797d4a741397c8630b739c021ddd">operations_research::sat::LoadExactlyOneConstraint</a></div><div class="ttdeci">void LoadExactlyOneConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00893">cp_model_loader.cc:893</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1a6eefe7a5bfd8bdf83407c9e6af56f5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1a6eefe7a5bfd8bdf83407c9e6af56f5">operations_research::sat::LoadVariables</a></div><div class="ttdeci">void LoadVariables(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#l00119">cp_model_loader.cc:119</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#l01140">cp_model_loader.cc:1140</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#l01259">cp_model_loader.cc:1259</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#l00432">cp_model_utils.cc:432</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#l00864">cp_model_loader.cc:864</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#l00036">cp_model_utils.h:36</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a238dd948ee65a553d4617753c0d44d7b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a238dd948ee65a553d4617753c0d44d7b">operations_research::sat::ExtractElementEncoding</a></div><div class="ttdeci">void ExtractElementEncoding(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00620">cp_model_loader.cc:620</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2d7fdf5a1e3a1a9f3c4b893227f2f523"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2d7fdf5a1e3a1a9f3c4b893227f2f523">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_t upper_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00361">integer_expr.h:361</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2dbcb7017d468a17bdb30252af5c6c31"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">operations_research::sat::kNoLiteralIndex</a></div><div class="ttdeci">const LiteralIndex kNoLiteralIndex(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2ee7c83ad06fb9a710a64f3ff79b4289"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2ee7c83ad06fb9a710a64f3ff79b4289">operations_research::sat::ProductConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ProductConstraint(AffineExpression a, AffineExpression b, AffineExpression p)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00834">integer_expr.h:834</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a37093a0df3cca500d5f58b1d5482bdc6"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a37093a0df3cca500d5f58b1d5482bdc6">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#l00906">sat_solver.h:906</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a393ff6c6adb9d243cd4b7b7e445a3c23"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a393ff6c6adb9d243cd4b7b7e445a3c23">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#l00952">sat_solver.h:952</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#l00499">circuit.cc:499</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a3cb95842130bc03177260ad20464bdbf"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3cb95842130bc03177260ad20464bdbf">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#l01598">integer.h:1598</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a41ea57d3df7b63f7be86a96eca1d0cf8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a41ea57d3df7b63f7be86a96eca1d0cf8">operations_research::sat::FixedDivisionConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; FixedDivisionConstraint(AffineExpression a, IntegerValue b, AffineExpression c)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00876">integer_expr.h:876</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#l00039">cp_model_utils.h:39</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4af0100d434de55ff841156fdac6d180"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4af0100d434de55ff841156fdac6d180">operations_research::sat::LoadBooleanSymmetries</a></div><div class="ttdeci">void LoadBooleanSymmetries(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00261">cp_model_loader.cc:261</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4e9a9e3ac315ee1254246c0fb2dfa3de"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4e9a9e3ac315ee1254246c0fb2dfa3de">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_t lower_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00578">integer_expr.h:578</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#l01224">cp_model_loader.cc:1224</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#l01246">cp_model_loader.cc:1246</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#l00873">cp_model_loader.cc:873</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#l01188">cp_model_loader.cc:1188</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#l00899">cp_model_loader.cc:899</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5a6444401c2185cb6968a3a526951d23"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5a6444401c2185cb6968a3a526951d23">operations_research::sat::LoadIntModConstraint</a></div><div class="ttdeci">void LoadIntModConstraint(const ConstraintProto &amp;ct, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l01176">cp_model_loader.cc:1176</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_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="anamespaceoperations__research_1_1sat_html_a5f5dfcfb781eb96e92b08d0f7f983a07"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5f5dfcfb781eb96e92b08d0f7f983a07">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_t upper_bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00490">integer_expr.h:490</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="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#l01157">cp_model_loader.cc:1157</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a6d8e3999c6efdf2b47d4379b3eb9c85e"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a6d8e3999c6efdf2b47d4379b3eb9c85e">operations_research::sat::DivisionConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; DivisionConstraint(AffineExpression num, AffineExpression denom, AffineExpression div)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00857">integer_expr.h:857</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a6e056f4efb99b080ae5bdb7267339f59"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a6e056f4efb99b080ae5bdb7267339f59">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#l01724">integer.h:1724</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#l00979">cp_model_loader.cc:979</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8a759583ee01f89ea955f23368976482"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8a759583ee01f89ea955f23368976482">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#l00892">sat_solver.h:892</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8d19e8d5e074feb1e673e585b3a04266"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8d19e8d5e074feb1e673e585b3a04266">operations_research::sat::DetectLinearEncodingOfProducts</a></div><div class="ttdeci">bool DetectLinearEncodingOfProducts(const AffineExpression &amp;left, const AffineExpression &amp;right, Model *model, LinearConstraintBuilder *builder)</div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8cc_source.html#l00320">implied_bounds.cc:320</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8f4f9889ab3527ce5381ed32e2fae25a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8f4f9889ab3527ce5381ed32e2fae25a">operations_research::sat::ReindexArcs</a></div><div class="ttdeci">int ReindexArcs(IntContainer *tails, IntContainer *heads)</div><div class="ttdef"><b>Definition:</b> <a href="circuit_8h_source.html#l00168">circuit.h:168</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="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#l00887">cp_model_loader.cc:887</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#l01234">cp_model_loader.cc:1234</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#l01206">cp_model_loader.cc:1206</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa3361a48335b9de95fcefa9dc5dc3e22"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa3361a48335b9de95fcefa9dc5dc3e22">operations_research::sat::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#l00761">cp_model_loader.cc:761</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#l01133">cp_model_loader.cc:1133</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#l00030">integer.cc:30</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab0b72a1346795e18cd789a15a0d3e1fc"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab0b72a1346795e18cd789a15a0d3e1fc">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#l00737">integer_expr.h:737</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#l00104">cp_model_utils.h:104</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#l01211">cp_model_loader.cc:1211</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#l00045">cp_model_utils.cc:45</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_abb7876d9d4a462b0073d5b57f6e66f5b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#abb7876d9d4a462b0073d5b57f6e66f5b">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, bool add_cumulative_relaxation=true)</div><div class="ttdef"><b>Definition:</b> <a href="diffn_8h_source.html#l00145">diffn.h:145</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac341ac6090ff0bed8ad2231c94cd3bfc"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac341ac6090ff0bed8ad2231c94cd3bfc">operations_research::sat::BooleanLinearConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; BooleanLinearConstraint(int64_t lower_bound, int64_t upper_bound, std::vector&lt; LiteralWithCoeff &gt; *cst)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00853">sat_solver.h:853</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_acbee1df94bc06fb7ca19708cd82a21e3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#acbee1df94bc06fb7ca19708cd82a21e3">operations_research::sat::AddFullEncodingFromSearchBranching</a></div><div class="ttdeci">void AddFullEncodingFromSearchBranching(const CpModelProto &amp;model_proto, Model *m)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8cc_source.html#l00840">cp_model_loader.cc:840</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_accfda9e32067da0a88da8e325cf39c7c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#accfda9e32067da0a88da8e325cf39c7c">operations_research::sat::ExactlyOneConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; ExactlyOneConstraint(const std::vector&lt; Literal &gt; &amp;literals)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00878">sat_solver.h:878</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#l00035">cp_model_utils.h:35</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ad78bf6fcea4b54f750e2457e47b4f46a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ad78bf6fcea4b54f750e2457e47b4f46a">operations_research::sat::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#l00351">cp_model_loader.cc:351</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ad9f0785106a02e030ddee919ff33bd0d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ad9f0785106a02e030ddee919ff33bd0d">operations_research::sat::FixedModuloConstraint</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; FixedModuloConstraint(AffineExpression a, IntegerValue b, AffineExpression c)</div><div class="ttdef"><b>Definition:</b> <a href="integer__expr_8h_source.html#l00890">integer_expr.h:890</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_adfbeb7391a9578a4cdba60c46b05e19e"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#adfbeb7391a9578a4cdba60c46b05e19e">operations_research::sat::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#l00677">cp_model_loader.cc:677</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aee7948e4ec576c5102f5f09028388d4c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aee7948e4ec576c5102f5f09028388d4c">operations_research::sat::AllDifferentOnBounds</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; AllDifferentOnBounds(const std::vector&lt; AffineExpression &gt; &amp;expressions)</div><div class="ttdef"><b>Definition:</b> <a href="all__different_8cc_source.html#l00067">all_different.cc:67</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">Collection of objects used to extend the Constraint Solver library.</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="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#l00085">optimization.cc:85</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="aprecedences_8h_html"><div class="ttname"><a href="precedences_8h.html">precedences.h</a></div></div>
<div class="ttc" id="arouting__flow_8cc_html_a2acb49f4df5288066c43610bede123ec"><div class="ttname"><a href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a></div><div class="ttdeci">int64_t capacity</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00151">routing_flow.cc:151</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="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="asat__solver_8h_html"><div class="ttname"><a href="sat__solver_8h.html">sat_solver.h</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="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="astl__util_8h_html"><div class="ttname"><a href="stl__util_8h.html">stl_util.h</a></div></div>
<div class="ttc" id="astrong__vector_8h_html"><div class="ttname"><a href="strong__vector_8h.html">strong_vector.h</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_affine_expression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_affine_expression.html">operations_research::sat::AffineExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00227">integer.h:227</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_index_references_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_index_references.html">operations_research::sat::IndexReferences</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00054">cp_model_utils.h:54</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_index_references_html_a0821f58cb944376b1f8919327f202443"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_index_references.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#l00055">cp_model_utils.h:55</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.html">operations_research::sat::IntegerLiteral</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00168">integer.h:168</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html_a3e2eb445631727dd4abf1d5343f16b2f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.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#l01383">integer.h:1383</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html_a6c233aafac25ea66d69de93a83c9be63"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">operations_research::sat::IntegerLiteral::GreaterOrEqual</a></div><div class="ttdeci">static IntegerLiteral GreaterOrEqual(IntegerVariable i, IntegerValue bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01377">integer.h:1377</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html_ab6516f556b715738034b30d290c40214"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.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#l00211">integer.h:211</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_expression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_expression.html">operations_research::sat::LinearExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00088">sat/linear_constraint.h:88</a></div></div>
<div class="ttc" id="asymmetry_8h_html"><div class="ttname"><a href="symmetry_8h.html">symmetry.h</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="atimetable_8h_html"><div class="ttname"><a href="timetable_8h.html">timetable.h</a></div></div>
<div class="ttc" id="autil_2logging_8h_html"><div class="ttname"><a href="util_2logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="autil_2logging_8h_html_a5f67b653dd99ddbe5e3367e3b4b7b532"><div class="ttname"><a href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a></div><div class="ttdeci">#define SOLVER_LOG(logger,...)</div><div class="ttdef"><b>Definition:</b> <a href="util_2logging_8h_source.html#l00069">util/logging.h:69</a></div></div>
<div class="ttc" id="avariable__and__expressions_8cc_html_a2091cd7d80fdd31762020bce86138587"><div class="ttname"><a href="variable__and__expressions_8cc.html#a2091cd7d80fdd31762020bce86138587">coeff</a></div><div class="ttdeci">const double coeff</div><div class="ttdef"><b>Definition:</b> <a href="variable__and__expressions_8cc_source.html#l00104">variable_and_expressions.cc:104</a></div></div>
<div class="ttc" id="avlog__is__on_8h_html"><div class="ttname"><a href="vlog__is__on_8h.html">vlog_is_on.h</a></div></div>
<div class="ttc" id="avlog__is__on_8h_html_a956152cad330225654d128f35c00efce"><div class="ttname"><a href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a></div><div class="ttdeci">#define VLOG_IS_ON(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="vlog__is__on_8h_source.html#l00044">vlog_is_on.h:44</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_dddac007a45022d9da6ea1dee012c3b9.html">sat</a></li><li class="navelem"><a class="el" href="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.9.3 </li>
</ul>
</div>
</body>
</html>