Files
ortools-clone/docs/cpp/scheduling__cuts_8cc_source.html
Mizux Seiha 3b81c981c2 Update doc
2022-03-04 00:19:15 +01:00

1667 lines
375 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.3"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: scheduling_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.3</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('scheduling__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">scheduling_cuts.cc</div></div>
</div><!--header-->
<div class="contents">
<a href="scheduling__cuts_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &quot;<a class="code" href="scheduling__cuts_8h.html">ortools/sat/scheduling_cuts.h</a>&quot;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;optional&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;tuple&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;absl/strings/str_cat.h&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;absl/types/span.h&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &quot;<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &quot;<a class="code" href="strong__vector_8h.html">ortools/base/strong_vector.h</a>&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include &quot;<a class="code" href="cuts_8h.html">ortools/sat/cuts.h</a>&quot;</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &quot;<a class="code" href="diffn__util_8h.html">ortools/sat/diffn_util.h</a>&quot;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &quot;<a class="code" href="implied__bounds_8h.html">ortools/sat/implied_bounds.h</a>&quot;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include &quot;<a class="code" href="integer_8h.html">ortools/sat/integer.h</a>&quot;</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;<a class="code" href="intervals_8h.html">ortools/sat/intervals.h</a>&quot;</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#include &quot;<a class="code" href="sat_2linear__constraint_8h.html">ortools/sat/linear_constraint.h</a>&quot;</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include &quot;<a class="code" href="linear__constraint__manager_8h.html">ortools/sat/linear_constraint_manager.h</a>&quot;</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#include &quot;<a class="code" href="sat_2model_8h.html">ortools/sat/model.h</a>&quot;</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#include &quot;<a class="code" href="sat__base_8h.html">ortools/sat/sat_base.h</a>&quot;</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#include &quot;<a class="code" href="strong__integers_8h.html">ortools/util/strong_integers.h</a>&quot;</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> </div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="keyword">namespace </span>sat {</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">// Minimum amount of violation of the cut constraint by the solution. This</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment">// is needed to avoid numerical issues and adding cuts with minor effect.</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="keyword">const</span> <span class="keywordtype">double</span> kMinCutViolation = 1e-4;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment">// Returns the lp value of a Literal.</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="keywordtype">double</span> GetLiteralLpValue(</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">const</span> Literal lit,</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">const</span> IntegerEncoder* encoder) {</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">const</span> IntegerVariable direct_view = encoder-&gt;GetLiteralView(lit);</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">if</span> (direct_view != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordflow">return</span> lp_values[direct_view];</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> }</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">const</span> IntegerVariable opposite_view = encoder-&gt;GetLiteralView(lit.Negated());</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(opposite_view, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">return</span> 1.0 - lp_values[opposite_view];</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span>}</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="keywordtype">void</span> AddIntegerVariableFromIntervals(SchedulingConstraintHelper* helper,</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> Model* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> std::vector&lt;IntegerVariable&gt;* vars) {</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> IntegerEncoder* encoder = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;IntegerEncoder&gt;();</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; helper-&gt;NumTasks(); ++t) {</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordflow">if</span> (helper-&gt;Starts()[t].var != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> vars-&gt;push_back(helper-&gt;Starts()[t].var);</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> }</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordflow">if</span> (helper-&gt;Sizes()[t].var != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> vars-&gt;push_back(helper-&gt;Sizes()[t].var);</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> }</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordflow">if</span> (helper-&gt;Ends()[t].var != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> vars-&gt;push_back(helper-&gt;Ends()[t].var);</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> }</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">if</span> (helper-&gt;IsOptional(t) &amp;&amp; !helper-&gt;IsAbsent(t) &amp;&amp;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> !helper-&gt;IsPresent(t)) {</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keyword">const</span> Literal l = helper-&gt;PresenceLiteral(t);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordflow">if</span> (encoder-&gt;GetLiteralView(l) == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a> &amp;&amp;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> encoder-&gt;GetLiteralView(l.Negated()) == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;Add(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a050c9f843d5f82c4cf6e958a4062e5a7">NewIntegerVariableFromLiteral</a>(l));</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> }</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keyword">const</span> IntegerVariable direct_view = encoder-&gt;GetLiteralView(l);</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordflow">if</span> (direct_view != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>) {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> vars-&gt;push_back(direct_view);</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> vars-&gt;push_back(encoder-&gt;GetLiteralView(l.Negated()));</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(vars-&gt;back(), <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> }</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> }</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> }</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span>}</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html"> 99</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a> {</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af"> 100</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a>;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86"> 101</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a>;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da"> 102</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a>;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5"> 103</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a>;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95"> 104</a></span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a>;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095"> 105</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a> = IntegerValue(0); <span class="comment">// Useful for no_overlap_2d.</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f"> 106</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a> = IntegerValue(0); <span class="comment">// Useful for no_overlap_2d.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782"> 107</a></span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a>;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="comment">// Energy will be present only if the x_size * y_size could be linearized.</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8"> 110</a></span> std::optional&lt;LinearExpression&gt; <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>;</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2"> 111</a></span> LiteralIndex <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="comment">// Caches for MinOf(x_size), MinOf(y_size), and the LP values of the energy</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="comment">// and the presence literal.</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2"> 115</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da"> 116</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958"> 117</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> = 1.0;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a"> 118</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a> = 0.0;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="comment">// Used to minimize the increase on the y axis for rectangles.</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#aa277e1f549852cd6f0324b278be5f552"> 121</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aa277e1f549852cd6f0324b278be5f552">y_spread</a> = 0.0;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> </div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="comment">// The actual value of the presence literal of the interval(s) is checked</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="comment">// when the event is created. A value of kNoLiteralIndex indicates that either</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="comment">// the interval was not optional, or that its presence literal is true at</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="comment">// level zero.</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a90037a849f93aa8dddc93f0e19868d24"> 127</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#a90037a849f93aa8dddc93f0e19868d24">IsPresent</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>; }</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="comment">// Computes the mandatory minimal overlap of the interval with the time window</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="comment">// [start, end].</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#ae9f7ab26b97268f5c53db090ce188428"> 131</a></span> IntegerValue <a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#ae9f7ab26b97268f5c53db090ce188428">GetMinOverlap</a>(IntegerValue <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>, IntegerValue <a class="code hl_variable" href="sparse__submatrix_8cc.html#a4d53eac2ef2732c28fa9fb663e0c19a7">end</a>)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>({<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a> - <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>, <a class="code hl_variable" href="sparse__submatrix_8cc.html#a4d53eac2ef2732c28fa9fb663e0c19a7">end</a> - <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>,</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <a class="code hl_variable" href="sparse__submatrix_8cc.html#a4d53eac2ef2732c28fa9fb663e0c19a7">end</a> - <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>}),</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> IntegerValue(0));</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> }</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_energy_event.html#a764be64f3029f8b8e23511061d8de355"> 137</a></span> std::string <a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#a764be64f3029f8b8e23511061d8de355">DebugString</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">return</span> absl::StrCat(</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="stringliteral">&quot;EnergyEvent(x_start_min = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a>.value(),</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="stringliteral">&quot;, x_start_max = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a>.value(),</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="stringliteral">&quot;, x_end_min = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a>.value(),</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="stringliteral">&quot;, x_end_max = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a>.value(),</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="stringliteral">&quot;, x_size = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#ac3740684133a43f28203f0b85ed847b7">DebugString</a>(), <span class="stringliteral">&quot;, y_min = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a>.value(),</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="stringliteral">&quot;, y_max = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a>.value(), <span class="stringliteral">&quot;, y_size = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#ac3740684133a43f28203f0b85ed847b7">DebugString</a>(),</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="stringliteral">&quot;, energy = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> ? <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>.value().DebugString() : <span class="stringliteral">&quot;{}&quot;</span>,</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="stringliteral">&quot;, presence_literal_index = &quot;</span>, <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a>.value(), <span class="stringliteral">&quot;)&quot;</span>);</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span>};</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="comment">// Note that we only support to cases:</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span><span class="comment">// - capacity is non-zero and the y_min/y_max of the events must be zero.</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span><span class="comment">// - capacity is zero, and the y_min/y_max can be set.</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="comment">// This is DCHECKed in the code.</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4"> 154</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4">GenerateEnergeticCuts</a>(</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> std::vector&lt;EnergyEvent&gt; events, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordtype">bool</span> events_are_2d, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_top_n_cuts.html">TopNCuts</a> top_n_cuts(15);</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> std::sort(events.begin(), events.end(),</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> [](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> return std::tie(a.x_start_min, a.y_spread, a.x_end_max) &lt;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> std::tie(b.x_start_min, b.y_spread, b.x_end_max);</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> });</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> </div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keyword">const</span> <span class="keywordtype">double</span> capacity_lp = <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>.LpValue(lp_values);</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> </div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="comment">// The sum of all energies can be used to stop iterating early.</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keywordtype">double</span> sum_of_all_energies = 0.0;</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : events) {</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> sum_of_all_energies += e.energy_lp;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> }</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_capacity_profile.html">CapacityProfile</a> capacity_profile;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> </div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> IntegerValue processed_start = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i1 = 0; i1 + 1 &lt; events.size(); ++i1) {</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="comment">// We want maximal cuts. For any x_start_min value, we only need to create</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="comment">// cuts starting from the first interval having this x_start_min value.</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="comment">//</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="comment">// Enabling this optimization reduces dramatically the number of generated</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="comment">// cuts in the rectangle_case case. So we only use it in the !events_are_2d</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="comment">// case.</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">if</span> (!events_are_2d) {</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keywordflow">if</span> (events[i1].x_start_min == processed_start) {</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> processed_start = events[i1].x_start_min;</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> }</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> }</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> </div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="comment">// For each start time, we will keep the most violated cut generated while</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="comment">// scanning the residual intervals.</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keywordtype">int</span> max_violation_end_index = -1;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordtype">double</span> max_relative_violation = 1.0 + kMinCutViolation;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> IntegerValue max_violation_window_start(0);</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> IntegerValue max_violation_window_end(0);</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> IntegerValue max_violation_y_min(0);</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> IntegerValue max_violation_y_max(0);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> IntegerValue max_violation_precise_area(0);</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordtype">bool</span> max_violation_use_precise_area = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> std::vector&lt;EnergyEvent&gt; max_violation_lifted_events;</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="comment">// Accumulate intervals, areas, energies and check for potential cuts.</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordtype">double</span> energy_lp = 0.0;</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> IntegerValue window_min = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> IntegerValue window_max = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> IntegerValue y_min = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> IntegerValue y_max = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> capacity_profile.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_capacity_profile.html#aa71d36872f416feaa853788a7a7a7ef8">Clear</a>();</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="comment">// We sort all tasks (x_start_min(task) &gt;= x_start_min(start_index) by</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="comment">// increasing end max.</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> std::vector&lt;EnergyEvent&gt; residual_events(events.begin() + i1, events.end());</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> std::sort(residual_events.begin(), residual_events.end(),</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> [](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> return std::tie(a.x_end_max, a.y_spread) &lt;</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> std::tie(b.x_end_max, b.y_spread);</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> });</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="comment">// Let&#39;s process residual tasks and evaluate the violation of the cut at</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="comment">// each step. We follow the same structure as the cut creation code below.</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i2 = 0; i2 &lt; residual_events.size(); ++i2) {</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; e = residual_events[i2];</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> energy_lp += e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a>;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> window_min = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(window_min, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a>);</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> window_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(window_max, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a>);</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> y_min = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(y_min, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a>);</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> y_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(y_max, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a>);</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keywordflow">if</span> (events_are_2d) {</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> capacity_profile.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_capacity_profile.html#a3131bcd0083f6de781499abfa46de79c">AddRectangle</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a>, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a>, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a>,</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a>);</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> }</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="comment">// Dominance rule. If the next interval also fits in</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="comment">// [window_min, window_max], the cut will be stronger with the</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="comment">// next interval/rectangle.</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">if</span> (i2 + 1 &lt; residual_events.size() &amp;&amp;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> residual_events[i2 + 1].x_start_min &gt;= window_min &amp;&amp;</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> residual_events[i2 + 1].x_end_max &lt;= window_max &amp;&amp;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> residual_events[i2 + 1].y_min &gt;= y_min &amp;&amp;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> residual_events[i2 + 1].y_max &lt;= y_max) {</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> }</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> </div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="comment">// Checks the current area vs the sum of all energies.</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(capacity_lp == 0.0 || y_max == y_min);</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="comment">// we have two cases:</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="comment">// - events_are_2d = false: the area is (window_max - window_min) *</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="comment">// capacity.</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="comment">// Its LP value is (window_max - window_min) * capacity_lp.</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="comment">// - events_are_2d = true: The area is</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="comment">// capacity_profile.GetBoundingArea().</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="comment">// We can compare it to the bounding box area:</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// (window_max - window_min) * (y_max - y_min).</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keywordtype">bool</span> use_precise_area = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> IntegerValue precise_area(0);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordtype">double</span> area_lp = 0.0;</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keywordflow">if</span> (events_are_2d) {</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keyword">const</span> IntegerValue bbox_area =</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> (window_max - window_min) * (y_max - y_min);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> precise_area = capacity_profile.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_capacity_profile.html#aea102560f0670a0432eca120b9089663">GetBoundingArea</a>();</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> use_precise_area = precise_area &lt; bbox_area;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> area_lp = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(precise_area);</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> area_lp = capacity_lp * <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(window_max - window_min);</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> }</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> </div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keywordflow">if</span> (area_lp &gt;= sum_of_all_energies) {</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> }</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="comment">// Compute forced contributions from intervals not included in</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="comment">// [window_min..window_max].</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">//</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// TODO(user): We could precompute possible intervals and store them</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="comment">// by x_start_max, x_end_min to reduce the complexity.</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="comment">//</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="comment">// Note: this is not useful in the no_overlap_2d case. Maybe because of</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="comment">// geometric nature of the overlap w.r.t. strict rectangles. i.e. a</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// rectangle that can be lifted will most likely increase the y_range.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> std::vector&lt;EnergyEvent&gt; lifted_events;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <span class="keywordtype">double</span> lifted_contrib_lp = 0.0;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="comment">// Because of the 2D conflicts, lifted events are unlikely in the</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="comment">// no_overlap_2d case. Let&#39;s disable this expensive loop for the time</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// being.</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="keywordflow">if</span> (!events_are_2d) {</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="keyword">const</span> <span class="keyword">auto</span> check_lifted_cuts = [&amp;lifted_events, window_min, window_max,</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> y_min, y_max, &amp;lifted_contrib_lp,</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> &amp;lp_values](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; e) {</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// It should not happen because of the 2 dominance rules above.</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> &gt;= window_min &amp;&amp; e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a> &lt;= window_max) {</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> }</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> </div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="comment">// Do not add if it extends the y range.</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a> &lt; y_min || e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a> &gt; y_max) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="comment">// Exit if the interval can be pushed left or right of the window.</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a> &lt;= window_min || e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a> &gt;= window_max) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> </div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(window_max, window_min);</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>, 0);</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> </div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keyword">const</span> IntegerValue min_overlap =</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> e.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#ae9f7ab26b97268f5c53db090ce188428">GetMinOverlap</a>(window_min, window_max);</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> </div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keywordflow">if</span> (min_overlap &lt;= 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> lifted_events.push_back(e);</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keywordtype">double</span> contrib_lp = 0.0;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordflow">if</span> (e.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#a90037a849f93aa8dddc93f0e19868d24">IsPresent</a>()) {</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> contrib_lp = e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) * <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(min_overlap);</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> contrib_lp = e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> * <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(min_overlap * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>);</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> }</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="comment">// We know the energy is &gt;= 0.0. Some epsilon in the simplex can make</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="comment">// contrib_lp a small negative number. We can correct this.</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> lifted_contrib_lp += <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(contrib_lp, 0.0);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> };</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i3 = 0; i3 &lt; i1; ++i3) {</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> check_lifted_cuts(events[i3]);</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> }</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i3 = i2 + 1; i3 &lt; residual_events.size(); ++i3) {</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> check_lifted_cuts(residual_events[i3]);</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> }</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> }</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> </div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="comment">// Compute the violation of the potential cut.</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keyword">const</span> <span class="keywordtype">double</span> relative_violation =</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> (energy_lp + lifted_contrib_lp) / area_lp;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> <span class="keywordflow">if</span> (relative_violation &gt; max_relative_violation) {</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> max_violation_end_index = i2;</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> max_relative_violation = relative_violation;</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> max_violation_window_start = window_min;</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> max_violation_window_end = window_max;</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(max_violation_lifted_events, lifted_events);</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> max_violation_y_min = y_min;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> max_violation_y_max = y_max;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> max_violation_precise_area = precise_area;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> max_violation_use_precise_area = use_precise_area;</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> }</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> }</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <span class="keywordflow">if</span> (max_violation_end_index == -1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> <span class="comment">// A maximal violated cut has been found.</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="keywordtype">bool</span> cut_generated = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keywordtype">bool</span> has_opt_cuts = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keywordtype">bool</span> use_lifted_events = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="keywordtype">bool</span> has_quadratic_cuts = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordtype">bool</span> use_energy = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> </div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(capacity_lp == 0.0 || max_violation_y_max == max_violation_y_min);</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="comment">// Build the cut.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>,</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> events_are_2d ? max_violation_precise_area : IntegerValue(0));</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> </div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="comment">// Adds the capacity in the disjunctive/cumulative case.</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="keywordflow">if</span> (!events_are_2d) {</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> max_violation_window_start - max_violation_window_end);</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> }</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i2 = 0; i2 &lt;= max_violation_end_index; ++i2) {</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; e = residual_events[i2];</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <span class="keywordflow">if</span> (e.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_energy_event.html#a90037a849f93aa8dddc93f0e19868d24">IsPresent</a>()) {</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>) {</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <span class="comment">// We favor the energy info instead of the McCormick relaxation.</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a49e8e4a987d39f4da335e1ed287bb8ad">AddLinearExpression</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>.value());</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> use_energy = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a7e251202babf951363efedbd30af45c5">AddQuadraticLowerBound</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a>, e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a>, integer_trail);</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> has_quadratic_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> }</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> has_opt_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keyword">const</span> IntegerValue min_energy =</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>,</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> ? e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>.value().LevelZeroMin(integer_trail)</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> : IntegerValue(0));</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keywordflow">if</span> (min_energy &gt; e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>) {</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> use_energy = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> }</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">if</span> (!cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">AddLiteralTerm</a>(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a>),</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> min_energy)) {</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> cut_generated = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> }</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> }</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> }</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> </div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; e : max_violation_lifted_events) {</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> <span class="keyword">const</span> IntegerValue min_overlap =</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> e.GetMinOverlap(max_violation_window_start, max_violation_window_end);</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(min_overlap, 0);</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> use_lifted_events = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> </div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="keywordflow">if</span> (e.IsPresent()) {</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(e.y_size, min_overlap);</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> has_opt_cuts = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="keywordflow">if</span> (!cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">AddLiteralTerm</a>(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.presence_literal_index),</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> min_overlap * e.y_size_min)) {</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> cut_generated = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> }</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> }</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> }</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> </div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (cut_generated) {</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> std::string full_name = cut_name;</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="keywordflow">if</span> (has_opt_cuts) full_name.append(<span class="stringliteral">&quot;_opt&quot;</span>);</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keywordflow">if</span> (has_quadratic_cuts) full_name.append(<span class="stringliteral">&quot;_quad&quot;</span>);</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordflow">if</span> (use_lifted_events) full_name.append(<span class="stringliteral">&quot;_lifted&quot;</span>);</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keywordflow">if</span> (use_energy) full_name.append(<span class="stringliteral">&quot;_energy&quot;</span>);</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="keywordflow">if</span> (max_violation_use_precise_area) full_name.append(<span class="stringliteral">&quot;_precise&quot;</span>);</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> top_n_cuts.AddCut(cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), full_name, lp_values);</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> }</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> }</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> top_n_cuts.TransferToManager(lp_values, manager);</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span>}</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> </div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554"> 427</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">AppendVariablesToCumulativeCut</a>(</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt;&amp; demands, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail,</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a>* result) {</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; demand_expr : demands) {</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">if</span> (!integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a523501d854b2ca8034d37c15e7c89117">IsFixed</a>(demand_expr)) {</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> result-&gt;<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(demand_expr.var);</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> }</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> }</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> <span class="keywordflow">if</span> (!integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a523501d854b2ca8034d37c15e7c89117">IsFixed</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>)) {</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> result-&gt;<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.push_back(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>.var);</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> }</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span>}</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> </div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a6ac647beb0b07619b73b2808adddbe3f"> 441</a></span><span class="keywordtype">double</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6ac647beb0b07619b73b2808adddbe3f">ComputeEnergyLp</a>(</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a>&amp; e,</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail) {</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>) {</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="keywordflow">return</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>.value().LpValue(lp_values);</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> } <span class="keywordflow">else</span> { <span class="comment">// demand and size are not fixed.</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="comment">// X * Y &gt;= X * y_min + x_min * Y - x_min * y_min.</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>) * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) +</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>) * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) -</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>);</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> }</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="keyword">const</span> IntegerValue min_energy =</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> * e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a>,</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> ? e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>.value().LevelZeroMin(integer_trail)</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> : IntegerValue(0));</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="keywordflow">return</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> * <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(min_energy);</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> }</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span>}</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> </div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a04d3913888ed0b200c1d1fa879c62804"> 463</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a04d3913888ed0b200c1d1fa879c62804">CreateCumulativeEnergyCutGenerator</a>(</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt;&amp; demands,</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; energies, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> </div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">AppendVariablesToCumulativeCut</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, integer_trail, &amp;result);</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_linear_expression.html">LinearExpression</a>&amp; <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a> : energies) {</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.insert(result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>.end(), <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a>.vars.begin(),</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a>.vars.end());</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> }</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> </div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> [<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, energies, trail, integer_trail, helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> encoder](<span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> </div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> std::vector&lt;EnergyEvent&gt; events;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++i) {</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">if</span> (helper-&gt;<a class="code hl_function" 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 id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">if</span> (integer_trail-&gt;LevelZeroUpperBound(demands[i]) == 0 ||</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(i) == 0) {</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> }</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> </div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a> e;</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(i);</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(i);</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(i);</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(i);</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a7ead258b894235518c2ba922e3fa7606">Sizes</a>()[i];</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a> = demands[i];</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a88c8ab90d500702234707905c3b07ad2">ProductIsLinearized</a>(energies[i])) {</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> = energies[i];</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> }</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(i);</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a> = integer_trail-&gt;LevelZeroLowerBound(demands[i]);</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(i)) {</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(i).<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> = GetLiteralLpValue(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a>),</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> lp_values, encoder);</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> }</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a> = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6ac647beb0b07619b73b2808adddbe3f">ComputeEnergyLp</a>(e, lp_values, integer_trail);</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> events.push_back(e);</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> }</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> </div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4">GenerateEnergeticCuts</a>(<span class="stringliteral">&quot;CumulativeEnergy&quot;</span>, lp_values, events, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="comment">/*events_are_2d=*/</span><span class="keyword">false</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> };</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> </div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span>}</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> </div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ab62fb8f885a68c653b586424aa5863c8"> 528</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab62fb8f885a68c653b586424aa5863c8">CreateNoOverlapEnergyCutGenerator</a>(</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> </div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> </div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> </div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <span class="comment">// We need to convert AffineExpression to LinearExpression for the energy.</span></div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> std::vector&lt;LinearExpression&gt; sizes;</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> sizes.reserve(intervals.size());</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; intervals.size(); ++i) {</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> builder(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> builder.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(helper-&gt;Sizes()[i], IntegerValue(1));</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> sizes.push_back(builder.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a96ececaa94026aaa3a46fb65df0a17a9">BuildExpression</a>());</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> }</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> </div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> [sizes, trail, helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, encoder](</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> std::vector&lt;EnergyEvent&gt; events;</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; helper-&gt;NumTasks(); ++i) {</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> <span class="keywordflow">if</span> (helper-&gt;IsAbsent(i)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <span class="keywordflow">if</span> (helper-&gt;SizeMin(i) == 0) {</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> }</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> </div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a> e;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = helper-&gt;StartMin(i);</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a> = helper-&gt;StartMax(i);</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a> = helper-&gt;EndMin(i);</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a> = helper-&gt;EndMax(i);</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a> = helper-&gt;Sizes()[i];</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a> = IntegerValue(1);</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> = sizes[i];</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> = helper-&gt;SizeMin(i);</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a> = IntegerValue(1);</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keywordflow">if</span> (helper-&gt;IsPresent(i)) {</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a> = e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a>-&gt;LpValue(lp_values);</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> = helper-&gt;PresenceLiteral(i).Index();</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> = GetLiteralLpValue(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a>),</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> lp_values, encoder);</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a> = e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> * <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>);</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> }</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> events.push_back(e);</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> }</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> </div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4">GenerateEnergeticCuts</a>(<span class="stringliteral">&quot;NoOverlapEnergy&quot;</span>, lp_values, events,</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> IntegerValue(1), <span class="comment">/*events_are_2d=*/</span><span class="keyword">false</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> manager);</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> };</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span>}</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> </div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a4afe32e790c8bdda016751c64074547e"> 592</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4afe32e790c8bdda016751c64074547e">GenerateNoOverlap2dEnergyCut</a>(</div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; energies, absl::Span&lt;int&gt; rectangles,</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder,</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* x_helper,</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* y_helper) {</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> std::vector&lt;EnergyEvent&gt; events;</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> rect : rectangles) {</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> <span class="keywordflow">if</span> (y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afa1aca9725da8adf5c56ea08e7636c32">SizeMax</a>(rect) == 0 || x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afa1aca9725da8adf5c56ea08e7636c32">SizeMax</a>(rect) == 0) {</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> }</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> </div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_energy_event.html">EnergyEvent</a> e;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">x_start_max</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(rect);</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">x_end_min</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(rect);</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">x_end_max</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">x_size</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a7ead258b894235518c2ba922e3fa7606">Sizes</a>()[rect];</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">y_min</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">y_size</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a7ead258b894235518c2ba922e3fa7606">Sizes</a>()[rect];</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a88c8ab90d500702234707905c3b07ad2">ProductIsLinearized</a>(energies[rect])) {</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">energy</a> = energies[rect];</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> }</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> =</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect)</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> ? (y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect)</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> ? <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> : y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(rect).<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>())</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> : x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(rect).<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keywordflow">if</span> (e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a> != <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">literal_lp</a> = GetLiteralLpValue(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">presence_literal_index</a>),</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> lp_values, encoder);</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> }</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(rect);</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">y_size_min</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(rect);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> e.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">energy_lp</a> = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6ac647beb0b07619b73b2808adddbe3f">ComputeEnergyLp</a>(e, lp_values, integer_trail);</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> events.push_back(e);</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> }</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> </div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="keywordflow">if</span> (events.empty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> </div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="comment">// Compute y_spread.</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> <span class="keywordtype">double</span> average_d = 0.0;</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : events) {</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> average_d += <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.y_min + e.y_max);</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> }</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="sharded__optimization__utils_8cc.html#a2e50537b138c27e2e30e8d3a568fbee0">average</a> = average_d / 2.0 / <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(events.size());</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; e : events) {</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> e.y_spread = std::abs(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.y_max) - <a class="code hl_variable" href="sharded__optimization__utils_8cc.html#a2e50537b138c27e2e30e8d3a568fbee0">average</a>) +</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> std::abs(<a class="code hl_variable" href="sharded__optimization__utils_8cc.html#a2e50537b138c27e2e30e8d3a568fbee0">average</a> - <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aed77a1a7675c2f8568529a5a16247ec1">ToDouble</a>(e.y_min));</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> }</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4">GenerateEnergeticCuts</a>(cut_name, lp_values, events, IntegerValue(0),</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> <span class="comment">/*events_are_2d=*/</span><span class="keyword">true</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span>}</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> </div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a0c1099fcb640b53078dba0e5b9bcd2ce"> 649</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a0c1099fcb640b53078dba0e5b9bcd2ce">CreateNoOverlap2dEnergyCutGenerator</a>(</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; x_intervals,</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; y_intervals, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_intervals_repository.html">IntervalsRepository</a>* intervals_repository =</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_intervals_repository.html">IntervalsRepository</a>&gt;();</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_rectangles = x_intervals.size();</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> </div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> std::vector&lt;LinearExpression&gt; energies;</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> std::vector&lt;AffineExpression&gt; x_sizes;</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> std::vector&lt;AffineExpression&gt; y_sizes;</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_rectangles; ++i) {</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> x_sizes.push_back(intervals_repository-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_intervals_repository.html#aa57420b719d949fc4e8fec48c0c41dcc">Size</a>(x_intervals[i]));</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> y_sizes.push_back(intervals_repository-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_intervals_repository.html#aa57420b719d949fc4e8fec48c0c41dcc">Size</a>(y_intervals[i]));</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> }</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a47064139cec9b2ea520361ee30f0f243">LinearizeInnerProduct</a>(x_sizes, y_sizes, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;energies);</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> </div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* x_helper =</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(x_intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(x_helper);</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> </div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* y_helper =</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(y_intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(y_helper);</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> </div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> AddIntegerVariableFromIntervals(x_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> AddIntegerVariableFromIntervals(y_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> </div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* encoder = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>&gt;();</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> </div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> [integer_trail, trail, encoder, x_helper, y_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, energies](</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> </div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordflow">if</span> (!x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keywordflow">if</span> (!y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> </div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_rectangles = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>();</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> std::vector&lt;int&gt; active_rectangles;</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> std::vector&lt;Rectangle&gt; cached_rectangles(num_rectangles);</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> rect = 0; rect &lt; num_rectangles; ++rect) {</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keywordflow">if</span> (y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(rect) || y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a8e6fcd6ce93a128626dede9f9cc89348">IsAbsent</a>(rect)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="comment">// We do not consider rectangles controlled by 2 different unassigned</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <span class="comment">// enforcement literals.</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="keywordflow">if</span> (!x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect) &amp;&amp; !y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect) &amp;&amp;</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(rect) !=</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(rect)) {</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> }</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> </div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="comment">// TODO(user): It might be possible/better to use some shifted value</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="comment">// here, but for now this code is not in the hot spot, so better be</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> <span class="comment">// defensive and only do connected components on really disjoint</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="comment">// rectangles.</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_rectangle.html">Rectangle</a>&amp; rectangle = cached_rectangles[rect];</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a1f62ae069f3793df9ae18399ba6d052c">x_min</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a0cc9a3a200ee27bae9b9907d97b5718e">x_max</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a379a897decc0711464cb15e8d02fd095">y_min</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> </div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> active_rectangles.push_back(rect);</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> </div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <span class="keywordflow">if</span> (active_rectangles.size() &lt;= 1) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> </div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> std::vector&lt;absl::Span&lt;int&gt;&gt; components =</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a3e2516c0d3fc4991896c6a9bbead80e7">GetOverlappingRectangleComponents</a>(</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> cached_rectangles, absl::MakeSpan(active_rectangles));</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> </div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="comment">// Forward pass. No need to do a backward pass.</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <span class="keywordflow">for</span> (absl::Span&lt;int&gt; rectangles : components) {</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <span class="keywordflow">if</span> (rectangles.size() &lt;= 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> </div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4afe32e790c8bdda016751c64074547e">GenerateNoOverlap2dEnergyCut</a>(</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> energies, rectangles, <span class="stringliteral">&quot;NoOverlap2dXEnergy&quot;</span>, lp_values, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> integer_trail, encoder, manager, x_helper, y_helper);</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a4afe32e790c8bdda016751c64074547e">GenerateNoOverlap2dEnergyCut</a>(</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> energies, rectangles, <span class="stringliteral">&quot;NoOverlap2dYEnergy&quot;</span>, lp_values, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> integer_trail, encoder, manager, y_helper, x_helper);</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> }</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> </div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> };</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span>}</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> </div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a6b12eb18e7becd3da4eda60b61182f95"> 740</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a6b12eb18e7becd3da4eda60b61182f95">CreateCumulativeTimeTableCutGenerator</a>(</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt;&amp; demands, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> </div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> </div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">AppendVariablesToCumulativeCut</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, integer_trail, &amp;result);</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> </div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> </div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> <span class="keyword">struct </span>TimeTableEvent {</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="keywordtype">int</span> interval_index;</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> IntegerValue <a class="code hl_variable" href="resource_8cc.html#aee52de7b225665566aa47246b9d6b8fa">time</a>;</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <span class="keywordtype">bool</span> positive;</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>;</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> };</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> </div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> </div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> [helper, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, trail, integer_trail, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> std::vector&lt;TimeTableEvent&gt; events;</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <span class="comment">// Iterate through the intervals. If start_max &lt; end_min, the demand</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="comment">// is mandatory.</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++i) {</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="keywordflow">if</span> (helper-&gt;<a class="code hl_function" 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 id="l00776" name="l00776"></a><span class="lineno"> 776</span> </div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="keyword">const</span> IntegerValue <a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(i);</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="keyword">const</span> IntegerValue <a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(i);</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> </div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a> &gt;= <a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> </div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> TimeTableEvent e1;</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> e1.interval_index = i;</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> e1.time = <a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a>;</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> e1.demand = demands[i];</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> e1.positive = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> </div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> TimeTableEvent e2 = e1;</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> e2.time = <a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>;</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> e2.positive = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> events.push_back(e1);</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> events.push_back(e2);</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> }</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> </div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> <span class="comment">// Sort events by time.</span></div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="comment">// It is also important that all positive event with the same time as</span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="comment">// negative events appear after for the correctness of the algo below.</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> std::sort(events.begin(), events.end(),</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> [](<span class="keyword">const</span> TimeTableEvent&amp; i, <span class="keyword">const</span> TimeTableEvent&amp; j) {</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> if (i.time == j.time) {</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> if (i.positive == j.positive) {</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> return i.interval_index &lt; j.interval_index;</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> }</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> return !i.positive;</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> }</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> <span class="keywordflow">return</span> i.time &lt; j.time;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> });</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> </div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> std::vector&lt;TimeTableEvent&gt; cut_events;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> <span class="keywordtype">bool</span> added_positive_event = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> TimeTableEvent&amp; e : events) {</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> <span class="keywordflow">if</span> (e.positive) {</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> added_positive_event = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> cut_events.push_back(e);</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> }</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> <span class="keywordflow">if</span> (added_positive_event &amp;&amp; cut_events.size() &gt; 1) {</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="comment">// Create cut.</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> <span class="keywordtype">bool</span> cut_generated = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>,</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> IntegerValue(0));</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, IntegerValue(-1));</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> TimeTableEvent&amp; cut_event : cut_events) {</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="keywordflow">if</span> (helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(cut_event.interval_index)) {</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(cut_event.demand, IntegerValue(1));</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> cut_generated &amp;= cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a094a24aaf66d66b693e7e80a0222f040">AddLiteralTerm</a>(</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ac8a0cc4c1cca9aefa21788b096954f31">PresenceLiteral</a>(cut_event.interval_index),</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">LowerBound</a>(cut_event.demand));</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="keywordflow">if</span> (!cut_generated) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> }</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> }</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> <span class="keywordflow">if</span> (cut_generated) {</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> <span class="comment">// Violation of the cut is checked by AddCut so we don&#39;t check</span></div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> <span class="comment">// it here.</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> manager-&gt;AddCut(cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), <span class="stringliteral">&quot;CumulativeTimeTable&quot;</span>, lp_values);</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> }</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> }</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> <span class="comment">// Remove the event.</span></div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <span class="keywordtype">int</span> new_size = 0;</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; cut_events.size(); ++i) {</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <span class="keywordflow">if</span> (cut_events[i].interval_index == e.interval_index) {</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> }</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> cut_events[new_size] = cut_events[i];</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> new_size++;</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> }</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> cut_events.resize(new_size);</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> added_positive_event = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> }</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> };</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span>}</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> </div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span><span class="comment">// Cached Information about one interval.</span></div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html"> 857</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a> {</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8"> 858</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8">start_min</a>;</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a42030b641a6e87057b56a8bcce50d74d"> 859</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a42030b641a6e87057b56a8bcce50d74d">start_max</a>;</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890"> 860</a></span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">start</a>;</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a5370a7b26b844e14470a72da8356f542"> 861</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a5370a7b26b844e14470a72da8356f542">end_min</a>;</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#adf60ac80f206800313d477b023b6fcf0"> 862</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#adf60ac80f206800313d477b023b6fcf0">end_max</a>;</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac"> 863</a></span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">end</a>;</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_precedence_event.html#a766465a77b29d9d4c1401711b5e1083c"> 864</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a766465a77b29d9d4c1401711b5e1083c">demand_min</a>;</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span>};</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> </div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a11da691271c7e581ccc6383d8c25c666"> 867</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a11da691271c7e581ccc6383d8c25c666">GeneratePrecedenceCuts</a>(</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> std::vector&lt;PrecedenceEvent&gt; events, IntegerValue capacity_max,</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_events = events.size();</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <span class="keywordflow">if</span> (num_events &lt;= 1) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> </div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> std::sort(events.begin(), events.end(),</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> [](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a>&amp; e1, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a>&amp; e2) {</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> return e1.start_min &lt; e2.start_min ||</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> (e1.start_min == e2.start_min &amp;&amp; e1.end_max &lt; e2.end_max);</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> });</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> </div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> <span class="keyword">const</span> <span class="keywordtype">double</span> tolerance = 1e-4;</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> </div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i + 1 &lt; num_events; ++i) {</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a>&amp; e1 = events[i];</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = i + 1; j &lt; num_events; ++j) {</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a>&amp; e2 = events[j];</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> <span class="keywordflow">if</span> (e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8">start_min</a> &gt;= e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#adf60ac80f206800313d477b023b6fcf0">end_max</a>) <span class="keywordflow">break</span>; <span class="comment">// Break out of the index2 loop.</span></div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> </div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> <span class="comment">// Encode only the interesting pairs.</span></div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> <span class="keywordflow">if</span> (e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a766465a77b29d9d4c1401711b5e1083c">demand_min</a> + e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a766465a77b29d9d4c1401711b5e1083c">demand_min</a> &lt;= capacity_max) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> </div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> interval_1_can_precede_2 = e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a5370a7b26b844e14470a72da8356f542">end_min</a> &lt;= e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a42030b641a6e87057b56a8bcce50d74d">start_max</a>;</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> interval_2_can_precede_1 = e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a5370a7b26b844e14470a72da8356f542">end_min</a> &lt;= e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a42030b641a6e87057b56a8bcce50d74d">start_max</a>;</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> </div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keywordflow">if</span> (interval_1_can_precede_2 &amp;&amp; !interval_2_can_precede_1 &amp;&amp;</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">end</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) &gt;=</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">start</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) + tolerance) {</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> <span class="comment">// interval1.end &lt;= interval2.start</span></div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>, IntegerValue(0));</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">end</a>, IntegerValue(1));</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">start</a>, IntegerValue(-1));</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_2_can_precede_1 &amp;&amp; !interval_1_can_precede_2 &amp;&amp;</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">end</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) &gt;=</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">start</a>.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values) + tolerance) {</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> <span class="comment">// interval2.end &lt;= interval1.start</span></div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>, IntegerValue(0));</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(e2.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">end</a>, IntegerValue(1));</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(e1.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">start</a>, IntegerValue(-1));</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> manager-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html#a9456bb31790e4dae791914e3c065b460">AddCut</a>(cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), cut_name, lp_values);</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> }</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> }</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> }</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span>}</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> </div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#ac8570d5d120d42444fded60c841c6616"> 915</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ac8570d5d120d42444fded60c841c6616">CreateCumulativePrecedenceCutGenerator</a>(</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt;&amp; demands, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> </div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> </div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">AppendVariablesToCumulativeCut</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, integer_trail, &amp;result);</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> </div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> </div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> </div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> [trail, integer_trail, helper, demands, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> </div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> <span class="keyword">const</span> IntegerValue capacity_max = integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a8b6d5a25e6ad3d28a85b1924471e2cac">UpperBound</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> std::vector&lt;PrecedenceEvent&gt; events;</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++t) {</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(t)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a> event;</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8">start_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(t);</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> <span class="keyword">event</span>.start_max = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(t);</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <span class="keyword">event</span>.start = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a161f91b61d5719572a17dd10949a5de9">Starts</a>()[t];</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> <span class="keyword">event</span>.end_min = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(t);</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> <span class="keyword">event</span>.end_max = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(t);</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> <span class="keyword">event</span>.end = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#af6b67dbb2cdebc18af8a8660f7469aa9">Ends</a>()[t];</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <span class="keyword">event</span>.demand_min = integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">LowerBound</a>(demands[t]);</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> events.push_back(event);</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> }</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a11da691271c7e581ccc6383d8c25c666">GeneratePrecedenceCuts</a>(<span class="stringliteral">&quot;CumulativePrecedence&quot;</span>, lp_values,</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> std::move(events), capacity_max, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> };</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span>}</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> </div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a23849eabdcf8e9f6f90e7aa05b298dc9"> 960</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a23849eabdcf8e9f6f90e7aa05b298dc9">CreateNoOverlapPrecedenceCutGenerator</a>(</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> </div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> </div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> </div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> </div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> [trail, helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> </div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> std::vector&lt;PrecedenceEvent&gt; events;</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t = 0; t &lt; helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++t) {</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(t)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_precedence_event.html">PrecedenceEvent</a> event;</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8">start_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(t);</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> <span class="keyword">event</span>.start_max = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad8f69698386f241297b78589c1f57c3e">StartMax</a>(t);</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> <span class="keyword">event</span>.start = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a161f91b61d5719572a17dd10949a5de9">Starts</a>()[t];</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> <span class="keyword">event</span>.end_min = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a11b6d6eef1159c1801cfa033778f09db">EndMin</a>(t);</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> <span class="keyword">event</span>.end_max = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(t);</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> <span class="keyword">event</span>.end = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#af6b67dbb2cdebc18af8a8660f7469aa9">Ends</a>()[t];</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> <span class="keyword">event</span>.demand_min = IntegerValue(1);</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> events.push_back(event);</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> }</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a11da691271c7e581ccc6383d8c25c666">GeneratePrecedenceCuts</a>(<span class="stringliteral">&quot;NoOverlapPrecedence&quot;</span>, lp_values,</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> std::move(events), IntegerValue(1), <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> manager);</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> };</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> </div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span>}</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> </div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span><span class="comment">// Stores the event for a rectangle along the two axis x and y.</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment">// For a no_overlap constraint, y is always of size 1 between 0 and 1.</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span><span class="comment">// For a cumulative constraint, y is the demand that must be between 0 and</span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span><span class="comment">// capacity_max.</span></div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span><span class="comment">// For a no_overlap_2d constraint, y the other dimension of the rect.</span></div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html"> 1006</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a> {</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> <span class="comment">// The start min of the x interval.</span></div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af"> 1008</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a>;</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> </div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> <span class="comment">// The size min of the x interval.</span></div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2"> 1011</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">x_size_min</a>;</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> </div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> <span class="comment">// The end of the x interval.</span></div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#aafe035000b060515489304c1d769c1c8"> 1014</a></span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#aafe035000b060515489304c1d769c1c8">x_end</a>;</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> </div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> <span class="comment">// The lp value of the end of the x interval.</span></div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#abd3efe555c40cabd2d93bc58dc5d6f0f"> 1017</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#abd3efe555c40cabd2d93bc58dc5d6f0f">x_lp_end</a>;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> </div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> <span class="comment">// The start min of the y interval.</span></div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a5113c9bb6a8fa5f8213f4e3eeb93b5fb"> 1020</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a5113c9bb6a8fa5f8213f4e3eeb93b5fb">y_start_min</a>;</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> </div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> <span class="comment">// The end max of the y interval.</span></div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a8aa9f672169eb8bb479c7f3e98e7a334"> 1023</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a8aa9f672169eb8bb479c7f3e98e7a334">y_end_max</a>;</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> </div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> <span class="comment">// The min energy of the task (this is always larger or equal to x_size_min *</span></div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> <span class="comment">// y_size_min).</span></div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a4f71e6fc95b8de0290911759804601d4"> 1027</a></span> IntegerValue <a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a4f71e6fc95b8de0290911759804601d4">energy_min</a>;</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> <span class="comment">// Indicates if the events used the optional energy information from the</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="comment">// model.</span></div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a938bfef8e3fbad056a67e91392c95df8"> 1031</a></span> <span class="keywordtype">bool</span> use_energy = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> </div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> <span class="comment">// Indicates if the cut is lifted, that is if it includes tasks that are not</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <span class="comment">// strictly contained in the current time window.</span></div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a6382230ccc5d66808e87821bfcc3f6a4"> 1035</a></span> <span class="keywordtype">bool</span> lifted = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> </div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"><a class="line" href="structoperations__research_1_1sat_1_1_ct_event.html#a764be64f3029f8b8e23511061d8de355"> 1037</a></span> std::string <a class="code hl_function" href="structoperations__research_1_1sat_1_1_ct_event.html#a764be64f3029f8b8e23511061d8de355">DebugString</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <span class="keywordflow">return</span> absl::StrCat(<span class="stringliteral">&quot;CtEvent(x_end = &quot;</span>, x_end.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#ac3740684133a43f28203f0b85ed847b7">DebugString</a>(),</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> <span class="stringliteral">&quot;, x_start_min = &quot;</span>, x_start_min.value(),</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> <span class="stringliteral">&quot;, x_size_min = &quot;</span>, x_size_min.value(),</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> <span class="stringliteral">&quot;, x_lp_end = &quot;</span>, x_lp_end,</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> <span class="stringliteral">&quot;, y_start_min = &quot;</span>, y_start_min.value(),</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> <span class="stringliteral">&quot;, y_end_max = &quot;</span>, y_end_max.value(),</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> <span class="stringliteral">&quot;, energy_min = &quot;</span>, energy_min.value(),</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> <span class="stringliteral">&quot;, use_energy = &quot;</span>, use_energy, <span class="stringliteral">&quot;, lifted = &quot;</span>, lifted);</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> }</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span>};</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> </div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span><span class="comment">// We generate the cut from the Smith&#39;s rule from:</span></div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span><span class="comment">// M. Queyranne, Structure of a simple scheduling polyhedron,</span></div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span><span class="comment">// Mathematical Programming 58 (1993), 263285</span></div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span><span class="comment">//</span></div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span><span class="comment">// The original cut is:</span></div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span><span class="comment">// sum(end_min_i * duration_min_i) &gt;=</span></div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span><span class="comment">// (sum(duration_min_i^2) + sum(duration_min_i)^2) / 2</span></div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span><span class="comment">// We strenghten this cuts by noticing that if all tasks starts after S,</span></div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span><span class="comment">// then replacing end_min_i by (end_min_i - S) is still valid.</span></div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span><span class="comment">//</span></div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span><span class="comment">// A second difference is that we look at a set of intervals starting</span></div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span><span class="comment">// after a given start_min, sorted by relative (end_lp - start_min).</span></div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635"> 1061</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635">GenerateCompletionTimeCuts</a>(</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> std::vector&lt;CtEvent&gt; events, <span class="keywordtype">bool</span> use_lifting, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_top_n_cuts.html">TopNCuts</a> top_n_cuts(15);</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> </div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="comment">// Sort by start min to bucketize by start_min.</span></div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> std::sort(events.begin(), events.end(),</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> [](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; e1, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; e2) {</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> return e1.x_start_min &lt; e2.x_start_min;</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> });</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a> = 0; <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a> + 1 &lt; events.size(); ++<a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>) {</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="comment">// Skip to the next start_min value.</span></div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a> &gt; 0 &amp;&amp;</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> events[<a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>].x_start_min == events[<a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a> - 1].x_start_min) {</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> }</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> </div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> <span class="keyword">const</span> IntegerValue sequence_start_min = events[<a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>].x_start_min;</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> std::vector&lt;CtEvent&gt; residual_tasks(events.begin() + <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>, events.end());</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> </div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="comment">// We look at event that start before sequence_start_min, but are forced</span></div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> <span class="comment">// to cross this time point. In that case, we replace this event by a</span></div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> <span class="comment">// truncated event starting at sequence_start_min. To do this, we reduce</span></div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="comment">// the size_min, align the start_min with the sequence_start_min, and</span></div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> <span class="comment">// scale the energy down accordingly.</span></div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">if</span> (use_lifting) {</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> before = 0; before &lt; <a class="code hl_variable" href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a>; ++before) {</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keywordflow">if</span> (events[before].x_start_min + events[before].x_size_min &gt;</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> sequence_start_min) {</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> <span class="comment">// Build the vector of energies as the vector of sizes.</span></div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a> <span class="keyword">event</span> = events[before]; <span class="comment">// Copy.</span></div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a6382230ccc5d66808e87821bfcc3f6a4">lifted</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="keyword">const</span> IntegerValue old_size_min = <span class="keyword">event</span>.x_size_min;</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> <span class="keyword">event</span>.x_size_min =</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keyword">event</span>.x_size_min + <span class="keyword">event</span>.x_start_min - sequence_start_min;</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> <span class="keyword">event</span>.x_start_min = sequence_start_min;</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="comment">// We can rescale the energy min correctly.</span></div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">//</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="comment">// Let&#39;s take the example of a rectangle of size 2 * 20 that overlaps</span></div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> <span class="comment">// sequence start min by 1, and that can rotate by 90 degrees.</span></div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> <span class="comment">// The energy min is 40, size min is 2, size_max is 20.</span></div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> <span class="comment">// If the rectangle is horizontal, the lifted energy is:</span></div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> <span class="comment">// (20 - 1) * 2 = 38</span></div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> <span class="comment">// If the rectangle is vertical, the lifted energy is:</span></div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> <span class="comment">// (2 - 1) * 20 = 20</span></div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> <span class="comment">// The min of the two is always reached when size = size_min.</span></div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> <span class="keyword">event</span>.energy_min = <span class="keyword">event</span>.energy_min * <span class="keyword">event</span>.x_size_min / old_size_min;</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> residual_tasks.push_back(event);</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> }</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> }</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> }</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> </div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> std::sort(residual_tasks.begin(), residual_tasks.end(),</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> [](<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; e1, <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; e2) {</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> return e1.x_lp_end &lt; e2.x_lp_end;</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> });</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> </div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> <span class="keywordtype">int</span> best_end = -1;</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <span class="keywordtype">double</span> best_efficacy = 0.01;</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> IntegerValue best_min_contrib(0);</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> IntegerValue sum_duration(0);</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> IntegerValue sum_square_duration(0);</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> IntegerValue best_size_divisor(0);</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keywordtype">double</span> unscaled_lp_contrib = 0;</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> IntegerValue current_start_min(<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>);</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> IntegerValue y_start_min = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> IntegerValue y_end_max = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; residual_tasks.size(); ++i) {</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; <span class="keyword">event</span> = residual_tasks[i];</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(event.x_start_min, sequence_start_min);</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> <span class="keyword">const</span> IntegerValue <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a> = <span class="keyword">event</span>.energy_min;</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> sum_duration += <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a>;</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> sum_square_duration += <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a> * <a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a>;</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> unscaled_lp_contrib += <span class="keyword">event</span>.x_lp_end * <a class="code hl_function" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(<a class="code hl_variable" href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a>);</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> current_start_min = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(current_start_min, event.x_start_min);</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> y_start_min = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(y_start_min, event.y_start_min);</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> y_end_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(y_end_max, event.y_end_max);</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> </div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> <span class="keyword">const</span> IntegerValue size_divisor = y_end_max - y_start_min;</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> </div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> <span class="comment">// We compute the cuts with all the sizes actually equal to</span></div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> <span class="comment">// size_min * demand_min / size_divisor</span></div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="comment">// but to keep the computation in the integer domain, we multiply by</span></div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> <span class="comment">// size_divisor where needed instead.</span></div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> <span class="keyword">const</span> IntegerValue min_contrib =</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> (sum_duration * sum_duration + sum_square_duration) / 2 +</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> current_start_min * sum_duration * size_divisor;</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> <span class="keyword">const</span> <span class="keywordtype">double</span> efficacy = (<a class="code hl_function" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(min_contrib) -</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> unscaled_lp_contrib * <a class="code hl_function" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(size_divisor)) /</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> std::sqrt(<a class="code hl_function" href="namespaceoperations__research_1_1glop.html#afd6d278f9d061a91716c6770f2d723e8">ToDouble</a>(sum_square_duration));</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> <span class="comment">// TODO(user): Check overflow and ignore if too big.</span></div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> <span class="keywordflow">if</span> (efficacy &gt; best_efficacy) {</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> best_efficacy = efficacy;</div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> best_end = i;</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> best_min_contrib = min_contrib;</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> best_size_divisor = size_divisor;</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> }</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> }</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> <span class="keywordflow">if</span> (best_end != -1) {</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html">LinearConstraintBuilder</a> cut(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, best_min_contrib, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>);</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="keywordtype">bool</span> is_lifted = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> <span class="keywordtype">bool</span> use_energy = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt;= best_end; ++i) {</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a>&amp; <span class="keyword">event</span> = residual_tasks[i];</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> is_lifted |= <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a6382230ccc5d66808e87821bfcc3f6a4">lifted</a>;</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> use_energy |= <span class="keyword">event</span>.use_energy;</div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#ad65ddc0d04d71006a9ebe3b9dcfe2ce6">AddTerm</a>(event.x_end, event.energy_min * best_size_divisor);</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> }</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> std::string full_name = cut_name;</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> <span class="keywordflow">if</span> (is_lifted) full_name.append(<span class="stringliteral">&quot;_lifted&quot;</span>);</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> <span class="keywordflow">if</span> (use_energy) full_name.append(<span class="stringliteral">&quot;_energy&quot;</span>);</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> top_n_cuts.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_top_n_cuts.html#a713bdb803c52b7b7ac3c52ba9b869530">AddCut</a>(cut.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a8ef32d79f50eb45bb9305c8b436cf6c4">Build</a>(), full_name, lp_values);</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> }</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> }</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> top_n_cuts.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_top_n_cuts.html#afb0f85e921e0f240d59d2a739e6b5712">TransferToManager</a>(lp_values, manager);</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span>}</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> </div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a18fe82932180e2e3bac0fbdf957f01a0"> 1181</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a18fe82932180e2e3bac0fbdf957f01a0">CreateNoOverlapCompletionTimeCutGenerator</a>(</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> </div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> </div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> </div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> </div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> [trail, helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> </div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> <span class="keyword">auto</span> generate_cuts = [&amp;lp_values, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager,</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> helper](<span class="keyword">const</span> std::string&amp; cut_name) {</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> std::vector&lt;CtEvent&gt; events;</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> &lt; helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>(); ++<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> <span class="keyword">const</span> IntegerValue size_min = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <span class="keywordflow">if</span> (size_min &gt; 0) {</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> end_expr = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#af6b67dbb2cdebc18af8a8660f7469aa9">Ends</a>()[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a> event;</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> <span class="keyword">event</span>.x_size_min = size_min;</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> <span class="keyword">event</span>.x_end = end_expr;</div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> <span class="keyword">event</span>.x_lp_end = end_expr.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values);</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> <span class="keyword">event</span>.y_start_min = IntegerValue(0);</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> <span class="keyword">event</span>.y_end_max = IntegerValue(1);</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> <span class="keyword">event</span>.energy_min = size_min;</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> events.push_back(event);</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> }</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> }</div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635">GenerateCompletionTimeCuts</a>(cut_name, lp_values, std::move(events),</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> <span class="comment">/*use_lifting=*/</span><span class="keyword">false</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> };</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> generate_cuts(<span class="stringliteral">&quot;NoOverlapCompletionTime&quot;</span>);</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> <span class="keywordflow">if</span> (!helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> generate_cuts(<span class="stringliteral">&quot;NoOverlapCompletionTimeMirror&quot;</span>);</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> };</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span>}</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> </div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#aac7919596b8f8087a558d3d4d6430d00"> 1231</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aac7919596b8f8087a558d3d4d6430d00">CreateCumulativeCompletionTimeCutGenerator</a>(</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; intervals,</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a>&amp; <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> <span class="keyword">const</span> std::vector&lt;AffineExpression&gt;&amp; demands,</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> <span class="keyword">const</span> std::vector&lt;LinearExpression&gt;&amp; energies, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> </div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* helper =</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(helper);</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> </div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>&gt;();</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">AppendVariablesToCumulativeCut</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, demands, integer_trail, &amp;result);</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> </div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> AddIntegerVariableFromIntervals(helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> </div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> </div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> [trail, integer_trail, helper, demands, energies, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> </div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> <span class="keyword">const</span> IntegerValue capacity_max = integer_trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a8b6d5a25e6ad3d28a85b1924471e2cac">UpperBound</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> <span class="keyword">auto</span> generate_cuts = [&amp;lp_values, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager, helper, capacity_max,</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> integer_trail, &amp;demands,</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> &amp;energies](<span class="keyword">const</span> std::string&amp; cut_name) {</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> std::vector&lt;CtEvent&gt; events;</div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> &lt; helper-&gt;NumTasks(); ++<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> <span class="keywordflow">if</span> (!helper-&gt;IsPresent(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> <span class="keywordflow">if</span> (helper-&gt;SizeMin(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) &gt; 0 &amp;&amp;</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> integer_trail-&gt;LowerBound(demands[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]) &gt; 0) {</div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> end_expr = helper-&gt;Ends()[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> <span class="keyword">const</span> IntegerValue size_min = helper-&gt;SizeMin(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <span class="keyword">const</span> IntegerValue demand_min =</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> integer_trail-&gt;LowerBound(demands[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]);</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> </div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a> event;</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = helper-&gt;StartMin(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="keyword">event</span>.x_size_min = size_min;</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> <span class="keyword">event</span>.x_end = end_expr;</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> <span class="keyword">event</span>.x_lp_end = end_expr.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values);</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> <span class="keyword">event</span>.y_start_min = IntegerValue(0);</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> <span class="keyword">event</span>.y_end_max = IntegerValue(capacity_max);</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> <span class="keyword">event</span>.energy_min = size_min * demand_min;</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> <span class="comment">// TODO(user): Investigate and re-enable a correct version.</span></div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> <span class="keywordflow">if</span> (<span class="comment">/*DISABLES_CODE*/</span> (<span class="keyword">false</span>) &amp;&amp;</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a88c8ab90d500702234707905c3b07ad2">ProductIsLinearized</a>(energies[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>])) {</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> <span class="keyword">const</span> IntegerValue linearized_energy =</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a14ed349a41e2b31bb1c15ea3c44a6bc0">LinExprLowerBound</a>(energies[<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], *integer_trail);</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> <span class="keywordflow">if</span> (linearized_energy &gt; event.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#a4f71e6fc95b8de0290911759804601d4">energy_min</a>) {</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> <span class="keyword">event</span>.energy_min = linearized_energy;</div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> <span class="keyword">event</span>.use_energy = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> }</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> }</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> events.push_back(event);</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> }</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> }</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635">GenerateCompletionTimeCuts</a>(cut_name, lp_values, std::move(events),</div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> <span class="comment">/*use_lifting=*/</span><span class="keyword">true</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> };</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> <span class="keywordflow">if</span> (!helper-&gt;SynchronizeAndSetTimeDirection(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> generate_cuts(<span class="stringliteral">&quot;CumulativeCompletionTime&quot;</span>);</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> <span class="keywordflow">if</span> (!helper-&gt;SynchronizeAndSetTimeDirection(<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> generate_cuts(<span class="stringliteral">&quot;CumulativeCompletionTimeMirror&quot;</span>);</div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> };</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span>}</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> </div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a7bd8a488b0a7ee7905bdab4c5984bd70"> 1303</a></span><a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7bd8a488b0a7ee7905bdab4c5984bd70">CreateNoOverlap2dCompletionTimeCutGenerator</a>(</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; x_intervals,</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> <span class="keyword">const</span> std::vector&lt;IntervalVariable&gt;&amp; y_intervals, <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_cut_generator.html">CutGenerator</a> result;</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> </div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* x_helper =</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(x_intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(x_helper);</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> </div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* y_helper =</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> <span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>(y_intervals, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;TakeOwnership(y_helper);</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> </div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> AddIntegerVariableFromIntervals(x_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> AddIntegerVariableFromIntervals(y_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, &amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> <a class="code hl_function" href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a>(&amp;result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a73e4094f2d4e2adbe5e8d79a5b61fcd1">vars</a>);</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> </div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>* trail = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-&gt;GetOrCreate&lt;<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>&gt;();</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> </div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> result.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">generate_cuts</a> =</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> [trail, x_helper, y_helper, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> <span class="keyword">const</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector&lt;IntegerVariable, double&gt;</a>&amp; lp_values,</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_linear_constraint_manager.html">LinearConstraintManager</a>* manager) {</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> <span class="keywordflow">if</span> (trail-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> </div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> <span class="keywordflow">if</span> (!x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> <span class="keywordflow">if</span> (!y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> </div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_rectangles = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ad9b4a962b743e358f3a7c4b2279f99c8">NumTasks</a>();</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> std::vector&lt;int&gt; active_rectangles;</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> std::vector&lt;IntegerValue&gt; cached_areas(num_rectangles);</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> std::vector&lt;Rectangle&gt; cached_rectangles(num_rectangles);</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> rect = 0; rect &lt; num_rectangles; ++rect) {</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> <span class="keywordflow">if</span> (!y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect) || !y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a58ca51a90e49e887146f760ba5eb6520">IsPresent</a>(rect))</div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> </div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> cached_areas[rect] =</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(rect) * y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(rect);</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> <span class="keywordflow">if</span> (cached_areas[rect] == 0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> </div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span> <span class="comment">// TODO(user): It might be possible/better to use some shifted value</span></div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> <span class="comment">// here, but for now this code is not in the hot spot, so better be</span></div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> <span class="comment">// defensive and only do connected components on really disjoint</span></div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> <span class="comment">// rectangles.</span></div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_rectangle.html">Rectangle</a>&amp; rectangle = cached_rectangles[rect];</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a1f62ae069f3793df9ae18399ba6d052c">x_min</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a0cc9a3a200ee27bae9b9907d97b5718e">x_max</a> = x_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#a379a897decc0711464cb15e8d02fd095">y_min</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#ab3a2a28d08246d8f3432caa1a27811b8">StartMin</a>(rect);</div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> rectangle.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_rectangle.html#ae39303b5b3149e1914834c36ad51fe8f">y_max</a> = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a9125ec8126e6035eacce8a5eb52b45c5">EndMax</a>(rect);</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> </div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span> active_rectangles.push_back(rect);</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span> }</div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> </div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span> <span class="keywordflow">if</span> (active_rectangles.size() &lt;= 1) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span> </div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span> std::vector&lt;absl::Span&lt;int&gt;&gt; components =</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a3e2516c0d3fc4991896c6a9bbead80e7">GetOverlappingRectangleComponents</a>(</div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span> cached_rectangles, absl::MakeSpan(active_rectangles));</div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span> <span class="keywordflow">for</span> (absl::Span&lt;int&gt; rectangles : components) {</div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span> <span class="keywordflow">if</span> (rectangles.size() &lt;= 1) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> </div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> <span class="keyword">auto</span> generate_cuts = [&amp;lp_values, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager, &amp;rectangles,</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span> &amp;cached_areas](</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> <span class="keyword">const</span> std::string&amp; cut_name,</div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* x_helper,</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html">SchedulingConstraintHelper</a>* y_helper) {</div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> std::vector&lt;CtEvent&gt; events;</div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> </div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> rect : rectangles) {</div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_affine_expression.html">AffineExpression</a> x_end_expr = x_helper-&gt;Ends()[rect];</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> <a class="code hl_struct" href="structoperations__research_1_1sat_1_1_ct_event.html">CtEvent</a> event;</div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> <span class="keyword">event</span>.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af">x_start_min</a> = x_helper-&gt;ShiftedStartMin(rect);</div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span> <span class="keyword">event</span>.x_size_min = x_helper-&gt;SizeMin(rect);</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> <span class="keyword">event</span>.x_end = x_end_expr;</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> <span class="keyword">event</span>.x_lp_end = x_end_expr.<a class="code hl_function" href="structoperations__research_1_1sat_1_1_affine_expression.html#aa9c149604bc3f558e14c6d233ebc4b19">LpValue</a>(lp_values);</div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> <span class="keyword">event</span>.y_start_min = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a0d7780af676ab4fd1c57e62da9e03686">ShiftedStartMin</a>(rect);</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> <span class="keyword">event</span>.y_end_max = y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a5caf109ec436f43088925c00bb64794b">ShiftedEndMax</a>(rect);</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span> <span class="keyword">event</span>.energy_min =</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> x_helper-&gt;SizeMin(rect) * y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afdbd968230d01fa0e91bc15b6f5994e3">SizeMin</a>(rect);</div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span> events.push_back(event);</div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span> }</div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span> </div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635">GenerateCompletionTimeCuts</a>(cut_name, lp_values, std::move(events),</div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span> <span class="comment">/*use_lifting=*/</span><span class="keyword">true</span>, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, manager);</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span> };</div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span> </div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span> <span class="keywordflow">if</span> (!x_helper-&gt;SynchronizeAndSetTimeDirection(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span> <span class="keywordflow">if</span> (!y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span> generate_cuts(<span class="stringliteral">&quot;NoOverlap2dXCompletionTime&quot;</span>, x_helper, y_helper);</div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span> generate_cuts(<span class="stringliteral">&quot;NoOverlap2dYCompletionTime&quot;</span>, y_helper, x_helper);</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span> <span class="keywordflow">if</span> (!x_helper-&gt;SynchronizeAndSetTimeDirection(<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span> <span class="keywordflow">if</span> (!y_helper-&gt;<a class="code hl_function" href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">SynchronizeAndSetTimeDirection</a>(<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span> generate_cuts(<span class="stringliteral">&quot;NoOverlap2dXCompletionTimeMirror&quot;</span>, x_helper, y_helper);</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span> generate_cuts(<span class="stringliteral">&quot;NoOverlap2dYCompletionTimeMirror&quot;</span>, y_helper, x_helper);</div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span> }</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span> };</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span>}</div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span> </div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span>} <span class="comment">// namespace sat</span></div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span>} <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"><div class="ttname"><a href="base_2logging_8h.html">logging.h</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#l00892">base/logging.h:892</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#l00895">base/logging.h:895</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ab4f56aa24c4c9cddc47a6abd2d747f9a"><div class="ttname"><a href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a></div><div class="ttdeci">#define DCHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00896">base/logging.h:896</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#l00890">base/logging.h:890</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_1sat_1_1_capacity_profile_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_capacity_profile.html">operations_research::sat::CapacityProfile</a></div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00170">diffn_util.h:170</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_capacity_profile_html_a3131bcd0083f6de781499abfa46de79c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_capacity_profile.html#a3131bcd0083f6de781499abfa46de79c">operations_research::sat::CapacityProfile::AddRectangle</a></div><div class="ttdeci">void AddRectangle(IntegerValue x_min, IntegerValue x_max, IntegerValue y_min, IntegerValue y_max)</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8cc_source.html#l00495">diffn_util.cc:495</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_capacity_profile_html_aa71d36872f416feaa853788a7a7a7ef8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_capacity_profile.html#aa71d36872f416feaa853788a7a7a7ef8">operations_research::sat::CapacityProfile::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8cc_source.html#l00490">diffn_util.cc:490</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_capacity_profile_html_aea102560f0670a0432eca120b9089663"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_capacity_profile.html#aea102560f0670a0432eca120b9089663">operations_research::sat::CapacityProfile::GetBoundingArea</a></div><div class="ttdeci">IntegerValue GetBoundingArea()</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8cc_source.html#l00562">diffn_util.cc:562</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#l00362">integer.h:362</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#l00620">integer.h:620</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_a523501d854b2ca8034d37c15e7c89117"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#a523501d854b2ca8034d37c15e7c89117">operations_research::sat::IntegerTrail::IsFixed</a></div><div class="ttdeci">bool IsFixed(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01453">integer.h:1453</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_a8b6d5a25e6ad3d28a85b1924471e2cac"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#a8b6d5a25e6ad3d28a85b1924471e2cac">operations_research::sat::IntegerTrail::UpperBound</a></div><div class="ttdeci">IntegerValue UpperBound(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01449">integer.h:1449</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_ab857cd2aead68952d9fe92a8ad8d3ac9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">operations_research::sat::IntegerTrail::LowerBound</a></div><div class="ttdeci">IntegerValue LowerBound(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01445">integer.h:1445</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_intervals_repository_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_intervals_repository.html">operations_research::sat::IntervalsRepository</a></div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00050">intervals.h:50</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_intervals_repository_html_aa57420b719d949fc4e8fec48c0c41dcc"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_intervals_repository.html#aa57420b719d949fc4e8fec48c0c41dcc">operations_research::sat::IntervalsRepository::Size</a></div><div class="ttdeci">AffineExpression Size(IntervalVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00097">intervals.h:97</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#l00161">sat/linear_constraint.h:161</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="linear__constraint_8cc_source.html#l00104">linear_constraint.cc:104</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a49e8e4a987d39f4da335e1ed287bb8ad"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a49e8e4a987d39f4da335e1ed287bb8ad">operations_research::sat::LinearConstraintBuilder::AddLinearExpression</a></div><div class="ttdeci">void AddLinearExpression(const LinearExpression &amp;expr)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8cc_source.html#l00065">linear_constraint.cc:65</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a7e251202babf951363efedbd30af45c5"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a7e251202babf951363efedbd30af45c5">operations_research::sat::LinearConstraintBuilder::AddQuadraticLowerBound</a></div><div class="ttdeci">void AddQuadraticLowerBound(AffineExpression left, AffineExpression right, IntegerTrail *integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8cc_source.html#l00083">linear_constraint.cc:83</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="linear__constraint_8cc_source.html#l00133">linear_constraint.cc:133</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_linear_constraint_builder_html_a96ececaa94026aaa3a46fb65df0a17a9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_linear_constraint_builder.html#a96ececaa94026aaa3a46fb65df0a17a9">operations_research::sat::LinearConstraintBuilder::BuildExpression</a></div><div class="ttdeci">LinearExpression BuildExpression()</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8cc_source.html#l00146">linear_constraint.cc:146</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="linear__constraint_8cc_source.html#l00039">linear_constraint.cc:39</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#l00050">linear_constraint_manager.h:50</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#l00224">linear_constraint_manager.cc:224</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#l00067">sat_base.h:67</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a4a11c7c4d7706c09de5e18707c3b5c62"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">operations_research::sat::Literal::Index</a></div><div class="ttdeci">LiteralIndex Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00087">sat_base.h:87</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#l00042">sat/model.h:42</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#l00176">intervals.h:177</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a0d7780af676ab4fd1c57e62da9e03686"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a0d7780af676ab4fd1c57e62da9e03686">operations_research::sat::SchedulingConstraintHelper::ShiftedStartMin</a></div><div class="ttdeci">IntegerValue ShiftedStartMin(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00253">intervals.h:253</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#l00235">intervals.h:235</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a161f91b61d5719572a17dd10949a5de9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a161f91b61d5719572a17dd10949a5de9">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#l00339">intervals.h:339</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#l00481">intervals.h:481</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a5caf109ec436f43088925c00bb64794b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a5caf109ec436f43088925c00bb64794b">operations_research::sat::SchedulingConstraintHelper::ShiftedEndMax</a></div><div class="ttdeci">IntegerValue ShiftedEndMax(int t) const</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8h_source.html#l00259">intervals.h:259</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_a7ead258b894235518c2ba922e3fa7606"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#a7ead258b894235518c2ba922e3fa7606">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#l00341">intervals.h:341</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#l00486">intervals.h:486</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#l00237">intervals.h:237</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_aa6ddfc5f8a8220c6e08fbe7568b41fcd"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#aa6ddfc5f8a8220c6e08fbe7568b41fcd">operations_research::sat::SchedulingConstraintHelper::SynchronizeAndSetTimeDirection</a></div><div class="ttdeci">ABSL_MUST_USE_RESULT bool SynchronizeAndSetTimeDirection(bool is_forward)</div><div class="ttdef"><b>Definition:</b> <a href="intervals_8cc_source.html#l00307">intervals.cc:307</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#l00234">intervals.h:234</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#l00342">intervals.h:342</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#l00236">intervals.h:236</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#l00207">intervals.h:207</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_af6b67dbb2cdebc18af8a8660f7469aa9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#af6b67dbb2cdebc18af8a8660f7469aa9">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#l00340">intervals.h:340</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_scheduling_constraint_helper_html_afa1aca9725da8adf5c56ea08e7636c32"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_scheduling_constraint_helper.html#afa1aca9725da8adf5c56ea08e7636c32">operations_research::sat::SchedulingConstraintHelper::SizeMax</a></div><div class="ttdeci">IntegerValue SizeMax(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_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#l00229">intervals.h:229</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#l00301">linear_constraint_manager.h:301</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#l00729">linear_constraint_manager.cc:729</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#l00740">linear_constraint_manager.cc:740</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#l00236">sat_base.h:236</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#l00358">sat_base.h:358</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="acuts_8h_html"><div class="ttname"><a href="cuts_8h.html">cuts.h</a></div></div>
<div class="ttc" id="adiffn__util_8h_html"><div class="ttname"><a href="diffn__util_8h.html">diffn_util.h</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#l00274">gurobi_interface.cc:274</a></div></div>
<div class="ttc" id="aimplied__bounds_8h_html"><div class="ttname"><a href="implied__bounds_8h.html">implied_bounds.h</a></div></div>
<div class="ttc" id="ainteger_8h_html"><div class="ttname"><a href="integer_8h.html">integer.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="alinear__constraint__manager_8h_html"><div class="ttname"><a href="linear__constraint__manager_8h.html">linear_constraint_manager.h</a></div></div>
<div class="ttc" id="alocal__search_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="local__search_8cc_source.html#l02750">local_search.cc:2750</a></div></div>
<div class="ttc" id="anamespacegtl_html_a288a1dc92da5d3ad62d4bc4cec9e8b1d"><div class="ttname"><a href="namespacegtl.html#a288a1dc92da5d3ad62d4bc4cec9e8b1d">gtl::STLSortAndRemoveDuplicates</a></div><div class="ttdeci">void STLSortAndRemoveDuplicates(T *v, const LessFunc &amp;less_func)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00058">stl_util.h:58</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_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_1math__opt_html_a5de89a1f6e3f80a49a0d76136d8044e2"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">operations_research::math_opt::swap</a></div><div class="ttdeci">void swap(IdMap&lt; K, V &gt; &amp;a, IdMap&lt; K, V &gt; &amp;b)</div><div class="ttdef"><b>Definition:</b> <a href="id__map_8h_source.html#l00262">id_map.h:262</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a04d3913888ed0b200c1d1fa879c62804"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a04d3913888ed0b200c1d1fa879c62804">operations_research::sat::CreateCumulativeEnergyCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCumulativeEnergyCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const AffineExpression &amp;capacity, const std::vector&lt; AffineExpression &gt; &amp;demands, const std::vector&lt; LinearExpression &gt; &amp;energies, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00463">scheduling_cuts.cc:463</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a050c9f843d5f82c4cf6e958a4062e5a7"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a050c9f843d5f82c4cf6e958a4062e5a7">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#l01640">integer.h:1640</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0c1099fcb640b53078dba0e5b9bcd2ce"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0c1099fcb640b53078dba0e5b9bcd2ce">operations_research::sat::CreateNoOverlap2dEnergyCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlap2dEnergyCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;x_intervals, const std::vector&lt; IntervalVariable &gt; &amp;y_intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00649">scheduling_cuts.cc:649</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a11da691271c7e581ccc6383d8c25c666"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a11da691271c7e581ccc6383d8c25c666">operations_research::sat::GeneratePrecedenceCuts</a></div><div class="ttdeci">void GeneratePrecedenceCuts(const std::string &amp;cut_name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, std::vector&lt; PrecedenceEvent &gt; events, IntegerValue capacity_max, Model *model, LinearConstraintManager *manager)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00867">scheduling_cuts.cc:867</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_a14ed349a41e2b31bb1c15ea3c44a6bc0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a14ed349a41e2b31bb1c15ea3c44a6bc0">operations_research::sat::LinExprLowerBound</a></div><div class="ttdeci">IntegerValue LinExprLowerBound(const LinearExpression &amp;expr, const IntegerTrail &amp;integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="linear__constraint_8cc_source.html#l00363">linear_constraint.cc:363</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a18fe82932180e2e3bac0fbdf957f01a0"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a18fe82932180e2e3bac0fbdf957f01a0">operations_research::sat::CreateNoOverlapCompletionTimeCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlapCompletionTimeCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01181">scheduling_cuts.cc:1181</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="scheduling__cuts_8cc_source.html#l00960">scheduling_cuts.cc:960</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_a3e2516c0d3fc4991896c6a9bbead80e7"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a3e2516c0d3fc4991896c6a9bbead80e7">operations_research::sat::GetOverlappingRectangleComponents</a></div><div class="ttdeci">std::vector&lt; absl::Span&lt; int &gt; &gt; GetOverlappingRectangleComponents(const std::vector&lt; Rectangle &gt; &amp;rectangles, absl::Span&lt; int &gt; active_rectangles)</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8cc_source.html#l00040">diffn_util.cc:40</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a47064139cec9b2ea520361ee30f0f243"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a47064139cec9b2ea520361ee30f0f243">operations_research::sat::LinearizeInnerProduct</a></div><div class="ttdeci">void LinearizeInnerProduct(const std::vector&lt; AffineExpression &gt; &amp;left, const std::vector&lt; AffineExpression &gt; &amp;right, Model *model, std::vector&lt; LinearExpression &gt; *energies)</div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8cc_source.html#l00461">implied_bounds.cc:461</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4afe32e790c8bdda016751c64074547e"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4afe32e790c8bdda016751c64074547e">operations_research::sat::GenerateNoOverlap2dEnergyCut</a></div><div class="ttdeci">void GenerateNoOverlap2dEnergyCut(const std::vector&lt; LinearExpression &gt; &amp;energies, absl::Span&lt; int &gt; rectangles, const std::string &amp;cut_name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, Model *model, IntegerTrail *integer_trail, IntegerEncoder *encoder, LinearConstraintManager *manager, SchedulingConstraintHelper *x_helper, SchedulingConstraintHelper *y_helper)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00592">scheduling_cuts.cc:592</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5316808a2d5007c3b489e844801385e5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">operations_research::sat::kMinIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue.value())</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_a64dd4ef1984ac7dd7fdb25c7b2765554"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a64dd4ef1984ac7dd7fdb25c7b2765554">operations_research::sat::AppendVariablesToCumulativeCut</a></div><div class="ttdeci">void AppendVariablesToCumulativeCut(const AffineExpression &amp;capacity, const std::vector&lt; AffineExpression &gt; &amp;demands, IntegerTrail *integer_trail, CutGenerator *result)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00427">scheduling_cuts.cc:427</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a6ac647beb0b07619b73b2808adddbe3f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a6ac647beb0b07619b73b2808adddbe3f">operations_research::sat::ComputeEnergyLp</a></div><div class="ttdeci">double ComputeEnergyLp(const EnergyEvent &amp;e, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, IntegerTrail *integer_trail)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00441">scheduling_cuts.cc:441</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a6b12eb18e7becd3da4eda60b61182f95"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a6b12eb18e7becd3da4eda60b61182f95">operations_research::sat::CreateCumulativeTimeTableCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCumulativeTimeTableCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const AffineExpression &amp;capacity, const std::vector&lt; AffineExpression &gt; &amp;demands, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00740">scheduling_cuts.cc:740</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7181fb054123974741e1ead27c6cf635"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7181fb054123974741e1ead27c6cf635">operations_research::sat::GenerateCompletionTimeCuts</a></div><div class="ttdeci">void GenerateCompletionTimeCuts(const std::string &amp;cut_name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, std::vector&lt; CtEvent &gt; events, bool use_lifting, Model *model, LinearConstraintManager *manager)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01061">scheduling_cuts.cc:1061</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7bd8a488b0a7ee7905bdab4c5984bd70"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7bd8a488b0a7ee7905bdab4c5984bd70">operations_research::sat::CreateNoOverlap2dCompletionTimeCutGenerator</a></div><div class="ttdeci">CutGenerator CreateNoOverlap2dCompletionTimeCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;x_intervals, const std::vector&lt; IntervalVariable &gt; &amp;y_intervals, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01303">scheduling_cuts.cc:1303</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a88c8ab90d500702234707905c3b07ad2"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a88c8ab90d500702234707905c3b07ad2">operations_research::sat::ProductIsLinearized</a></div><div class="ttdeci">bool ProductIsLinearized(const LinearExpression &amp;expr)</div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8cc_source.html#l00456">implied_bounds.cc:456</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa11012c3867461cc2038e7919fe9bad4"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa11012c3867461cc2038e7919fe9bad4">operations_research::sat::GenerateEnergeticCuts</a></div><div class="ttdeci">void GenerateEnergeticCuts(const std::string &amp;cut_name, const absl::StrongVector&lt; IntegerVariable, double &gt; &amp;lp_values, std::vector&lt; EnergyEvent &gt; events, const AffineExpression capacity, bool events_are_2d, Model *model, LinearConstraintManager *manager)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00154">scheduling_cuts.cc:154</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aac7919596b8f8087a558d3d4d6430d00"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aac7919596b8f8087a558d3d4d6430d00">operations_research::sat::CreateCumulativeCompletionTimeCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCumulativeCompletionTimeCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const AffineExpression &amp;capacity, const std::vector&lt; AffineExpression &gt; &amp;demands, const std::vector&lt; LinearExpression &gt; &amp;energies, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01231">scheduling_cuts.cc:1231</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="scheduling__cuts_8cc_source.html#l00528">scheduling_cuts.cc:528</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac8570d5d120d42444fded60c841c6616"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac8570d5d120d42444fded60c841c6616">operations_research::sat::CreateCumulativePrecedenceCutGenerator</a></div><div class="ttdeci">CutGenerator CreateCumulativePrecedenceCutGenerator(const std::vector&lt; IntervalVariable &gt; &amp;intervals, const AffineExpression &amp;capacity, const std::vector&lt; AffineExpression &gt; &amp;demands, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00915">scheduling_cuts.cc:915</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#l00077">integer.h:77</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="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_a4a6149ef5bdc681a998b90bb5c165bf3"><div class="ttname"><a href="resource_8cc.html#a4a6149ef5bdc681a998b90bb5c165bf3">energy</a></div><div class="ttdeci">int64_t energy</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00354">resource.cc:354</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#l01693">resource.cc:1693</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_2model_8h_html"><div class="ttname"><a href="sat_2model_8h.html">model.h</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_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="ascheduling__cuts_8h_html"><div class="ttname"><a href="scheduling__cuts_8h.html">scheduling_cuts.h</a></div></div>
<div class="ttc" id="asharded__optimization__utils_8cc_html_a2e50537b138c27e2e30e8d3a568fbee0"><div class="ttname"><a href="sharded__optimization__utils_8cc.html#a2e50537b138c27e2e30e8d3a568fbee0">average</a></div><div class="ttdeci">double average</div><div class="ttdef"><b>Definition:</b> <a href="sharded__optimization__utils_8cc_source.html#l00101">sharded_optimization_utils.cc:101</a></div></div>
<div class="ttc" id="asparse__submatrix_8cc_html_a4d53eac2ef2732c28fa9fb663e0c19a7"><div class="ttname"><a href="sparse__submatrix_8cc.html#a4d53eac2ef2732c28fa9fb663e0c19a7">end</a></div><div class="ttdeci">std::optional&lt; int64_t &gt; end</div><div class="ttdef"><b>Definition:</b> <a href="sparse__submatrix_8cc_source.html#l00036">sparse_submatrix.cc:36</a></div></div>
<div class="ttc" id="asparse__submatrix_8cc_html_a9b7656b922ea4ec96097d7380c0e61fe"><div class="ttname"><a href="sparse__submatrix_8cc.html#a9b7656b922ea4ec96097d7380c0e61fe">start</a></div><div class="ttdeci">int64_t start</div><div class="ttdef"><b>Definition:</b> <a href="sparse__submatrix_8cc_source.html#l00035">sparse_submatrix.cc:35</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__integers_8h_html"><div class="ttname"><a href="strong__integers_8h.html">strong_integers.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#l00233">integer.h:233</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#l00278">integer.h:278</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_affine_expression_html_ac3740684133a43f28203f0b85ed847b7"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_affine_expression.html#ac3740684133a43f28203f0b85ed847b7">operations_research::sat::AffineExpression::DebugString</a></div><div class="ttdeci">const std::string DebugString() const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00284">integer.h:284</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html">operations_research::sat::CtEvent</a></div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01006">scheduling_cuts.cc:1006</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_a4f71e6fc95b8de0290911759804601d4"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#a4f71e6fc95b8de0290911759804601d4">operations_research::sat::CtEvent::energy_min</a></div><div class="ttdeci">IntegerValue energy_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01027">scheduling_cuts.cc:1027</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_a5113c9bb6a8fa5f8213f4e3eeb93b5fb"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#a5113c9bb6a8fa5f8213f4e3eeb93b5fb">operations_research::sat::CtEvent::y_start_min</a></div><div class="ttdeci">IntegerValue y_start_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01020">scheduling_cuts.cc:1020</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_a6382230ccc5d66808e87821bfcc3f6a4"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#a6382230ccc5d66808e87821bfcc3f6a4">operations_research::sat::CtEvent::lifted</a></div><div class="ttdeci">bool lifted</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01035">scheduling_cuts.cc:1035</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_a764be64f3029f8b8e23511061d8de355"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#a764be64f3029f8b8e23511061d8de355">operations_research::sat::CtEvent::DebugString</a></div><div class="ttdeci">std::string DebugString() const</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01037">scheduling_cuts.cc:1037</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_a8aa9f672169eb8bb479c7f3e98e7a334"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#a8aa9f672169eb8bb479c7f3e98e7a334">operations_research::sat::CtEvent::y_end_max</a></div><div class="ttdeci">IntegerValue y_end_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01023">scheduling_cuts.cc:1023</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_aae5633dcc6f196817cf87ff999faa6af"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#aae5633dcc6f196817cf87ff999faa6af">operations_research::sat::CtEvent::x_start_min</a></div><div class="ttdeci">IntegerValue x_start_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01008">scheduling_cuts.cc:1008</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_aafe035000b060515489304c1d769c1c8"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#aafe035000b060515489304c1d769c1c8">operations_research::sat::CtEvent::x_end</a></div><div class="ttdeci">AffineExpression x_end</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01014">scheduling_cuts.cc:1014</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_ab8949d991a8939f5e7f84b1bdebcd7f2"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">operations_research::sat::CtEvent::x_size_min</a></div><div class="ttdeci">IntegerValue x_size_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01011">scheduling_cuts.cc:1011</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_ct_event_html_abd3efe555c40cabd2d93bc58dc5d6f0f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_ct_event.html#abd3efe555c40cabd2d93bc58dc5d6f0f">operations_research::sat::CtEvent::x_lp_end</a></div><div class="ttdeci">double x_lp_end</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l01017">scheduling_cuts.cc:1017</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#l00047">cuts.h:47</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#l00048">cuts.h:48</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_cut_generator_html_a79779673f2fe909d104c37f3b7cc5a48"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_cut_generator.html#a79779673f2fe909d104c37f3b7cc5a48">operations_research::sat::CutGenerator::generate_cuts</a></div><div class="ttdeci">std::function&lt; bool(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#l00052">cuts.h:52</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html">operations_research::sat::EnergyEvent</a></div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00099">scheduling_cuts.cc:99</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a0dd6e2baf0ea9a1cbd252bed5a8890da"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a0dd6e2baf0ea9a1cbd252bed5a8890da">operations_research::sat::EnergyEvent::x_end_min</a></div><div class="ttdeci">IntegerValue x_end_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00102">scheduling_cuts.cc:102</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a227a649685aa74d3dbf82f5ff410f782"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a227a649685aa74d3dbf82f5ff410f782">operations_research::sat::EnergyEvent::y_size</a></div><div class="ttdeci">AffineExpression y_size</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00107">scheduling_cuts.cc:107</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a318e14075dca909780636f1eb7435ea2"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a318e14075dca909780636f1eb7435ea2">operations_research::sat::EnergyEvent::presence_literal_index</a></div><div class="ttdeci">LiteralIndex presence_literal_index</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00111">scheduling_cuts.cc:111</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a379a897decc0711464cb15e8d02fd095"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a379a897decc0711464cb15e8d02fd095">operations_research::sat::EnergyEvent::y_min</a></div><div class="ttdeci">IntegerValue y_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00105">scheduling_cuts.cc:105</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a419daefa95b40282f25dcff95c1f40e8"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a419daefa95b40282f25dcff95c1f40e8">operations_research::sat::EnergyEvent::energy</a></div><div class="ttdeci">std::optional&lt; LinearExpression &gt; energy</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00110">scheduling_cuts.cc:110</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a4807e6da5062c463e7f6c8cabe7d63c5"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a4807e6da5062c463e7f6c8cabe7d63c5">operations_research::sat::EnergyEvent::x_end_max</a></div><div class="ttdeci">IntegerValue x_end_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00103">scheduling_cuts.cc:103</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a764be64f3029f8b8e23511061d8de355"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a764be64f3029f8b8e23511061d8de355">operations_research::sat::EnergyEvent::DebugString</a></div><div class="ttdeci">std::string DebugString() const</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00137">scheduling_cuts.cc:137</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a7feaa770019816070e3fcafcc0883e95"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a7feaa770019816070e3fcafcc0883e95">operations_research::sat::EnergyEvent::x_size</a></div><div class="ttdeci">AffineExpression x_size</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00104">scheduling_cuts.cc:104</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a83f79d0fb389d59356fe4b7a7440d55a"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a83f79d0fb389d59356fe4b7a7440d55a">operations_research::sat::EnergyEvent::energy_lp</a></div><div class="ttdeci">double energy_lp</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00118">scheduling_cuts.cc:118</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_a90037a849f93aa8dddc93f0e19868d24"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#a90037a849f93aa8dddc93f0e19868d24">operations_research::sat::EnergyEvent::IsPresent</a></div><div class="ttdeci">bool IsPresent() const</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00127">scheduling_cuts.cc:127</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_aa277e1f549852cd6f0324b278be5f552"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#aa277e1f549852cd6f0324b278be5f552">operations_research::sat::EnergyEvent::y_spread</a></div><div class="ttdeci">double y_spread</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00121">scheduling_cuts.cc:121</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_aae5633dcc6f196817cf87ff999faa6af"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#aae5633dcc6f196817cf87ff999faa6af">operations_research::sat::EnergyEvent::x_start_min</a></div><div class="ttdeci">IntegerValue x_start_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00100">scheduling_cuts.cc:100</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_ab8949d991a8939f5e7f84b1bdebcd7f2"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#ab8949d991a8939f5e7f84b1bdebcd7f2">operations_research::sat::EnergyEvent::x_size_min</a></div><div class="ttdeci">IntegerValue x_size_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00115">scheduling_cuts.cc:115</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_ac33aa2de38f159fcf7838830159d6c86"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#ac33aa2de38f159fcf7838830159d6c86">operations_research::sat::EnergyEvent::x_start_max</a></div><div class="ttdeci">IntegerValue x_start_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00101">scheduling_cuts.cc:101</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_acffeeeb7712a014c78029cb130da23da"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#acffeeeb7712a014c78029cb130da23da">operations_research::sat::EnergyEvent::y_size_min</a></div><div class="ttdeci">IntegerValue y_size_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00116">scheduling_cuts.cc:116</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_ae39303b5b3149e1914834c36ad51fe8f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#ae39303b5b3149e1914834c36ad51fe8f">operations_research::sat::EnergyEvent::y_max</a></div><div class="ttdeci">IntegerValue y_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00106">scheduling_cuts.cc:106</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_ae9f7ab26b97268f5c53db090ce188428"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#ae9f7ab26b97268f5c53db090ce188428">operations_research::sat::EnergyEvent::GetMinOverlap</a></div><div class="ttdeci">IntegerValue GetMinOverlap(IntegerValue start, IntegerValue end) const</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00131">scheduling_cuts.cc:131</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_energy_event_html_af8dee2e03e9b51a9149bad32c7ed4958"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_energy_event.html#af8dee2e03e9b51a9149bad32c7ed4958">operations_research::sat::EnergyEvent::literal_lp</a></div><div class="ttdeci">double literal_lp</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00117">scheduling_cuts.cc:117</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#l00096">sat/linear_constraint.h:96</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html">operations_research::sat::PrecedenceEvent</a></div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00857">scheduling_cuts.cc:857</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a42030b641a6e87057b56a8bcce50d74d"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a42030b641a6e87057b56a8bcce50d74d">operations_research::sat::PrecedenceEvent::start_max</a></div><div class="ttdeci">IntegerValue start_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00859">scheduling_cuts.cc:859</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a44f4c48334f8c6331c4529a8d3a24890"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a44f4c48334f8c6331c4529a8d3a24890">operations_research::sat::PrecedenceEvent::start</a></div><div class="ttdeci">AffineExpression start</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00860">scheduling_cuts.cc:860</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a5370a7b26b844e14470a72da8356f542"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a5370a7b26b844e14470a72da8356f542">operations_research::sat::PrecedenceEvent::end_min</a></div><div class="ttdeci">IntegerValue end_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00861">scheduling_cuts.cc:861</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a766465a77b29d9d4c1401711b5e1083c"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a766465a77b29d9d4c1401711b5e1083c">operations_research::sat::PrecedenceEvent::demand_min</a></div><div class="ttdeci">IntegerValue demand_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00864">scheduling_cuts.cc:864</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a79a74bd07a8525e729a55c74f7edf5a8"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a79a74bd07a8525e729a55c74f7edf5a8">operations_research::sat::PrecedenceEvent::start_min</a></div><div class="ttdeci">IntegerValue start_min</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00858">scheduling_cuts.cc:858</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_a7c9fbb0345c1acfa72199617f10038ac"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#a7c9fbb0345c1acfa72199617f10038ac">operations_research::sat::PrecedenceEvent::end</a></div><div class="ttdeci">AffineExpression end</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00863">scheduling_cuts.cc:863</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_precedence_event_html_adf60ac80f206800313d477b023b6fcf0"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_precedence_event.html#adf60ac80f206800313d477b023b6fcf0">operations_research::sat::PrecedenceEvent::end_max</a></div><div class="ttdeci">IntegerValue end_max</div><div class="ttdef"><b>Definition:</b> <a href="scheduling__cuts_8cc_source.html#l00862">scheduling_cuts.cc:862</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rectangle_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rectangle.html">operations_research::sat::Rectangle</a></div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00036">diffn_util.h:36</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rectangle_html_a0cc9a3a200ee27bae9b9907d97b5718e"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rectangle.html#a0cc9a3a200ee27bae9b9907d97b5718e">operations_research::sat::Rectangle::x_max</a></div><div class="ttdeci">IntegerValue x_max</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00038">diffn_util.h:38</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rectangle_html_a1f62ae069f3793df9ae18399ba6d052c"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rectangle.html#a1f62ae069f3793df9ae18399ba6d052c">operations_research::sat::Rectangle::x_min</a></div><div class="ttdeci">IntegerValue x_min</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00037">diffn_util.h:37</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rectangle_html_a379a897decc0711464cb15e8d02fd095"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rectangle.html#a379a897decc0711464cb15e8d02fd095">operations_research::sat::Rectangle::y_min</a></div><div class="ttdeci">IntegerValue y_min</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00039">diffn_util.h:39</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_rectangle_html_ae39303b5b3149e1914834c36ad51fe8f"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_rectangle.html#ae39303b5b3149e1914834c36ad51fe8f">operations_research::sat::Rectangle::y_max</a></div><div class="ttdeci">IntegerValue y_max</div><div class="ttdef"><b>Definition:</b> <a href="diffn__util_8h_source.html#l00040">diffn_util.h:40</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="scheduling__cuts_8cc.html">scheduling_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.3 </li>
</ul>
</div>
</body>
</html>