Files
ortools-clone/docs/cpp/cuts_8cc_source.html
2021-04-27 23:00:03 +02:00

2882 lines
562 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: cuts.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">9.0</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('cuts_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">cuts.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="cuts_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-2021 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="cuts_8h.html">ortools/sat/cuts.h</a>&quot;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; </div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="knapsack__solver__for__cuts_8h.html">ortools/algorithms/knapsack_solver_for_cuts.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="integral__types_8h.html">ortools/base/integral_types.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="stl__util_8h.html">ortools/base/stl_util.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="strong__vector_8h.html">ortools/base/strong_vector.h</a>&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="integer_8h.html">ortools/sat/integer.h</a>&quot;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="intervals_8h.html">ortools/sat/intervals.h</a>&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat_2linear__constraint_8h.html">ortools/sat/linear_constraint.h</a>&quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat__base_8h.html">ortools/sat/sat_base.h</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="time__limit_8h.html">ortools/util/time_limit.h</a>&quot;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">namespace </span>{</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="comment">// Minimum amount of violation of the cut constraint by the solution. This</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">// is needed to avoid numerical issues and adding cuts with minor effect.</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword">const</span> <span class="keywordtype">double</span> kMinCutViolation = 1e-4;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// Returns the lp value of a Literal.</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="keywordtype">double</span> GetLiteralLpValue(</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keyword">const</span> Literal lit,</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keyword">const</span> IntegerEncoder* encoder) {</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keyword">const</span> IntegerVariable direct_view = encoder-&gt;GetLiteralView(lit);</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">if</span> (direct_view != <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> lp_values[direct_view];</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; }</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keyword">const</span> IntegerVariable opposite_view = encoder-&gt;GetLiteralView(lit.Negated());</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(opposite_view, <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">return</span> 1.0 - lp_values[opposite_view];</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;}</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment">// Returns a constraint that disallow all given variables to be at their current</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment">// upper bound. The arguments must form a non-trival constraint of the form</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment">// sum terms (coeff * var) &lt;= upper_bound.</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;LinearConstraint GenerateKnapsackCutForCover(</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; vars,</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; coeffs, <span class="keyword">const</span> IntegerValue <a class="code" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>,</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">const</span> IntegerTrail&amp; integer_trail) {</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vars.size(), coeffs.size());</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="base_2logging_8h.html#a7e03ec13560fa94a8fea569960d7efc6">CHECK_GT</a>(vars.size(), 0);</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; LinearConstraint cut;</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; IntegerValue cut_upper_bound = IntegerValue(0);</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; IntegerValue max_coeff = coeffs[0];</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="comment">// slack = \sum_{i}(coeffs[i] * upper_bound[i]) - upper_bound.</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; IntegerValue slack = -<a class="code" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; vars.size(); ++i) {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">const</span> IntegerValue var_upper_bound =</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; integer_trail.LevelZeroUpperBound(vars[i]);</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; cut_upper_bound += var_upper_bound;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; cut.vars.push_back(vars[i]);</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; cut.coeffs.push_back(IntegerValue(1));</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; max_coeff = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_coeff, coeffs[i]);</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; slack += coeffs[i] * var_upper_bound;</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; <a class="code" href="base_2logging_8h.html#a7e03ec13560fa94a8fea569960d7efc6">CHECK_GT</a>(slack, 0.0) &lt;&lt; <span class="stringliteral">&quot;Invalid cover for knapsack cut.&quot;</span>;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; cut_upper_bound -= <a class="code" href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">CeilRatio</a>(slack, max_coeff);</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; cut.lb = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; cut.ub = cut_upper_bound;</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Generated Knapsack Constraint:&quot;</span> &lt;&lt; cut.DebugString();</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">return</span> cut;</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;}</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; </div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="keywordtype">bool</span> SolutionSatisfiesConstraint(</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keyword">const</span> LinearConstraint&amp; constraint,</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values) {</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> activity = <a class="code" href="namespaceoperations__research_1_1sat.html#aea18a909121c1c2ba4a818298611f0b2">ComputeActivity</a>(constraint, lp_values);</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> tolerance = 1e-6;</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">return</span> (activity &lt;= constraint.ub.value() + tolerance &amp;&amp;</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; activity &gt;= constraint.lb.value() - tolerance)</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; ? true</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; : <span class="keyword">false</span>;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;}</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="keywordtype">bool</span> SmallRangeAndAllCoefficientsMagnitudeAreTheSame(</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">const</span> LinearConstraint&amp; constraint, IntegerTrail* integer_trail) {</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (constraint.vars.empty()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keyword">const</span> int64_t magnitude = std::abs(constraint.coeffs[0].value());</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; constraint.coeffs.size(); ++i) {</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.vars[i];</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) -</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; integer_trail-&gt;LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) &gt;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; 1) {</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; }</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (std::abs(constraint.coeffs[i].value()) != magnitude) {</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; }</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">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;}</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="keywordtype">bool</span> AllVarsTakeIntegerValue(</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt; vars,</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values) {</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">for</span> (IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : vars) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordflow">if</span> (std::abs(lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] - std::round(lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>])) &gt; 1e-6) {</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; }</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; }</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</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; </div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="comment">// Returns smallest cover size for the given constraint taking into account</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment">// level zero bounds. Smallest Cover size is computed as follows.</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">// 1. Compute the upper bound if all variables are shifted to have zero lower</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">// bound.</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">// 2. Sort all terms (coefficient * shifted upper bound) in non decreasing</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment">// order.</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment">// 3. Add terms in cover until term sum is smaller or equal to upper bound.</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment">// 4. Add the last item which violates the upper bound. This forms the smallest</span></div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment">// cover. Return the size of this cover.</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="keywordtype">int</span> GetSmallestCoverSize(<span class="keyword">const</span> LinearConstraint&amp; constraint,</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keyword">const</span> IntegerTrail&amp; integer_trail) {</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; IntegerValue ub = constraint.ub;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; std::vector&lt;IntegerValue&gt; sorted_terms;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.vars.size(); ++i) {</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.coeffs[i];</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.vars[i];</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">const</span> IntegerValue var_ub = integer_trail.LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keyword">const</span> IntegerValue var_lb = integer_trail.LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; ub -= var_lb * coeff;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; sorted_terms.push_back(coeff * (var_ub - var_lb));</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; }</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; std::sort(sorted_terms.begin(), sorted_terms.end(),</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; std::greater&lt;IntegerValue&gt;());</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordtype">int</span> smallest_cover_size = 0;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; IntegerValue sorted_term_sum = IntegerValue(0);</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keywordflow">while</span> (sorted_term_sum &lt;= ub &amp;&amp;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; smallest_cover_size &lt; constraint.vars.size()) {</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; sorted_term_sum += sorted_terms[smallest_cover_size++];</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="keywordflow">return</span> smallest_cover_size;</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;}</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; </div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="keywordtype">bool</span> ConstraintIsEligibleForLifting(<span class="keyword">const</span> LinearConstraint&amp; constraint,</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">const</span> IntegerTrail&amp; integer_trail) {</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : constraint.vars) {</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span> (integer_trail.LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(0) ||</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; integer_trail.LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(1)) {</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; }</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;}</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
<div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#accb737ae1fad15d6798a4b8bc27cea51"> 174</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#accb737ae1fad15d6798a4b8bc27cea51">LiftKnapsackCut</a>(</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint,</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; cut_vars_original_coefficients,</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail, <a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>,</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>* cut) {</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; std::set&lt;IntegerVariable&gt; vars_in_cut;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">for</span> (IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>) {</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; vars_in_cut.insert(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; }</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; std::vector&lt;std::pair&lt;IntegerValue, IntegerVariable&gt;&gt; non_zero_vars;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; std::vector&lt;std::pair&lt;IntegerValue, IntegerVariable&gt;&gt; zero_vars;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordflow">if</span> (integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(0) ||</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(1)) {</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; }</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">if</span> (vars_in_cut.find(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != vars_in_cut.end()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">if</span> (lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] &lt;= 1e-6) {</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; zero_vars.push_back({coeff, <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>});</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; non_zero_vars.push_back({coeff, <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>});</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; }</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="comment">// Decide lifting sequence (nonzeros, zeros in nonincreasing order</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">// of coefficient ).</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; std::sort(non_zero_vars.rbegin(), non_zero_vars.rend());</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; std::sort(zero_vars.rbegin(), zero_vars.rend());</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; </div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; std::vector&lt;std::pair&lt;IntegerValue, IntegerVariable&gt;&gt; lifting_sequence(</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; std::move(non_zero_vars));</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; </div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; lifting_sequence.insert(lifting_sequence.end(), zero_vars.begin(),</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; zero_vars.end());</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; <span class="comment">// Form Knapsack.</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; std::vector&lt;double&gt; lifting_profits;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; std::vector&lt;double&gt; lifting_weights;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; lifting_profits.push_back(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i].value());</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; lifting_weights.push_back(cut_vars_original_coefficients[i].<a class="code" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>());</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; }</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="comment">// Lift the cut.</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordtype">bool</span> is_lifted = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordtype">bool</span> is_solution_optimal = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html">KnapsackSolverForCuts</a> knapsack_solver(<span class="stringliteral">&quot;Knapsack cut lifter&quot;</span>);</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> entry : lifting_sequence) {</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; is_solution_optimal = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keyword">const</span> IntegerValue var_original_coeff = entry.first;</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = entry.second;</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keyword">const</span> IntegerValue lifting_capacity = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> - entry.first;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (lifting_capacity &lt;= IntegerValue(0)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a902b91803b24fe467929767c65b6ee4f">Init</a>(lifting_profits, lifting_weights,</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; lifting_capacity.value());</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a4bcd14198cbb6f2c3bea61c85015e07a">set_node_limit</a>(100);</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="comment">// NOTE: Since all profits and weights are integer, solution of</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="comment">// knapsack is also integer.</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="comment">// TODO(user): Use an integer solver or heuristic.</span></div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#aab4a9c689632460b6b96f3d4bf22f86e">Solve</a>(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>, &amp;is_solution_optimal);</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> knapsack_upper_bound =</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; std::round(knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#afa66a5ae5f09a131d7fdb338b8a212ba">GetUpperBound</a>());</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keyword">const</span> IntegerValue cut_coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> - knapsack_upper_bound;</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">if</span> (cut_coeff &gt; IntegerValue(0)) {</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; is_lifted = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(cut_coeff);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; lifting_profits.push_back(cut_coeff.value());</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; lifting_weights.push_back(var_original_coeff.value());</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</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; <span class="keywordflow">return</span> is_lifted;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;}</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; </div>
<div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a1de556a1559f25bd0819655d375f6c8e"> 252</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a1de556a1559f25bd0819655d375f6c8e">GetPreprocessedLinearConstraint</a>(</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint,</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail) {</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; IntegerValue ub = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> constraint_with_left_vars;</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keyword">const</span> IntegerValue var_ub = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordflow">if</span> (var_ub.value() - lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] &lt;= 1.0 - kMinCutViolation) {</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; constraint_with_left_vars.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; constraint_with_left_vars.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(coeff);</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// Variable not in cut</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keyword">const</span> IntegerValue var_lb = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; ub -= coeff * var_lb;</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; }</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; constraint_with_left_vars.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = ub;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; constraint_with_left_vars.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a>;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordflow">return</span> constraint_with_left_vars;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;}</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; </div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ac8b530afe36cf1521c919ca43429926d"> 276</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ac8b530afe36cf1521c919ca43429926d">ConstraintIsTriviallyTrue</a>(<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint,</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail) {</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; IntegerValue term_sum = IntegerValue(0);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keyword">const</span> IntegerValue var_ub = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; term_sum += coeff * var_ub;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; }</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">if</span> (term_sum &lt;= constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>) {</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Filtered by cover filter&quot;</span>;</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; }</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;}</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; </div>
<div class="line"><a name="l00292"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a588b516182cd6d5d8c048dfd76bc5523"> 292</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a588b516182cd6d5d8c048dfd76bc5523">CanBeFilteredUsingCutLowerBound</a>(</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; preprocessed_constraint,</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail) {</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; std::vector&lt;double&gt; variable_upper_bound_distances;</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>) {</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">const</span> IntegerValue var_ub = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; variable_upper_bound_distances.push_back(var_ub.value() - lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>]);</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; }</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="comment">// Compute the min cover size.</span></div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> smallest_cover_size =</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; GetSmallestCoverSize(preprocessed_constraint, integer_trail);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; </div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; std::nth_element(</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; variable_upper_bound_distances.begin(),</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; variable_upper_bound_distances.begin() + smallest_cover_size - 1,</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; variable_upper_bound_distances.end());</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keywordtype">double</span> cut_lower_bound = 0.0;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; smallest_cover_size; ++i) {</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; cut_lower_bound += variable_upper_bound_distances[i];</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; }</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordflow">if</span> (cut_lower_bound &gt;= 1.0 - kMinCutViolation) {</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Filtered by kappa heuristic&quot;</span>;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;}</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
<div class="line"><a name="l00320"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a457076abfb3071fca80b8175363e3dfa"> 320</a></span>&#160;<span class="keywordtype">double</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a457076abfb3071fca80b8175363e3dfa">GetKnapsackUpperBound</a>(std::vector&lt;KnapsackItem&gt; items,</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>) {</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="comment">// Sort items by value by weight ratio.</span></div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; std::sort(items.begin(), items.end(), std::greater&lt;KnapsackItem&gt;());</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordtype">double</span> left_capacity = <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>;</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keywordtype">double</span> profit = 0.0;</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_knapsack_item.html">KnapsackItem</a> item : items) {</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordflow">if</span> (item.weight &lt;= left_capacity) {</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; profit += item.profit;</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; left_capacity -= item.weight;</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; profit += (left_capacity / item.weight) * item.profit;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; }</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; }</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">return</span> profit;</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;}</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; </div>
<div class="line"><a name="l00338"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a8c8db245a613f2fb46d917cd78100f83"> 338</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a8c8db245a613f2fb46d917cd78100f83">CanBeFilteredUsingKnapsackUpperBound</a>(</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint,</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail) {</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; std::vector&lt;KnapsackItem&gt; items;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keywordtype">double</span> <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> = -constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>.value() - 1.0;</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordtype">double</span> sum_variable_profit = 0;</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keyword">const</span> IntegerValue var_ub = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keyword">const</span> IntegerValue var_lb = integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_knapsack_item.html">KnapsackItem</a> item;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; item.<a class="code" href="structoperations__research_1_1sat_1_1_knapsack_item.html#a3ff84545f00a56ba7584b2a7f2cef69c">profit</a> = var_ub.value() - lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; item.<a class="code" href="structoperations__research_1_1sat_1_1_knapsack_item.html#a99108733d00274978a4979dc072bd513">weight</a> = (coeff * (var_ub - var_lb)).value();</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; items.push_back(item);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> += (coeff * var_ub).<a class="code" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>();</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; sum_variable_profit += item.<a class="code" href="structoperations__research_1_1sat_1_1_knapsack_item.html#a3ff84545f00a56ba7584b2a7f2cef69c">profit</a>;</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; }</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="comment">// Return early if the required upper bound is negative since all the profits</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// are non negative.</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keywordflow">if</span> (sum_variable_profit - 1.0 + kMinCutViolation &lt; 0.0) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; </div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// Get the knapsack upper bound.</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> knapsack_upper_bound =</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a457076abfb3071fca80b8175363e3dfa">GetKnapsackUpperBound</a>(std::move(items), <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">if</span> (knapsack_upper_bound &lt; sum_variable_profit - 1.0 + kMinCutViolation) {</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Filtered by knapsack upper bound&quot;</span>;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;}</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; </div>
<div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a32f0016572d69bfcd1f3af811b2043ad"> 372</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a32f0016572d69bfcd1f3af811b2043ad">CanFormValidKnapsackCover</a>(</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; preprocessed_constraint,</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail) {</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#ac8b530afe36cf1521c919ca43429926d">ConstraintIsTriviallyTrue</a>(preprocessed_constraint, integer_trail)) {</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#a588b516182cd6d5d8c048dfd76bc5523">CanBeFilteredUsingCutLowerBound</a>(preprocessed_constraint, lp_values,</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; integer_trail)) {</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</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 class="code" href="namespaceoperations__research_1_1sat.html#a8c8db245a613f2fb46d917cd78100f83">CanBeFilteredUsingKnapsackUpperBound</a>(preprocessed_constraint, lp_values,</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; integer_trail)) {</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; }</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;}</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; </div>
<div class="line"><a name="l00390"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a06e2118f6735d033f7f43a939abe558d"> 390</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a06e2118f6735d033f7f43a939abe558d">ConvertToKnapsackForm</a>(<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint,</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; std::vector&lt;LinearConstraint&gt;* knapsack_constraints,</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail) {</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// If all coefficient are the same, the generated knapsack cuts cannot be</span></div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// stronger than the constraint itself. However, when we substitute variables</span></div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="comment">// using the implication graph, this is not longer true. So we only skip</span></div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="comment">// constraints with same coeff and no substitutions.</span></div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordflow">if</span> (SmallRangeAndAllCoefficientsMagnitudeAreTheSame(constraint,</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; integer_trail)) {</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; }</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">if</span> (constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> &lt; <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>) {</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> canonical_knapsack_form;</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; </div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// Negate the variables with negative coefficients.</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (coeff &gt; IntegerValue(0)) {</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, coeff);</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), -coeff);</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; }</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; knapsack_constraints-&gt;push_back(canonical_knapsack_form);</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; }</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; </div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="keywordflow">if</span> (constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> &gt; <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>) {</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> canonical_knapsack_form;</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; </div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// Negate the variables with positive coefficients.</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; constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keyword">const</span> IntegerValue coeff = constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keywordflow">if</span> (coeff &gt; IntegerValue(0)) {</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), coeff);</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, -coeff);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; }</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = -constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a>;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; canonical_knapsack_form.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; knapsack_constraints-&gt;push_back(canonical_knapsack_form);</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;}</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; </div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160;<span class="comment">// TODO(user): Move the cut generator into a class and reuse variables.</span></div>
<div class="line"><a name="l00439"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ac158f737c8653b1fc1bd294ea2d3412d"> 439</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#ac158f737c8653b1fc1bd294ea2d3412d">CreateKnapsackCoverCutGenerator</a>(</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keyword">const</span> std::vector&lt;LinearConstraint&gt;&amp; base_constraints,</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; vars, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = vars;</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; </div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; std::vector&lt;LinearConstraint&gt; knapsack_constraints;</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint : base_constraints) {</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// There is often a lot of small linear base constraints and it doesn&#39;t seem</span></div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="comment">// super useful to generate cuts for constraints of size 2. Any valid cut</span></div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="comment">// of size 1 should be already infered by the propagation.</span></div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="comment">// TODO(user): The case of size 2 is a bit less clear. investigate more if</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="comment">// it is useful.</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">if</span> (constraint.vars.size() &lt;= 2) <span class="keywordflow">continue</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; <a class="code" href="namespaceoperations__research_1_1sat.html#a06e2118f6735d033f7f43a939abe558d">ConvertToKnapsackForm</a>(constraint, &amp;knapsack_constraints, integer_trail);</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; }</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;#knapsack constraints: &quot;</span> &lt;&lt; knapsack_constraints.size();</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; </div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// Note(user): for Knapsack cuts, it seems always advantageous to replace a</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="comment">// variable X by a TIGHT lower bound of the form &quot;coeff * binary + lb&quot;. This</span></div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// will not change &quot;covers&quot; but can only result in more violation by the</span></div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="comment">// current LP solution.</span></div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html">ImpliedBoundsProcessor</a> implied_bounds_processor(</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; vars, integer_trail, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>&gt;());</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; </div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="comment">// TODO(user): do not add generator if there are no knapsack constraints.</span></div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> = [implied_bounds_processor, knapsack_constraints, vars,</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, integer_trail](</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; lp_values,</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) <span class="keyword">mutable</span> {</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="comment">// TODO(user): When we use implied-bound substitution, we might still infer</span></div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">// an interesting cut even if all variables are integer. See if we still</span></div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// want to skip all such constraints.</span></div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keywordflow">if</span> (AllVarsTakeIntegerValue(vars, lp_values)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; </div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html">KnapsackSolverForCuts</a> knapsack_solver(</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="stringliteral">&quot;Knapsack on demand cover cut generator&quot;</span>);</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; int64_t skipped_constraints = 0;</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> mutable_constraint;</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; </div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="comment">// Iterate through all knapsack constraints.</span></div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; implied_bounds_processor.<a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a011f5f336c989d356c5f06a5793473c1">ClearCache</a>();</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; constraint : knapsack_constraints) {</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>&gt;()-&gt;<a class="code" href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">LimitReached</a>()) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Processing constraint: &quot;</span> &lt;&lt; constraint.DebugString();</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; </div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; mutable_constraint = constraint;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; implied_bounds_processor.<a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a7fb8d0b24091252e79aea6e5666f29e8">ProcessUpperBoundedConstraint</a>(</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; lp_values, &amp;mutable_constraint);</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a5d3aa6734674f8f81aac3895cde58d6d">MakeAllCoefficientsPositive</a>(&amp;mutable_constraint);</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> preprocessed_constraint =</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a1de556a1559f25bd0819655d375f6c8e">GetPreprocessedLinearConstraint</a>(mutable_constraint, lp_values,</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; *integer_trail);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="keywordflow">if</span> (preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.empty()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; </div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a32f0016572d69bfcd1f3af811b2043ad">CanFormValidKnapsackCover</a>(preprocessed_constraint, lp_values,</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; *integer_trail)) {</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; skipped_constraints++;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; }</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; </div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="comment">// Profits are (upper_bounds[i] - lp_values[i]) for knapsack variables.</span></div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; std::vector&lt;double&gt; profits;</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; profits.reserve(preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size());</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; </div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="comment">// Weights are (coeffs[i] * (upper_bound[i] - lower_bound[i])).</span></div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; std::vector&lt;double&gt; weights;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; weights.reserve(preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size());</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; </div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordtype">double</span> <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> = -preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>.value() - 1.0;</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; <span class="comment">// Compute and store the sum of variable profits. This is the constant</span></div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="comment">// part of the objective of the problem we are trying to solve. Hence</span></div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="comment">// this part is not supplied to the knapsack_solver and is subtracted</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="comment">// when we receive the knapsack solution.</span></div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordtype">double</span> sum_variable_profit = 0;</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; </div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="comment">// Compute the profits, the weights and the capacity for the knapsack</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="comment">// instance.</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a> = preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i].value();</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> var_ub = <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> var_lb = <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> variable_profit = var_ub - lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; profits.push_back(variable_profit);</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; </div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; sum_variable_profit += variable_profit;</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; </div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a> = <a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a> * (var_ub - var_lb);</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; weights.push_back(<a class="code" href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a>);</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> += <a class="code" href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a> + <a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a> * var_lb;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; }</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a> &lt; 0.0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; </div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; std::vector&lt;IntegerVariable&gt; cut_vars;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; std::vector&lt;IntegerValue&gt; cut_vars_original_coefficients;</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; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Knapsack size: &quot;</span> &lt;&lt; profits.size();</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a902b91803b24fe467929767c65b6ee4f">Init</a>(profits, weights, <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; </div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="comment">// Set the time limit for the knapsack solver.</span></div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> time_limit_for_knapsack_solver =</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>&gt;()-&gt;GetTimeLeft();</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="comment">// Solve the instance and subtract the constant part to compute the</span></div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="comment">// sum_of_distance_to_ub_for_vars_in_cover.</span></div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="comment">// TODO(user): Consider solving the instance approximately.</span></div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordtype">bool</span> is_solution_optimal = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#afd53920302b4dcd6ef445bc52a001a5b">set_solution_upper_bound_threshold</a>(</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; sum_variable_profit - 1.0 + kMinCutViolation);</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// TODO(user): Consider providing lower bound threshold as</span></div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="comment">// sum_variable_profit - 1.0 + kMinCutViolation.</span></div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="comment">// TODO(user): Set node limit for knapsack solver.</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keyword">auto</span> time_limit_for_solver =</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; absl::make_unique&lt;TimeLimit&gt;(time_limit_for_knapsack_solver);</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> sum_of_distance_to_ub_for_vars_in_cover =</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; sum_variable_profit -</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#aab4a9c689632460b6b96f3d4bf22f86e">Solve</a>(time_limit_for_solver.get(),</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; &amp;is_solution_optimal);</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keywordflow">if</span> (is_solution_optimal) {</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Knapsack Optimal solution found yay !&quot;</span>;</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">if</span> (time_limit_for_solver-&gt;LimitReached()) {</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Knapsack Solver run out of time limit.&quot;</span>;</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; }</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">if</span> (sum_of_distance_to_ub_for_vars_in_cover &lt; 1.0 - kMinCutViolation) {</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="comment">// Constraint is eligible for the cover.</span></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; IntegerValue constraint_ub_for_cut = preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; std::set&lt;IntegerVariable&gt; vars_in_cut;</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a> = preprocessed_constraint.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">if</span> (!knapsack_solver.<a class="code" href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a3bd66bb6693c84e8b758c0d8a18ed9e5">best_solution</a>(i)) {</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; cut_vars.push_back(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; cut_vars_original_coefficients.push_back(<a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; vars_in_cut.insert(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keyword">const</span> IntegerValue var_lb = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; constraint_ub_for_cut -= <a class="code" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a> * var_lb;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; }</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; }</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> cut = GenerateKnapsackCutForCover(</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; cut_vars, cut_vars_original_coefficients, constraint_ub_for_cut,</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; *integer_trail);</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; </div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="comment">// Check if the constraint has only binary variables.</span></div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="keywordtype">bool</span> is_lifted = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">if</span> (ConstraintIsEligibleForLifting(cut, *integer_trail)) {</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1sat.html#accb737ae1fad15d6798a4b8bc27cea51">LiftKnapsackCut</a>(mutable_constraint, lp_values,</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; cut_vars_original_coefficients, *integer_trail,</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>&gt;(), &amp;cut)) {</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; is_lifted = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</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; </div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!SolutionSatisfiesConstraint(cut, lp_values));</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; manager-&gt;AddCut(cut, is_lifted ? <span class="stringliteral">&quot;LiftedKnapsack&quot;</span> : <span class="stringliteral">&quot;Knapsack&quot;</span>,</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; lp_values);</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; }</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">if</span> (skipped_constraints &gt; 0) {</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Skipped constraints: &quot;</span> &lt;&lt; skipped_constraints;</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; }</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; };</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; <span class="keywordflow">return</span> result;</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; </div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment">// Compute the larger t &lt;= max_t such that t * rhs_remainder &gt;= divisor / 2.</span></div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="comment">// This is just a separate function as it is slightly faster to compute the</span></div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160;<span class="comment">// result only once.</span></div>
<div class="line"><a name="l00618"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5"> 618</a></span>&#160;IntegerValue <a class="code" href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5">GetFactorT</a>(IntegerValue rhs_remainder, IntegerValue divisor,</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; IntegerValue max_t) {</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <a class="code" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(max_t, 1);</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keywordflow">return</span> rhs_remainder == 0</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; ? max_t</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; : <a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(max_t, <a class="code" href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">CeilRatio</a>(divisor / 2, rhs_remainder));</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"><a class="line" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667"> 626</a></span>&#160;std::function&lt;IntegerValue(IntegerValue)&gt; <a class="code" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">GetSuperAdditiveRoundingFunction</a>(</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; IntegerValue rhs_remainder, IntegerValue divisor, IntegerValue t,</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; IntegerValue max_scaling) {</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <a class="code" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(max_scaling, 1);</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; </div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="comment">// Adjust after the multiplication by t.</span></div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; rhs_remainder *= t;</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(rhs_remainder, divisor);</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; </div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="comment">// Make sure we don&#39;t have an integer overflow below. Note that we assume that</span></div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="comment">// divisor and the maximum coeff magnitude are not too different (maybe a</span></div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="comment">// factor 1000 at most) so that the final result will never overflow.</span></div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; max_scaling =</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; <a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(max_scaling, <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>() / divisor);</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; <span class="keyword">const</span> IntegerValue size = divisor - rhs_remainder;</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">if</span> (max_scaling == 1 || size == 1) {</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="comment">// TODO(user): Use everywhere a two step computation to avoid overflow?</span></div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="comment">// First divide by divisor, then multiply by t. For now, we limit t so that</span></div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <span class="comment">// we never have an overflow instead.</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="keywordflow">return</span> [t, divisor](IntegerValue coeff) {</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(t * coeff, divisor);</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; };</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (size &lt;= max_scaling) {</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keywordflow">return</span> [size, rhs_remainder, t, divisor](IntegerValue coeff) {</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(t * coeff, divisor);</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keyword">const</span> IntegerValue remainder = t * coeff - <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> * divisor;</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keyword">const</span> IntegerValue diff = remainder - rhs_remainder;</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="keywordflow">return</span> size * <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> + <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(IntegerValue(0), diff);</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; };</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (max_scaling.value() * rhs_remainder.value() &lt; divisor) {</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="comment">// Because of our max_t limitation, the rhs_remainder might stay small.</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="comment">// If it is &quot;too small&quot; we cannot use the code below because it will not be</span></div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// valid. So we just divide divisor into max_scaling bucket. The</span></div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="comment">// rhs_remainder will be in the bucket 0.</span></div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <span class="comment">// Note(user): This seems the same as just increasing t, modulo integer</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="comment">// overflows. Maybe we should just always do the computation like this so</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="comment">// that we can use larger t even if coeff is close to kint64max.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <span class="keywordflow">return</span> [t, divisor, max_scaling](IntegerValue coeff) {</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(t * coeff, divisor);</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="keyword">const</span> IntegerValue remainder = t * coeff - <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> * divisor;</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keyword">const</span> IntegerValue bucket = <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(remainder * max_scaling, divisor);</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keywordflow">return</span> max_scaling * <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> + bucket;</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="keywordflow">else</span> {</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <span class="comment">// We divide (size = divisor - rhs_remainder) into (max_scaling - 1) buckets</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="comment">// and increase the function by 1 / max_scaling for each of them.</span></div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="comment">// Note that for different values of max_scaling, we get a family of</span></div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="comment">// functions that do not dominate each others. So potentially, a max scaling</span></div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="comment">// as low as 2 could lead to the better cut (this is exactly the Letchford &amp;</span></div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <span class="comment">// Lodi function).</span></div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; <span class="comment">// Another intersting fact, is that if we want to compute the maximum alpha</span></div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <span class="comment">// for a constraint with 2 terms like:</span></div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="comment">// divisor * Y + (ratio * divisor + remainder) * X</span></div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="comment">// &lt;= rhs_ratio * divisor + rhs_remainder</span></div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="comment">// so that we have the cut:</span></div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="comment">// Y + (ratio + alpha) * X &lt;= rhs_ratio</span></div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="comment">// This is the same as computing the maximum alpha such that for all integer</span></div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="comment">// X &gt; 0 we have CeilRatio(alpha * divisor * X, divisor)</span></div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="comment">// &lt;= CeilRatio(remainder * X - rhs_remainder, divisor).</span></div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="comment">// We can prove that this alpha is of the form (n - 1) / n, and it will</span></div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <span class="comment">// be reached by such function for a max_scaling of n.</span></div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="comment">// TODO(user): This function is not always maximal when</span></div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="comment">// size % (max_scaling - 1) == 0. Improve?</span></div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keywordflow">return</span> [size, rhs_remainder, t, divisor, max_scaling](IntegerValue coeff) {</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(t * coeff, divisor);</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keyword">const</span> IntegerValue remainder = t * coeff - <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> * divisor;</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keyword">const</span> IntegerValue diff = remainder - rhs_remainder;</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keyword">const</span> IntegerValue bucket =</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; diff &gt; 0 ? <a class="code" href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">CeilRatio</a>(diff * (max_scaling - 1), size)</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; : IntegerValue(0);</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">return</span> max_scaling * <a class="code" href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a> + bucket;</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; };</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; }</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160;}</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; </div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160;<span class="comment">// TODO(user): This has been optimized a bit, but we can probably do even better</span></div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160;<span class="comment">// as it still takes around 25% percent of the run time when all the cuts are on</span></div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;<span class="comment">// for the opm*mps.gz problems and others.</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_integer_rounding_cut_helper.html#a66c8e6dc26260b69dcdf7668925dc3aa"> 710</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_rounding_cut_helper.html#a66c8e6dc26260b69dcdf7668925dc3aa">IntegerRoundingCutHelper::ComputeCut</a>(</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_rounding_options.html">RoundingOptions</a> options, <span class="keyword">const</span> std::vector&lt;double&gt;&amp; lp_values,</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>,</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>,</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html">ImpliedBoundsProcessor</a>* ib_processor, <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>* cut) {</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> size = lp_values.size();</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="keywordflow">if</span> (size == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(<a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>.size(), size);</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(<a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>.size(), size);</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(), size);</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.size(), size);</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <a class="code" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>);</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="comment">// To optimize the computation of the best divisor below, we only need to</span></div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <span class="comment">// look at the indices with a shifted lp value that is not close to zero.</span></div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="comment">// TODO(user): sort by decreasing lp_values so that our early abort test in</span></div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="comment">// the critical loop below has more chance of returning early? I tried but it</span></div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="comment">// didn&#39;t seems to change much though.</span></div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; relevant_indices_.clear();</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; relevant_lp_values_.clear();</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; relevant_coeffs_.clear();</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; relevant_bound_diffs_.clear();</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; divisors_.clear();</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; adjusted_coeffs_.clear();</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; </div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="comment">// Compute the maximum magnitude for non-fixed variables.</span></div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; IntegerValue max_magnitude(0);</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i] == <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keyword">const</span> IntegerValue magnitude = <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i]);</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; max_magnitude = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_magnitude, magnitude);</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; }</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; </div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="comment">// Shift each variable using its lower/upper bound so that no variable can</span></div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="comment">// change sign. We eventually do a change of variable to its negation so</span></div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <span class="comment">// that all variable are non-negative.</span></div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; <span class="keywordtype">bool</span> overflow = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; change_sign_at_postprocessing_.assign(size, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <span class="keywordflow">if</span> (cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i] == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keyword">const</span> IntegerValue magnitude = <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i]);</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; </div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="comment">// We might change them below.</span></div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; IntegerValue lb = <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i];</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keywordtype">double</span> lp_value = lp_values[i];</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; </div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="keyword">const</span> IntegerValue ub = <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i];</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keyword">const</span> IntegerValue bound_diff =</div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; IntegerValue(<a class="code" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(ub.value(), lb.value()));</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; </div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="comment">// Note that since we use ToDouble() this code works fine with lb/ub at</span></div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <span class="comment">// min/max integer value.</span></div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="comment">// TODO(user): Experiments with different heuristics. Other solver also</span></div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="comment">// seems to try a bunch of possibilities in a &quot;postprocess&quot; phase once</span></div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; <span class="comment">// the divisor is chosen. Try that.</span></div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; {</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="comment">// when the magnitude of the entry become smaller and smaller we bias</span></div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="comment">// towards a positive coefficient. This is because after rounding this</span></div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="comment">// will likely become zero instead of -divisor and we need the lp value</span></div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="comment">// to be really close to its bound to compensate.</span></div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> lb_dist = std::abs(lp_value - <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(lb));</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> ub_dist = std::abs(lp_value - <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(ub));</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> bias =</div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(1.0, 0.1 * <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(max_magnitude) / <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(magnitude));</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; <span class="keywordflow">if</span> ((bias * lb_dist &gt; ub_dist &amp;&amp; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i] &lt; 0) ||</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; (lb_dist &gt; bias * ub_dist &amp;&amp; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i] &gt; 0)) {</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; change_sign_at_postprocessing_[i] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i] = -cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; lp_value = -lp_value;</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; lb = -ub;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; }</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; }</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; </div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <span class="comment">// Always shift to lb.</span></div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="comment">// coeff * X = coeff * (X - shift) + coeff * shift.</span></div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; lp_value -= <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(lb);</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(-cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i], lb, &amp;cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>)) {</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; overflow = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; }</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; </div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <span class="comment">// Deal with fixed variable, no need to shift back in this case, we can</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <span class="comment">// just remove the term.</span></div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="keywordflow">if</span> (bound_diff == 0) {</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i] = IntegerValue(0);</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; lp_value = 0.0;</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; }</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; </div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">if</span> (std::abs(lp_value) &gt; 1e-2) {</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; relevant_coeffs_.push_back(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i]);</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; relevant_indices_.push_back(i);</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; relevant_lp_values_.push_back(lp_value);</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; relevant_bound_diffs_.push_back(bound_diff);</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; divisors_.push_back(magnitude);</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; }</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; }</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; </div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="comment">// TODO(user): Maybe this shouldn&#39;t be called on such constraint.</span></div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordflow">if</span> (relevant_coeffs_.empty()) {</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Issue, nothing to cut.&quot;</span>;</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; *cut = <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>(IntegerValue(0), IntegerValue(0));</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; }</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; <a class="code" href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a>(max_magnitude, 0);</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="comment">// Our heuristic will try to generate a few different cuts, and we will keep</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="comment">// the most violated one scaled by the l2 norm of the relevant position.</span></div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="comment">// TODO(user): Experiment for the best value of this initial violation</span></div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <span class="comment">// threshold. Note also that we use the l2 norm on the restricted position</span></div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="comment">// here. Maybe we should change that? On that note, the L2 norm usage seems a</span></div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="comment">// bit weird to me since it grows with the number of term in the cut. And</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="comment">// often, we already have a good cut, and we make it stronger by adding extra</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="comment">// terms that do not change its activity.</span></div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <span class="comment">// The discussion above only concern the best_scaled_violation initial value.</span></div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="comment">// The remainder_threshold allows to not consider cuts for which the final</span></div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="comment">// efficacity is clearly lower than 1e-3 (it is a bound, so we could generate</span></div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="comment">// cuts with a lower efficacity than this).</span></div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; <span class="keywordtype">double</span> best_scaled_violation = 0.01;</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keyword">const</span> IntegerValue remainder_threshold(max_magnitude / 1000);</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; </div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="comment">// The cut-&gt;ub might have grown quite a bit with the bound substitution, so</span></div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="comment">// we need to include it too since we will apply the rounding function on it.</span></div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; max_magnitude = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_magnitude, <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>));</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; </div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="comment">// Make sure that when we multiply the rhs or the coefficient by a factor t,</span></div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="comment">// we do not have an integer overflow. Actually, we need a bit more room</span></div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="comment">// because we might round down a value to the next multiple of</span></div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="comment">// max_magnitude.</span></div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keyword">const</span> IntegerValue threshold = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a> / 2;</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keywordflow">if</span> (overflow || max_magnitude &gt;= threshold) {</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Issue, overflow.&quot;</span>;</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; *cut = <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>(IntegerValue(0), IntegerValue(0));</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">return</span>;</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; <span class="keyword">const</span> IntegerValue max_t = threshold / max_magnitude;</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; </div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <span class="comment">// There is no point trying twice the same divisor or a divisor that is too</span></div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="comment">// small. Note that we use a higher threshold than the remainder_threshold</span></div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="comment">// because we can boost the remainder thanks to our adjusting heuristic below</span></div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">// and also because this allows to have cuts with a small range of</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="comment">// coefficients.</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="comment">// TODO(user): Note that the std::sort() is visible in some cpu profile.</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; {</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keyword">const</span> IntegerValue divisor_threshold = max_magnitude / 10;</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; divisors_.size(); ++i) {</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="keywordflow">if</span> (divisors_[i] &lt;= divisor_threshold) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; divisors_[new_size++] = divisors_[i];</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; }</div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; divisors_.resize(new_size);</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; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;divisors_, std::greater&lt;IntegerValue&gt;());</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">// TODO(user): Avoid quadratic algorithm? Note that we are quadratic in</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="comment">// relevant_indices not the full cut-&gt;coeffs.size(), but this is still too</span></div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="comment">// much on some problems.</span></div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; IntegerValue best_divisor(0);</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerValue divisor : divisors_) {</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="comment">// Skip if we don&#39;t have the potential to generate a good enough cut.</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keyword">const</span> IntegerValue initial_rhs_remainder =</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> - <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>, divisor) * divisor;</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <span class="keywordflow">if</span> (initial_rhs_remainder &lt;= remainder_threshold) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; </div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; IntegerValue temp_ub = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; adjusted_coeffs_.clear();</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; </div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; <span class="comment">// We will adjust coefficient that are just under an exact multiple of</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; <span class="comment">// divisor to an exact multiple. This is meant to get rid of small errors</span></div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="comment">// that appears due to rounding error in our exact computation of the</span></div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="comment">// initial constraint given to this class.</span></div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="comment">// Each adjustement will cause the initial_rhs_remainder to increase, and we</span></div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <span class="comment">// do not want to increase it above divisor. Our threshold below guarantees</span></div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <span class="comment">// this. Note that the higher the rhs_remainder becomes, the more the</span></div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; <span class="comment">// function f() has a chance to reduce the violation, so it is not always a</span></div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; <span class="comment">// good idea to use all the slack we have between initial_rhs_remainder and</span></div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; <span class="comment">// divisor.</span></div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; <span class="comment">// TODO(user): If possible, it might be better to complement these</span></div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="comment">// variables. Even if the adjusted lp_values end up larger, if we loose less</span></div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; <span class="comment">// when taking f(), then we will have a better violation.</span></div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; <span class="keyword">const</span> IntegerValue adjust_threshold =</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; (divisor - initial_rhs_remainder - 1) / IntegerValue(size);</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <span class="keywordflow">if</span> (adjust_threshold &gt; 0) {</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <span class="comment">// Even before we finish the adjust, we can have a lower bound on the</span></div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="comment">// activily loss using this divisor, and so we can abort early. This is</span></div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="comment">// similar to what is done below in the function.</span></div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordtype">bool</span> early_abort = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordtype">double</span> loss_lb = 0.0;</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> threshold = <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(initial_rhs_remainder);</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="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; relevant_coeffs_.size(); ++i) {</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; <span class="comment">// Compute the difference of coeff with the next multiple of divisor.</span></div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="keyword">const</span> IntegerValue coeff = relevant_coeffs_[i];</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keyword">const</span> IntegerValue remainder =</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">CeilRatio</a>(coeff, divisor) * divisor - coeff;</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; </div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">if</span> (divisor - remainder &lt;= initial_rhs_remainder) {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="comment">// We do not know exactly f() yet, but it will always round to the</span></div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="comment">// floor of the division by divisor in this case.</span></div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; loss_lb += <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(divisor - remainder) * relevant_lp_values_[i];</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="keywordflow">if</span> (loss_lb &gt;= threshold) {</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; early_abort = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; }</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; }</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; </div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="comment">// Adjust coeff of the form k * divisor - epsilon.</span></div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <span class="keyword">const</span> IntegerValue diff = relevant_bound_diffs_[i];</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="keywordflow">if</span> (remainder &gt; 0 &amp;&amp; remainder &lt;= adjust_threshold &amp;&amp;</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(diff.value(), remainder.value()) &lt;= adjust_threshold) {</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; temp_ub += remainder * diff;</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; adjusted_coeffs_.push_back({i, coeff + remainder});</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; }</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; }</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; </div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <span class="keywordflow">if</span> (early_abort) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; }</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; </div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="comment">// Create the super-additive function f().</span></div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; <span class="keyword">const</span> IntegerValue rhs_remainder =</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; temp_ub - <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(temp_ub, divisor) * divisor;</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keywordflow">if</span> (rhs_remainder == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; </div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> f = <a class="code" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">GetSuperAdditiveRoundingFunction</a>(</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; rhs_remainder, divisor, <a class="code" href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5">GetFactorT</a>(rhs_remainder, divisor, max_t),</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; options.<a class="code" href="structoperations__research_1_1sat_1_1_rounding_options.html#a01db407e90fac1c31c6705758a057908">max_scaling</a>);</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; </div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; <span class="comment">// As we round coefficients, we will compute the loss compared to the</span></div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="comment">// current scaled constraint activity. As soon as this loss crosses the</span></div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; <span class="comment">// slack, then we known that there is no violation and we can abort early.</span></div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <span class="comment">// TODO(user): modulo the scaling, we could compute the exact threshold</span></div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="comment">// using our current best cut. Note that we also have to account the change</span></div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <span class="comment">// in slack due to the adjust code above.</span></div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> scaling = <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(f(divisor)) / <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(divisor);</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> threshold = scaling * <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(rhs_remainder);</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <span class="keywordtype">double</span> loss = 0.0;</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; </div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="comment">// Apply f() to the cut and compute the cut violation. Note that it is</span></div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; <span class="comment">// okay to just look at the relevant indices since the other have a lp</span></div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; <span class="comment">// value which is almost zero. Doing it like this is faster, and even if</span></div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; <span class="comment">// the max_magnitude might be off it should still be relevant enough.</span></div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keywordtype">double</span> violation = -<a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(f(temp_ub));</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; <span class="keywordtype">double</span> l2_norm = 0.0;</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordtype">bool</span> early_abort = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="keywordtype">int</span> adjusted_coeffs_index = 0;</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; relevant_coeffs_.size(); ++i) {</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; IntegerValue coeff = relevant_coeffs_[i];</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; </div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <span class="comment">// Adjust coeff according to our previous computation if needed.</span></div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keywordflow">if</span> (adjusted_coeffs_index &lt; adjusted_coeffs_.size() &amp;&amp;</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; adjusted_coeffs_[adjusted_coeffs_index].first == i) {</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; coeff = adjusted_coeffs_[adjusted_coeffs_index].second;</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; adjusted_coeffs_index++;</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; }</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; </div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; <span class="keywordflow">if</span> (coeff == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keyword">const</span> IntegerValue new_coeff = f(coeff);</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> new_coeff_double = <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(new_coeff);</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> lp_value = relevant_lp_values_[i];</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; </div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; l2_norm += new_coeff_double * new_coeff_double;</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; violation += new_coeff_double * lp_value;</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; loss += (scaling * <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(coeff) - new_coeff_double) * lp_value;</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keywordflow">if</span> (loss &gt;= threshold) {</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; early_abort = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; }</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <span class="keywordflow">if</span> (early_abort) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; </div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <span class="comment">// Here we scale by the L2 norm over the &quot;relevant&quot; positions. This seems</span></div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="comment">// to work slighly better in practice.</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; violation /= sqrt(l2_norm);</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="keywordflow">if</span> (violation &gt; best_scaled_violation) {</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; best_scaled_violation = violation;</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; best_divisor = divisor;</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; </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="keywordflow">if</span> (best_divisor == 0) {</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; *cut = <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>(IntegerValue(0), IntegerValue(0));</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; }</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; </div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <span class="comment">// Adjust coefficients.</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <span class="comment">// TODO(user): It might make sense to also adjust the one with a small LP</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <span class="comment">// value, but then the cut will be slighlty different than the one we computed</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="comment">// above. Try with and without maybe?</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <span class="keyword">const</span> IntegerValue initial_rhs_remainder =</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> - <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>, best_divisor) * best_divisor;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <span class="keyword">const</span> IntegerValue adjust_threshold =</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; (best_divisor - initial_rhs_remainder - 1) / IntegerValue(size);</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keywordflow">if</span> (adjust_threshold &gt; 0) {</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; relevant_indices_.size(); ++i) {</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = relevant_indices_[i];</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <span class="keyword">const</span> IntegerValue diff = relevant_bound_diffs_[i];</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="keywordflow">if</span> (diff &gt; adjust_threshold) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; </div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="comment">// Adjust coeff of the form k * best_divisor - epsilon.</span></div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; <span class="keyword">const</span> IntegerValue coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="keyword">const</span> IntegerValue remainder =</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">CeilRatio</a>(coeff, best_divisor) * best_divisor - coeff;</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(diff.value(), remainder.value()) &lt;= adjust_threshold) {</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> += remainder * diff;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] += remainder;</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; }</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; }</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; }</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; </div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="comment">// Create the super-additive function f().</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; <span class="comment">// TODO(user): Try out different rounding function and keep the best. We can</span></div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; <span class="comment">// change max_t and max_scaling. It might not be easy to choose which cut is</span></div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="comment">// the best, but we can at least know for sure if one dominate the other</span></div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="comment">// completely. That is, if for all coeff f(coeff)/f(divisor) is greater than</span></div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="comment">// or equal to the same value for another function f.</span></div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="keyword">const</span> IntegerValue rhs_remainder =</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> - <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>, best_divisor) * best_divisor;</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; IntegerValue factor_t = <a class="code" href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5">GetFactorT</a>(rhs_remainder, best_divisor, max_t);</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <span class="keyword">auto</span> f = <a class="code" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">GetSuperAdditiveRoundingFunction</a>(rhs_remainder, best_divisor,</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; factor_t, options.<a class="code" href="structoperations__research_1_1sat_1_1_rounding_options.html#a01db407e90fac1c31c6705758a057908">max_scaling</a>);</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; </div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="comment">// Look amongst all our possible function f() for one that dominate greedily</span></div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="comment">// our current best one. Note that we prefer lower scaling factor since that</span></div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; <span class="comment">// result in a cut with lower coefficients.</span></div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; remainders_.clear();</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <span class="keyword">const</span> IntegerValue coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="keyword">const</span> IntegerValue r =</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; coeff - <a class="code" href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">FloorRatio</a>(coeff, best_divisor) * best_divisor;</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; <span class="keywordflow">if</span> (r &gt; rhs_remainder) remainders_.push_back(r);</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; }</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;remainders_);</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; <span class="keywordflow">if</span> (remainders_.size() &lt;= 100) {</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; best_rs_.clear();</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerValue r : remainders_) {</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; best_rs_.push_back(f(r));</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; IntegerValue best_d = f(best_divisor);</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; </div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="comment">// Note that the complexity seems high 100 * 2 * options.max_scaling, but</span></div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; <span class="comment">// this only run on cuts that are already efficient and the inner loop tend</span></div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="comment">// to abort quickly. I didn&#39;t see this code in the cpu profile so far.</span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerValue t :</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; {IntegerValue(1), <a class="code" href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5">GetFactorT</a>(rhs_remainder, best_divisor, max_t)}) {</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keywordflow">for</span> (IntegerValue s(2); s &lt;= options.<a class="code" href="structoperations__research_1_1sat_1_1_rounding_options.html#a01db407e90fac1c31c6705758a057908">max_scaling</a>; ++s) {</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> g =</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">GetSuperAdditiveRoundingFunction</a>(rhs_remainder, best_divisor, t, s);</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; <span class="keywordtype">int</span> num_strictly_better = 0;</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; rs_.clear();</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; <span class="keyword">const</span> IntegerValue d = g(best_divisor);</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; best_rs_.size(); ++i) {</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <span class="keyword">const</span> IntegerValue temp = g(remainders_[i]);</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="keywordflow">if</span> (temp * best_d &lt; best_rs_[i] * d) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <span class="keywordflow">if</span> (temp * best_d &gt; best_rs_[i] * d) num_strictly_better++;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; rs_.push_back(temp);</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; }</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <span class="keywordflow">if</span> (rs_.size() == best_rs_.size() &amp;&amp; num_strictly_better &gt; 0) {</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; f = g;</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; factor_t = t;</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; best_rs_ = rs_;</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; best_d = d;</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; }</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="comment">// Starts to apply f() to the cut. We only apply it to the rhs here, the</span></div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="comment">// coefficient will be done after the potential lifting of some Booleans.</span></div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = f(cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>);</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; tmp_terms_.clear();</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; </div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; <span class="comment">// Lift some implied bounds Booleans. Note that we will add them after</span></div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <span class="comment">// &quot;size&quot; so they will be ignored in the second loop below.</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; num_lifted_booleans_ = 0;</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">if</span> (ib_processor != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <span class="keyword">const</span> IntegerValue coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; <span class="keywordflow">if</span> (coeff == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; </div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <span class="keywordflow">if</span> (change_sign_at_postprocessing_[i]) {</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; }</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="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">ImpliedBoundsProcessor::BestImpliedBoundInfo</a> info =</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; ib_processor-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#abb0b7cc2e259fc8ebe8fd3dd55816b75">GetCachedImpliedBoundInfo</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; </div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="comment">// Avoid overflow.</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(<a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(std::abs(coeff.value()), factor_t.value()),</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>.value()) ==</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>()) {</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; <span class="keywordflow">continue</span>;</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; </div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; <span class="comment">// Because X = bound_diff * B + S</span></div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; <span class="comment">// We can replace coeff * X by the expression before applying f:</span></div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="comment">// = f(coeff * bound_diff) * B + f(coeff) * [X - bound_diff * B]</span></div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; <span class="comment">// = f(coeff) * X + (f(coeff * bound_diff) - f(coeff) * bound_diff] B</span></div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="comment">// So we can &quot;lift&quot; B into the cut.</span></div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="keyword">const</span> IntegerValue coeff_b =</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; f(coeff * info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>) - f(coeff) * info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <a class="code" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(coeff_b, 0);</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; <span class="keywordflow">if</span> (coeff_b == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; </div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; ++num_lifted_booleans_;</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="keywordflow">if</span> (info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a6d2822d5e07c3716efcdf73a4ae5eafc">is_positive</a>) {</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; tmp_terms_.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, coeff_b});</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; tmp_terms_.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, -coeff_b});</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = <a class="code" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(-coeff_b.value(), cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>.value());</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; }</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; }</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; <span class="comment">// Apply f() to the cut.</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; <span class="comment">// Remove the bound shifts so the constraint is expressed in the original</span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="comment">// variables.</span></div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; IntegerValue coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <span class="keywordflow">if</span> (coeff == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; coeff = f(coeff);</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keywordflow">if</span> (coeff == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; <span class="keywordflow">if</span> (change_sign_at_postprocessing_[i]) {</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = IntegerValue(</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <a class="code" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>((coeff * -<a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i]).<a class="code" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>(), cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>.value()));</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; tmp_terms_.push_back({cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i], -coeff});</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = IntegerValue(</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <a class="code" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>((coeff * <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i]).<a class="code" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>(), cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>.value()));</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; tmp_terms_.push_back({cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i], coeff});</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; }</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; }</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; </div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; <span class="comment">// Basic post-processing.</span></div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">CleanTermsAndFillConstraint</a>(&amp;tmp_terms_, cut);</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a4393db2c15b2f92d7ef16ce6b38c8150">RemoveZeroTerms</a>(cut);</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ae3c495e2e05950c578b01976701f9b2a">DivideByGCD</a>(cut);</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;}</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; </div>
<div class="line"><a name="l01159"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_cover_cut_helper.html#ad86e161bb994fe49fa9c4298ebb5ae2d"> 1159</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1sat_1_1_cover_cut_helper.html#ad86e161bb994fe49fa9c4298ebb5ae2d">CoverCutHelper::TrySimpleKnapsack</a>(</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> base_ct, <span class="keyword">const</span> std::vector&lt;double&gt;&amp; lp_values,</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>,</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>) {</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> base_size = lp_values.size();</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">// Fill terms with a rewrite of the base constraint where all coeffs &amp;</span></div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <span class="comment">// variables are positive by using either (X - LB) or (UB - X) as new</span></div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; <span class="comment">// variables.</span></div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; terms_.clear();</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; IntegerValue rhs = base_ct.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; IntegerValue sum_of_diff(0);</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; IntegerValue max_base_magnitude(0);</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; base_size; ++i) {</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; <span class="keyword">const</span> IntegerValue coeff = base_ct.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <span class="keyword">const</span> IntegerValue positive_coeff = <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(coeff);</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; max_base_magnitude = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_base_magnitude, positive_coeff);</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keyword">const</span> IntegerValue bound_diff = <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i] - <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i];</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(positive_coeff, bound_diff, &amp;sum_of_diff)) {</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; }</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; <span class="keyword">const</span> IntegerValue diff = positive_coeff * bound_diff;</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="keywordflow">if</span> (coeff &gt; 0) {</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(-coeff, <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i], &amp;rhs)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; terms_.push_back(</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; {i, <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(<a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i]) - lp_values[i], positive_coeff, diff});</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(-coeff, <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i], &amp;rhs)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; terms_.push_back(</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; {i, lp_values[i] - <a class="code" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(<a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i]), positive_coeff, diff});</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; }</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; }</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; </div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; <span class="comment">// Try a simple cover heuristic.</span></div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; <span class="comment">// Look for violated CUT of the form: sum (UB - X) or (X - LB) &gt;= 1.</span></div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; <span class="keywordtype">double</span> activity = 0.0;</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; std::sort(terms_.begin(), terms_.end(), [](<span class="keyword">const</span> Term&amp; <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keyword">const</span> Term&amp; <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; if (a.dist_to_max_value == b.dist_to_max_value) {</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; <span class="comment">// Prefer low coefficients if the distance is the same.</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; return a.positive_coeff &lt; b.positive_coeff;</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; }</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; <span class="keywordflow">return</span> <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dist_to_max_value &lt; <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dist_to_max_value;</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="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; terms_.size(); ++i) {</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; <span class="keyword">const</span> Term&amp; term = terms_[i];</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; activity += term.dist_to_max_value;</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; </div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; <span class="comment">// As an heuristic we select all the term so that the sum of distance</span></div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; <span class="comment">// to the upper bound is &lt;= 1.0. If the corresponding rhs is negative, then</span></div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <span class="comment">// we will have a cut of violation at least 0.0. Note that this violation</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="comment">// can be improved by the lifting.</span></div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; <span class="comment">// TODO(user): experiment with different threshold (even greater than one).</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; <span class="comment">// Or come up with an algo that incorporate the lifting into the heuristic.</span></div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160; <span class="keywordflow">if</span> (activity &gt; 1.0) {</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; new_size = i; <span class="comment">// before this entry.</span></div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; }</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; </div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; rhs -= term.diff;</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; }</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; </div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; <span class="comment">// If the rhs is now negative, we have a cut.</span></div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; <span class="comment">// Note(user): past this point, now that a given &quot;base&quot; cover has been chosen,</span></div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; <span class="comment">// we basically compute the cut (of the form sum X &lt;= bound) with the maximum</span></div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; <span class="comment">// possible violation. Note also that we lift as much as possible, so we don&#39;t</span></div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; <span class="comment">// necessarilly optimize for the cut efficacity though. But we do get a</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; <span class="comment">// stronger cut.</span></div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160; <span class="keywordflow">if</span> (rhs &gt;= 0) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; <span class="keywordflow">if</span> (new_size == 0) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; </div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; <span class="comment">// Transform to a minimal cover. We want to greedily remove the largest coeff</span></div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; <span class="comment">// first, so we have more chance for the &quot;lifting&quot; below which can increase</span></div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; <span class="comment">// the cut violation. If the coeff are the same, we prefer to remove high</span></div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; <span class="comment">// distance from upper bound first.</span></div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; <span class="comment">// We compute the cut at the same time.</span></div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; terms_.resize(new_size);</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; std::sort(terms_.begin(), terms_.end(), [](<span class="keyword">const</span> Term&amp; <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keyword">const</span> Term&amp; <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; if (a.positive_coeff == b.positive_coeff) {</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; return a.dist_to_max_value &gt; b.dist_to_max_value;</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; <span class="keywordflow">return</span> <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.positive_coeff &gt; <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.positive_coeff;</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; in_cut_.assign(base_ct.vars.size(), <span class="keyword">false</span>);</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160; cut_.ClearTerms();</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; cut_.lb = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160; cut_.ub = IntegerValue(-1);</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160; IntegerValue max_coeff(0);</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Term term : terms_) {</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; <span class="keywordflow">if</span> (term.diff + rhs &lt; 0) {</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; rhs += term.diff;</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; }</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; in_cut_[term.index] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; max_coeff = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_coeff, term.positive_coeff);</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; cut_.vars.push_back(base_ct.vars[term.index]);</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; <span class="keywordflow">if</span> (base_ct.coeffs[term.index] &gt; 0) {</div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; cut_.coeffs.push_back(IntegerValue(1));</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; cut_.ub += <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[term.index];</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160; cut_.coeffs.push_back(IntegerValue(-1));</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160; cut_.ub -= <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[term.index];</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160; }</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160; }</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160; </div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160; <span class="comment">// In case the max_coeff variable is not binary, it might be possible to</span></div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160; <span class="comment">// tighten the cut a bit more.</span></div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160; <span class="comment">// Note(user): I never observed this on the miplib so far.</span></div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160; <span class="keywordflow">if</span> (max_coeff == 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160; <span class="keywordflow">if</span> (max_coeff &lt; -rhs) {</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160; <span class="keyword">const</span> IntegerValue m = <a class="code" href="namespaceoperations__research.html#a1e2ec837105d112356116f6308b73fca">FloorRatio</a>(-rhs - 1, max_coeff);</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160; rhs += max_coeff * m;</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160; cut_.ub -= m;</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; }</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; <a class="code" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(rhs, 0);</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; </div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160; <span class="comment">// Lift all at once the variables not used in the cover.</span></div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160; <span class="comment">// We have a cut of the form sum_i X_i &lt;= b that we will lift into</span></div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; <span class="comment">// sum_i scaling X_i + sum f(base_coeff_j) X_j &lt;= b * scaling.</span></div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160; <span class="comment">// Using the super additivity of f() and how we construct it,</span></div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160; <span class="comment">// we know that: sum_j base_coeff_j X_j &lt;= N * max_coeff + (max_coeff - slack)</span></div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160; <span class="comment">// implies that: sum_j f(base_coeff_j) X_j &lt;= N * scaling.</span></div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160; <span class="comment">// 1/ cut &gt; b -(N+1) =&gt; original sum + (N+1) * max_coeff &gt;= rhs + slack</span></div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160; <span class="comment">// 2/ rewrite 1/ as : scaling * cut &gt;= scaling * b - scaling * N =&gt; ...</span></div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160; <span class="comment">// 3/ lift &gt; N * scaling =&gt; lift_sum &gt; N * max_coeff + (max_coeff - slack)</span></div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160; <span class="comment">// And adding 2/ + 3/ we prove what we want:</span></div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160; <span class="comment">// cut * scaling + lift &gt; b * scaling =&gt; original_sum + lift_sum &gt; rhs.</span></div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; <span class="keyword">const</span> IntegerValue slack = -rhs;</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160; <span class="keyword">const</span> IntegerValue remainder = max_coeff - slack;</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; max_base_magnitude = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_base_magnitude, <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(cut_.ub));</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; <span class="keyword">const</span> IntegerValue max_scaling(<a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; IntegerValue(60), <a class="code" href="namespaceoperations__research.html#a1e2ec837105d112356116f6308b73fca">FloorRatio</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>, max_base_magnitude)));</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> f = <a class="code" href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">GetSuperAdditiveRoundingFunction</a>(remainder, max_coeff,</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160; IntegerValue(1), max_scaling);</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; </div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; <span class="keyword">const</span> IntegerValue scaling = f(max_coeff);</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160; <span class="keywordflow">if</span> (scaling &gt; 1) {</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; cut_.coeffs.size(); ++i) cut_.coeffs[i] *= scaling;</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; cut_.ub *= scaling;</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; }</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160; </div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; num_lifting_ = 0;</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; base_size; ++i) {</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; <span class="keywordflow">if</span> (in_cut_[i]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160; <span class="keyword">const</span> IntegerValue positive_coeff = <a class="code" href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">IntTypeAbs</a>(base_ct.coeffs[i]);</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160; <span class="keyword">const</span> IntegerValue new_coeff = f(positive_coeff);</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160; <span class="keywordflow">if</span> (new_coeff == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160; </div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; ++num_lifting_;</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160; <span class="keywordflow">if</span> (base_ct.coeffs[i] &gt; 0) {</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; <span class="comment">// Add new_coeff * (X - LB)</span></div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; cut_.coeffs.push_back(new_coeff);</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; cut_.vars.push_back(base_ct.vars[i]);</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160; cut_.ub += <a class="code" href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a>[i] * new_coeff;</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160; <span class="comment">// Add new_coeff * (UB - X)</span></div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160; cut_.coeffs.push_back(-new_coeff);</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; cut_.vars.push_back(base_ct.vars[i]);</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160; cut_.ub -= <a class="code" href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a>[i] * new_coeff;</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; }</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160; }</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160; </div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160; <span class="keywordflow">if</span> (scaling &gt; 1) <a class="code" href="namespaceoperations__research_1_1sat.html#ae3c495e2e05950c578b01976701f9b2a">DivideByGCD</a>(&amp;cut_);</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;}</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; </div>
<div class="line"><a name="l01332"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#acd00c99b5770a8f86418ce2c60c716b8"> 1332</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#acd00c99b5770a8f86418ce2c60c716b8">CreatePositiveMultiplicationCutGenerator</a>(IntegerVariable z,</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; IntegerVariable x,</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; IntegerVariable y,</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = {z, x, y};</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; </div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* <span class="keyword">const</span> integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; [z, x, y, integer_trail](</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; <span class="keyword">const</span> int64_t x_lb = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(x).value();</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; <span class="keyword">const</span> int64_t x_ub = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(x).value();</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160; <span class="keyword">const</span> int64_t y_lb = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(y).value();</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160; <span class="keyword">const</span> int64_t y_ub = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(y).value();</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160; </div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160; <span class="comment">// TODO(user): Compute a better bound (int_max / 4 ?).</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; <span class="keyword">const</span> int64_t kMaxSafeInteger = (int64_t{1} &lt;&lt; 53) - 1;</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; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(x_ub, y_ub) &gt;= kMaxSafeInteger) {</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(3) &lt;&lt; <span class="stringliteral">&quot;Potential overflow in PositiveMultiplicationCutGenerator&quot;</span>;</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160; }</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; </div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> x_lp_value = lp_values[x];</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> y_lp_value = lp_values[y];</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> z_lp_value = lp_values[z];</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; </div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160; <span class="comment">// TODO(user): As the bounds change monotonically, these cuts</span></div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; <span class="comment">// dominate any previous one. try to keep a reference to the cut and</span></div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; <span class="comment">// replace it. Alternatively, add an API for a level-zero bound change</span></div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160; <span class="comment">// callback.</span></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; <span class="comment">// Cut -z + x_coeff * x + y_coeff* y &lt;= rhs</span></div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160; <span class="keyword">auto</span> try_add_above_cut =</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160; [manager, z_lp_value, x_lp_value, y_lp_value, x, y, z, &amp;lp_values](</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; int64_t x_coeff, int64_t y_coeff, int64_t rhs) {</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; <span class="keywordflow">if</span> (-z_lp_value + x_lp_value * x_coeff + y_lp_value * y_coeff &gt;=</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; rhs + kMinCutViolation) {</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> cut;</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(z);</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(-1));</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160; <span class="keywordflow">if</span> (x_coeff != 0) {</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(x);</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(x_coeff));</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; }</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; <span class="keywordflow">if</span> (y_coeff != 0) {</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(y);</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(y_coeff));</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160; }</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = IntegerValue(rhs);</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160; manager-&gt;AddCut(cut, <span class="stringliteral">&quot;PositiveProduct&quot;</span>, lp_values);</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160; }</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; };</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; <span class="comment">// Cut -z + x_coeff * x + y_coeff* y &gt;= rhs</span></div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160; <span class="keyword">auto</span> try_add_below_cut =</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; [manager, z_lp_value, x_lp_value, y_lp_value, x, y, z, &amp;lp_values](</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; int64_t x_coeff, int64_t y_coeff, int64_t rhs) {</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160; <span class="keywordflow">if</span> (-z_lp_value + x_lp_value * x_coeff + y_lp_value * y_coeff &lt;=</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; rhs - kMinCutViolation) {</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> cut;</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(z);</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(-1));</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; <span class="keywordflow">if</span> (x_coeff != 0) {</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(x);</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(x_coeff));</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; }</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; <span class="keywordflow">if</span> (y_coeff != 0) {</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(y);</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(y_coeff));</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160; }</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = IntegerValue(rhs);</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; manager-&gt;AddCut(cut, <span class="stringliteral">&quot;PositiveProduct&quot;</span>, lp_values);</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160; }</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; </div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160; <span class="comment">// McCormick relaxation of bilinear constraints. These 4 cuts are the</span></div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160; <span class="comment">// exact facets of the x * y polyhedron for a bounded x and y.</span></div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; <span class="comment">// Each cut correspond to plane that contains two of the line</span></div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160; <span class="comment">// (x=x_lb), (x=x_ub), (y=y_lb), (y=y_ub). The easiest to</span></div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; <span class="comment">// understand them is to draw the x*y curves and see the 4</span></div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160; <span class="comment">// planes that correspond to the convex hull of the graph.</span></div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160; try_add_above_cut(y_lb, x_lb, x_lb * y_lb);</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160; try_add_above_cut(y_ub, x_ub, x_ub * y_ub);</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160; try_add_below_cut(y_ub, x_lb, x_lb * y_ub);</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160; try_add_below_cut(y_lb, x_ub, x_ub * y_lb);</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160; };</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160; </div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;}</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160; </div>
<div class="line"><a name="l01428"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a562723a1a137cee8f869c1d7eb9641b0"> 1428</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a562723a1a137cee8f869c1d7eb9641b0">CreateSquareCutGenerator</a>(IntegerVariable y, IntegerVariable x,</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = {y, x};</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160; </div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160; [y, x, integer_trail](</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160; <span class="keyword">const</span> int64_t x_ub = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(x).value();</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160; <span class="keyword">const</span> int64_t x_lb = integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(x).value();</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160; </div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160; <span class="keywordflow">if</span> (x_lb == x_ub) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160; </div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160; <span class="comment">// Check for potential overflows.</span></div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160; <span class="keywordflow">if</span> (x_ub &gt; (int64_t{1} &lt;&lt; 31)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160; <a class="code" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(x_lb, 0);</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160; </div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> y_lp_value = lp_values[y];</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> x_lp_value = lp_values[x];</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160; </div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160; <span class="comment">// First cut: target should be below the line:</span></div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160; <span class="comment">// (x_lb, x_lb ^ 2) to (x_ub, x_ub ^ 2).</span></div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160; <span class="comment">// The slope of that line is (ub^2 - lb^2) / (ub - lb) = ub + lb.</span></div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160; <span class="keyword">const</span> int64_t y_lb = x_lb * x_lb;</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160; <span class="keyword">const</span> int64_t above_slope = x_ub + x_lb;</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> max_lp_y = y_lb + above_slope * (x_lp_value - x_lb);</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160; <span class="keywordflow">if</span> (y_lp_value &gt;= max_lp_y + kMinCutViolation) {</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160; <span class="comment">// cut: y &lt;= (x_lb + x_ub) * x - x_lb * x_ub</span></div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> above_cut;</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(y);</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(1));</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(x);</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(-above_slope));</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160; above_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = IntegerValue(-x_lb * x_ub);</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160; manager-&gt;AddCut(above_cut, <span class="stringliteral">&quot;SquareUpper&quot;</span>, lp_values);</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160; }</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; <span class="comment">// Second cut: target should be above all the lines</span></div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160; <span class="comment">// (value, value ^ 2) to (value + 1, (value + 1) ^ 2)</span></div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160; <span class="comment">// The slope of that line is 2 * value + 1</span></div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160; <span class="comment">// Note that we only add one of these cuts. The one for x_lp_value in</span></div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; <span class="comment">// [value, value + 1].</span></div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160; <span class="keyword">const</span> int64_t x_floor = <span class="keyword">static_cast&lt;</span>int64_t<span class="keyword">&gt;</span>(std::floor(x_lp_value));</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; <span class="keyword">const</span> int64_t below_slope = 2 * x_floor + 1;</div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> min_lp_y =</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160; below_slope * x_lp_value - x_floor - x_floor * x_floor;</div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160; <span class="keywordflow">if</span> (min_lp_y &gt;= y_lp_value + kMinCutViolation) {</div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160; <span class="comment">// cut: y &gt;= below_slope * (x - x_floor) + x_floor ^ 2</span></div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160; <span class="comment">// : y &gt;= below_slope * x - x_floor ^ 2 - x_floor</span></div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> below_cut;</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(y);</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(IntegerValue(1));</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(x);</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>.push_back(-IntegerValue(below_slope));</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = IntegerValue(-x_floor - x_floor * x_floor);</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; below_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160; manager-&gt;AddCut(below_cut, <span class="stringliteral">&quot;SquareLower&quot;</span>, lp_values);</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160; }</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160; };</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160; </div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160; <span class="keywordflow">return</span> result;</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; </div>
<div class="line"><a name="l01495"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a7fb8d0b24091252e79aea6e5666f29e8"> 1495</a></span>&#160;<span class="keywordtype">void</span> ImpliedBoundsProcessor::ProcessUpperBoundedConstraint(</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>* cut) {</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160; ProcessUpperBoundedConstraintWithSlackCreation(</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160; <span class="comment">/*substitute_only_inner_variables=*/</span><span class="keyword">false</span>, IntegerVariable(0), lp_values,</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160; cut, <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;}</div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160; </div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">ImpliedBoundsProcessor::BestImpliedBoundInfo</a></div>
<div class="line"><a name="l01504"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#abb0b7cc2e259fc8ebe8fd3dd55816b75"> 1504</a></span>&#160;ImpliedBoundsProcessor::GetCachedImpliedBoundInfo(IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160; <span class="keyword">auto</span> it = cache_.find(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160; <span class="keywordflow">if</span> (it != cache_.end()) <span class="keywordflow">return</span> it-&gt;second;</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">BestImpliedBoundInfo</a>();</div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;}</div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160; </div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">ImpliedBoundsProcessor::BestImpliedBoundInfo</a></div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;ImpliedBoundsProcessor::ComputeBestImpliedBound(</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160; IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values) {</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160; <span class="keyword">auto</span> it = cache_.find(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160; <span class="keywordflow">if</span> (it != cache_.end()) <span class="keywordflow">return</span> it-&gt;second;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160; BestImpliedBoundInfo result;</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160; <span class="keyword">const</span> IntegerValue lb = integer_trail_-&gt;LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_implied_bound_entry.html">ImpliedBoundEntry</a>&amp; entry :</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160; implied_bounds_-&gt;GetImpliedBounds(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160; <span class="comment">// Only process entries with a Boolean variable currently part of the LP</span></div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160; <span class="comment">// we are considering for this cut.</span></div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160; <span class="comment">// TODO(user): the more we use cuts, the less it make sense to have a</span></div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160; <span class="comment">// lot of small independent LPs.</span></div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160; <span class="keywordflow">if</span> (!lp_vars_.contains(<a class="code" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(entry.literal_view))) {</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160; }</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160; </div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160; <span class="comment">// The equation is X = lb + diff * Bool + Slack where Bool is in [0, 1]</span></div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160; <span class="comment">// and slack in [0, ub - lb].</span></div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160; <span class="keyword">const</span> IntegerValue diff = entry.lower_bound - lb;</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160; <a class="code" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(diff, 0);</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> bool_lp_value = entry.is_positive</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160; ? lp_values[entry.literal_view]</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160; : 1.0 - lp_values[entry.literal_view];</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> slack_lp_value =</div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160; lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] - <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(lb) - bool_lp_value * <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(diff);</div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160; </div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160; <span class="comment">// If the implied bound equation is not respected, we just add it</span></div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160; <span class="comment">// to implied_bound_cuts, and skip the entry for now.</span></div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160; <span class="keywordflow">if</span> (slack_lp_value &lt; -1e-4) {</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160; LinearConstraint ib_cut;</div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160; ib_cut.lb = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160; std::vector&lt;std::pair&lt;IntegerVariable, IntegerValue&gt;&gt; terms;</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160; <span class="keywordflow">if</span> (entry.is_positive) {</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160; <span class="comment">// X &gt;= Indicator * (bound - lb) + lb</span></div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160; terms.push_back({entry.literal_view, diff});</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160; terms.push_back({<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(-1)});</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160; ib_cut.ub = -lb;</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160; <span class="comment">// X &gt;= -Indicator * (bound - lb) + bound</span></div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160; terms.push_back({entry.literal_view, -diff});</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160; terms.push_back({<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(-1)});</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160; ib_cut.ub = -entry.lower_bound;</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160; }</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">CleanTermsAndFillConstraint</a>(&amp;terms, &amp;ib_cut);</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160; ib_cut_pool_.AddCut(std::move(ib_cut), <span class="stringliteral">&quot;IB&quot;</span>, lp_values);</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160; }</div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160; </div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160; <span class="comment">// We look for tight implied bounds, and amongst the tightest one, we</span></div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160; <span class="comment">// prefer larger coefficient in front of the Boolean.</span></div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160; <span class="keywordflow">if</span> (slack_lp_value + 1e-4 &lt; result.slack_lp_value ||</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160; (slack_lp_value &lt; result.slack_lp_value + 1e-4 &amp;&amp;</div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160; diff &gt; result.bound_diff)) {</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160; result.bool_lp_value = bool_lp_value;</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160; result.slack_lp_value = slack_lp_value;</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160; </div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160; result.bound_diff = diff;</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160; result.is_positive = entry.is_positive;</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160; result.bool_var = entry.literal_view;</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160; }</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160; }</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160; cache_[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = result;</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;}</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160; </div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;<span class="comment">// TODO(user): restrict to a subset of the variables to not spend too much time.</span></div>
<div class="line"><a name="l01579"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#aecf53d8ca125b38267c341d76cebf6a9"> 1579</a></span>&#160;<span class="keywordtype">void</span> ImpliedBoundsProcessor::SeparateSomeImpliedBoundCuts(</div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values) {</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> :</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160; implied_bounds_-&gt;VariablesWithImpliedBounds()) {</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160; <span class="keywordflow">if</span> (!lp_vars_.contains(<a class="code" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>))) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160; ComputeBestImpliedBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, lp_values);</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160; }</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;}</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160; </div>
<div class="line"><a name="l01588"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a135d2e8757ef674942be0b1d6f46f75b"> 1588</a></span>&#160;<span class="keywordtype">void</span> ImpliedBoundsProcessor::ProcessUpperBoundedConstraintWithSlackCreation(</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160; <span class="keywordtype">bool</span> substitute_only_inner_variables, IntegerVariable first_slack,</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>* cut, std::vector&lt;SlackInfo&gt;* slack_infos) {</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160; tmp_terms_.clear();</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160; IntegerValue new_ub = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160; </div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160; <span class="comment">// TODO(user): we could relax a bit this test.</span></div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160; int64_t overflow_detection = 0;</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160; </div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> size = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size();</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160; IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i];</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160; IntegerValue coeff = cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160; </div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160; <span class="comment">// Starts by positive coefficient.</span></div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160; <span class="comment">// TODO(user): Not clear this is best.</span></div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160; <span class="keywordflow">if</span> (coeff &lt; 0) {</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160; coeff = -coeff;</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160; }</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160; </div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160; <span class="comment">// Find the best implied bound to use.</span></div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160; <span class="comment">// TODO(user): We could also use implied upper bound, that is try with</span></div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160; <span class="comment">// NegationOf(var).</span></div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">BestImpliedBoundInfo</a> info = ComputeBestImpliedBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, lp_values);</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160; {</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160; <span class="comment">// This make sure the implied bound for NegationOf(var) is &quot;cached&quot; so</span></div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160; <span class="comment">// that GetCachedImpliedBoundInfo() will work. It will also add any</span></div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160; <span class="comment">// relevant implied bound cut.</span></div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160; <span class="comment">// TODO(user): this is a bit hacky. Find a cleaner way.</span></div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160; ComputeBestImpliedBound(<a class="code" href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">NegationOf</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), lp_values);</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160; }</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160; </div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> old_size = tmp_terms_.size();</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160; </div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160; <span class="comment">// Shall we keep the original term ?</span></div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160; <span class="keywordtype">bool</span> keep_term = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160; <span class="keywordflow">if</span> (info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a> == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) keep_term = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(std::abs(coeff.value()), info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>.value()) ==</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160; <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits&lt;int64_t&gt;::max</a>()) {</div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160; keep_term = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160; }</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160; </div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160; <span class="comment">// TODO(user): On some problem, not replacing the variable at their bound</span></div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160; <span class="comment">// by an implied bounds seems beneficial. This is especially the case on</span></div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160; <span class="comment">// g200x740.mps.gz</span></div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160; <span class="comment">// Note that in ComputeCut() the variable with an LP value at the bound do</span></div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160; <span class="comment">// not contribute to the cut efficacity (no loss) but do contribute to the</span></div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160; <span class="comment">// various heuristic based on the coefficient magnitude.</span></div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160; <span class="keywordflow">if</span> (substitute_only_inner_variables) {</div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160; <span class="keyword">const</span> IntegerValue lb = integer_trail_-&gt;LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160; <span class="keyword">const</span> IntegerValue ub = integer_trail_-&gt;LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160; <span class="keywordflow">if</span> (lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] - <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(lb) &lt; 1e-2) keep_term = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(ub) - lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] &lt; 1e-2) keep_term = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160; }</div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160; </div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160; <span class="comment">// This is when we do not add slack.</span></div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160; <span class="keywordflow">if</span> (slack_infos == <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160; <span class="comment">// We do not want to loose anything, so we only replace if the slack lp is</span></div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160; <span class="comment">// zero.</span></div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160; <span class="keywordflow">if</span> (info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#ac11e010c276514d6402c772d0651f82f">slack_lp_value</a> &gt; 1e-6) keep_term = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160; }</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160; </div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160; <span class="keywordflow">if</span> (keep_term) {</div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160; tmp_terms_.push_back({<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, coeff});</div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160; <span class="comment">// Substitute.</span></div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160; <span class="keyword">const</span> IntegerValue lb = integer_trail_-&gt;LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160; <span class="keyword">const</span> IntegerValue ub = integer_trail_-&gt;LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160; </div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html">SlackInfo</a> slack_info;</div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#adb47ac0cff7c9dc4dc5f101d38a91185">lp_value</a> = info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#ac11e010c276514d6402c772d0651f82f">slack_lp_value</a>;</div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = 0;</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = ub - lb;</div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160; </div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160; <span class="keywordflow">if</span> (info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a6d2822d5e07c3716efcdf73a4ae5eafc">is_positive</a>) {</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160; <span class="comment">// X = Indicator * diff + lb + Slack</span></div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160; tmp_terms_.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, coeff * info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>});</div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(-coeff, lb, &amp;new_ub)) {</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Overflow&quot;</span>;</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160; }</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160; <span class="keywordflow">if</span> (slack_infos != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160; tmp_terms_.push_back({first_slack, coeff});</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160; first_slack += 2;</div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160; </div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160; <span class="comment">// slack = X - Indicator * info.bound_diff - lb;</span></div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a250583d63e8184c6f9f4deba1125e6bb">terms</a>.push_back({<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(1)});</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a250583d63e8184c6f9f4deba1125e6bb">terms</a>.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, -info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>});</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#acd07f8397a2e61932c8ee17a4e300e23">offset</a> = -lb;</div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160; slack_infos-&gt;push_back(slack_info);</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160; }</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160; <span class="comment">// X = (1 - Indicator) * (diff) + lb + Slack</span></div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160; <span class="comment">// X = -Indicator * (diff) + lb + diff + Slack</span></div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160; tmp_terms_.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, -coeff * info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>});</div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">AddProductTo</a>(-coeff, lb + info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>, &amp;new_ub)) {</div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Overflow&quot;</span>;</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160; }</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160; <span class="keywordflow">if</span> (slack_infos != <span class="keyword">nullptr</span>) {</div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160; tmp_terms_.push_back({first_slack, coeff});</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160; first_slack += 2;</div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160; </div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160; <span class="comment">// slack = X + Indicator * info.bound_diff - lb - diff;</span></div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a250583d63e8184c6f9f4deba1125e6bb">terms</a>.push_back({<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(1)});</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a250583d63e8184c6f9f4deba1125e6bb">terms</a>.push_back({info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">bool_var</a>, +info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>});</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160; slack_info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#acd07f8397a2e61932c8ee17a4e300e23">offset</a> = -lb - info.<a class="code" href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">bound_diff</a>;</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160; slack_infos-&gt;push_back(slack_info);</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160; }</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160; }</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160; changed = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160; }</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160; </div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160; <span class="comment">// Add all the new terms coefficient to the overflow detection to avoid</span></div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160; <span class="comment">// issue when merging terms refering to the same variable.</span></div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = old_size; i &lt; tmp_terms_.size(); ++i) {</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160; overflow_detection =</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160; <a class="code" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(overflow_detection, std::abs(tmp_terms_[i].second.value()));</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160; }</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160; }</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160; </div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160; <span class="keywordflow">if</span> (overflow_detection &gt;= <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>) {</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Overflow&quot;</span>;</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160; }</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160; <span class="keywordflow">if</span> (!changed) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160; </div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160; <span class="comment">// Update the cut.</span></div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160; <span class="comment">// Note that because of our overflow_detection variable, there should be</span></div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160; <span class="comment">// no integer overflow when we merge identical terms.</span></div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>; <span class="comment">// Not relevant.</span></div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160; cut-&gt;<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = new_ub;</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">CleanTermsAndFillConstraint</a>(&amp;tmp_terms_, cut);</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;}</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160; </div>
<div class="line"><a name="l01729"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#ab1b4642341faf5ff972b02f034d88f21"> 1729</a></span>&#160;<span class="keywordtype">bool</span> ImpliedBoundsProcessor::DebugSlack(IntegerVariable first_slack,</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; initial_cut,</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a>&amp; cut,</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160; <span class="keyword">const</span> std::vector&lt;SlackInfo&gt;&amp; info) {</div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160; tmp_terms_.clear();</div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160; IntegerValue new_ub = cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a>;</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160; <span class="comment">// Simple copy for non-slack variables.</span></div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160; <span class="keywordflow">if</span> (cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i] &lt; first_slack) {</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160; tmp_terms_.push_back({cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i], cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i]});</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160; }</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160; </div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160; <span class="comment">// Replace slack by its definition.</span></div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160; <span class="keyword">const</span> IntegerValue multiplier = cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i];</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = (cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i].value() - first_slack.value()) / 2;</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;IntegerVariable, IntegerValue&gt;&amp; term :</div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160; info[<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].terms) {</div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160; tmp_terms_.push_back({term.first, term.second * multiplier});</div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160; }</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160; new_ub -= multiplier * info[<a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].offset;</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160; }</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160; </div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> tmp_cut;</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160; tmp_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>; <span class="comment">// Not relevant.</span></div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160; tmp_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = new_ub;</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">CleanTermsAndFillConstraint</a>(&amp;tmp_terms_, &amp;tmp_cut);</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aa2ba15be9aeabce0142c726fbf880798">MakeAllVariablesPositive</a>(&amp;tmp_cut);</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160; </div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160; <span class="comment">// We need to canonicalize the initial_cut too for comparison. Note that we</span></div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160; <span class="comment">// only use this for debug, so we don&#39;t care too much about the memory and</span></div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160; <span class="comment">// extra time.</span></div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160; <span class="comment">// TODO(user): Expose CanonicalizeConstraint() from the manager.</span></div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> tmp_copy;</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; tmp_terms_.clear();</div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; initial_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.size(); ++i) {</div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; tmp_terms_.push_back({initial_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>[i], initial_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">coeffs</a>[i]});</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160; }</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; tmp_copy.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>; <span class="comment">// Not relevant.</span></div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; tmp_copy.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = new_ub;</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">CleanTermsAndFillConstraint</a>(&amp;tmp_terms_, &amp;tmp_copy);</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#aa2ba15be9aeabce0142c726fbf880798">MakeAllVariablesPositive</a>(&amp;tmp_copy);</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; </div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160; <span class="keywordflow">if</span> (tmp_cut == tmp_copy) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160; </div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</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; first_slack;</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</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; tmp_copy.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a764be64f3029f8b8e23511061d8de355">DebugString</a>();</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</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; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a764be64f3029f8b8e23511061d8de355">DebugString</a>();</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</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; tmp_cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a764be64f3029f8b8e23511061d8de355">DebugString</a>();</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;}</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160; </div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160; </div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;<span class="keywordtype">void</span> TryToGenerateAllDiffCut(</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160; <span class="keyword">const</span> std::vector&lt;std::pair&lt;double, IntegerVariable&gt;&gt;&amp; sorted_vars_lp,</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&amp; integer_trail,</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160; <a class="code" href="classoperations__research_1_1_domain.html">Domain</a> current_union;</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160; std::vector&lt;IntegerVariable&gt; current_set_vars;</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160; <span class="keywordtype">double</span> sum = 0.0;</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> value_var : sorted_vars_lp) {</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160; sum += value_var.first;</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = value_var.second;</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160; <span class="comment">// TODO(user): The union of the domain of the variable being considered</span></div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; <span class="comment">// does not give the tightest bounds, try to get better bounds.</span></div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160; current_union =</div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; current_union.<a class="code" href="classoperations__research_1_1_domain.html#a5919f86aede74172b7fea05ebdb58975">UnionWith</a>(integer_trail.<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#af4303d31360f06c50729f156b1fbc2a9">InitialVariableDomain</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160; current_set_vars.push_back(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; <span class="keyword">const</span> int64_t required_min_sum =</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160; <a class="code" href="namespaceoperations__research.html#a07ae210be5b66d61cdc83361e4c478a8">SumOfKMinValueInDomain</a>(current_union, current_set_vars.size());</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160; <span class="keyword">const</span> int64_t required_max_sum =</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160; <a class="code" href="namespaceoperations__research.html#a6b2032743808743ca19f9d9bdaba644e">SumOfKMaxValueInDomain</a>(current_union, current_set_vars.size());</div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; <span class="keywordflow">if</span> (sum &lt; required_min_sum || sum &gt; required_max_sum) {</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html">LinearConstraint</a> cut;</div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160; <span class="keywordflow">for</span> (IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : current_set_vars) {</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(1));</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160; }</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">lb</a> = IntegerValue(required_min_sum);</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160; cut.<a class="code" href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">ub</a> = IntegerValue(required_max_sum);</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut, <span class="stringliteral">&quot;all_diff&quot;</span>, lp_values);</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160; <span class="comment">// NOTE: We can extend the current set but it is more helpful to generate</span></div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160; <span class="comment">// the cut on a different set of variables so we reset the counters.</span></div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160; sum = 0.0;</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160; current_set_vars.clear();</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; current_union = <a class="code" href="classoperations__research_1_1_domain.html">Domain</a>();</div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160; }</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160; }</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;}</div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160; </div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160; </div>
<div class="line"><a name="l01822"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a7feb76be212dca01ffe7ba3a0391e118"> 1822</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a7feb76be212dca01ffe7ba3a0391e118">CreateAllDifferentCutGenerator</a>(</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; vars, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = vars;</div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160; [vars, integer_trail, trail](</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160; <span class="comment">// These cuts work at all levels but the generator adds too many cuts on</span></div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160; <span class="comment">// some instances and degrade the performance so we only use it at level</span></div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160; <span class="comment">// 0.</span></div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160; <span class="keywordflow">if</span> (trail-&gt;CurrentDecisionLevel() &gt; 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160; std::vector&lt;std::pair&lt;double, IntegerVariable&gt;&gt; sorted_vars;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : vars) {</div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">LevelZeroLowerBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) ==</div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; integer_trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">LevelZeroUpperBound</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160; }</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160; sorted_vars.push_back(std::make_pair(lp_values[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>], <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160; }</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160; std::sort(sorted_vars.begin(), sorted_vars.end());</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160; TryToGenerateAllDiffCut(sorted_vars, *integer_trail, lp_values,</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160; manager);</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160; <span class="comment">// Other direction.</span></div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160; std::reverse(sorted_vars.begin(), sorted_vars.end());</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160; TryToGenerateAllDiffCut(sorted_vars, *integer_trail, lp_values,</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160; manager);</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160; };</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) &lt;&lt; <span class="stringliteral">&quot;Created all_diff cut generator of size: &quot;</span> &lt;&lt; vars.size();</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;}</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160; </div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;<span class="comment">// Returns max((w2i - w1i)*Li, (w2i - w1i)*Ui).</span></div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;IntegerValue MaxCornerDifference(<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160; <span class="keyword">const</span> IntegerValue w1_i,</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160; <span class="keyword">const</span> IntegerValue w2_i,</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160; <span class="keyword">const</span> IntegerTrail&amp; integer_trail) {</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160; <span class="keyword">const</span> IntegerValue lb = integer_trail.LevelZeroLowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160; <span class="keyword">const</span> IntegerValue ub = integer_trail.LevelZeroUpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160; <span class="keywordflow">return</span> <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>((w2_i - w1_i) * lb, (w2_i - w1_i) * ub);</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;}</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160; </div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;<span class="comment">// This is the coefficient of zk in the cut, where k = max_index.</span></div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;<span class="comment">// MPlusCoefficient_ki = max((wki - wI(i)i) * Li,</span></div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;<span class="comment">// (wki - wI(i)i) * Ui)</span></div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;<span class="comment">// = max corner difference for variable i,</span></div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;<span class="comment">// target expr I(i), max expr k.</span></div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<span class="comment">// The coefficient of zk is Sum(i=1..n)(MPlusCoefficient_ki) + bk</span></div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;IntegerValue MPlusCoefficient(</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; x_vars,</div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160; <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; exprs,</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, int&gt;</a>&amp; variable_partition,</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> max_index, <span class="keyword">const</span> IntegerTrail&amp; integer_trail) {</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160; IntegerValue coeff = exprs[max_index].offset;</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160; <span class="comment">// TODO(user): This algo is quadratic since GetCoefficientOfPositiveVar()</span></div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160; <span class="comment">// is linear. This can be optimized (better complexity) if needed.</span></div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : x_vars) {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target_index = variable_partition[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160; <span class="keywordflow">if</span> (max_index != target_index) {</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160; coeff += MaxCornerDifference(</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">GetCoefficientOfPositiveVar</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, exprs[target_index]),</div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">GetCoefficientOfPositiveVar</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, exprs[max_index]), integer_trail);</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160; }</div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160; }</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160; <span class="keywordflow">return</span> coeff;</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;}</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160; </div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;<span class="comment">// Compute the value of</span></div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;<span class="comment">// rhs = wI(i)i * xi + Sum(k=1..d)(MPlusCoefficient_ki * zk)</span></div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;<span class="comment">// for variable xi for given target index I(i).</span></div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;<span class="keywordtype">double</span> ComputeContribution(</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160; <span class="keyword">const</span> IntegerVariable xi_var, <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; z_vars,</div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160; <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; exprs,</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160; <span class="keyword">const</span> IntegerTrail&amp; integer_trail, <span class="keyword">const</span> <span class="keywordtype">int</span> target_index) {</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; <a class="code" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(target_index, 0);</div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; <a class="code" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(target_index, exprs.size());</div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160; <span class="keyword">const</span> LinearExpression&amp; target_expr = exprs[target_index];</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> xi_value = lp_values[xi_var];</div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160; <span class="keyword">const</span> IntegerValue wt_i = <a class="code" href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">GetCoefficientOfPositiveVar</a>(xi_var, target_expr);</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160; <span class="keywordtype">double</span> contrib = wt_i.value() * xi_value;</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> expr_index = 0; expr_index &lt; exprs.size(); ++expr_index) {</div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160; <span class="keywordflow">if</span> (expr_index == target_index) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160; <span class="keyword">const</span> LinearExpression&amp; max_expr = exprs[expr_index];</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> z_max_value = lp_values[z_vars[expr_index]];</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160; <span class="keyword">const</span> IntegerValue corner_value = MaxCornerDifference(</div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160; xi_var, wt_i, <a class="code" href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">GetCoefficientOfPositiveVar</a>(xi_var, max_expr),</div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160; integer_trail);</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160; contrib += corner_value.value() * z_max_value;</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160; }</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160; <span class="keywordflow">return</span> contrib;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;}</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160; </div>
<div class="line"><a name="l01919"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a7fea62548e11ae728e506874f767bdd3"> 1919</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a7fea62548e11ae728e506874f767bdd3">CreateLinMaxCutGenerator</a>(</div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160; <span class="keyword">const</span> IntegerVariable target, <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; exprs,</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; z_vars, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160; std::vector&lt;IntegerVariable&gt; x_vars;</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = {target};</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_exprs = exprs.size();</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_exprs; ++i) {</div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(z_vars[i]);</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160; x_vars.insert(x_vars.end(), exprs[i].vars.begin(), exprs[i].vars.end());</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160; }</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;x_vars);</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; <span class="comment">// All expressions should only contain positive variables.</span></div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(std::all_of(x_vars.begin(), x_vars.end(), [](IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160; return VariableIsPositive(var);</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160; }));</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.insert(result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.end(), x_vars.begin(), x_vars.end());</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160; </div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160; [x_vars, z_vars, target, num_exprs, exprs, integer_trail, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, int&gt;</a> variable_partition(</div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160; lp_values.size(), -1);</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160; <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a> variable_partition_contrib(</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160; lp_values.size(), std::numeric_limits&lt;double&gt;::infinity());</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> expr_index = 0; expr_index &lt; num_exprs; ++expr_index) {</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : x_vars) {</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> contribution = ComputeContribution(</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, z_vars, exprs, lp_values, *integer_trail, expr_index);</div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> prev_contribution = variable_partition_contrib[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>];</div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160; <span class="keywordflow">if</span> (contribution &lt; prev_contribution) {</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160; variable_partition[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = expr_index;</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160; variable_partition_contrib[<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>] = contribution;</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160; }</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160; }</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160; }</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160; </div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <span class="comment">/*lb=*/</span>IntegerValue(0),</div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160; <span class="comment">/*ub=*/</span><a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>);</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160; <span class="keywordtype">double</span> violation = lp_values[target];</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(target, IntegerValue(-1));</div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160; </div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable xi_var : x_vars) {</div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> input_index = variable_partition[xi_var];</div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_linear_expression.html">LinearExpression</a>&amp; expr = exprs[input_index];</div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160; <span class="keyword">const</span> IntegerValue coeff = <a class="code" href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">GetCoefficientOfPositiveVar</a>(xi_var, expr);</div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160; <span class="keywordflow">if</span> (coeff != IntegerValue(0)) {</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(xi_var, coeff);</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160; }</div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160; violation -= coeff.value() * lp_values[xi_var];</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; }</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> expr_index = 0; expr_index &lt; num_exprs; ++expr_index) {</div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160; <span class="keyword">const</span> IntegerVariable z_var = z_vars[expr_index];</div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160; <span class="keyword">const</span> IntegerValue z_coeff = MPlusCoefficient(</div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160; x_vars, exprs, variable_partition, expr_index, *integer_trail);</div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160; <span class="keywordflow">if</span> (z_coeff != IntegerValue(0)) {</div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(z_var, z_coeff);</div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160; }</div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160; violation -= z_coeff.value() * lp_values[z_var];</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160; }</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160; <span class="keywordflow">if</span> (violation &gt; 1e-2) {</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;LinMax&quot;</span>, lp_values);</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160; }</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160; };</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;}</div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160; </div>
<div class="line"><a name="l01988"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f"> 1988</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper,</div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160; std::vector&lt;IntegerVariable&gt;* vars) {</div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++t) {</div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a98d787780ea13b5862ccb1ca73067da4">Starts</a>()[t].var != <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160; vars-&gt;push_back(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a98d787780ea13b5862ccb1ca73067da4">Starts</a>()[t].var);</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160; }</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t].var != <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160; vars-&gt;push_back(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t].var);</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160; }</div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">Ends</a>()[t].var != <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160; vars-&gt;push_back(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">Ends</a>()[t].var);</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160; }</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9fa7bdc81941d5eae85952db86867de0">IsOptional</a>(t) &amp;&amp; !helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(t) &amp;&amp;</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160; !helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(t)) {</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(t);</div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160; <span class="keywordflow">if</span> (encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html#a308a6df2722f2c0f36ec8888f4458b41">GetLiteralView</a>(l) == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a> &amp;&amp;</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160; encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html#a308a6df2722f2c0f36ec8888f4458b41">GetLiteralView</a>(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) == <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;Add(<a class="code" href="namespaceoperations__research_1_1sat.html#a775efd540e54bd3be662ce7ee8894c1e">NewIntegerVariableFromLiteral</a>(l));</div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160; }</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160; <span class="keyword">const</span> IntegerVariable direct_view = encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html#a308a6df2722f2c0f36ec8888f4458b41">GetLiteralView</a>(l);</div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160; <span class="keywordflow">if</span> (direct_view != <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160; vars-&gt;push_back(direct_view);</div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160; vars-&gt;push_back(encoder-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html#a308a6df2722f2c0f36ec8888f4458b41">GetLiteralView</a>(l.<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160; <a class="code" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(vars-&gt;back(), <a class="code" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160; }</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160; }</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160; }</div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160; <a class="code" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(vars);</div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;}</div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160; </div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;std::function&lt;void(<span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp;,</div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160; LinearConstraintManager*)&gt;</div>
<div class="line"><a name="l02023"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a3769d7503e7e86df192b6a7a158f86a9"> 2023</a></span>&#160;<a class="code" href="namespaceoperations__research_1_1sat.html#a3769d7503e7e86df192b6a7a158f86a9">GenerateCumulativeCut</a>(<span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper,</div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; demands,</div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160; </div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160; <span class="keywordflow">return</span> [<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, trail, integer_trail, helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, cut_name,</div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160; encoder](<span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160; <span class="keywordflow">if</span> (trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160; </div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> demand_is_fixed = [integer_trail, &amp;demands](<span class="keywordtype">int</span> i) {</div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160; <span class="keywordflow">return</span> demands.empty() || integer_trail-&gt;IsFixed(demands[i]);</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160; };</div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> demand_min = [integer_trail, &amp;demands](<span class="keywordtype">int</span> i) {</div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160; <span class="keywordflow">return</span> demands.empty() ? IntegerValue(1)</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160; : integer_trail-&gt;LowerBound(demands[i]);</div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160; };</div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> demand_max = [integer_trail, &amp;demands](<span class="keywordtype">int</span> i) {</div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160; <span class="keywordflow">return</span> demands.empty() ? IntegerValue(1)</div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160; : integer_trail-&gt;UpperBound(demands[i]);</div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160; };</div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160; </div>
<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160; std::vector&lt;int&gt; active_intervals;</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++i) {</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160; <span class="keywordflow">if</span> (!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(i) &amp;&amp; demand_max(i) &gt; 0 &amp;&amp; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(i) &gt; 0) {</div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160; active_intervals.push_back(i);</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160; }</div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160; }</div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160; </div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160; <span class="keywordflow">if</span> (active_intervals.size() &lt; 2) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160; </div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160; std::sort(active_intervals.begin(), active_intervals.end(),</div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160; [helper](<span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160; return helper-&gt;StartMin(a) &lt; helper-&gt;StartMin(b) ||</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160; (helper-&gt;StartMin(a) == helper-&gt;StartMin(b) &amp;&amp;</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160; helper-&gt;EndMax(a) &lt; helper-&gt;EndMax(b));</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160; });</div>
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160; </div>
<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160; <span class="keyword">const</span> IntegerValue capacity_max = integer_trail-&gt;UpperBound(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160; IntegerValue processed_start = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i1 = 0; i1 + 1 &lt; active_intervals.size(); ++i1) {</div>
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> start_index = active_intervals[i1];</div>
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(start_index));</div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160; </div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160; <span class="comment">// We want maximal cuts. For any start_min value, we only need to create</span></div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160; <span class="comment">// cuts starting from the first interval having this start_min value.</span></div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(start_index) == processed_start) {</div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160; processed_start = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(start_index);</div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160; }</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160; </div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160; <span class="comment">// For each start time, we will keep the most violated cut generated while</span></div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160; <span class="comment">// scanning the residual tasks.</span></div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160; <span class="keywordtype">int</span> end_index_of_max_violation = -1;</div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160; <span class="keywordtype">double</span> max_relative_violation = 1.01;</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160; IntegerValue span_of_max_violation(0);</div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160; </div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160; <span class="comment">// Accumulate intervals and check for potential cuts.</span></div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160; <span class="keywordtype">double</span> energy_lp = 0.0;</div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160; IntegerValue min_of_starts = <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160; IntegerValue max_of_ends = <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>;</div>
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160; </div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160; <span class="comment">// We sort all tasks (start_min(task) &gt;= start_min(start_index) by</span></div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160; <span class="comment">// increasing end max.</span></div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160; std::vector&lt;int&gt; residual_tasks(active_intervals.begin() + i1,</div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160; active_intervals.end());</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160; std::sort(</div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160; residual_tasks.begin(), residual_tasks.end(),</div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160; [&amp;](<span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keywordtype">int</span> <a class="code" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) { return helper-&gt;EndMax(a) &lt; helper-&gt;EndMax(b); });</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160; </div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160; <span class="comment">// Let&#39;s process residual tasks and evaluate the cut violation of the cut</span></div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160; <span class="comment">// at each step. We follow the same structure as the cut creation code</span></div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160; <span class="comment">// below.</span></div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i2 = 0; i2 &lt; residual_tasks.size(); ++i2) {</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> t = residual_tasks[i2];</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(t)) {</div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160; <span class="keywordflow">if</span> (demand_is_fixed(t)) {</div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">SizeIsFixed</a>(t)) {</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160; energy_lp += <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t) * demand_min(t));</div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160; energy_lp += <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(demand_min(t)) *</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t].LpValue(lp_values);</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160; }</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">SizeIsFixed</a>(t)) {</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!demands.empty());</div>
<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160; energy_lp += lp_values[demands[t]] * <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t));</div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160; } <span class="keywordflow">else</span> { <span class="comment">// demand and size are not fixed.</span></div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!demands.empty());</div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160; energy_lp +=</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160; <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(demand_min(t)) * helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t].LpValue(lp_values);</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160; energy_lp += lp_values[demands[t]] * <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t));</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160; energy_lp -= <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(demand_min(t) * helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t));</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160; }</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160; energy_lp += GetLiteralLpValue(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(t), lp_values,</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160; encoder) *</div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160; <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t) * demand_min(t));</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160; }</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160; </div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160; min_of_starts = <a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(min_of_starts, helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(t));</div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160; max_of_ends = <a class="code" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(max_of_ends, helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(t));</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160; </div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160; <span class="comment">// Compute the violation of the potential cut.</span></div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> relative_violation =</div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160; energy_lp / <a class="code" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>((max_of_ends - min_of_starts) * capacity_max);</div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160; <span class="keywordflow">if</span> (relative_violation &gt; max_relative_violation) {</div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160; end_index_of_max_violation = i2;</div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160; max_relative_violation = relative_violation;</div>
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160; span_of_max_violation = max_of_ends - min_of_starts;</div>
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160; }</div>
<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160; }</div>
<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160; </div>
<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160; <span class="keywordflow">if</span> (end_index_of_max_violation == -1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160; </div>
<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160; <span class="comment">// A maximal violated cut has been found.</span></div>
<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160; <span class="keywordtype">bool</span> cut_generated = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160; <span class="keywordtype">bool</span> has_opt_cuts = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160; <span class="keywordtype">bool</span> has_quadratic_cuts = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160; </div>
<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>, IntegerValue(0));</div>
<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160; </div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160; <span class="comment">// Build the cut.</span></div>
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, -span_of_max_violation);</div>
<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i2 = 0; i2 &lt;= end_index_of_max_violation; ++i2) {</div>
<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> t = residual_tasks[i2];</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(t)) {</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160; <span class="keywordflow">if</span> (demand_is_fixed(t)) {</div>
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">SizeIsFixed</a>(t)) {</div>
<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a322657f18d11f256cf3e03b0bd640d5a">AddConstant</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t) * demand_min(t));</div>
<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t], demand_min(t));</div>
<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160; }</div>
<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">SizeIsFixed</a>(t)) {</div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!demands.empty());</div>
<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(demands[t], helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t));</div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160; } <span class="keywordflow">else</span> { <span class="comment">// demand and size are not fixed.</span></div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!demands.empty());</div>
<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160; <span class="comment">// We use McCormick equation.</span></div>
<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160; <span class="comment">// demand * size = (demand_min + delta_d) * (min_size +</span></div>
<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160; <span class="comment">// delta_s) =</span></div>
<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160; <span class="comment">// demand_min * min_size + delta_d * min_size +</span></div>
<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160; <span class="comment">// delta_s * demand_min + delta_s * delta_d</span></div>
<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160; <span class="comment">// which is &gt;= (by ignoring the quatratic term)</span></div>
<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160; <span class="comment">// demand_min * size + min_size * demand - demand_min *</span></div>
<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160; <span class="comment">// min_size</span></div>
<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">Sizes</a>()[t], demand_min(t));</div>
<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(demands[t], helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t));</div>
<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160; <span class="comment">// Substract the energy counted twice.</span></div>
<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a322657f18d11f256cf3e03b0bd640d5a">AddConstant</a>(-helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t) * demand_min(t));</div>
<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160; has_quadratic_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160; }</div>
<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160; has_opt_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160; <span class="keywordflow">if</span> (!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">SizeIsFixed</a>(t) || !demand_is_fixed(t)) {</div>
<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160; has_quadratic_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160; }</div>
<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160; <span class="keywordflow">if</span> (!cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">AddLiteralTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(t),</div>
<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(t) * demand_min(t))) {</div>
<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160; cut_generated = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160; }</div>
<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160; }</div>
<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160; }</div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160; </div>
<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160; <span class="keywordflow">if</span> (cut_generated) {</div>
<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160; std::string full_name = cut_name;</div>
<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160; <span class="keywordflow">if</span> (has_opt_cuts) full_name.append(<span class="stringliteral">&quot;_opt&quot;</span>);</div>
<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160; <span class="keywordflow">if</span> (has_quadratic_cuts) full_name.append(<span class="stringliteral">&quot;_quad&quot;</span>);</div>
<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160; </div>
<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), cut_name, lp_values);</div>
<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160; }</div>
<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160; }</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160; };</div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;}</div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160; </div>
<div class="line"><a name="l02202"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a34b1d34844b9b1695dd45dfd9c33f663"> 2202</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a34b1d34844b9b1695dd45dfd9c33f663">CreateCumulativeCutGenerator</a>(</div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; demands,</div>
<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160; </div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160; <span class="keyword">new</span> <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160; </div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = demands;</div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160; </div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a3769d7503e7e86df192b6a7a158f86a9">GenerateCumulativeCut</a>(</div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160; <span class="stringliteral">&quot;CumulativeEnergy&quot;</span>, helper, demands, <a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>), <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;}</div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160; </div>
<div class="line"><a name="l02221"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a50b686357c19f67aa58931db58e801e6"> 2221</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a50b686357c19f67aa58931db58e801e6">CreateOverlappingCumulativeCutGenerator</a>(</div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160; <span class="keyword">const</span> IntegerVariable <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; demands,</div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160; </div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160; <span class="keyword">new</span> <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160; </div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = demands;</div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160; </div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160; <span class="keyword">struct </span>Event {</div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160; <span class="keywordtype">int</span> interval_index;</div>
<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160; IntegerValue <a class="code" href="resource_8cc.html#aee52de7b225665566aa47246b9d6b8fa">time</a>;</div>
<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160; <span class="keywordtype">bool</span> positive;</div>
<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160; IntegerVariable <a class="code" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>;</div>
<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160; };</div>
<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160; </div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160; </div>
<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160; [helper, <a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, trail, integer_trail, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160; <span class="keywordflow">if</span> (trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160; </div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160; std::vector&lt;Event&gt; events;</div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160; <span class="comment">// Iterate through the intervals. If start_max &lt; end_min, the demand</span></div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160; <span class="comment">// is mandatory.</span></div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++i) {</div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(i)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160; </div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a> = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(i);</div>
<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160; <span class="keyword">const</span> IntegerValue <a class="code" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a> = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(i);</div>
<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160; </div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a> &gt;= <a class="code" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160; </div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160; Event e1;</div>
<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160; e1.interval_index = i;</div>
<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160; e1.time = <a class="code" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a>;</div>
<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160; e1.demand = demands[i];</div>
<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160; e1.positive = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160; </div>
<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160; Event e2 = e1;</div>
<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160; e2.time = <a class="code" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>;</div>
<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160; e2.positive = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160; events.push_back(e1);</div>
<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160; events.push_back(e2);</div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160; }</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160; </div>
<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160; <span class="comment">// Sort events by time.</span></div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160; <span class="comment">// It is also important that all positive event with the same time as</span></div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160; <span class="comment">// negative events appear after for the correctness of the algo below.</span></div>
<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160; std::sort(events.begin(), events.end(),</div>
<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160; [](<span class="keyword">const</span> Event i, <span class="keyword">const</span> Event j) {</div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160; if (i.time == j.time) {</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160; if (i.positive == j.positive) {</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160; return i.interval_index &lt; j.interval_index;</div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160; }</div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160; return !i.positive;</div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160; }</div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160; <span class="keywordflow">return</span> i.time &lt; j.time;</div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160; });</div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160; </div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160; std::vector&lt;Event&gt; cut_events;</div>
<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160; <span class="keywordtype">bool</span> added_positive_event = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Event&amp; e : events) {</div>
<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160; <span class="keywordflow">if</span> (e.positive) {</div>
<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160; added_positive_event = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160; cut_events.push_back(e);</div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160; }</div>
<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160; <span class="keywordflow">if</span> (added_positive_event &amp;&amp; cut_events.size() &gt; 1) {</div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160; <span class="comment">// Create cut.</span></div>
<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160; <span class="keywordtype">bool</span> cut_generated = <span class="keyword">true</span>;</div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>,</div>
<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160; IntegerValue(0));</div>
<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, IntegerValue(-1));</div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Event&amp; cut_event : cut_events) {</div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(cut_event.interval_index)) {</div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(cut_event.demand, IntegerValue(1));</div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160; cut_generated &amp;= cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">AddLiteralTerm</a>(</div>
<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(cut_event.interval_index),</div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160; integer_trail-&gt;LowerBound(cut_event.demand));</div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160; <span class="keywordflow">if</span> (!cut_generated) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160; }</div>
<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160; }</div>
<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160; <span class="keywordflow">if</span> (cut_generated) {</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160; <span class="comment">// Violation of the cut is checked by AddCut so we don&#39;t check</span></div>
<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160; <span class="comment">// it here.</span></div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;Cumulative&quot;</span>, lp_values);</div>
<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160; }</div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160; }</div>
<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160; <span class="comment">// Remove the event.</span></div>
<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160; <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; cut_events.size(); ++i) {</div>
<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160; <span class="keywordflow">if</span> (cut_events[i].interval_index == e.interval_index) {</div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160; }</div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160; cut_events[new_size] = cut_events[i];</div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160; new_size++;</div>
<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160; }</div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160; cut_events.resize(new_size);</div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160; added_positive_event = <span class="keyword">false</span>;</div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160; }</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160; };</div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;}</div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160; </div>
<div class="line"><a name="l02335"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab62fb8f885a68c653b586424aa5863c8"> 2335</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#ab62fb8f885a68c653b586424aa5863c8">CreateNoOverlapEnergyCutGenerator</a>(</div>
<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160; </div>
<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160; <span class="keyword">new</span> <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160; </div>
<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160; </div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> = <a class="code" href="namespaceoperations__research_1_1sat.html#a3769d7503e7e86df192b6a7a158f86a9">GenerateCumulativeCut</a>(</div>
<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160; <span class="stringliteral">&quot;NoOverlapEnergy&quot;</span>, helper,</div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160; <span class="comment">/*demands=*/</span>{},</div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160; <span class="comment">/*capacity=*/</span><a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>(IntegerValue(1)), <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;}</div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160; </div>
<div class="line"><a name="l02352"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a23849eabdcf8e9f6f90e7aa05b298dc9"> 2352</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a23849eabdcf8e9f6f90e7aa05b298dc9">CreateNoOverlapPrecedenceCutGenerator</a>(</div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160; </div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160; <span class="keyword">new</span> <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160; </div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160; </div>
<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160; </div>
<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160; [trail, helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160; <span class="keywordflow">if</span> (trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160; </div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160; <span class="comment">// TODO(user): We can do much better in term of complexity:</span></div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160; <span class="comment">// Sort all tasks by min start time, loop other them 1 by 1,</span></div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160; <span class="comment">// start scanning their successors and stop when the start time of the</span></div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160; <span class="comment">// successor is &gt;= duration min of the task.</span></div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160; </div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160; <span class="comment">// TODO(user): each time we go back to level zero, we will generate</span></div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160; <span class="comment">// the same cuts over and over again. It is okay because AddCut() will</span></div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160; <span class="comment">// not add duplicate cuts, but it might not be the most efficient way.</span></div>
<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> index1 = 0; index1 &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++index1) {</div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160; <span class="keywordflow">if</span> (!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(index1)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> index2 = index1 + 1; index2 &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++index2) {</div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160; <span class="keywordflow">if</span> (!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(index2)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160; </div>
<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160; <span class="comment">// Encode only the interesting pairs.</span></div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160; <span class="keywordflow">if</span> (helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(index1) &lt;= helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(index2) ||</div>
<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(index2) &lt;= helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(index1)) {</div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160; }</div>
<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160; </div>
<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> interval_1_can_precede_2 =</div>
<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(index1) &lt;= helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(index2);</div>
<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> interval_2_can_precede_1 =</div>
<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(index2) &lt;= helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(index1);</div>
<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160; </div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160; <span class="keywordflow">if</span> (interval_1_can_precede_2 &amp;&amp; !interval_2_can_precede_1) {</div>
<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160; <span class="comment">// interval1.end &lt;= interval2.start</span></div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>,</div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160; IntegerValue(0));</div>
<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">Ends</a>()[index1], IntegerValue(1));</div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a98d787780ea13b5862ccb1ca73067da4">Starts</a>()[index2], IntegerValue(-1));</div>
<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;NoOverlapPrecedence&quot;</span>, lp_values);</div>
<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_2_can_precede_1 &amp;&amp; !interval_1_can_precede_2) {</div>
<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160; <span class="comment">// interval2.end &lt;= interval1.start</span></div>
<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">kMinIntegerValue</a>,</div>
<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160; IntegerValue(0));</div>
<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">Ends</a>()[index2], IntegerValue(1));</div>
<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a98d787780ea13b5862ccb1ca73067da4">Starts</a>()[index1], IntegerValue(-1));</div>
<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;NoOverlapPrecedence&quot;</span>, lp_values);</div>
<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160; }</div>
<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160; }</div>
<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160; }</div>
<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160; };</div>
<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160; </div>
<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;}</div>
<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160; </div>
<div class="line"><a name="l02416"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a90cb4e9fd1941ba3f7c011f086920d7a"> 2416</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a90cb4e9fd1941ba3f7c011f086920d7a">CreateNoOverlapBalasCutGenerator</a>(</div>
<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160; <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160; </div>
<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160; <span class="keyword">new</span> <a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160; </div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">AddIntegerVariableFromIntervals</a>(helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160; </div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160; </div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> = [trail, helper, <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160; <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp;</div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160; lp_values,</div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160; <span class="keywordflow">if</span> (trail-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160; </div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160; <span class="keyword">struct </span>Event {</div>
<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> end;</div>
<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160; IntegerValue <a class="code" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>;</div>
<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160; IntegerValue size_min;</div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160; <span class="keywordtype">double</span> lp_end;</div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160; <span class="keywordtype">int</span> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160; };</div>
<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160; std::vector&lt;Event&gt; events;</div>
<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160; </div>
<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> index1 = 0; index1 &lt; helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++index1) {</div>
<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160; <span class="keywordflow">if</span> (!helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(index1)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160; <span class="keyword">const</span> IntegerValue size_min = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(index1);</div>
<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160; <span class="keywordflow">if</span> (size_min &gt; 0) {</div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> end_expr = helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">Ends</a>()[index1];</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160; events.push_back({end_expr, helper-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(index1), size_min,</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160; end_expr.<a class="code" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values), index1});</div>
<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160; }</div>
<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160; }</div>
<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160; </div>
<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160; <span class="comment">// We generate the cut from:</span></div>
<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160; <span class="comment">// E. Balas, On the facial structure of scheduling polyhedra,</span></div>
<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160; <span class="comment">// Mathematical Programming Essays in Honor of George B. Dantzig</span></div>
<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160; <span class="comment">// Part I, Mathematical Programming Studies, vol. 24,</span></div>
<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160; <span class="comment">// Springer, 1985, pp. 179218.</span></div>
<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160; <span class="comment">// The original cut is:</span></div>
<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160; <span class="comment">// sum(end_min_i * duration_min_i) &gt;=</span></div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160; <span class="comment">// (sum(duration_min_i^2) + sum(duration_min_i)^2) / 2</span></div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160; <span class="comment">// We streghten this cuts by noticing that if all tasks starts after S,</span></div>
<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160; <span class="comment">// then replacing end_min_i by (end_min_i - S) is still valid.</span></div>
<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160; <span class="comment">// A second difference is that we look at a set of intervals starting</span></div>
<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160; <span class="comment">// after a given start_min, sorted by relative</span></div>
<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160; <span class="comment">// (end_lp - S) / duration_min.</span></div>
<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_top_n_cuts.html">TopNCuts</a> top_n_cuts(15);</div>
<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160; </div>
<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160; <span class="comment">// Sort by start min to bucketize by start_min.</span></div>
<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160; std::sort(events.begin(), events.end(),</div>
<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160; [](<span class="keyword">const</span> Event&amp; e1, <span class="keyword">const</span> Event&amp; e2) {</div>
<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160; return e1.start_min &lt; e2.start_min;</div>
<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160; });</div>
<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> start = 0; start + 1 &lt; events.size(); ++start) {</div>
<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160; <span class="comment">// Skip to the next start_min value.</span></div>
<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160; <span class="keywordflow">if</span> (start &gt; 0 &amp;&amp; events[start].<a class="code" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a> == events[start - 1].<a class="code" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>) {</div>
<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160; }</div>
<div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160; <span class="keyword">const</span> IntegerValue sequence_start_min = events[start].start_min;</div>
<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160; std::vector&lt;Event&gt; residual_tasks(events.begin() + start,</div>
<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160; events.end());</div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160; std::sort(residual_tasks.begin(), residual_tasks.end(),</div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160; [sequence_start_min](<span class="keyword">const</span> Event&amp; e1, <span class="keyword">const</span> Event&amp; e2) {</div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160; return ((e1.lp_end - sequence_start_min) / e1.size_min) &lt;</div>
<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160; ((e2.lp_end - sequence_start_min) / e2.size_min);</div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160; });</div>
<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160; <span class="keywordtype">int</span> best_end = -1;</div>
<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160; <span class="keywordtype">double</span> best_efficacy = 0.01;</div>
<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160; IntegerValue best_min_contrib(0);</div>
<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160; </div>
<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160; IntegerValue sum_duration(0);</div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160; IntegerValue sum_square_duration(0);</div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160; <span class="keywordtype">double</span> lp_contrib = 0;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160; IntegerValue current_start_min(<a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>);</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; residual_tasks.size(); ++i) {</div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160; <a class="code" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(residual_tasks[i].<a class="code" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>, sequence_start_min);</div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160; <span class="keyword">const</span> IntegerValue duration = residual_tasks[i].size_min;</div>
<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160; sum_duration += duration;</div>
<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160; sum_square_duration += duration * duration;</div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160; lp_contrib +=</div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160; residual_tasks[i].lp_end * residual_tasks[i].size_min.value();</div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160; current_start_min =</div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160; <a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(current_start_min, residual_tasks[i].<a class="code" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>);</div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160; </div>
<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160; <span class="keyword">const</span> IntegerValue min_contrib =</div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160; (sum_duration * sum_duration + sum_square_duration) / 2 +</div>
<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160; current_start_min * sum_duration;</div>
<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> efficacy = (min_contrib.value() - lp_contrib) /</div>
<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160; std::sqrt(sum_square_duration.value());</div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160; <span class="keywordflow">if</span> (efficacy &gt; best_efficacy) {</div>
<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160; best_efficacy = efficacy;</div>
<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160; best_end = i;</div>
<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160; best_min_contrib = min_contrib;</div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160; }</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160; }</div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160; <span class="keywordflow">if</span> (best_end != -1) {</div>
<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, best_min_contrib,</div>
<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>);</div>
<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt;= best_end; ++i) {</div>
<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160; cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(residual_tasks[i].end, residual_tasks[i].size_min);</div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160; }</div>
<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160; top_n_cuts.<a class="code" href="classoperations__research_1_1sat_1_1_top_n_cuts.html#a713bdb803c52b7b7ac3c52ba9b869530">AddCut</a>(cut.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;NoOverlapBalasArea&quot;</span>, lp_values);</div>
<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160; }</div>
<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160; }</div>
<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160; top_n_cuts.<a class="code" href="classoperations__research_1_1sat_1_1_top_n_cuts.html#afb0f85e921e0f240d59d2a739e6b5712">TransferToManager</a>(lp_values, manager);</div>
<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160; };</div>
<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;}</div>
<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160; </div>
<div class="line"><a name="l02531"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#adf176ac81e34e8fd124d823ee0033f1a"> 2531</a></span>&#160;<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code" href="namespaceoperations__research_1_1sat.html#adf176ac81e34e8fd124d823ee0033f1a">CreateCliqueCutGenerator</a>(</div>
<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; base_variables, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160; <span class="comment">// Filter base_variables to only keep the one with a literal view, and</span></div>
<div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160; <span class="comment">// do the conversion.</span></div>
<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160; std::vector&lt;IntegerVariable&gt; variables;</div>
<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160; std::vector&lt;Literal&gt; literals;</div>
<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160; absl::flat_hash_map&lt;LiteralIndex, IntegerVariable&gt; positive_map;</div>
<div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160; absl::flat_hash_map&lt;LiteralIndex, IntegerVariable&gt; negative_map;</div>
<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160; <span class="keyword">auto</span>* integer_trail = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160; <span class="keyword">auto</span>* encoder = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> : base_variables) {</div>
<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;LowerBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(0)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160; <span class="keywordflow">if</span> (integer_trail-&gt;UpperBound(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != IntegerValue(1)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160; <span class="keyword">const</span> LiteralIndex literal_index = encoder-&gt;GetAssociatedLiteral(</div>
<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a0dedef72c691d332e0e1cc092bc01bc8">IntegerLiteral::GreaterOrEqual</a>(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, IntegerValue(1)));</div>
<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160; <span class="keywordflow">if</span> (literal_index != <a class="code" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160; variables.push_back(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160; literals.push_back(<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(literal_index));</div>
<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160; positive_map[literal_index] = <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160; negative_map[<a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(literal_index).<a class="code" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()] = <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160; }</div>
<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160; }</div>
<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160; <a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a> = variables;</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160; <span class="keyword">auto</span>* implication_graph = <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>&gt;();</div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160; result.<a class="code" href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">generate_cuts</a> =</div>
<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160; [variables, literals, implication_graph, positive_map, negative_map,</div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](<span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160; std::vector&lt;double&gt; packed_values;</div>
<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; literals.size(); ++i) {</div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160; packed_values.push_back(lp_values[variables[i]]);</div>
<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160; }</div>
<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160; <span class="keyword">const</span> std::vector&lt;std::vector&lt;Literal&gt;&gt; at_most_ones =</div>
<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160; implication_graph-&gt;GenerateAtMostOnesWithLargeWeight(literals,</div>
<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160; packed_values);</div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160; </div>
<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; at_most_one : at_most_ones) {</div>
<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160; <span class="comment">// We need to express such &quot;at most one&quot; in term of the initial</span></div>
<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160; <span class="comment">// variables, so we do not use the</span></div>
<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160; <span class="comment">// LinearConstraintBuilder::AddLiteralTerm() here.</span></div>
<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> builder(</div>
<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160; <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, IntegerValue(<a class="code" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits&lt;int64_t&gt;::min</a>()),</div>
<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160; IntegerValue(1));</div>
<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l : at_most_one) {</div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">ContainsKey</a>(positive_map, l.Index())) {</div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160; builder.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(positive_map.at(l.Index()), IntegerValue(1));</div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160; <span class="comment">// Add 1 - X to the linear constraint.</span></div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160; builder.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(negative_map.at(l.Index()), IntegerValue(-1));</div>
<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160; builder.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a322657f18d11f256cf3e03b0bd640d5a">AddConstant</a>(IntegerValue(1));</div>
<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160; }</div>
<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160; }</div>
<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160; </div>
<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160; manager-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(builder.<a class="code" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;clique&quot;</span>, lp_values);</div>
<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160; }</div>
<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160; };</div>
<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;}</div>
<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160; </div>
<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;} <span class="comment">// namespace sat</span></div>
<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;} <span class="comment">// namespace operations_research</span></div>
<div class="ttc" id="aalldiff__cst_8cc_html_a26e6db9bcc64b584051ecc28171ed11f"><div class="ttname"><a href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a></div><div class="ttdeci">int64_t max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00140">alldiff_cst.cc:140</a></div></div>
<div class="ttc" id="aalldiff__cst_8cc_html_ad10edae0a852d72fb76afb1c77735045"><div class="ttname"><a href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a></div><div class="ttdeci">int64_t min</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_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#l00498">base/logging.h:498</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a46e69120fbd3b36e6960e096d23b66f0"><div class="ttname"><a href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a></div><div class="ttdeci">#define DCHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00894">base/logging.h:894</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a4bd2e815ca2f702a4b6aa744b1ff3b82"><div class="ttname"><a href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a></div><div class="ttdeci">#define CHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00708">base/logging.h:708</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#l00705">base/logging.h:705</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#l00709">base/logging.h:709</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a7e03ec13560fa94a8fea569960d7efc6"><div class="ttname"><a href="base_2logging_8h.html#a7e03ec13560fa94a8fea569960d7efc6">CHECK_GT</a></div><div class="ttdeci">#define CHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00710">base/logging.h:710</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_aae2dc65d9ea248d54bf39daa986dd295"><div class="ttname"><a href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a></div><div class="ttdeci">#define DCHECK_GE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00897">base/logging.h:897</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab25e01a2942b821d66371fc68d53f2eb"><div class="ttname"><a href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a></div><div class="ttdeci">#define CHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00706">base/logging.h:706</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#l00896">base/logging.h:896</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#l00423">base/logging.h:423</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#l00892">base/logging.h:892</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#l00986">base/logging.h:986</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html"><div class="ttname"><a href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt; IntegerVariable, double &gt;</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html"><div class="ttname"><a href="classoperations__research_1_1_domain.html">operations_research::Domain</a></div><div class="ttdoc">We call domain any subset of Int64 = [kint64min, kint64max].</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00081">sorted_interval_list.h:81</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a5919f86aede74172b7fea05ebdb58975"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a5919f86aede74172b7fea05ebdb58975">operations_research::Domain::UnionWith</a></div><div class="ttdeci">Domain UnionWith(const Domain &amp;domain) const</div><div class="ttdoc">Returns the union of D and domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00323">sorted_interval_list.cc:323</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html">operations_research::KnapsackSolverForCuts</a></div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8h_source.html#l00301">knapsack_solver_for_cuts.h:301</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_a3bd66bb6693c84e8b758c0d8a18ed9e5"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a3bd66bb6693c84e8b758c0d8a18ed9e5">operations_research::KnapsackSolverForCuts::best_solution</a></div><div class="ttdeci">bool best_solution(int item_id) const</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8h_source.html#l00342">knapsack_solver_for_cuts.h:342</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_a4bcd14198cbb6f2c3bea61c85015e07a"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a4bcd14198cbb6f2c3bea61c85015e07a">operations_research::KnapsackSolverForCuts::set_node_limit</a></div><div class="ttdeci">void set_node_limit(const int64_t node_limit)</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8h_source.html#l00337">knapsack_solver_for_cuts.h:337</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_a902b91803b24fe467929767c65b6ee4f"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#a902b91803b24fe467929767c65b6ee4f">operations_research::KnapsackSolverForCuts::Init</a></div><div class="ttdeci">void Init(const std::vector&lt; double &gt; &amp;profits, const std::vector&lt; double &gt; &amp;weights, const double capacity)</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8cc_source.html#l00287">knapsack_solver_for_cuts.cc:287</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_aab4a9c689632460b6b96f3d4bf22f86e"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#aab4a9c689632460b6b96f3d4bf22f86e">operations_research::KnapsackSolverForCuts::Solve</a></div><div class="ttdeci">double Solve(TimeLimit *time_limit, bool *is_solution_optimal)</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8cc_source.html#l00321">knapsack_solver_for_cuts.cc:321</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_afa66a5ae5f09a131d7fdb338b8a212ba"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#afa66a5ae5f09a131d7fdb338b8a212ba">operations_research::KnapsackSolverForCuts::GetUpperBound</a></div><div class="ttdeci">double GetUpperBound()</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8h_source.html#l00320">knapsack_solver_for_cuts.h:320</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_knapsack_solver_for_cuts_html_afd53920302b4dcd6ef445bc52a001a5b"><div class="ttname"><a href="classoperations__research_1_1_knapsack_solver_for_cuts.html#afd53920302b4dcd6ef445bc52a001a5b">operations_research::KnapsackSolverForCuts::set_solution_upper_bound_threshold</a></div><div class="ttdeci">void set_solution_upper_bound_threshold(const double solution_upper_bound_threshold)</div><div class="ttdef"><b>Definition:</b> <a href="knapsack__solver__for__cuts_8h_source.html#l00331">knapsack_solver_for_cuts.h:331</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html">operations_research::TimeLimit</a></div><div class="ttdoc">A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00105">time_limit.h:105</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html_a810d5f7aaf80cc09cf5a094e20c1aaca"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">operations_research::TimeLimit::LimitReached</a></div><div class="ttdeci">bool LimitReached()</div><div class="ttdoc">Returns true when the external limit is true, or the deterministic time is over the deterministic lim...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00532">time_limit.h:532</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_binary_implication_graph_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">operations_research::sat::BinaryImplicationGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00457">clause.h:457</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_cover_cut_helper_html_ad86e161bb994fe49fa9c4298ebb5ae2d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_cover_cut_helper.html#ad86e161bb994fe49fa9c4298ebb5ae2d">operations_research::sat::CoverCutHelper::TrySimpleKnapsack</a></div><div class="ttdeci">bool TrySimpleKnapsack(const LinearConstraint base_ct, const std::vector&lt; double &gt; &amp;lp_values, const std::vector&lt; IntegerValue &gt; &amp;lower_bounds, const std::vector&lt; IntegerValue &gt; &amp;upper_bounds)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01159">cuts.cc:1159</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds.html">operations_research::sat::ImpliedBounds</a></div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8h_source.html#l00078">implied_bounds.h:78</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_processor_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html">operations_research::sat::ImpliedBoundsProcessor</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00056">cuts.h:56</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_processor_html_a011f5f336c989d356c5f06a5793473c1"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a011f5f336c989d356c5f06a5793473c1">operations_research::sat::ImpliedBoundsProcessor::ClearCache</a></div><div class="ttdeci">void ClearCache() const</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00112">cuts.h:112</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_processor_html_a7fb8d0b24091252e79aea6e5666f29e8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#a7fb8d0b24091252e79aea6e5666f29e8">operations_research::sat::ImpliedBoundsProcessor::ProcessUpperBoundedConstraint</a></div><div class="ttdeci">void ProcessUpperBoundedConstraint(const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, LinearConstraint *cut)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01495">cuts.cc:1495</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_processor_html_abb0b7cc2e259fc8ebe8fd3dd55816b75"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds_processor.html#abb0b7cc2e259fc8ebe8fd3dd55816b75">operations_research::sat::ImpliedBoundsProcessor::GetCachedImpliedBoundInfo</a></div><div class="ttdeci">BestImpliedBoundInfo GetCachedImpliedBoundInfo(IntegerVariable var)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01504">cuts.cc:1504</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_encoder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_encoder.html">operations_research::sat::IntegerEncoder</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00281">integer.h:281</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_encoder_html_a308a6df2722f2c0f36ec8888f4458b41"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_encoder.html#a308a6df2722f2c0f36ec8888f4458b41">operations_research::sat::IntegerEncoder::GetLiteralView</a></div><div class="ttdeci">const IntegerVariable GetLiteralView(Literal lit) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00425">integer.h:425</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_rounding_cut_helper_html_a66c8e6dc26260b69dcdf7668925dc3aa"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_rounding_cut_helper.html#a66c8e6dc26260b69dcdf7668925dc3aa">operations_research::sat::IntegerRoundingCutHelper::ComputeCut</a></div><div class="ttdeci">void ComputeCut(RoundingOptions options, const std::vector&lt; double &gt; &amp;lp_values, const std::vector&lt; IntegerValue &gt; &amp;lower_bounds, const std::vector&lt; IntegerValue &gt; &amp;upper_bounds, ImpliedBoundsProcessor *ib_processor, LinearConstraint *cut)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00710">cuts.cc:710</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00545">integer.h:545</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_a9ab880b5e67213a0607c5c3935da9f08"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#a9ab880b5e67213a0607c5c3935da9f08">operations_research::sat::IntegerTrail::LevelZeroUpperBound</a></div><div class="ttdeci">IntegerValue LevelZeroUpperBound(IntegerVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01360">integer.h:1360</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_aa68cc40c827bff2fb311040e2b848f9b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#aa68cc40c827bff2fb311040e2b848f9b">operations_research::sat::IntegerTrail::LevelZeroLowerBound</a></div><div class="ttdeci">IntegerValue LevelZeroLowerBound(IntegerVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01355">integer.h:1355</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_af4303d31360f06c50729f156b1fbc2a9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#af4303d31360f06c50729f156b1fbc2a9">operations_research::sat::IntegerTrail::InitialVariableDomain</a></div><div class="ttdeci">const Domain &amp; InitialVariableDomain(IntegerVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00647">integer.cc:647</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">operations_research::sat::LinearConstraintBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00088">sat/linear_constraint.h:88</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a094a24aaf66d66b693e7e80a0222f040"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">operations_research::sat::LinearConstraintBuilder::AddLiteralTerm</a></div><div class="ttdeci">ABSL_MUST_USE_RESULT bool AddLiteralTerm(Literal lit, IntegerValue coeff)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00055">sat/linear_constraint.cc:55</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a322657f18d11f256cf3e03b0bd640d5a"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a322657f18d11f256cf3e03b0bd640d5a">operations_research::sat::LinearConstraintBuilder::AddConstant</a></div><div class="ttdeci">void AddConstant(IntegerValue value)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00050">sat/linear_constraint.cc:50</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a8ef32d79f50eb45bb9305c8b436cf6c4"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">operations_research::sat::LinearConstraintBuilder::Build</a></div><div class="ttdeci">LinearConstraint Build()</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00116">sat/linear_constraint.cc:116</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_ad65ddc0d04d71006a9ebe3b9dcfe2ce6"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">operations_research::sat::LinearConstraintBuilder::AddTerm</a></div><div class="ttdeci">void AddTerm(IntegerVariable var, IntegerValue coeff)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00025">sat/linear_constraint.cc:25</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_manager_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">operations_research::sat::LinearConstraintManager</a></div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint__manager_8h_source.html#l00043">linear_constraint_manager.h:43</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_manager_html_a9456bb31790e4dae791914e3c065b460"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">operations_research::sat::LinearConstraintManager::AddCut</a></div><div class="ttdeci">bool AddCut(LinearConstraint ct, std::string type_name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_solution, std::string extra_info=&quot;&quot;)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint__manager_8cc_source.html#l00221">linear_constraint_manager.cc:221</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html">operations_research::sat::Literal</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00065">sat_base.h:65</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a239e1315c4e975a35537790ba0d913a7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">operations_research::sat::Literal::NegatedIndex</a></div><div class="ttdeci">LiteralIndex NegatedIndex() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00086">sat_base.h:86</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a886e9c024f7209181c0a850b6e90c644"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">operations_research::sat::Literal::Negated</a></div><div class="ttdeci">Literal Negated() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00092">sat_base.h:92</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html">operations_research::sat::Model</a></div><div class="ttdoc">Class that owns everything related to a particular optimization model.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00038">sat/model.h:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">operations_research::sat::SchedulingConstraintHelper</a></div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00172">intervals.h:173</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a11b6d6eef1159c1801cfa033778f09db"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">operations_research::sat::SchedulingConstraintHelper::EndMin</a></div><div class="ttdeci">IntegerValue EndMin(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00230">intervals.h:230</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a58ca51a90e49e887146f760ba5eb6520"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">operations_research::sat::SchedulingConstraintHelper::IsPresent</a></div><div class="ttdeci">bool IsPresent(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00454">intervals.h:454</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a63f565c8739300c26c9c42ae82f2faef"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a63f565c8739300c26c9c42ae82f2faef">operations_research::sat::SchedulingConstraintHelper::SizeIsFixed</a></div><div class="ttdeci">bool SizeIsFixed(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00446">intervals.h:446</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a8e6fcd6ce93a128626dede9f9cc89348"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">operations_research::sat::SchedulingConstraintHelper::IsAbsent</a></div><div class="ttdeci">bool IsAbsent(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00459">intervals.h:459</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a9125ec8126e6035eacce8a5eb52b45c5"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">operations_research::sat::SchedulingConstraintHelper::EndMax</a></div><div class="ttdeci">IntegerValue EndMax(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00232">intervals.h:232</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a98d787780ea13b5862ccb1ca73067da4"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a98d787780ea13b5862ccb1ca73067da4">operations_research::sat::SchedulingConstraintHelper::Starts</a></div><div class="ttdeci">const std::vector&lt; AffineExpression &gt; &amp; Starts() const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00320">intervals.h:320</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a9fa7bdc81941d5eae85952db86867de0"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9fa7bdc81941d5eae85952db86867de0">operations_research::sat::SchedulingConstraintHelper::IsOptional</a></div><div class="ttdeci">bool IsOptional(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00450">intervals.h:450</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_ab3a2a28d08246d8f3432caa1a27811b8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">operations_research::sat::SchedulingConstraintHelper::StartMin</a></div><div class="ttdeci">IntegerValue StartMin(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00229">intervals.h:229</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_ac8a0cc4c1cca9aefa21788b096954f31"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">operations_research::sat::SchedulingConstraintHelper::PresenceLiteral</a></div><div class="ttdeci">Literal PresenceLiteral(int index) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00323">intervals.h:323</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_ad8f69698386f241297b78589c1f57c3e"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">operations_research::sat::SchedulingConstraintHelper::StartMax</a></div><div class="ttdeci">IntegerValue StartMax(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00231">intervals.h:231</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_ad9b4a962b743e358f3a7c4b2279f99c8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">operations_research::sat::SchedulingConstraintHelper::NumTasks</a></div><div class="ttdeci">int NumTasks() const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00203">intervals.h:203</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_ade00ce69e73ccd8470ea0198961da58e"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ade00ce69e73ccd8470ea0198961da58e">operations_research::sat::SchedulingConstraintHelper::Sizes</a></div><div class="ttdeci">const std::vector&lt; AffineExpression &gt; &amp; Sizes() const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00322">intervals.h:322</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_afdbd968230d01fa0e91bc15b6f5994e3"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">operations_research::sat::SchedulingConstraintHelper::SizeMin</a></div><div class="ttdeci">IntegerValue SizeMin(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00224">intervals.h:224</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_affb6ad259bc1c6bd004308fb3b8a6b05"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#affb6ad259bc1c6bd004308fb3b8a6b05">operations_research::sat::SchedulingConstraintHelper::Ends</a></div><div class="ttdeci">const std::vector&lt; AffineExpression &gt; &amp; Ends() const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00321">intervals.h:321</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_top_n_cuts_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_top_n_cuts.html">operations_research::sat::TopNCuts</a></div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint__manager_8h_source.html#l00292">linear_constraint_manager.h:292</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_top_n_cuts_html_a713bdb803c52b7b7ac3c52ba9b869530"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_top_n_cuts.html#a713bdb803c52b7b7ac3c52ba9b869530">operations_research::sat::TopNCuts::AddCut</a></div><div class="ttdeci">void AddCut(LinearConstraint ct, const std::string &amp;name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_solution)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint__manager_8cc_source.html#l00726">linear_constraint_manager.cc:726</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_top_n_cuts_html_afb0f85e921e0f240d59d2a739e6b5712"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_top_n_cuts.html#afb0f85e921e0f240d59d2a739e6b5712">operations_research::sat::TopNCuts::TransferToManager</a></div><div class="ttdeci">void TransferToManager(const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_solution, LinearConstraintManager *manager)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint__manager_8cc_source.html#l00737">linear_constraint_manager.cc:737</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html">operations_research::sat::Trail</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00234">sat_base.h:234</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html_ad63c4461a1384629cb99413c6df8b9ca"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">operations_research::sat::Trail::CurrentDecisionLevel</a></div><div class="ttdeci">int CurrentDecisionLevel() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00356">sat_base.h:356</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_a9293e4d29cac928301645070dd307683"><div class="ttname"><a href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a></div><div class="ttdeci">int64_t b</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00047">constraint_solver/table.cc:47</a></div></div>
<div class="ttc" id="aconstraint__solver_2table_8cc_html_acb18315d548212835cd8ed4287e6c0b6"><div class="ttname"><a href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a></div><div class="ttdeci">int64_t a</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00046">constraint_solver/table.cc:46</a></div></div>
<div class="ttc" id="acp__model__solver_8cc_html_ac3cf9db02b23ea1455b5ae6955d03e47"><div class="ttname"><a href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a></div><div class="ttdeci">SharedTimeLimit * time_limit</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02152">cp_model_solver.cc:2152</a></div></div>
<div class="ttc" id="acuts_8h_html"><div class="ttname"><a href="cuts_8h.html">cuts.h</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_ac072af30c4ffbc834bb4c681f6ecb514"><div class="ttname"><a href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a></div><div class="ttdeci">int64_t value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00044">demon_profiler.cc:44</a></div></div>
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01874">expr_array.cc:1874</a></div></div>
<div class="ttc" id="agscip__solver_8cc_html_a1ba5ca0f61f2fa13bd23bf0f89004f35"><div class="ttname"><a href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a></div><div class="ttdeci">double upper_bound</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00126">gscip_solver.cc:126</a></div></div>
<div class="ttc" id="agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf"><div class="ttname"><a href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a></div><div class="ttdeci">GRBmodel * model</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00273">gurobi_interface.cc:273</a></div></div>
<div class="ttc" id="ainteger_8h_html"><div class="ttname"><a href="integer_8h.html">integer.h</a></div></div>
<div class="ttc" id="aintegral__types_8h_html"><div class="ttname"><a href="integral__types_8h.html">integral_types.h</a></div></div>
<div class="ttc" id="aintervals_8h_html"><div class="ttname"><a href="intervals_8h.html">intervals.h</a></div></div>
<div class="ttc" id="aknapsack__solver__for__cuts_8h_html"><div class="ttname"><a href="knapsack__solver__for__cuts_8h.html">knapsack_solver_for_cuts.h</a></div></div>
<div class="ttc" id="alog__severity_8h_html_ab4a2cbab234914b320b7fae11b6e8cb9"><div class="ttname"><a href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a></div><div class="ttdeci">const int INFO</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
<div class="ttc" id="anamespacegtl_html_a288a1dc92da5d3ad62d4bc4cec9e8b1d"><div class="ttname"><a href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a></div><div class="ttdeci">void STLSortAndRemoveDuplicates(T *v, const LessFunc &amp;less_func)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00058">stl_util.h:58</a></div></div>
<div class="ttc" id="anamespacegtl_html_aae28e97bd1fa93cb0032642550da7455"><div class="ttname"><a href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a></div><div class="ttdeci">bool ContainsKey(const Collection &amp;collection, const Key &amp;key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00200">map_util.h:200</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_afd6d278f9d061a91716c6770f2d723e8"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">operations_research::glop::ToDouble</a></div><div class="ttdeci">static double ToDouble(double f)</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00069">lp_types.h:69</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a06e2118f6735d033f7f43a939abe558d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a06e2118f6735d033f7f43a939abe558d">operations_research::sat::ConvertToKnapsackForm</a></div><div class="ttdeci">void ConvertToKnapsackForm(const LinearConstraint &amp;constraint, std::vector&lt; LinearConstraint &gt; *knapsack_constraints, IntegerTrail *integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00390">cuts.cc:390</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a07823d046b027c81155f8a2f322cf813"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a07823d046b027c81155f8a2f322cf813">operations_research::sat::FloorRatio</a></div><div class="ttdeci">IntegerValue FloorRatio(IntegerValue dividend, IntegerValue positive_divisor)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00091">integer.h:91</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0c9e8fab437ba44c91b0493a74cde263"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0c9e8fab437ba44c91b0493a74cde263">operations_research::sat::AddProductTo</a></div><div class="ttdeci">bool AddProductTo(IntegerValue a, IntegerValue b, IntegerValue *result)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00111">integer.h:111</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0dedef72c691d332e0e1cc092bc01bc8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0dedef72c691d332e0e1cc092bc01bc8">operations_research::sat::GreaterOrEqual</a></div><div class="ttdeci">std::function&lt; void(Model *)&gt; GreaterOrEqual(IntegerVariable v, int64_t lb)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01500">integer.h:1500</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1227e67513602591fb959e35c9de66e8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">operations_research::sat::kMaxIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMaxIntegerValue(std::numeric_limits&lt; IntegerValue::ValueType &gt;::max() - 1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1de556a1559f25bd0819655d375f6c8e"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1de556a1559f25bd0819655d375f6c8e">operations_research::sat::GetPreprocessedLinearConstraint</a></div><div class="ttdeci">LinearConstraint GetPreprocessedLinearConstraint(const LinearConstraint &amp;constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00252">cuts.cc:252</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1e30e51173c7e43a8c0b4668d5e3f050"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1e30e51173c7e43a8c0b4668d5e3f050">operations_research::sat::IntTypeAbs</a></div><div class="ttdeci">IntType IntTypeAbs(IntType t)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00078">integer.h:78</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a23849eabdcf8e9f6f90e7aa05b298dc9"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a23849eabdcf8e9f6f90e7aa05b298dc9">operations_research::sat::CreateNoOverlapPrecedenceCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlapPrecedenceCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02352">cuts.cc:2352</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a29b96869d2a821cf1d2e6099e7a0f51b"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a29b96869d2a821cf1d2e6099e7a0f51b">operations_research::sat::CeilRatio</a></div><div class="ttdeci">IntegerValue CeilRatio(IntegerValue dividend, IntegerValue positive_divisor)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00082">integer.h:82</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2dbcb7017d468a17bdb30252af5c6c31"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">operations_research::sat::kNoLiteralIndex</a></div><div class="ttdeci">const LiteralIndex kNoLiteralIndex(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a32f0016572d69bfcd1f3af811b2043ad"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a32f0016572d69bfcd1f3af811b2043ad">operations_research::sat::CanFormValidKnapsackCover</a></div><div class="ttdeci">bool CanFormValidKnapsackCover(const LinearConstraint &amp;preprocessed_constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00372">cuts.cc:372</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a34b1d34844b9b1695dd45dfd9c33f663"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a34b1d34844b9b1695dd45dfd9c33f663">operations_research::sat::CreateCumulativeCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCumulativeCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const IntegerVariable capacity, const std::vector&lt; IntegerVariable &gt; &amp;demands, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02202">cuts.cc:2202</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a355a62f25cfadeccfb164ab9fb867c81"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a355a62f25cfadeccfb164ab9fb867c81">operations_research::sat::kMinIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a3769d7503e7e86df192b6a7a158f86a9"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3769d7503e7e86df192b6a7a158f86a9">operations_research::sat::GenerateCumulativeCut</a></div><div class="ttdeci">std::function&lt; void(const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;, LinearConstraintManager *)&gt; GenerateCumulativeCut(const std::string &amp;cut_name, SchedulingConstraintHelper *helper, const std::vector&lt; IntegerVariable &gt; &amp;demands, AffineExpression capacity, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02023">cuts.cc:2023</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4393db2c15b2f92d7ef16ce6b38c8150"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4393db2c15b2f92d7ef16ce6b38c8150">operations_research::sat::RemoveZeroTerms</a></div><div class="ttdeci">void RemoveZeroTerms(LinearConstraint *constraint)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00205">sat/linear_constraint.cc:205</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a44bd0a015c444c2e2d58a002a09a1ea5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a44bd0a015c444c2e2d58a002a09a1ea5">operations_research::sat::GetFactorT</a></div><div class="ttdeci">IntegerValue GetFactorT(IntegerValue rhs_remainder, IntegerValue divisor, IntegerValue max_t)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00618">cuts.cc:618</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a457076abfb3071fca80b8175363e3dfa"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a457076abfb3071fca80b8175363e3dfa">operations_research::sat::GetKnapsackUpperBound</a></div><div class="ttdeci">double GetKnapsackUpperBound(std::vector&lt; KnapsackItem &gt; items, const double capacity)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00320">cuts.cc:320</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a50b686357c19f67aa58931db58e801e6"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a50b686357c19f67aa58931db58e801e6">operations_research::sat::CreateOverlappingCumulativeCutGenerator</a></div><div class="ttdeci">CutGenerator CreateOverlappingCumulativeCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const IntegerVariable capacity, const std::vector&lt; IntegerVariable &gt; &amp;demands, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02221">cuts.cc:2221</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a562723a1a137cee8f869c1d7eb9641b0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a562723a1a137cee8f869c1d7eb9641b0">operations_research::sat::CreateSquareCutGenerator</a></div><div class="ttdeci">CutGenerator CreateSquareCutGenerator(IntegerVariable y, IntegerVariable x, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01428">cuts.cc:1428</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a588b516182cd6d5d8c048dfd76bc5523"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a588b516182cd6d5d8c048dfd76bc5523">operations_research::sat::CanBeFilteredUsingCutLowerBound</a></div><div class="ttdeci">bool CanBeFilteredUsingCutLowerBound(const LinearConstraint &amp;preprocessed_constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00292">cuts.cc:292</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5bd8c44473618b7eafd33ba978db2f06"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">operations_research::sat::kNoIntegerVariable</a></div><div class="ttdeci">const IntegerVariable kNoIntegerVariable(-1)</div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5d3aa6734674f8f81aac3895cde58d6d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5d3aa6734674f8f81aac3895cde58d6d">operations_research::sat::MakeAllCoefficientsPositive</a></div><div class="ttdeci">void MakeAllCoefficientsPositive(LinearConstraint *constraint)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00218">sat/linear_constraint.cc:218</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a775efd540e54bd3be662ce7ee8894c1e"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a775efd540e54bd3be662ce7ee8894c1e">operations_research::sat::NewIntegerVariableFromLiteral</a></div><div class="ttdeci">std::function&lt; IntegerVariable(Model *)&gt; NewIntegerVariableFromLiteral(Literal lit)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01449">integer.h:1449</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7f1ac774d4646a83631f8117f4ea03f5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">operations_research::sat::PositiveVariable</a></div><div class="ttdeci">IntegerVariable PositiveVariable(IntegerVariable i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00139">integer.h:139</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7fea62548e11ae728e506874f767bdd3"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7fea62548e11ae728e506874f767bdd3">operations_research::sat::CreateLinMaxCutGenerator</a></div><div class="ttdeci">CutGenerator CreateLinMaxCutGenerator(const IntegerVariable target, const std::vector&lt; LinearExpression &gt; &amp;exprs, const std::vector&lt; IntegerVariable &gt; &amp;z_vars, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01919">cuts.cc:1919</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7feb76be212dca01ffe7ba3a0391e118"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7feb76be212dca01ffe7ba3a0391e118">operations_research::sat::CreateAllDifferentCutGenerator</a></div><div class="ttdeci">CutGenerator CreateAllDifferentCutGenerator(const std::vector&lt; IntegerVariable &gt; &amp;vars, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01822">cuts.cc:1822</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8c8db245a613f2fb46d917cd78100f83"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8c8db245a613f2fb46d917cd78100f83">operations_research::sat::CanBeFilteredUsingKnapsackUpperBound</a></div><div class="ttdeci">bool CanBeFilteredUsingKnapsackUpperBound(const LinearConstraint &amp;constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00338">cuts.cc:338</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a8e30df8580d6914abba28f43b6e4e667"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a8e30df8580d6914abba28f43b6e4e667">operations_research::sat::GetSuperAdditiveRoundingFunction</a></div><div class="ttdeci">std::function&lt; IntegerValue(IntegerValue)&gt; GetSuperAdditiveRoundingFunction(IntegerValue rhs_remainder, IntegerValue divisor, IntegerValue t, IntegerValue max_scaling)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00626">cuts.cc:626</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a90cb4e9fd1941ba3f7c011f086920d7a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a90cb4e9fd1941ba3f7c011f086920d7a">operations_research::sat::CreateNoOverlapBalasCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlapBalasCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02416">cuts.cc:2416</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa2ba15be9aeabce0142c726fbf880798"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa2ba15be9aeabce0142c726fbf880798">operations_research::sat::MakeAllVariablesPositive</a></div><div class="ttdeci">void MakeAllVariablesPositive(LinearConstraint *constraint)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00229">sat/linear_constraint.cc:229</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aae43e784db06c0974ce59ebbe8dd2b22"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aae43e784db06c0974ce59ebbe8dd2b22">operations_research::sat::NegationOf</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; NegationOf(const std::vector&lt; IntegerVariable &gt; &amp;vars)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00029">integer.cc:29</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab62fb8f885a68c653b586424aa5863c8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab62fb8f885a68c653b586424aa5863c8">operations_research::sat::CreateNoOverlapEnergyCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlapEnergyCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02335">cuts.cc:2335</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab7b2c273b19bf885462dfa04611e4e62"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab7b2c273b19bf885462dfa04611e4e62">operations_research::sat::GetCoefficientOfPositiveVar</a></div><div class="ttdeci">IntegerValue GetCoefficientOfPositiveVar(const IntegerVariable var, const LinearExpression &amp;expr)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00350">sat/linear_constraint.cc:350</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac158f737c8653b1fc1bd294ea2d3412d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac158f737c8653b1fc1bd294ea2d3412d">operations_research::sat::CreateKnapsackCoverCutGenerator</a></div><div class="ttdeci">CutGenerator CreateKnapsackCoverCutGenerator(const std::vector&lt; LinearConstraint &gt; &amp;base_constraints, const std::vector&lt; IntegerVariable &gt; &amp;vars, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00439">cuts.cc:439</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac807305eb9dd5e975f7fe9766307de2f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac807305eb9dd5e975f7fe9766307de2f">operations_research::sat::AddIntegerVariableFromIntervals</a></div><div class="ttdeci">void AddIntegerVariableFromIntervals(SchedulingConstraintHelper *helper, Model *model, std::vector&lt; IntegerVariable &gt; *vars)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01988">cuts.cc:1988</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac8b530afe36cf1521c919ca43429926d"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac8b530afe36cf1521c919ca43429926d">operations_research::sat::ConstraintIsTriviallyTrue</a></div><div class="ttdeci">bool ConstraintIsTriviallyTrue(const LinearConstraint &amp;constraint, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00276">cuts.cc:276</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_acbbef9110caafe014de5510ddd26b45f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#acbbef9110caafe014de5510ddd26b45f">operations_research::sat::CleanTermsAndFillConstraint</a></div><div class="ttdeci">void CleanTermsAndFillConstraint(std::vector&lt; std::pair&lt; IntegerVariable, IntegerValue &gt;&gt; *terms, LinearConstraint *constraint)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00085">sat/linear_constraint.cc:85</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_accb737ae1fad15d6798a4b8bc27cea51"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#accb737ae1fad15d6798a4b8bc27cea51">operations_research::sat::LiftKnapsackCut</a></div><div class="ttdeci">bool LiftKnapsackCut(const LinearConstraint &amp;constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, const std::vector&lt; IntegerValue &gt; &amp;cut_vars_original_coefficients, const IntegerTrail &amp;integer_trail, TimeLimit *time_limit, LinearConstraint *cut)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l00174">cuts.cc:174</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_acd00c99b5770a8f86418ce2c60c716b8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#acd00c99b5770a8f86418ce2c60c716b8">operations_research::sat::CreatePositiveMultiplicationCutGenerator</a></div><div class="ttdeci">CutGenerator CreatePositiveMultiplicationCutGenerator(IntegerVariable z, IntegerVariable x, IntegerVariable y, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l01332">cuts.cc:1332</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_adf176ac81e34e8fd124d823ee0033f1a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#adf176ac81e34e8fd124d823ee0033f1a">operations_research::sat::CreateCliqueCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCliqueCutGenerator(const std::vector&lt; IntegerVariable &gt; &amp;base_variables, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8cc_source.html#l02531">cuts.cc:2531</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae3c495e2e05950c578b01976701f9b2a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae3c495e2e05950c578b01976701f9b2a">operations_research::sat::DivideByGCD</a></div><div class="ttdeci">void DivideByGCD(LinearConstraint *constraint)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00191">sat/linear_constraint.cc:191</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aea18a909121c1c2ba4a818298611f0b2"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aea18a909121c1c2ba4a818298611f0b2">operations_research::sat::ComputeActivity</a></div><div class="ttdeci">double ComputeActivity(const LinearConstraint &amp;constraint, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;values)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8cc_source.html#l00124">sat/linear_constraint.cc:124</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aed77a1a7675c2f8568529a5a16247ec1"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">operations_research::sat::ToDouble</a></div><div class="ttdeci">double ToDouble(IntegerValue value)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00070">integer.h:70</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">Collection of objects used to extend the Constraint Solver library.</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a07ae210be5b66d61cdc83361e4c478a8"><div class="ttname"><a href="namespaceoperations__research.html#a07ae210be5b66d61cdc83361e4c478a8">operations_research::SumOfKMinValueInDomain</a></div><div class="ttdeci">int64_t SumOfKMinValueInDomain(const Domain &amp;domain, int k)</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00546">sorted_interval_list.cc:546</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a111f44b9b9cf67a8e8d83794ac9f5291"><div class="ttname"><a href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">operations_research::CapAdd</a></div><div class="ttdeci">int64_t CapAdd(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00126">saturated_arithmetic.h:126</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a1e2ec837105d112356116f6308b73fca"><div class="ttname"><a href="namespaceoperations__research.html#a1e2ec837105d112356116f6308b73fca">operations_research::FloorRatio</a></div><div class="ttdeci">int64_t FloorRatio(int64_t value, int64_t positive_coeff)</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00094">sorted_interval_list.cc:94</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a4a43d435871f16c321861fa5de32df82"><div class="ttname"><a href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">operations_research::CapSub</a></div><div class="ttdeci">int64_t CapSub(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00156">saturated_arithmetic.h:156</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a6b2032743808743ca19f9d9bdaba644e"><div class="ttname"><a href="namespaceoperations__research.html#a6b2032743808743ca19f9d9bdaba644e">operations_research::SumOfKMaxValueInDomain</a></div><div class="ttdeci">int64_t SumOfKMaxValueInDomain(const Domain &amp;domain, int k)</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00560">sorted_interval_list.cc:560</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_aa64bf49d041052c7cb3f40f7496d7534"><div class="ttname"><a href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">operations_research::CapProd</a></div><div class="ttdeci">int64_t CapProd(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00233">saturated_arithmetic.h:233</a></div></div>
<div class="ttc" id="apack_8cc_html_a4255f714cea26cdd64f6a0ee72d34a8c"><div class="ttname"><a href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a></div><div class="ttdeci">int64_t weight</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00510">pack.cc:510</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#l00509">pack.cc:509</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_t demand</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00125">resource.cc:125</a></div></div>
<div class="ttc" id="aresource_8cc_html_aee52de7b225665566aa47246b9d6b8fa"><div class="ttname"><a href="resource_8cc.html#aee52de7b225665566aa47246b9d6b8fa">time</a></div><div class="ttdeci">int64_t time</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l01691">resource.cc:1691</a></div></div>
<div class="ttc" id="arevised__simplex_8cc_html_af01c50e388647c921aa7d9c77f2b72b2"><div class="ttname"><a href="revised__simplex_8cc.html#af01c50e388647c921aa7d9c77f2b72b2">ratio</a></div><div class="ttdeci">Fractional ratio</div><div class="ttdef"><b>Definition:</b> <a href="revised__simplex_8cc_source.html#l01805">revised_simplex.cc:1805</a></div></div>
<div class="ttc" id="arouting__filters_8cc_html_a8e4ee19dee0e00541dbe9bbc83d806ba"><div class="ttname"><a href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a></div><div class="ttdeci">int64_t coefficient</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00985">routing_filters.cc:985</a></div></div>
<div class="ttc" id="arouting__flow_8cc_html_a2acb49f4df5288066c43610bede123ec"><div class="ttname"><a href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a></div><div class="ttdeci">int64_t capacity</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00151">routing_flow.cc:151</a></div></div>
<div class="ttc" id="asat_2linear__constraint_8h_html"><div class="ttname"><a href="sat_2linear__constraint_8h.html">linear_constraint.h</a></div></div>
<div class="ttc" id="asat_2lp__utils_8cc_html_a561d7bf12fc7674b3fe0ad2ba2e175a0"><div class="ttname"><a href="sat_2lp__utils_8cc.html#a561d7bf12fc7674b3fe0ad2ba2e175a0">lower_bounds</a></div><div class="ttdeci">std::vector&lt; double &gt; lower_bounds</div><div class="ttdef"><b>Definition:</b> <a href="sat_2lp__utils_8cc_source.html#l00497">sat/lp_utils.cc:497</a></div></div>
<div class="ttc" id="asat_2lp__utils_8cc_html_a88215c8581662c40eec0fb8621c44af3"><div class="ttname"><a href="sat_2lp__utils_8cc.html#a88215c8581662c40eec0fb8621c44af3">upper_bounds</a></div><div class="ttdeci">std::vector&lt; double &gt; upper_bounds</div><div class="ttdef"><b>Definition:</b> <a href="sat_2lp__utils_8cc_source.html#l00498">sat/lp_utils.cc:498</a></div></div>
<div class="ttc" id="asat__base_8h_html"><div class="ttname"><a href="sat__base_8h.html">sat_base.h</a></div></div>
<div class="ttc" id="asched__constraints_8cc_html_a0d94a083ebe1975ac196611f87a4e0a2"><div class="ttname"><a href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a></div><div class="ttdeci">Rev&lt; int64_t &gt; start_max</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00244">sched_constraints.cc:244</a></div></div>
<div class="ttc" id="asched__constraints_8cc_html_a826c744af066625acb241b17ae3e2be9"><div class="ttname"><a href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a></div><div class="ttdeci">Rev&lt; int64_t &gt; start_min</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00243">sched_constraints.cc:243</a></div></div>
<div class="ttc" id="asched__constraints_8cc_html_ad3f96403731a9e915dad229813609e74"><div class="ttname"><a href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a></div><div class="ttdeci">Rev&lt; int64_t &gt; end_min</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00245">sched_constraints.cc:245</a></div></div>
<div class="ttc" id="astl__util_8h_html"><div class="ttname"><a href="stl__util_8h.html">stl_util.h</a></div></div>
<div class="ttc" id="astrong__vector_8h_html"><div class="ttname"><a href="strong__vector_8h.html">strong_vector.h</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_affine_expression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_affine_expression.html">operations_research::sat::AffineExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00210">integer.h:210</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_affine_expression_html_aa9c149604bc3f558e14c6d233ebc4b19"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">operations_research::sat::AffineExpression::LpValue</a></div><div class="ttdeci">double LpValue(const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00238">integer.h:238</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_cut_generator_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_cut_generator.html">operations_research::sat::CutGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00041">cuts.h:41</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_cut_generator_html_a73e4094f2d4e2adbe5e8d79a5b61fcd1"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">operations_research::sat::CutGenerator::vars</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; vars</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00042">cuts.h:42</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_cut_generator_html_af7117deb3f57ff3ecceddc6e9bb2c561"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_cut_generator.html#af7117deb3f57ff3ecceddc6e9bb2c561">operations_research::sat::CutGenerator::generate_cuts</a></div><div class="ttdeci">std::function&lt; void(const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, LinearConstraintManager *manager)&gt; generate_cuts</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00046">cuts.h:46</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bound_entry_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bound_entry.html">operations_research::sat::ImpliedBoundEntry</a></div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8h_source.html#l00040">implied_bounds.h:40</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html">operations_research::sat::ImpliedBoundsProcessor::BestImpliedBoundInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00114">cuts.h:114</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info_html_a2c25b894240115eebb2e75e2d8491a79"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a2c25b894240115eebb2e75e2d8491a79">operations_research::sat::ImpliedBoundsProcessor::BestImpliedBoundInfo::bound_diff</a></div><div class="ttdeci">IntegerValue bound_diff</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00118">cuts.h:118</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info_html_a6d2822d5e07c3716efcdf73a4ae5eafc"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a6d2822d5e07c3716efcdf73a4ae5eafc">operations_research::sat::ImpliedBoundsProcessor::BestImpliedBoundInfo::is_positive</a></div><div class="ttdeci">bool is_positive</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00117">cuts.h:117</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info_html_a871eaa421116e3c7cd440b6299d0b74d"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#a871eaa421116e3c7cd440b6299d0b74d">operations_research::sat::ImpliedBoundsProcessor::BestImpliedBoundInfo::bool_var</a></div><div class="ttdeci">IntegerVariable bool_var</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00119">cuts.h:119</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info_html_ac11e010c276514d6402c772d0651f82f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_best_implied_bound_info.html#ac11e010c276514d6402c772d0651f82f">operations_research::sat::ImpliedBoundsProcessor::BestImpliedBoundInfo::slack_lp_value</a></div><div class="ttdeci">double slack_lp_value</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00116">cuts.h:116</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html">operations_research::sat::ImpliedBoundsProcessor::SlackInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00078">cuts.h:78</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html_a0ee34e5c6fbf075def1a6c2f0c42d040"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a0ee34e5c6fbf075def1a6c2f0c42d040">operations_research::sat::ImpliedBoundsProcessor::SlackInfo::lb</a></div><div class="ttdeci">IntegerValue lb</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00084">cuts.h:84</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html_a250583d63e8184c6f9f4deba1125e6bb"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a250583d63e8184c6f9f4deba1125e6bb">operations_research::sat::ImpliedBoundsProcessor::SlackInfo::terms</a></div><div class="ttdeci">std::vector&lt; std::pair&lt; IntegerVariable, IntegerValue &gt; &gt; terms</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00080">cuts.h:80</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html_a6e2915dc7e5345d6959390b53f026c5f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#a6e2915dc7e5345d6959390b53f026c5f">operations_research::sat::ImpliedBoundsProcessor::SlackInfo::ub</a></div><div class="ttdeci">IntegerValue ub</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00085">cuts.h:85</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html_acd07f8397a2e61932c8ee17a4e300e23"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#acd07f8397a2e61932c8ee17a4e300e23">operations_research::sat::ImpliedBoundsProcessor::SlackInfo::offset</a></div><div class="ttdeci">IntegerValue offset</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00081">cuts.h:81</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info_html_adb47ac0cff7c9dc4dc5f101d38a91185"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_implied_bounds_processor_1_1_slack_info.html#adb47ac0cff7c9dc4dc5f101d38a91185">operations_research::sat::ImpliedBoundsProcessor::SlackInfo::lp_value</a></div><div class="ttdeci">double lp_value</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00086">cuts.h:86</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_knapsack_item_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_knapsack_item.html">operations_research::sat::KnapsackItem</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00305">cuts.h:305</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_knapsack_item_html_a3ff84545f00a56ba7584b2a7f2cef69c"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_knapsack_item.html#a3ff84545f00a56ba7584b2a7f2cef69c">operations_research::sat::KnapsackItem::profit</a></div><div class="ttdeci">double profit</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00306">cuts.h:306</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_knapsack_item_html_a99108733d00274978a4979dc072bd513"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_knapsack_item.html#a99108733d00274978a4979dc072bd513">operations_research::sat::KnapsackItem::weight</a></div><div class="ttdeci">double weight</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00307">cuts.h:307</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html">operations_research::sat::LinearConstraint</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00040">sat/linear_constraint.h:40</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_a0ee34e5c6fbf075def1a6c2f0c42d040"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#a0ee34e5c6fbf075def1a6c2f0c42d040">operations_research::sat::LinearConstraint::lb</a></div><div class="ttdeci">IntegerValue lb</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00041">sat/linear_constraint.h:41</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_a4053d5aed2a34995e0aeb2042878ca7a"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#a4053d5aed2a34995e0aeb2042878ca7a">operations_research::sat::LinearConstraint::coeffs</a></div><div class="ttdeci">std::vector&lt; IntegerValue &gt; coeffs</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00044">sat/linear_constraint.h:44</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_a6e2915dc7e5345d6959390b53f026c5f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#a6e2915dc7e5345d6959390b53f026c5f">operations_research::sat::LinearConstraint::ub</a></div><div class="ttdeci">IntegerValue ub</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00042">sat/linear_constraint.h:42</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_a73e4094f2d4e2adbe5e8d79a5b61fcd1"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">operations_research::sat::LinearConstraint::vars</a></div><div class="ttdeci">std::vector&lt; IntegerVariable &gt; vars</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00043">sat/linear_constraint.h:43</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_a764be64f3029f8b8e23511061d8de355"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#a764be64f3029f8b8e23511061d8de355">operations_research::sat::LinearConstraint::DebugString</a></div><div class="ttdeci">std::string DebugString() const</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00059">sat/linear_constraint.h:59</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_constraint_html_ad65ddc0d04d71006a9ebe3b9dcfe2ce6"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_constraint.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">operations_research::sat::LinearConstraint::AddTerm</a></div><div class="ttdeci">void AddTerm(IntegerVariable var, IntegerValue coeff)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00049">sat/linear_constraint.h:49</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_linear_expression_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_linear_expression.html">operations_research::sat::LinearExpression</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2linear__constraint_8h_source.html#l00174">sat/linear_constraint.h:174</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rounding_options_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rounding_options.html">operations_research::sat::RoundingOptions</a></div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00209">cuts.h:209</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rounding_options_html_a01db407e90fac1c31c6705758a057908"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rounding_options.html#a01db407e90fac1c31c6705758a057908">operations_research::sat::RoundingOptions::max_scaling</a></div><div class="ttdeci">IntegerValue max_scaling</div><div class="ttdef"><b>Definition:</b> <a href="cuts_8h_source.html#l00210">cuts.h:210</a></div></div>
<div class="ttc" id="atime__limit_8h_html"><div class="ttname"><a href="time__limit_8h.html">time_limit.h</a></div></div>
</div><!-- 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="cuts_8cc.html">cuts.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>