Files
ortools-clone/docs/cpp/cp__model__expand_8cc_source.html
2021-01-26 11:34:47 +01:00

1657 lines
289 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: cp_model_expand.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">8.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('cp__model__expand_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_expand.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="cp__model__expand_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2010-2018 Google LLC</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// limitations under the License.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model__expand_8h.html">ortools/sat/cp_model_expand.h</a>&quot;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;absl/container/flat_hash_map.h&quot;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="hash_8h.html">ortools/base/hash.h</a>&quot;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="map__util_8h.html">ortools/base/map_util.h</a>&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>&quot;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="port_2proto__utils_8h.html">ortools/port/proto_utils.h</a>&quot;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model_8pb_8h.html">ortools/sat/cp_model.pb.h</a>&quot;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model__utils_8h.html">ortools/sat/cp_model_utils.h</a>&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="presolve__context_8h.html">ortools/sat/presolve_context.h</a>&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat_2util_8h.html">ortools/sat/util.h</a>&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="saturated__arithmetic_8h.html">ortools/util/saturated_arithmetic.h</a>&quot;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sorted__interval__list_8h.html">ortools/util/sorted_interval_list.h</a>&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="keywordtype">void</span> ExpandReservoir(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;reservoir().min_level() &gt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;reservoir().max_level()) {</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty level domain in reservoir constraint.&quot;</span>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; }</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">const</span> ReservoirConstraintProto&amp; reservoir = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;reservoir();</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_events = reservoir.times_size();</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; </div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> true_literal = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateConstantVar(1);</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; </div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> is_active_literal = [&amp;reservoir, true_literal](<span class="keywordtype">int</span> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">if</span> (reservoir.actives_size() == 0) <span class="keywordflow">return</span> true_literal;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> reservoir.actives(<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; };</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordtype">int</span> num_positives = 0;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordtype">int</span> num_negatives = 0;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> : reservoir.demands()) {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> &gt; 0) {</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; num_positives++;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> &lt; 0) {</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; num_negatives++;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; }</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">if</span> (num_positives &gt; 0 &amp;&amp; num_negatives &gt; 0) {</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// Creates Boolean variables equivalent to (start[i] &lt;= start[j]) i != j</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_events - 1; ++i) {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> active_i = is_active_literal(i);</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;LiteralIsFalse(active_i)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> time_i = reservoir.times(i);</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = i + 1; j &lt; num_events; ++j) {</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> active_j = is_active_literal(j);</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;LiteralIsFalse(active_j)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> time_j = reservoir.times(j);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> i_lesseq_j = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateReifiedPrecedenceLiteral(</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; time_i, time_j, active_i, active_j);</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;mutable_variables(i_lesseq_j)</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; -&gt;set_name(absl::StrCat(i, <span class="stringliteral">&quot; before &quot;</span>, j));</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> j_lesseq_i = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateReifiedPrecedenceLiteral(</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; time_j, time_i, active_j, active_i);</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;mutable_variables(j_lesseq_i)</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; -&gt;set_name(absl::StrCat(j, <span class="stringliteral">&quot; before &quot;</span>, i));</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; }</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; }</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; </div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">// Constrains the running level to be consistent at all times.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="comment">// For this we only add a constraint at the time a given demand</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// take place. We also have a constraint for time zero if needed</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="comment">// (added below).</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_events; ++i) {</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> active_i = is_active_literal(i);</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;LiteralIsFalse(active_i)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> time_i = reservoir.times(i);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="comment">// Accumulates demands of all predecessors.</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; ConstraintProto* <span class="keyword">const</span> level = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; level-&gt;add_enforcement_literal(active_i);</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="comment">// Add contributions from previous events.</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; num_events; ++j) {</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">if</span> (i == j) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> active_j = is_active_literal(j);</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;LiteralIsFalse(active_j)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> time_j = reservoir.times(j);</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; level-&gt;mutable_linear()-&gt;add_vars(</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateReifiedPrecedenceLiteral(time_j, time_i,</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; active_j, active_i));</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; level-&gt;mutable_linear()-&gt;add_coeffs(reservoir.demands(j));</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; }</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// Accounts for own demand in the domain of the sum.</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> demand_i = reservoir.demands(i);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; level-&gt;mutable_linear()-&gt;add_domain(</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b">CapSub</a>(reservoir.min_level(), demand_i));</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; level-&gt;mutable_linear()-&gt;add_domain(</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <a class="code" href="namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b">CapSub</a>(reservoir.max_level(), demand_i));</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="comment">// If all demands have the same sign, we do not care about the order, just</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// the sum.</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">auto</span>* <span class="keyword">const</span> sum =</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_events; ++i) {</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; sum-&gt;add_vars(is_active_literal(i));</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; sum-&gt;add_coeffs(reservoir.demands(i));</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; }</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; sum-&gt;add_domain(reservoir.min_level());</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; sum-&gt;add_domain(reservoir.max_level());</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; }</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;reservoir: expanded&quot;</span>);</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;}</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; </div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">// This is not an &quot;expansion&quot; per say, but just a mandatory presolve step to</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">// satisfy preconditions assumed by the rest of the code.</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="keywordtype">void</span> ExpandIntDiv(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> divisor = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;int_div().vars(1);</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(divisor, Domain(0).Complement())) {</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; }</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;}</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; </div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="keywordtype">void</span> ExpandIntMod(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keyword">const</span> IntegerArgumentProto&amp; int_mod = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;int_mod();</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = int_mod.vars(0);</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> mod_var = int_mod.vars(1);</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target_var = int_mod.target();</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> mod_lb = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(mod_var);</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(mod_lb, 1);</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> mod_ub = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(mod_var);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> var_lb = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> var_ub = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// Compute domains of var / mod_var.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> div_var =</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(Domain(var_lb / mod_ub, var_ub / mod_lb));</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">auto</span> add_enforcement_literal_if_needed = [&amp;]() {</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;enforcement_literal_size() == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;enforcement_literal(0);</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; ConstraintProto* <span class="keyword">const</span> last = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;mutable_constraints(</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;constraints_size() - 1);</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; last-&gt;add_enforcement_literal(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; };</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; </div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="comment">// div = var / mod.</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; IntegerArgumentProto* <span class="keyword">const</span> div_proto =</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_int_div();</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; div_proto-&gt;set_target(div_var);</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; div_proto-&gt;add_vars(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; div_proto-&gt;add_vars(mod_var);</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; add_enforcement_literal_if_needed();</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// Checks if mod is constant.</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">if</span> (mod_lb == mod_ub) {</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="comment">// var - div_var * mod = target.</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; LinearConstraintProto* <span class="keyword">const</span> lin =</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; lin-&gt;add_vars(int_mod.vars(0));</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; lin-&gt;add_vars(div_var);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; lin-&gt;add_coeffs(-mod_lb);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; lin-&gt;add_vars(target_var);</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; lin-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; add_enforcement_literal_if_needed();</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// Create prod_var = div_var * mod.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> prod_var = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; Domain(var_lb * mod_lb / mod_ub, var_ub * mod_ub / mod_lb));</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; IntegerArgumentProto* <span class="keyword">const</span> int_prod =</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_int_prod();</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; int_prod-&gt;set_target(prod_var);</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; int_prod-&gt;add_vars(div_var);</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; int_prod-&gt;add_vars(mod_var);</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; add_enforcement_literal_if_needed();</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// var - prod_var = target.</span></div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; LinearConstraintProto* <span class="keyword">const</span> lin =</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; lin-&gt;add_vars(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; lin-&gt;add_vars(prod_var);</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; lin-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; lin-&gt;add_vars(target_var);</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; lin-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; add_enforcement_literal_if_needed();</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; }</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;int_mod: expanded&quot;</span>);</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;}</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;<span class="keywordtype">void</span> ExpandIntProdWithBoolean(<span class="keywordtype">int</span> bool_ref, <span class="keywordtype">int</span> int_ref, <span class="keywordtype">int</span> product_ref,</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; ConstraintProto* <span class="keyword">const</span> one = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; one-&gt;add_enforcement_literal(bool_ref);</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; one-&gt;mutable_linear()-&gt;add_vars(int_ref);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; one-&gt;mutable_linear()-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; one-&gt;mutable_linear()-&gt;add_vars(product_ref);</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; one-&gt;mutable_linear()-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; one-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; one-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; </div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; ConstraintProto* <span class="keyword">const</span> zero = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; zero-&gt;add_enforcement_literal(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(bool_ref));</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; zero-&gt;mutable_linear()-&gt;add_vars(product_ref);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; zero-&gt;mutable_linear()-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; zero-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; zero-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;}</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;<span class="keywordtype">void</span> AddXEqualYOrXEqualZero(<span class="keywordtype">int</span> x_eq_y, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y,</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; ConstraintProto* equality = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; equality-&gt;add_enforcement_literal(x_eq_y);</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; equality-&gt;mutable_linear()-&gt;add_vars(x);</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; equality-&gt;mutable_linear()-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; equality-&gt;mutable_linear()-&gt;add_vars(y);</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; equality-&gt;mutable_linear()-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; equality-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; equality-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(x_eq_y), x, {0, 0});</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;}</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; </div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;<span class="comment">// a_ref spans across 0, b_ref does not.</span></div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;<span class="keywordtype">void</span> ExpandIntProdWithOneAcrossZero(<span class="keywordtype">int</span> a_ref, <span class="keywordtype">int</span> b_ref, <span class="keywordtype">int</span> product_ref,</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <a class="code" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(a_ref), 0);</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <a class="code" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(a_ref), 0);</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(b_ref) &gt;= 0 || <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(b_ref) &lt;= 0);</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">// Split the domain of a in two, controlled by a new literal.</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> a_is_positive = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(a_is_positive, a_ref, {0, <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>});</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(a_is_positive), a_ref, {<a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>, -1});</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> pos_a_ref = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar({0, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(a_ref)});</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; AddXEqualYOrXEqualZero(a_is_positive, pos_a_ref, a_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> neg_a_ref = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar({<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(a_ref), 0});</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; AddXEqualYOrXEqualZero(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(a_is_positive), neg_a_ref, a_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; </div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// Create product with the positive part ofa_ref.</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> b_is_positive = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(b_ref) &gt;= 0;</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keyword">const</span> Domain pos_a_product_domain =</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; b_is_positive ? Domain({0, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(product_ref)})</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; : Domain({<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(product_ref), 0});</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> pos_a_product = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(pos_a_product_domain);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; IntegerArgumentProto* pos_product =</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_int_prod();</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; pos_product-&gt;set_target(pos_a_product);</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; pos_product-&gt;add_vars(pos_a_ref);</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; pos_product-&gt;add_vars(b_ref);</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; </div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">// Create product with the negative part of a_ref.</span></div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keyword">const</span> Domain neg_a_product_domain =</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; b_is_positive ? Domain({<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(product_ref), 0})</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; : Domain({0, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(product_ref)});</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> neg_a_product = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(neg_a_product_domain);</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; IntegerArgumentProto* neg_product =</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_int_prod();</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; neg_product-&gt;set_target(neg_a_product);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; neg_product-&gt;add_vars(neg_a_ref);</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; neg_product-&gt;add_vars(b_ref);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; </div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">// Link back to the original product.</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; LinearConstraintProto* lin =</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; lin-&gt;add_vars(product_ref);</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; lin-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; lin-&gt;add_vars(pos_a_product);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; lin-&gt;add_vars(neg_a_product);</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;}</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;<span class="keywordtype">void</span> ExpandIntProdWithTwoAcrossZero(<span class="keywordtype">int</span> a_ref, <span class="keywordtype">int</span> b_ref, <span class="keywordtype">int</span> product_ref,</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="comment">// Split a_ref domain in two, controlled by a new literal.</span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> a_is_positive = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(a_is_positive, a_ref, {0, <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>});</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(a_is_positive), a_ref, {<a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>, -1});</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> min_of_a = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(a_ref);</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> max_of_a = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(a_ref);</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; </div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> pos_a_ref = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar({0, max_of_a});</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; AddXEqualYOrXEqualZero(a_is_positive, pos_a_ref, a_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; </div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> neg_a_ref = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar({min_of_a, 0});</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; AddXEqualYOrXEqualZero(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(a_is_positive), neg_a_ref, a_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; </div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">// Create product with two sub parts of a_ref.</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> pos_product_ref =</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(product_ref));</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; ExpandIntProdWithOneAcrossZero(b_ref, pos_a_ref, pos_product_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> neg_product_ref =</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewIntVar(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(product_ref));</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; ExpandIntProdWithOneAcrossZero(b_ref, neg_a_ref, neg_product_ref, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; </div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="comment">// Link back to the original product.</span></div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; LinearConstraintProto* lin =</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; lin-&gt;add_vars(product_ref);</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; lin-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; lin-&gt;add_vars(pos_product_ref);</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; lin-&gt;add_vars(neg_product_ref);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; lin-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; lin-&gt;add_domain(0);</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;}</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; </div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;<span class="keywordtype">void</span> ExpandIntProd(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keyword">const</span> IntegerArgumentProto&amp; int_prod = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;int_prod();</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keywordflow">if</span> (int_prod.vars_size() != 2) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a> = int_prod.vars(0);</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a> = int_prod.vars(1);</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> p = int_prod.target();</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> a_is_boolean =</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>) &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>) == 0 &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>) == 1;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> b_is_boolean =</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) == 0 &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) == 1;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; </div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">// We expand if exactly one of {a, b} is Boolean. If both are Boolean, it</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="comment">// will be presolved into a better version.</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (a_is_boolean &amp;&amp; !b_is_boolean) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; ExpandIntProdWithBoolean(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, p, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;int_prod: expanded product with Boolean var&quot;</span>);</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordflow">if</span> (b_is_boolean &amp;&amp; !a_is_boolean) {</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; ExpandIntProdWithBoolean(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, p, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;int_prod: expanded product with Boolean var&quot;</span>);</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; }</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; </div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> a_span_across_zero =</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>) &lt; 0 &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>) &gt; 0;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> b_span_across_zero =</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MinOf(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) &lt; 0 &amp;&amp; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;MaxOf(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>) &gt; 0;</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">if</span> (a_span_across_zero &amp;&amp; !b_span_across_zero) {</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; ExpandIntProdWithOneAcrossZero(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, p, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="stringliteral">&quot;int_prod: expanded product with general integer variables&quot;</span>);</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; }</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">if</span> (!a_span_across_zero &amp;&amp; b_span_across_zero) {</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; ExpandIntProdWithOneAcrossZero(<a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, <a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, p, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="stringliteral">&quot;int_prod: expanded product with general integer variables&quot;</span>);</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (a_span_across_zero &amp;&amp; b_span_across_zero) {</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; ExpandIntProdWithTwoAcrossZero(<a class="code" href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a>, <a class="code" href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a>, p, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="stringliteral">&quot;int_prod: expanded product with general integer variables&quot;</span>);</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160;}</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; </div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;<span class="keywordtype">void</span> ExpandInverse(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_direct().size();</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(size, <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_inverse().size());</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; </div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="comment">// Make sure the domains are included in [0, size - 1).</span></div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="comment">// TODO(user): Add support for UNSAT at expansion. This should create empty</span></div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// domain if UNSAT, so it should still work correctly.</span></div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_direct()) {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(ref, Domain(0, size - 1))) {</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for a variable in ExpandInverse()&quot;</span>;</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; }</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; }</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_inverse()) {</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(ref, Domain(0, size - 1))) {</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for a variable in ExpandInverse()&quot;</span>;</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; }</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; }</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; </div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="comment">// Reduce the domains of each variable by checking that the inverse value</span></div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// exists.</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; std::vector&lt;int64&gt; possible_values;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="comment">// Propagate from one vector to its counterpart.</span></div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="comment">// Note this reaches the fixpoint as there is a one to one mapping between</span></div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">// (variable-value) pairs in each vector.</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> filter_inverse_domain = [<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>, size, &amp;possible_values](</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; direct,</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; inverse) {</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// Propagate for the inverse vector to the direct vector.</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; possible_values.clear();</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keyword">const</span> Domain domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(direct[i]);</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keywordtype">bool</span> removed_value = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : domain) {</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> j = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; j &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++j) {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(inverse[j]).Contains(i)) {</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; possible_values.push_back(j);</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; removed_value = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; }</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordflow">if</span> (removed_value) {</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; direct[i], <a class="code" href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">Domain::FromValues</a>(possible_values))) {</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for a variable in ExpandInverse()&quot;</span>;</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; }</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; }</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; }</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; };</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; </div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (!filter_inverse_domain(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_direct(),</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_inverse())) {</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; }</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; </div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordflow">if</span> (!filter_inverse_domain(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_inverse(),</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_direct())) {</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; }</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; </div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="comment">// Expand the inverse constraint by associating literal to var == value</span></div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// and sharing them between the direct and inverse variables.</span></div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> f_i = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_direct(i);</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keyword">const</span> Domain domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(f_i);</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : domain) {</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> j = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; j &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++j) {</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="comment">// We have f[i] == j &lt;=&gt; r[j] == i;</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> r_j = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;inverse().f_inverse(j);</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordtype">int</span> r_j_i;</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;HasVarValueEncoding(r_j, i, &amp;r_j_i)) {</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InsertVarValueEncoding(r_j_i, f_i, j);</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> f_i_j = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(f_i, j);</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InsertVarValueEncoding(f_i_j, r_j, i);</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; }</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; }</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; }</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; </div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;inverse: expanded&quot;</span>);</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;}</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; </div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;<span class="keywordtype">void</span> ExpandElement(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keyword">const</span> ElementConstraintProto&amp; element = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;element();</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> index_ref = element.index();</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target_ref = element.target();</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> size = element.vars_size();</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; </div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(index_ref, Domain(0, size - 1))) {</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for the index variable in ExpandElement()&quot;</span>;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; </div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="keywordtype">bool</span> all_constants = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; absl::flat_hash_map&lt;int64, int&gt; constant_var_values_usage;</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; std::vector&lt;int64&gt; constant_var_values;</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; std::vector&lt;int64&gt; invalid_indices;</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; Domain index_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(index_ref);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; Domain target_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(target_ref);</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : index_domain) {</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = element.vars(v);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="keyword">const</span> Domain var_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">if</span> (var_domain.IntersectionWith(target_domain).IsEmpty()) {</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; invalid_indices.push_back(v);</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; }</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">if</span> (var_domain.Min() != var_domain.Max()) {</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; all_constants = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; </div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = var_domain.Min();</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">if</span> (constant_var_values_usage[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>]++ == 0) {</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; constant_var_values.push_back(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; }</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; }</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; </div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (!invalid_indices.empty() &amp;&amp; target_ref != index_ref) {</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; index_ref, <a class="code" href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">Domain::FromValues</a>(invalid_indices).<a class="code" href="classoperations__research_1_1_domain.html#a1f1de3874966a137f140748498f43e0c">Complement</a>())) {</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;No compatible variable domains in ExpandElement()&quot;</span>;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; }</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; </div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="comment">// Re-read the domain.</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; index_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(index_ref);</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="comment">// This BoolOrs implements the deduction that if all index literals pointing</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="comment">// to the same values in the constant array are false, then this value is no</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="comment">// no longer valid for the target variable. They are created only for values</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="comment">// that have multiples literals supporting them.</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="comment">// Order is not important.</span></div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; absl::flat_hash_map&lt;int64, BoolArgumentProto*&gt; supports;</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordflow">if</span> (all_constants &amp;&amp; target_ref != index_ref) {</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; target_ref, <a class="code" href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">Domain::FromValues</a>(constant_var_values))) {</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for the target variable in ExpandElement()&quot;</span>;</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; }</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; </div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; target_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(target_ref);</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keywordflow">if</span> (target_domain.Size() == 1) {</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;element: one value array&quot;</span>);</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; }</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; </div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : target_domain) {</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> usage = <a class="code" href="namespacegtl.html#abce27d097bc5680207b294bdad75f59f">gtl::FindOrDie</a>(constant_var_values_usage, v);</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">if</span> (usage &gt; 1) {</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> lit = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(target_ref, v);</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; BoolArgumentProto* <span class="keyword">const</span> support =</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; supports[v] = support;</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; support-&gt;add_literals(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(lit));</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; }</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; }</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; }</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="comment">// While this is not stricly needed since all value in the index will be</span></div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="comment">// covered, it allows to easily detect this fact in the presolve.</span></div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keyword">auto</span>* bool_or = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; </div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : index_domain) {</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = element.vars(v);</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> index_lit = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(index_ref, v);</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keyword">const</span> Domain var_domain = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; </div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; bool_or-&gt;add_literals(index_lit);</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; </div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">if</span> (target_ref == index_ref) {</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="comment">// This adds extra code. But this information is really important,</span></div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="comment">// and hard to retrieve once lost.</span></div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(index_lit, <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, Domain(v));</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (target_domain.Size() == 1) {</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="comment">// TODO(user): If we know all variables are different, then this</span></div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="comment">// becomes an equivalence.</span></div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(index_lit, <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, target_domain);</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (var_domain.Size() == 1) {</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">if</span> (all_constants) {</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = var_domain.Min();</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordflow">if</span> (constant_var_values_usage[<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>] &gt; 1) {</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="comment">// The encoding literal for &#39;value&#39; of the target_ref has been</span></div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="comment">// created before.</span></div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target_lit =</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(target_ref, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplication(index_lit, target_lit);</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <a class="code" href="namespacegtl.html#abce27d097bc5680207b294bdad75f59f">gtl::FindOrDie</a>(supports, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)-&gt;add_literals(index_lit);</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="comment">// Try to reuse the literal of the index.</span></div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InsertVarValueEncoding(index_lit, target_ref, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; }</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplyInDomain(index_lit, target_ref, var_domain);</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; }</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; ConstraintProto* <span class="keyword">const</span> <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;add_enforcement_literal(index_lit);</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_vars(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_vars(target_ref);</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_linear()-&gt;add_domain(0);</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; }</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; }</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; </div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordflow">if</span> (all_constants) {</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> var_min = target_domain.Min();</div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; </div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="comment">// Scan all values to find the one with the most literals attached.</span></div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> most_frequent_value = <a class="code" href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a>;</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keywordtype">int</span> usage = -1;</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> it : constant_var_values_usage) {</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="keywordflow">if</span> (it.second &gt; usage ||</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; (it.second == usage &amp;&amp; it.first &lt; most_frequent_value)) {</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; usage = it.second;</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; most_frequent_value = it.first;</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; }</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; }</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; </div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="comment">// Add a linear constraint. This helps the linear relaxation.</span></div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <span class="comment">// We try to minimize the size of the linear constraint (if the gain is</span></div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="comment">// meaningful compared to using the min that has the advantage that all</span></div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="comment">// coefficients are positive).</span></div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="comment">// TODO(user): Benchmark if using base is always beneficial.</span></div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="comment">// TODO(user): Try not to create this if max_usage == 1.</span></div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> base =</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; usage &gt; 2 &amp;&amp; usage &gt; size / 10 ? most_frequent_value : var_min;</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="keywordflow">if</span> (base != var_min) {</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(3) &lt;&lt; <span class="stringliteral">&quot;expand element: choose &quot;</span> &lt;&lt; base &lt;&lt; <span class="stringliteral">&quot; with usage &quot;</span> &lt;&lt; usage</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; &lt;&lt; <span class="stringliteral">&quot; over &quot;</span> &lt;&lt; var_min &lt;&lt; <span class="stringliteral">&quot; among &quot;</span> &lt;&lt; size &lt;&lt; <span class="stringliteral">&quot; values.&quot;</span>;</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; }</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; </div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; LinearConstraintProto* <span class="keyword">const</span> linear =</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> rhs = -base;</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; linear-&gt;add_vars(target_ref);</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; linear-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : index_domain) {</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> ref = element.vars(v);</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> index_lit =</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(index_ref, v);</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="resource_8cc.html#a73461c37822b6ebb75b54ba1a9ffb442">delta</a> = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(ref).Min() - base;</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(index_lit)) {</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; linear-&gt;add_vars(index_lit);</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; linear-&gt;add_coeffs(<a class="code" href="resource_8cc.html#a73461c37822b6ebb75b54ba1a9ffb442">delta</a>);</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; linear-&gt;add_vars(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(index_lit));</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; linear-&gt;add_coeffs(-<a class="code" href="resource_8cc.html#a73461c37822b6ebb75b54ba1a9ffb442">delta</a>);</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; rhs -= <a class="code" href="resource_8cc.html#a73461c37822b6ebb75b54ba1a9ffb442">delta</a>;</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; }</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; }</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; }</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; linear-&gt;add_domain(rhs);</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; linear-&gt;add_domain(rhs);</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; </div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;element: expanded value element&quot;</span>);</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;element: expanded&quot;</span>);</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; }</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160;}</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; </div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160;<span class="comment">// Adds clauses so that literals[i] true &lt;=&gt; encoding[value[i]] true.</span></div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;<span class="comment">// This also implicitly use the fact that exactly one alternative is true.</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;<span class="keywordtype">void</span> LinkLiteralsAndValues(</div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt;&amp; value_literals, <span class="keyword">const</span> std::vector&lt;int64&gt;&amp; values,</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="keyword">const</span> absl::flat_hash_map&lt;int64, int&gt;&amp; target_encoding,</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(value_literals.size(), values.size());</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; </div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="comment">// TODO(user): Make sure this does not appear in the profile.</span></div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; <span class="comment">// We use a map to make this method deterministic.</span></div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; std::map&lt;int, std::vector&lt;int&gt;&gt; value_literals_per_target_literal;</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; </div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="comment">// If a value is false (i.e not possible), then the tuple with this</span></div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="comment">// value is false too (i.e not possible). Conversely, if the tuple is</span></div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="comment">// selected, the value must be selected.</span></div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; values.size(); ++i) {</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = values[i];</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(target_encoding.contains(v));</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> lit = <a class="code" href="namespacegtl.html#abce27d097bc5680207b294bdad75f59f">gtl::FindOrDie</a>(target_encoding, v);</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; value_literals_per_target_literal[lit].push_back(value_literals[i]);</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; }</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; </div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="comment">// If all tuples supporting a value are false, then this value must be</span></div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="comment">// false.</span></div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; it : value_literals_per_target_literal) {</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target_literal = it.first;</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">switch</span> (it.second.size()) {</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keywordflow">case</span> 0: {</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;SetLiteralToFalse(target_literal)) {</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; }</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; }</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="keywordflow">case</span> 1: {</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;StoreBooleanEqualityRelation(target_literal,</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; it.second.front());</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; }</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">default</span>: {</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; BoolArgumentProto* <span class="keyword">const</span> bool_or =</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; bool_or-&gt;add_literals(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(target_literal));</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> value_literal : it.second) {</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; bool_or-&gt;add_literals(value_literal);</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplication(value_literal, target_literal);</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; }</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; }</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; }</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; }</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160;}</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; </div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160;<span class="keywordtype">void</span> ExpandAutomaton(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; AutomatonConstraintProto&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a> = *<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_automaton();</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; </div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size() == 0) {</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> initial_state = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.starting_state();</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> final_state : <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.final_states()) {</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordflow">if</span> (initial_state == final_state) {</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;automaton: empty constraint&quot;</span>);</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; }</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; }</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="comment">// The initial state is not in the final state. The model is unsat.</span></div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_label_size() == 0) {</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="comment">// Not transitions. The constraint is infeasible.</span></div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; }</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; </div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> n = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size();</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt; vars = {<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars().begin(), <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars().end()};</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; </div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="comment">// Compute the set of reachable state at each time point.</span></div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <span class="keyword">const</span> absl::flat_hash_set&lt;int64&gt; final_states(</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; {<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.final_states().begin(), <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.final_states().end()});</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; std::vector&lt;absl::flat_hash_set&lt;int64&gt;&gt; reachable_states(n + 1);</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; reachable_states[0].insert(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.starting_state());</div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; </div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="comment">// Forward pass.</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> = 0; <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> &lt; n; ++<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>) {</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_tail_size(); ++t) {</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_tail(t);</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> label = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_label(t);</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_head(t);</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="keywordflow">if</span> (!reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>].contains(<a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>], label)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> == n - 1 &amp;&amp; !final_states.contains(<a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> + 1].insert(<a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a>);</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; }</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; }</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; </div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="comment">// Backward pass.</span></div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> = n - 1; <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> &gt;= 0; --<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>) {</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; absl::flat_hash_set&lt;int64&gt; new_set;</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_tail_size(); ++t) {</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_tail(t);</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> label = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_label(t);</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_head(t);</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; </div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="keywordflow">if</span> (!reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>].contains(<a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>], label)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="keywordflow">if</span> (!reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> + 1].contains(<a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; new_set.insert(<a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a>);</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; }</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>].swap(new_set);</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; }</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; </div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="comment">// We will model at each time step the current automaton state using Boolean</span></div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="comment">// variables. We will have n+1 time step. At time zero, we start in the</span></div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="comment">// initial state, and at time n we should be in one of the final states. We</span></div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="comment">// don&#39;t need to create Booleans at at time when there is just one possible</span></div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="comment">// state (like at time zero).</span></div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; absl::flat_hash_map&lt;int64, int&gt; encoding;</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; absl::flat_hash_map&lt;int64, int&gt; in_encoding;</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; absl::flat_hash_map&lt;int64, int&gt; out_encoding;</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; <span class="keywordtype">bool</span> removed_values = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; </div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> = 0; <a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> &lt; n; ++<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>) {</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; <span class="comment">// All these vector have the same size. We will use them to enforce a</span></div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; <span class="comment">// local table constraint representing one step of the automaton at the</span></div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <span class="comment">// given time.</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; std::vector&lt;int64&gt; in_states;</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; std::vector&lt;int64&gt; transition_values;</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; std::vector&lt;int64&gt; out_states;</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_label_size(); ++i) {</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_tail(i);</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> label = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_label(i);</div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a> = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.transition_head(i);</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; </div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="keywordflow">if</span> (!reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>].contains(<a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="keywordflow">if</span> (!reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> + 1].contains(<a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>], label)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; </div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="comment">// TODO(user): if this transition correspond to just one in-state or</span></div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; <span class="comment">// one-out state or one variable value, we could reuse the corresponding</span></div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; <span class="comment">// Boolean variable instead of creating a new one!</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; in_states.push_back(<a class="code" href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a>);</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; transition_values.push_back(label);</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="comment">// On the last step we don&#39;t need to distinguish the output states, so</span></div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="comment">// we use zero.</span></div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; out_states.push_back(<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> + 1 == n ? 0 : <a class="code" href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a>);</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; }</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; std::vector&lt;int&gt; tuple_literals;</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keywordflow">if</span> (transition_values.size() == 1) {</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordtype">bool</span> tmp_removed_values = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; tuple_literals.push_back(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateConstantVar(1));</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(reachable_states[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a> + 1].size(), 1);</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>],</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; Domain(transition_values.front()),</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; &amp;tmp_removed_values)) {</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; }</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; in_encoding.clear();</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (transition_values.size() == 2) {</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> bool_var = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; tuple_literals.push_back(bool_var);</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; tuple_literals.push_back(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(bool_var));</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="comment">// Note that we do not need the ExactlyOneConstraint(tuple_literals)</span></div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="comment">// because it is already implicitly encoded since we have exactly one</span></div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; <span class="comment">// transition value.</span></div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; LinearConstraintProto* <span class="keyword">const</span> exactly_one =</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; exactly_one-&gt;add_domain(1);</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; exactly_one-&gt;add_domain(1);</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; transition_values.size(); ++i) {</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> tuple_literal = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; tuple_literals.push_back(tuple_literal);</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; exactly_one-&gt;add_vars(tuple_literal);</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; exactly_one-&gt;add_coeffs(1);</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; }</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; }</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; </div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="comment">// Fully encode vars[time].</span></div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; {</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; std::vector&lt;int64&gt; s = transition_values;</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;s);</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; </div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; encoding.clear();</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>], <a class="code" href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">Domain::FromValues</a>(s),</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; &amp;removed_values)) {</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; }</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; </div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="comment">// Fully encode the variable.</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>])) {</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; encoding[v] = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(vars[<a class="code" href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a>], v);</div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; }</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; }</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; }</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; </div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="comment">// For each possible out states, create one Boolean variable.</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; {</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; std::vector&lt;int64&gt; s = out_states;</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;s);</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; </div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; out_encoding.clear();</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keywordflow">if</span> (s.size() == 2) {</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; out_encoding[s.front()] = <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; out_encoding[s.back()] = <a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (s.size() &gt; 2) {</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> state : s) {</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; out_encoding[state] = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; }</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; }</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; }</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; </div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="keywordflow">if</span> (!in_encoding.empty()) {</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; LinkLiteralsAndValues(tuple_literals, in_states, in_encoding, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; }</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <span class="keywordflow">if</span> (!encoding.empty()) {</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; LinkLiteralsAndValues(tuple_literals, transition_values, encoding,</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; }</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="keywordflow">if</span> (!out_encoding.empty()) {</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; LinkLiteralsAndValues(tuple_literals, out_states, out_encoding, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; }</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; in_encoding.swap(out_encoding);</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; out_encoding.clear();</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; }</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; </div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <span class="keywordflow">if</span> (removed_values) {</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;automaton: reduced variable domains&quot;</span>);</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; }</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;automaton: expanded&quot;</span>);</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160;}</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; </div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160;<span class="keywordtype">void</span> ExpandNegativeTable(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; TableConstraintProto&amp; table = *<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_table();</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = table.vars_size();</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_original_tuples = table.values_size() / num_vars;</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; std::vector&lt;std::vector&lt;int64&gt;&gt; tuples(num_original_tuples);</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <span class="keywordtype">int</span> count = 0;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_original_tuples; ++i) {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; num_vars; ++j) {</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; tuples[i].push_back(table.values(count++));</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; }</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; }</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; </div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">if</span> (tuples.empty()) { <span class="comment">// Early exit.</span></div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: empty negated constraint&quot;</span>);</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; }</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; </div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="comment">// Compress tuples.</span></div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> any_value = <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>;</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; std::vector&lt;int64&gt; domain_sizes;</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_vars; ++i) {</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; domain_sizes.push_back(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(table.vars(i)).Size());</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; }</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#af71bcddf81b886f6c4700c212bacae64">CompressTuples</a>(domain_sizes, any_value, &amp;tuples);</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; </div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <span class="comment">// For each tuple, forbid the variables values to be this tuple.</span></div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; std::vector&lt;int&gt; clause;</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;int64&gt;&amp; tuple : tuples) {</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; clause.clear();</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_vars; ++i) {</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = tuple[i];</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> == any_value) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; </div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> =</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(table.vars(i), <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; clause.push_back(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>));</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; }</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="keywordflow">if</span> (!clause.empty()) {</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; BoolArgumentProto* bool_or =</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> lit : clause) {</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; bool_or-&gt;add_literals(lit);</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; }</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; }</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; }</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: expanded negated constraint&quot;</span>);</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160;}</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; </div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160;<span class="keywordtype">void</span> ExpandLinMin(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; ConstraintProto* <span class="keyword">const</span> lin_max = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints();</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;enforcement_literal_size(); ++i) {</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; lin_max-&gt;add_enforcement_literal(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;enforcement_literal(i));</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; }</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; </div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="comment">// Target</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a22efb1995471e34caa35927a9032f5f3">SetToNegatedLinearExpression</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;lin_min().target(),</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; lin_max-&gt;mutable_lin_max()-&gt;mutable_target());</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; </div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;lin_min().exprs_size(); ++i) {</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; LinearExpressionProto* <span class="keyword">const</span> expr = lin_max-&gt;mutable_lin_max()-&gt;add_exprs();</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a22efb1995471e34caa35927a9032f5f3">SetToNegatedLinearExpression</a>(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;lin_min().exprs(i), expr);</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; }</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160;}</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; </div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160;<span class="comment">// Add the implications and clauses to link one variable of a table to the</span></div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160;<span class="comment">// literals controling if the tuples are possible or not. The parallel vectors</span></div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160;<span class="comment">// (tuple_literals, values) contains all valid projected tuples. The</span></div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160;<span class="comment">// tuples_with_any vector provides a list of tuple_literals that will support</span></div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;<span class="comment">// any value.</span></div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160;<span class="keywordtype">void</span> ProcessOneVariable(<span class="keyword">const</span> std::vector&lt;int&gt;&amp; tuple_literals,</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; <span class="keyword">const</span> std::vector&lt;int64&gt;&amp; values, <span class="keywordtype">int</span> variable,</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt;&amp; tuples_with_any,</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Process var(&quot;</span> &lt;&lt; variable &lt;&lt; <span class="stringliteral">&quot;) with domain &quot;</span></div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; &lt;&lt; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(variable) &lt;&lt; <span class="stringliteral">&quot; and &quot;</span> &lt;&lt; values.size()</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; &lt;&lt; <span class="stringliteral">&quot; active tuples, and &quot;</span> &lt;&lt; tuples_with_any.size() &lt;&lt; <span class="stringliteral">&quot; any tuples&quot;</span>;</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(tuple_literals.size(), values.size());</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; std::vector&lt;std::pair&lt;int64, int&gt;&gt; pairs;</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; </div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="comment">// Collect pairs of value-literal.</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; values.size(); ++i) {</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = values[i];</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(variable, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>));</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; pairs.emplace_back(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, tuple_literals[i]);</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; }</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; </div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; <span class="comment">// Regroup literal with the same value and add for each the clause: If all the</span></div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="comment">// tuples containing a value are false, then this value must be false too.</span></div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; std::vector&lt;int&gt; selected;</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; std::sort(pairs.begin(), pairs.end());</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; pairs.size();) {</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; selected.clear();</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = pairs[i].first;</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <span class="keywordflow">for</span> (; i &lt; pairs.size() &amp;&amp; pairs[i].first == <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>; ++i) {</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; selected.push_back(pairs[i].second);</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; }</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; </div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!selected.empty() || !tuples_with_any.empty());</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordflow">if</span> (selected.size() == 1 &amp;&amp; tuples_with_any.empty()) {</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InsertVarValueEncoding(selected.front(), variable, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> value_literal =</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(variable, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; BoolArgumentProto* no_support =</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> lit : selected) {</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; no_support-&gt;add_literals(lit);</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplication(lit, value_literal);</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; }</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> lit : tuples_with_any) {</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; no_support-&gt;add_literals(lit);</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; }</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; </div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="comment">// And the &quot;value&quot; literal.</span></div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; no_support-&gt;add_literals(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(value_literal));</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; }</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; }</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;}</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; </div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;<span class="comment">// Simpler encoding for table constraints with 2 variables.</span></div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;<span class="keywordtype">void</span> AddSizeTwoTable(</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt;&amp; vars, <span class="keyword">const</span> std::vector&lt;std::vector&lt;int64&gt;&gt;&amp; tuples,</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="keyword">const</span> std::vector&lt;absl::flat_hash_set&lt;int64&gt;&gt;&amp; values_per_var,</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vars.size(), 2);</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> left_var = vars[0];</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> right_var = vars[1];</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(left_var).Size() == 1 ||</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(right_var).Size() == 1) {</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <span class="comment">// A table constraint with at most one variable not fixed is trivially</span></div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="comment">// enforced after domain reduction.</span></div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; }</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; </div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; std::map&lt;int, std::vector&lt;int&gt;&gt; left_to_right;</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; std::map&lt;int, std::vector&lt;int&gt;&gt; right_to_left;</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; </div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; tuple : tuples) {</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> left_value(tuple[0]);</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> right_value(tuple[1]);</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(left_var, left_value));</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(right_var, right_value));</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; </div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> left_literal =</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(left_var, left_value);</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> right_literal =</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(right_var, right_value);</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; left_to_right[left_literal].push_back(right_literal);</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; right_to_left[right_literal].push_back(left_literal);</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; }</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; </div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="keywordtype">int</span> num_implications = 0;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <span class="keywordtype">int</span> num_clause_added = 0;</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <span class="keywordtype">int</span> num_large_clause_added = 0;</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keyword">auto</span> add_support_constraint =</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; [<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>, &amp;num_clause_added, &amp;num_large_clause_added, &amp;num_implications](</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; <span class="keywordtype">int</span> lit, <span class="keyword">const</span> std::vector&lt;int&gt;&amp; support_literals,</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; <span class="keywordtype">int</span> max_support_size) {</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; <span class="keywordflow">if</span> (support_literals.size() == max_support_size) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; <span class="keywordflow">if</span> (support_literals.size() == 1) {</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;AddImplication(lit, support_literals.front());</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; num_implications++;</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; BoolArgumentProto* bool_or =</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> support_literal : support_literals) {</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; bool_or-&gt;add_literals(support_literal);</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; }</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; bool_or-&gt;add_literals(<a class="code" href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">NegatedRef</a>(lit));</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; num_clause_added++;</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; <span class="keywordflow">if</span> (support_literals.size() &gt; max_support_size / 2) {</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; num_large_clause_added++;</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; }</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; }</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; };</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; </div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; it : left_to_right) {</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; add_support_constraint(it.first, it.second, values_per_var[1].size());</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; }</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; it : right_to_left) {</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; add_support_constraint(it.first, it.second, values_per_var[0].size());</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; }</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Table: 2 variables, &quot;</span> &lt;&lt; tuples.size() &lt;&lt; <span class="stringliteral">&quot; tuples encoded using &quot;</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; &lt;&lt; num_clause_added &lt;&lt; <span class="stringliteral">&quot; clauses, including &quot;</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; &lt;&lt; num_large_clause_added &lt;&lt; <span class="stringliteral">&quot; large clauses, &quot;</span> &lt;&lt; num_implications</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; &lt;&lt; <span class="stringliteral">&quot; implications&quot;</span>;</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;}</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; </div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;<span class="keywordtype">void</span> ExpandPositiveTable(ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="keyword">const</span> TableConstraintProto&amp; table = <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;table();</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <span class="keyword">const</span> std::vector&lt;int&gt; vars(table.vars().begin(), table.vars().end());</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = table.vars_size();</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_original_tuples = table.values_size() / num_vars;</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="comment">// Read tuples flat array and recreate the vector of tuples.</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; std::vector&lt;std::vector&lt;int64&gt;&gt; tuples(num_original_tuples);</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; <span class="keywordtype">int</span> count = 0;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> tuple_index = 0; tuple_index &lt; num_original_tuples; ++tuple_index) {</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; tuples[tuple_index].push_back(table.values(count++));</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; }</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; }</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; </div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="comment">// Compute the set of possible values for each variable (from the table).</span></div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; <span class="comment">// Remove invalid tuples along the way.</span></div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; std::vector&lt;absl::flat_hash_set&lt;int64&gt;&gt; values_per_var(num_vars);</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> tuple_index = 0; tuple_index &lt; num_original_tuples; ++tuple_index) {</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="keywordtype">bool</span> keep = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = tuples[tuple_index][var_index];</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(vars[var_index], <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)) {</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; keep = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; }</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; }</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keywordflow">if</span> (keep) {</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; values_per_var[var_index].insert(tuples[tuple_index][var_index]);</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; }</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; std::swap(tuples[tuple_index], tuples[new_size]);</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; new_size++;</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; }</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; }</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; tuples.resize(new_size);</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_valid_tuples = tuples.size();</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; </div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keywordflow">if</span> (tuples.empty()) {</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: empty&quot;</span>);</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; }</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; </div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="comment">// Update variable domains. It is redundant with presolve, but we could be</span></div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; <span class="comment">// here with presolve = false.</span></div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; <span class="comment">// Also counts the number of fixed variables.</span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <span class="keywordtype">int</span> num_fixed_variables = 0;</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; vars[var_index],</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <a class="code" href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">Domain::FromValues</a>({values_per_var[var_index].begin(),</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; values_per_var[var_index].end()})));</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(vars[var_index]).Size() == 1) {</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; num_fixed_variables++;</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; }</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; }</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; </div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <span class="keywordflow">if</span> (num_fixed_variables == num_vars - 1) {</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: one variable not fixed&quot;</span>);</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (num_fixed_variables == num_vars) {</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: all variables fixed&quot;</span>);</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; }</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; </div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; <span class="comment">// Tables with two variables do not need tuple literals.</span></div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <span class="keywordflow">if</span> (num_vars == 2) {</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; AddSizeTwoTable(vars, tuples, values_per_var, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; <span class="stringliteral">&quot;table: expanded positive constraint with two variables&quot;</span>);</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; }</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; </div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <span class="comment">// It is easier to compute this before compression, as compression will merge</span></div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; <span class="comment">// tuples.</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keywordtype">int</span> num_prefix_tuples = 0;</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; {</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; absl::flat_hash_set&lt;absl::Span&lt;const int64&gt;&gt; prefixes;</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;int64&gt;&amp; tuple : tuples) {</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; prefixes.insert(absl::MakeSpan(tuple.data(), num_vars - 1));</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; }</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; num_prefix_tuples = prefixes.size();</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; }</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; </div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <span class="comment">// TODO(user): reinvestigate ExploreSubsetOfVariablesAndAddNegatedTables.</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; </div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; <span class="comment">// Compress tuples.</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> any_value = <a class="code" href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a>;</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; std::vector&lt;int64&gt; domain_sizes;</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_vars; ++i) {</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; domain_sizes.push_back(values_per_var[i].size());</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; }</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#af71bcddf81b886f6c4700c212bacae64">CompressTuples</a>(domain_sizes, any_value, &amp;tuples);</div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_compressed_tuples = tuples.size();</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; </div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; <span class="keywordflow">if</span> (num_compressed_tuples == 1) {</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; <span class="comment">// Domains are propagated. We can remove the constraint.</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: one tuple&quot;</span>);</div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; }</div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; </div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; <span class="comment">// Detect if prefix tuples are all different.</span></div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> prefixes_are_all_different = num_prefix_tuples == num_valid_tuples;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; <span class="keywordflow">if</span> (prefixes_are_all_different) {</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(</div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; <span class="stringliteral">&quot;TODO table: last value implied by previous values&quot;</span>);</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; }</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <span class="comment">// TODO(user): if 2 table constraints share the same valid prefix, the</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="comment">// tuple literals can be reused.</span></div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; <span class="comment">// TODO(user): investigate different encoding for prefix tables. Maybe</span></div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; <span class="comment">// we can remove the need to create tuple literals.</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; </div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160; <span class="comment">// Debug message to log the status of the expansion.</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(2)) {</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; <span class="comment">// Compute the maximum number of prefix tuples.</span></div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> max_num_prefix_tuples = 1;</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index + 1 &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; max_num_prefix_tuples =</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; <a class="code" href="namespaceoperations__research.html#ab216763dccd16f5060d2fbcfb08173fb">CapProd</a>(max_num_prefix_tuples, values_per_var[var_index].size());</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; }</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; </div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160; std::string <a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a> =</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; absl::StrCat(<span class="stringliteral">&quot;Table: &quot;</span>, num_vars,</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; <span class="stringliteral">&quot; variables, original tuples = &quot;</span>, num_original_tuples);</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; <span class="keywordflow">if</span> (num_valid_tuples != num_original_tuples) {</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; absl::StrAppend(&amp;<a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>, <span class="stringliteral">&quot;, valid tuples = &quot;</span>, num_valid_tuples);</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; }</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160; <span class="keywordflow">if</span> (prefixes_are_all_different) {</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; <span class="keywordflow">if</span> (num_prefix_tuples &lt; max_num_prefix_tuples) {</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; absl::StrAppend(&amp;<a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>, <span class="stringliteral">&quot;, partial prefix = &quot;</span>, num_prefix_tuples, <span class="stringliteral">&quot;/&quot;</span>,</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; max_num_prefix_tuples);</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; absl::StrAppend(&amp;<a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>, <span class="stringliteral">&quot;, full prefix = true&quot;</span>);</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; }</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; absl::StrAppend(&amp;<a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>, <span class="stringliteral">&quot;, num prefix tuples = &quot;</span>, num_prefix_tuples);</div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; }</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; <span class="keywordflow">if</span> (num_compressed_tuples != num_valid_tuples) {</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; absl::StrAppend(&amp;<a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>,</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; <span class="stringliteral">&quot;, compressed tuples = &quot;</span>, num_compressed_tuples);</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; }</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <a class="code" href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a>;</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160; }</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160; </div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160; <span class="comment">// Log if we have only two tuples.</span></div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; <span class="keywordflow">if</span> (num_compressed_tuples == 2) {</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;TODO table: two tuples&quot;</span>);</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160; }</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; </div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; <span class="comment">// Create one Boolean variable per tuple to indicate if it can still be</span></div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; <span class="comment">// selected or not. Note that we don&#39;t enforce exactly one tuple to be</span></div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160; <span class="comment">// selected as this is costly.</span></div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; <span class="comment">// TODO(user): Investigate adding the at_most_one if the number of tuples</span></div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; <span class="comment">// is small.</span></div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; <span class="comment">// TODO(user): Investigate it we could recover a linear constraint:</span></div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; <span class="comment">// var = sum(tuple_literals[i] * values[i])</span></div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; <span class="comment">// It could be done here or along the deductions grouping.</span></div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; std::vector&lt;int&gt; tuple_literals(num_compressed_tuples);</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; BoolArgumentProto* at_least_one_tuple =</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_bool_or();</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160; </div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160; <span class="comment">// If we want to enumerate all solutions, we should not add new variables that</span></div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160; <span class="comment">// can take more than one value for a given feasible solution, otherwise we</span></div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160; <span class="comment">// will have a lot more solution than needed.</span></div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160; <span class="comment">// TODO(user): Alternatively, we could mark those variable so that their</span></div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160; <span class="comment">// value do not count when excluding solution, but we do not have a</span></div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160; <span class="comment">// mecanism for that yet. It might not be easy to track them down when we</span></div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160; <span class="comment">// replace them with equivalent variable too.</span></div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160; <span class="comment">// TODO(user): We use keep_all_feasible_solutions as a proxy for enumerate</span></div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160; <span class="comment">// all solution, but the concept are slightly different though.</span></div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160; BoolArgumentProto* at_most_one_tuple = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;keep_all_feasible_solutions) {</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; at_most_one_tuple =</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_at_most_one();</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160; }</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; </div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_compressed_tuples; ++var_index) {</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; tuple_literals[var_index] = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NewBoolVar();</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160; at_least_one_tuple-&gt;add_literals(tuple_literals[var_index]);</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160; <span class="keywordflow">if</span> (at_most_one_tuple != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160; at_most_one_tuple-&gt;add_literals(tuple_literals[var_index]);</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160; }</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; }</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160; </div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160; std::vector&lt;int&gt; active_tuple_literals;</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160; std::vector&lt;int64&gt; active_values;</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160; std::vector&lt;int&gt; any_tuple_literals;</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index &lt; num_vars; ++var_index) {</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; <span class="keywordflow">if</span> (values_per_var[var_index].size() == 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160; </div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; active_tuple_literals.clear();</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; active_values.clear();</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; any_tuple_literals.clear();</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> tuple_index = 0; tuple_index &lt; tuple_literals.size();</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160; ++tuple_index) {</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; <span class="keyword">const</span> <a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = tuples[tuple_index][var_index];</div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> tuple_literal = tuple_literals[tuple_index];</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160; </div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> == any_value) {</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; any_tuple_literals.push_back(tuple_literal);</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160; active_tuple_literals.push_back(tuple_literal);</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; active_values.push_back(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; }</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; }</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160; </div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160; <span class="keywordflow">if</span> (!active_tuple_literals.empty()) {</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160; ProcessOneVariable(active_tuple_literals, active_values, vars[var_index],</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160; any_tuple_literals, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; }</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160; }</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; </div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;table: expanded positive constraint&quot;</span>);</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;}</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; </div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;<span class="keywordtype">void</span> ExpandAllDiff(<span class="keywordtype">bool</span> expand_non_permutations, ConstraintProto* <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>,</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160; PresolveContext* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; AllDifferentConstraintProto&amp; <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a> = *<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;mutable_all_diff();</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size() &lt;= 2) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; </div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_vars = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size();</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160; </div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160; Domain union_of_domains = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars(0));</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; num_vars; ++i) {</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160; union_of_domains =</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; union_of_domains.UnionWith(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(<a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars(i)));</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160; }</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; </div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> is_permutation = <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars_size() == union_of_domains.Size();</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; </div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; <span class="keywordflow">if</span> (!is_permutation &amp;&amp; !expand_non_permutations) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; </div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; <span class="comment">// Collect all possible variables that can take each value, and add one linear</span></div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; <span class="comment">// equation per value stating that this value can be assigned at most once, or</span></div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; <span class="comment">// exactly once in case of permutation.</span></div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ClosedInterval&amp; <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : union_of_domains) {</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a> v = <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.start; v &lt;= <a class="code" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>.end; ++v) {</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; <span class="comment">// Collect references which domain contains v.</span></div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; std::vector&lt;int&gt; possible_refs;</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; <span class="keywordtype">int</span> fixed_variable_count = 0;</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : <a class="code" href="cp__model__fz__solver_8cc.html#aed003f5eb5197bc586b7ef2c36a63da2">proto</a>.vars()) {</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(ref, v)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160; possible_refs.push_back(ref);</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(ref).Size() == 1) {</div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; fixed_variable_count++;</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160; }</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160; }</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; </div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160; <span class="keywordflow">if</span> (fixed_variable_count &gt; 1) {</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160; <span class="comment">// Violates the definition of AllDifferent.</span></div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">void</span>)<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;NotifyThatModelIsUnsat();</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fixed_variable_count == 1) {</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; <span class="comment">// Remove values from other domains.</span></div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : possible_refs) {</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(ref).Size() == 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;IntersectDomainWith(ref, Domain(v).Complement())) {</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Empty domain for a variable in ExpandAllDiff()&quot;</span>;</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160; }</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160; }</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160; }</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160; </div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160; LinearConstraintProto* at_most_or_equal_one =</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;add_constraints()-&gt;mutable_linear();</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; <span class="keywordtype">int</span> lb = is_permutation ? 1 : 0;</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; <span class="keywordtype">int</span> ub = 1;</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> ref : possible_refs) {</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainContains(ref, v));</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160; <a class="code" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(ref).Size(), 1);</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> encoding = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;GetOrCreateVarValueEncoding(ref, v);</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">RefIsPositive</a>(encoding)) {</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160; at_most_or_equal_one-&gt;add_vars(encoding);</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; at_most_or_equal_one-&gt;add_coeffs(1);</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; at_most_or_equal_one-&gt;add_vars(<a class="code" href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">PositiveRef</a>(encoding));</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; at_most_or_equal_one-&gt;add_coeffs(-1);</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160; lb--;</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; ub--;</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160; }</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160; }</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160; at_most_or_equal_one-&gt;add_domain(lb);</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; at_most_or_equal_one-&gt;add_domain(ub);</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160; }</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160; }</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160; <span class="keywordflow">if</span> (is_permutation) {</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;alldiff: permutation expanded&quot;</span>);</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateRuleStats(<span class="stringliteral">&quot;alldiff: expanded&quot;</span>);</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; }</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160; <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;Clear();</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;}</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; </div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160; </div>
<div class="line"><a name="l01400"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a4d700795b2500705ef3031ec994fe472"> 1400</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a4d700795b2500705ef3031ec994fe472">ExpandCpModel</a>(<a class="code" href="classoperations__research_1_1sat_1_1_presolve_context.html">PresolveContext</a>* <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>) {</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().disable_constraint_expansion()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; </div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;ModelIsUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160; </div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160; <span class="comment">// Make sure all domains are initialized.</span></div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InitializeNewDomains();</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160; </div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; <span class="comment">// Clear the precedence cache.</span></div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;ClearPrecedenceCache();</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160; </div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_constraints = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;constraints_size();</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_constraints; ++i) {</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160; ConstraintProto* <span class="keyword">const</span> <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a> = <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;mutable_constraints(i);</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160; <span class="keywordtype">bool</span> skip = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; <span class="keywordflow">switch</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;constraint_case()) {</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kReservoir:</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().expand_reservoir_constraints()) {</div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160; ExpandReservoir(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160; }</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kIntMod:</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160; ExpandIntMod(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kIntDiv:</div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160; ExpandIntDiv(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kIntProd:</div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160; ExpandIntProd(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kLinMin:</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160; ExpandLinMin(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kElement:</div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().expand_element_constraints()) {</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160; ExpandElement(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160; }</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kInverse:</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160; ExpandInverse(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kAutomaton:</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().expand_automaton_constraints()) {</div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160; ExpandAutomaton(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160; }</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kTable:</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;table().negated()) {</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; ExpandNegativeTable(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().expand_table_constraints()) {</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160; ExpandPositiveTable(<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>, <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160; }</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160; <span class="keywordflow">case</span> ConstraintProto::ConstraintCase::kAllDiff:</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160; ExpandAllDiff(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().expand_alldiff_constraints(), <a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>,</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>);</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160; skip = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160; }</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160; <span class="keywordflow">if</span> (skip) <span class="keywordflow">continue</span>; <span class="comment">// Nothing was done for this constraint.</span></div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160; </div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160; <span class="comment">// Update variable-contraint graph.</span></div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateNewConstraintsVariableUsage();</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>-&gt;constraint_case() == ConstraintProto::CONSTRAINT_NOT_SET) {</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;UpdateConstraintVariableUsage(i);</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160; }</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160; </div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160; <span class="comment">// Early exit if the model is unsat.</span></div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;ModelIsUnsat()) {</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1) || <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;params().log_search_progress()) {</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160; <a class="code" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) &lt;&lt; <span class="stringliteral">&quot;UNSAT after expansion of &quot;</span></div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; &lt;&lt; <a class="code" href="namespaceoperations__research.html#a87d7aa58897e0042898d1c2207deda18">ProtobufShortDebugString</a>(*<a class="code" href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a>);</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160; }</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160; }</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160; }</div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160; </div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160; <span class="comment">// The precedence cache can become invalid during presolve as it does not</span></div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160; <span class="comment">// handle variable substitution. It is safer just to clear it at the end</span></div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160; <span class="comment">// of the expansion phase.</span></div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;ClearPrecedenceCache();</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160; </div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160; <span class="comment">// Make sure the context is consistent.</span></div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;InitializeNewDomains();</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160; </div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; <span class="comment">// Update any changed domain from the context.</span></div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;variables_size(); ++i) {</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a901c19b12842f8af153e588a689a90b5">FillDomainInProto</a>(<a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;DomainOf(i),</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a>-&gt;working_model-&gt;mutable_variables(i));</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160; }</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;}</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160; </div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;} <span class="comment">// namespace sat</span></div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;} <span class="comment">// namespace operations_research</span></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#l00697">base/logging.h:697</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a7cc25402ecd7591b4c39934dd656b1f9"><div class="ttname"><a href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a></div><div class="ttdeci">#define CHECK_GE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00701">base/logging.h:701</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab4f56aa24c4c9cddc47a6abd2d747f9a"><div class="ttname"><a href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a></div><div class="ttdeci">#define DCHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00890">base/logging.h:890</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab62f5ed8f2d48e29802be0cbbcd1359a"><div class="ttname"><a href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a></div><div class="ttdeci">#define DCHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00888">base/logging.h:888</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_accad43a85d781d53381cd53a9894b6ae"><div class="ttname"><a href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a></div><div class="ttdeci">#define LOG(severity)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00420">base/logging.h:420</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ae17f8119c108cf3070bad3449c7e0006"><div class="ttname"><a href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a></div><div class="ttdeci">#define DCHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00884">base/logging.h:884</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927"><div class="ttname"><a href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a></div><div class="ttdeci">#define VLOG(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00978">base/logging.h:978</a></div></div>
<div class="ttc" id="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#l00246">sorted_interval_list.cc:246</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a323893786ccc452af69697e1c8564ed3"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a323893786ccc452af69697e1c8564ed3">operations_research::Domain::FromValues</a></div><div class="ttdeci">static Domain FromValues(std::vector&lt; int64 &gt; values)</div><div class="ttdoc">Creates a domain from the union of an unsorted list of integer values.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00138">sorted_interval_list.cc:138</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_presolve_context_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_presolve_context.html">operations_research::sat::PresolveContext</a></div><div class="ttdef"><b>Definition:</b> <a href="presolve__context_8h_source.html#l00068">presolve_context.h:68</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_a344010e26426d6a13411648d988bc9b6"><div class="ttname"><a href="constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6">b</a></div><div class="ttdeci">int64 b</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00043">constraint_solver/table.cc:43</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_af730895c6c6ef6e03caaf6251192dfd2"><div class="ttname"><a href="constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2">a</a></div><div class="ttdeci">int64 a</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00042">constraint_solver/table.cc:42</a></div></div>
<div class="ttc" id="acp__model_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__expand_8h_html"><div class="ttname"><a href="cp__model__expand_8h.html">cp_model_expand.h</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#l00107">cp_model_fz_solver.cc:107</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="ademon__profiler_8cc_html_a05da18ca9c7b657a4a6ea24e07c9b695"><div class="ttname"><a href="demon__profiler_8cc.html#a05da18ca9c7b657a4a6ea24e07c9b695">ct</a></div><div class="ttdeci">const Constraint * ct</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00042">demon_profiler.cc:42</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_a21edc7ca4cc5802c8779d68556bc09cf"><div class="ttname"><a href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a></div><div class="ttdeci">int64 value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00043">demon_profiler.cc:43</a></div></div>
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01858">expr_array.cc:1858</a></div></div>
<div class="ttc" id="agurobi__interface_8cc_html_a5f287b83a753915ae862fed64f8640a6"><div class="ttname"><a href="gurobi__interface_8cc.html#a5f287b83a753915ae862fed64f8640a6">context</a></div><div class="ttdeci">GurobiMPCallbackContext * context</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00512">gurobi_interface.cc:512</a></div></div>
<div class="ttc" id="ahash_8h_html"><div class="ttname"><a href="hash_8h.html">hash.h</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_a74ea76ea27f48fb1b6e148e1577b3719"><div class="ttname"><a href="integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719">kint64max</a></div><div class="ttdeci">static const int64 kint64max</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00062">integral_types.h:62</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_a7cde0074dfd288f2d70c0e035dacb28a"><div class="ttname"><a href="integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a">int64</a></div><div class="ttdeci">int64_t int64</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00034">integral_types.h:34</a></div></div>
<div class="ttc" id="aintegral__types_8h_html_af458164b470cbba416d5ed579e00ff60"><div class="ttname"><a href="integral__types_8h.html#af458164b470cbba416d5ed579e00ff60">kint64min</a></div><div class="ttdeci">static const int64 kint64min</div><div class="ttdef"><b>Definition:</b> <a href="integral__types_8h_source.html#l00060">integral_types.h:60</a></div></div>
<div class="ttc" id="alog__severity_8h_html_ab4a2cbab234914b320b7fae11b6e8cb9"><div class="ttname"><a href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a></div><div class="ttdeci">const int INFO</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
<div class="ttc" id="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_abce27d097bc5680207b294bdad75f59f"><div class="ttname"><a href="namespacegtl.html#abce27d097bc5680207b294bdad75f59f">gtl::FindOrDie</a></div><div class="ttdeci">const Collection::value_type::second_type &amp; FindOrDie(const Collection &amp;collection, const typename Collection::value_type::first_type &amp;key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00176">map_util.h:176</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a217338425de4389014563f1f24331713"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a217338425de4389014563f1f24331713">operations_research::sat::RefIsPositive</a></div><div class="ttdeci">bool RefIsPositive(int ref)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00034">cp_model_utils.h:34</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a22efb1995471e34caa35927a9032f5f3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a22efb1995471e34caa35927a9032f5f3">operations_research::sat::SetToNegatedLinearExpression</a></div><div class="ttdeci">void SetToNegatedLinearExpression(const LinearExpressionProto &amp;input_expr, LinearExpressionProto *output_negated_expr)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8cc_source.html#l00030">cp_model_utils.cc:30</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4d700795b2500705ef3031ec994fe472"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4d700795b2500705ef3031ec994fe472">operations_research::sat::ExpandCpModel</a></div><div class="ttdeci">void ExpandCpModel(PresolveContext *context)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__expand_8cc_source.html#l01400">cp_model_expand.cc:1400</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a901c19b12842f8af153e588a689a90b5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a901c19b12842f8af153e588a689a90b5">operations_research::sat::FillDomainInProto</a></div><div class="ttdeci">void FillDomainInProto(const Domain &amp;domain, ProtoWithDomain *proto)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00091">cp_model_utils.h:91</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_acdbc8ad33149d45a6e6fcd8b72fd68ed"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#acdbc8ad33149d45a6e6fcd8b72fd68ed">operations_research::sat::PositiveRef</a></div><div class="ttdeci">int PositiveRef(int ref)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00033">cp_model_utils.h:33</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae0803b8198728cd4f6e58498d9c60091"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae0803b8198728cd4f6e58498d9c60091">operations_research::sat::NegatedRef</a></div><div class="ttdeci">int NegatedRef(int ref)</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__utils_8h_source.html#l00032">cp_model_utils.h:32</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_af71bcddf81b886f6c4700c212bacae64"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#af71bcddf81b886f6c4700c212bacae64">operations_research::sat::CompressTuples</a></div><div class="ttdeci">void CompressTuples(absl::Span&lt; const int64 &gt; domain_sizes, int64 any_value, std::vector&lt; std::vector&lt; int64 &gt;&gt; *tuples)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2util_8cc_source.html#l00112">sat/util.cc:112</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a228fe84d99348c2b62bb4f70a6371d9b"><div class="ttname"><a href="namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b">operations_research::CapSub</a></div><div class="ttdeci">int64 CapSub(int64 x, int64 y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00154">saturated_arithmetic.h:154</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a87d7aa58897e0042898d1c2207deda18"><div class="ttname"><a href="namespaceoperations__research.html#a87d7aa58897e0042898d1c2207deda18">operations_research::ProtobufShortDebugString</a></div><div class="ttdeci">std::string ProtobufShortDebugString(const P &amp;message)</div><div class="ttdef"><b>Definition:</b> <a href="port_2proto__utils_8h_source.html#l00058">port/proto_utils.h:58</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_ab216763dccd16f5060d2fbcfb08173fb"><div class="ttname"><a href="namespaceoperations__research.html#ab216763dccd16f5060d2fbcfb08173fb">operations_research::CapProd</a></div><div class="ttdeci">int64 CapProd(int64 x, int64 y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00231">saturated_arithmetic.h:231</a></div></div>
<div class="ttc" id="aoptimization_8cc_html_af63dcc00f2023fdf498e0829e6fb8a6b"><div class="ttname"><a href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a></div><div class="ttdeci">Literal literal</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00084">optimization.cc:84</a></div></div>
<div class="ttc" id="apack_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00508">pack.cc:508</a></div></div>
<div class="ttc" id="aport_2proto__utils_8h_html"><div class="ttname"><a href="port_2proto__utils_8h.html">proto_utils.h</a></div></div>
<div class="ttc" id="apresolve__context_8h_html"><div class="ttname"><a href="presolve__context_8h.html">presolve_context.h</a></div></div>
<div class="ttc" id="aresource_8cc_html_a13421db7d7e84fff732599bcf954c5cc"><div class="ttname"><a href="resource_8cc.html#a13421db7d7e84fff732599bcf954c5cc">time</a></div><div class="ttdeci">int64 time</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l01683">resource.cc:1683</a></div></div>
<div class="ttc" id="aresource_8cc_html_a29fb0dd9484d890b12b280c41c150e20"><div class="ttname"><a href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a></div><div class="ttdeci">int64 demand</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00123">resource.cc:123</a></div></div>
<div class="ttc" id="aresource_8cc_html_a73461c37822b6ebb75b54ba1a9ffb442"><div class="ttname"><a href="resource_8cc.html#a73461c37822b6ebb75b54ba1a9ffb442">delta</a></div><div class="ttdeci">int64 delta</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l01684">resource.cc:1684</a></div></div>
<div class="ttc" id="aresource_8cc_html_af92a8383a05fdf586a52263d358f5ada"><div class="ttname"><a href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a></div><div class="ttdeci">IntervalVar * interval</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00098">resource.cc:98</a></div></div>
<div class="ttc" id="arouting__flow_8cc_html_a10b672faee4b99c6a02feb0e343f3b0f"><div class="ttname"><a href="routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f">tail</a></div><div class="ttdeci">int64 tail</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00127">routing_flow.cc:127</a></div></div>
<div class="ttc" id="arouting__flow_8cc_html_ac891d9f514e55ec8ee1212757a147888"><div class="ttname"><a href="routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888">head</a></div><div class="ttdeci">int64 head</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00128">routing_flow.cc:128</a></div></div>
<div class="ttc" id="asat_2util_8h_html"><div class="ttname"><a href="sat_2util_8h.html">util.h</a></div></div>
<div class="ttc" id="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="atrace_8cc_html_a36bd74109f547f7f8198faf5a12d2879"><div class="ttname"><a href="trace_8cc.html#a36bd74109f547f7f8198faf5a12d2879">message</a></div><div class="ttdeci">std::string message</div><div class="ttdef"><b>Definition:</b> <a href="trace_8cc_source.html#l00395">trace.cc:395</a></div></div>
<div class="ttc" id="avlog__is__on_8h_html_a956152cad330225654d128f35c00efce"><div class="ttname"><a href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a></div><div class="ttdeci">#define VLOG_IS_ON(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="vlog__is__on_8h_source.html#l00041">vlog_is_on.h:41</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_dddac007a45022d9da6ea1dee012c3b9.html">sat</a></li><li class="navelem"><a class="el" href="cp__model__expand_8cc.html">cp_model_expand.cc</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.1 </li>
</ul>
</div>
</body>
</html>