Files
ortools-clone/docs/cpp/bop__lns_8cc_source.html
Mizux Seiha 687bdd636a docs: update
2020-12-29 22:27:47 +01:00

786 lines
147 KiB
HTML

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.20"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: bop_lns.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">8.1</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.20 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('bop__lns_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">bop_lns.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="bop__lns_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2010-2018 Google LLC</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// limitations under the License.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="bop__lns_8h.html">ortools/bop/bop_lns.h</a>&quot;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;deque&gt;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;absl/memory/memory.h&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;google/protobuf/text_format.h&quot;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cleanup_8h.html">ortools/base/cleanup.h</a>&quot;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="commandlineflags_8h.html">ortools/base/commandlineflags.h</a>&quot;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="lp__solver_8h.html">ortools/glop/lp_solver.h</a>&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="lp__print__utils_8h.html">ortools/lp_data/lp_print_utils.h</a>&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="boolean__problem_8h.html">ortools/sat/boolean_problem.h</a>&quot;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat_2lp__utils_8h.html">ortools/sat/lp_utils.h</a>&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat__solver_8h.html">ortools/sat/sat_solver.h</a>&quot;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="bitset_8h.html">ortools/util/bitset.h</a>&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword">namespace </span>bop {</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;using ::operations_research::glop::ColIndex;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<a class="code" href="namespaceoperations__research_1_1glop.html#a4dc8ae0f97c4110f3cc770715b2bbd12">using ::operations_research::glop::DenseRow</a>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;using ::operations_research::glop::LinearProgram;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;using ::operations_research::glop::LPSolver;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;using ::operations_research::sat::LinearBooleanConstraint;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;using ::operations_research::sat::LinearBooleanProblem;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">// BopCompleteLNSOptimizer</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="keywordtype">void</span> UseBopSolutionForSatAssignmentPreference(<span class="keyword">const</span> BopSolution&amp; solution,</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; sat::SatSolver* solver) {</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; solution.Size(); ++i) {</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; solver-&gt;SetAssignmentPreference(</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; sat::Literal(sat::BooleanVariable(i), solution.Value(VariableIndex(i))),</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; 1.0);</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;}</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#a36297fc10df6b1b5effa82aeb9021766"> 57</a></span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#a36297fc10df6b1b5effa82aeb9021766">BopCompleteLNSOptimizer::BopCompleteLNSOptimizer</a>(</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">const</span> std::string&amp; <a class="code" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, <span class="keyword">const</span> <a class="code" href="classabsl_1_1_strong_vector.html">BopConstraintTerms</a>&amp; objective_terms)</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; : <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html">BopOptimizerBase</a>(<a class="code" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>),</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; state_update_stamp_(<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html">ProblemState</a>::kInitialStampValue),</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; objective_terms_(objective_terms) {}</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#ae69a6901e444016287dcad9930ea500e"> 63</a></span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#ae69a6901e444016287dcad9930ea500e">BopCompleteLNSOptimizer::~BopCompleteLNSOptimizer</a>() {}</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">BopOptimizerBase::Status</a> BopCompleteLNSOptimizer::SynchronizeIfNeeded(</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html">ProblemState</a>&amp; problem_state, <span class="keywordtype">int</span> num_relaxed_vars) {</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">if</span> (state_update_stamp_ == problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#a05fdb14439563d77a1ce890279a7c762">update_stamp</a>()) {</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>;</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; }</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; state_update_stamp_ = problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#a05fdb14439563d77a1ce890279a7c762">update_stamp</a>();</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; </div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="comment">// Load the current problem to the solver.</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; sat_solver_ = absl::make_unique&lt;sat::SatSolver&gt;();</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">BopOptimizerBase::Status</a> status =</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <a class="code" href="namespaceoperations__research_1_1bop.html#a2c3c1538ecc101963e5c92ff9bfb33bb">LoadStateProblemToSatSolver</a>(problem_state, sat_solver_.get());</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keywordflow">if</span> (status != <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>) <span class="keywordflow">return</span> status;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// Add the constraint that forces the solver to look for a solution</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// at a distance &lt;= num_relaxed_vars from the current one. Note that not all</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// the terms appear in this constraint.</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="comment">// TODO(user): if the current solution didn&#39;t change, there is no need to</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">// re-run this optimizer if we already proved UNSAT.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; std::vector&lt;sat::LiteralWithCoeff&gt; cst;</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">for</span> (BopConstraintTerm term : objective_terms_) {</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">if</span> (problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>().<a class="code" href="classoperations__research_1_1bop_1_1_bop_solution.html#a6cd00223d6f5614e7a88064c55fd6080">Value</a>(term.var_id) &amp;&amp; term.weight &lt; 0) {</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; cst.push_back(<a class="code" href="structoperations__research_1_1sat_1_1_literal_with_coeff.html">sat::LiteralWithCoeff</a>(</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a>(sat::BooleanVariable(term.var_id.value()), <span class="keyword">false</span>), 1.0));</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>().<a class="code" href="classoperations__research_1_1bop_1_1_bop_solution.html#a6cd00223d6f5614e7a88064c55fd6080">Value</a>(term.var_id) &amp;&amp;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; term.weight &gt; 0) {</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; cst.push_back(sat::LiteralWithCoeff(</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; sat::Literal(sat::BooleanVariable(term.var_id.value()), <span class="keyword">true</span>), 1.0));</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; }</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; }</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; sat_solver_-&gt;AddLinearConstraint(</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="comment">/*use_lower_bound=*/</span><span class="keyword">false</span>, sat::Coefficient(0),</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">/*use_upper_bound=*/</span><span class="keyword">true</span>, sat::Coefficient(num_relaxed_vars), &amp;cst);</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">if</span> (sat_solver_-&gt;IsModelUnsat()) <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba781ad2788df9e25c59a70894c7832096">BopOptimizerBase::ABORT</a>;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="comment">// It sounds like a good idea to force the solver to find a similar solution</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">// from the current one. On another side, this is already somewhat enforced by</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">// the constraint above, so it will need more investigation.</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; UseBopSolutionForSatAssignmentPreference(problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>(),</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; sat_solver_.get());</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;}</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="keywordtype">bool</span> BopCompleteLNSOptimizer::ShouldBeRun(</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">const</span> ProblemState&amp; problem_state)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">return</span> problem_state.solution().IsFeasible();</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;}</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">BopOptimizerBase::Status</a> BopCompleteLNSOptimizer::Optimize(</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">const</span> BopParameters&amp; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keyword">const</span> ProblemState&amp; problem_state,</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; LearnedInfo* learned_info, TimeLimit* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>) {</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <a class="code" href="stats_8h.html#a9995704aaaf45fc21e08c847551a8d04">SCOPED_TIME_STAT</a>(&amp;<a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a7c6fc06ca542eed0ff0b6ed4b1ecbcda">stats_</a>);</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(learned_info != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a> != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; learned_info-&gt;Clear();</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; </div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">BopOptimizerBase::Status</a> sync_status =</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; SynchronizeIfNeeded(problem_state, <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.num_relaxed_vars());</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (sync_status != <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>) {</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">return</span> sync_status;</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; }</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(sat_solver_ != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> initial_dt = sat_solver_-&gt;deterministic_time();</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">auto</span> advance_dt = <a class="code" href="namespaceabsl.html#a9bfb260a67150f0bc1da17aac9199866">::absl::MakeCleanup</a>([initial_dt, <span class="keyword">this</span>, &amp;<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>]() {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(sat_solver_-&gt;deterministic_time() -</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; initial_dt);</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; });</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// Set the parameters for this run.</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// TODO(user): Because of this, we actually loose the perfect continuity</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="comment">// between runs, and the restart policy is resetted... Fix this.</span></div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; sat::SatParameters sat_params;</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; sat_params.set_max_number_of_conflicts(</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.max_number_of_conflicts_in_random_lns());</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; sat_params.set_max_time_in_seconds(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetTimeLeft());</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; sat_params.set_max_deterministic_time(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetDeterministicTimeLeft());</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; sat_params.set_random_seed(<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.random_seed());</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; sat_solver_-&gt;SetParameters(sat_params);</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">sat::SatSolver::Status</a> sat_status = sat_solver_-&gt;Solve();</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">if</span> (sat_status == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">sat::SatSolver::FEASIBLE</a>) {</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <a class="code" href="namespaceoperations__research_1_1bop.html#a49c2b7c159260e338438fc2e167a0c3d">SatAssignmentToBopSolution</a>(sat_solver_-&gt;Assignment(),</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; &amp;learned_info-&gt;solution);</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba22ebbfba03095f407fb90f5a363a384b">BopOptimizerBase::SOLUTION_FOUND</a>;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span> (sat_status == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed">sat::SatSolver::LIMIT_REACHED</a>) {</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; </div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// Because of the &quot;LNS&quot; constraint, we can&#39;t deduce anything about the problem</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// in this case.</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba781ad2788df9e25c59a70894c7832096">BopOptimizerBase::ABORT</a>;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;}</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment">// BopAdaptiveLNSOptimizer</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;<span class="comment">// Returns false if the limit is reached while solving the LP.</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;<span class="keywordtype">bool</span> UseLinearRelaxationForSatAssignmentPreference(</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keyword">const</span> BopParameters&amp; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; sat::SatSolver* sat_solver, TimeLimit* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>) {</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="comment">// TODO(user): Re-use the lp_model and lp_solver or build a model with only</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="comment">// needed constraints and variables.</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; glop::LinearProgram lp_model;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a4591e100a0f29a249169e5833995cd31">sat::ConvertBooleanProblemToLinearProgram</a>(problem, &amp;lp_model);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// Set bounds of variables fixed by the sat_solver.</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keyword">const</span> sat::Trail&amp; propagation_trail = sat_solver-&gt;LiteralTrail();</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> trail_index = 0; trail_index &lt; propagation_trail.Index();</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; ++trail_index) {</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">const</span> sat::Literal fixed_literal = propagation_trail[trail_index];</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceoperations__research_1_1glop.html#a733947145e3e1631165b618b05c9ccb7">glop::Fractional</a> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = fixed_literal.IsPositive() ? 1.0 : 0.0;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; lp_model.SetVariableBounds(ColIndex(fixed_literal.Variable().value()),</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>, <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; }</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; glop::LPSolver lp_solver;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; NestedTimeLimit nested_time_limit(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>, <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetTimeLeft(),</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.lp_max_deterministic_time());</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceoperations__research_1_1glop.html#ae8a885303349cb7807c7c87b405bc0c9">glop::ProblemStatus</a> lp_status =</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; lp_solver.SolveWithTimeLimit(lp_model, nested_time_limit.GetTimeLimit());</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">if</span> (lp_status != <a class="code" href="namespaceoperations__research_1_1glop.html#ae8a885303349cb7807c7c87b405bc0c9af00c8dbdd6e1f11bdae06be94277d293">glop::ProblemStatus::OPTIMAL</a> &amp;&amp;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; lp_status != glop::ProblemStatus::PRIMAL_FEASIBLE &amp;&amp;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; lp_status != <a class="code" href="namespaceoperations__research_1_1glop.html#ae8a885303349cb7807c7c87b405bc0c9af00c8dbdd6e1f11bdae06be94277d293">glop::ProblemStatus::IMPRECISE</a>) {</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// We have no useful information from the LP, we will abort this LNS.</span></div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; </div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="comment">// Set preferences based on the solution of the relaxation.</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">for</span> (ColIndex <a class="code" href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a>(0); <a class="code" href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a> &lt; lp_solver.variable_values().size(); ++<a class="code" href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a>) {</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> = lp_solver.variable_values()[<a class="code" href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a>];</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; sat_solver-&gt;SetAssignmentPreference(</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; sat::Literal(sat::BooleanVariable(<a class="code" href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a>.value()), round(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>) == 1),</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; 1 - fabs(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a> - round(<a class="code" href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a>)));</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; }</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;}</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="comment">// Note(user): We prefer to start with a really low difficulty as this works</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="comment">// better for large problem, and for small ones, it will be really quickly</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="comment">// increased anyway. Maybe a better appproach is to start by relaxing something</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="comment">// like 10 variables instead of having a fixed percentage.</span></div>
<div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a29f0d547269428a823f377a0aa2dd017"> 213</a></span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a29f0d547269428a823f377a0aa2dd017">BopAdaptiveLNSOptimizer::BopAdaptiveLNSOptimizer</a>(</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keyword">const</span> std::string&amp; <a class="code" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, <span class="keywordtype">bool</span> use_lp_to_guide_sat,</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="classoperations__research_1_1bop_1_1_neighborhood_generator.html">NeighborhoodGenerator</a>* neighborhood_generator,</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">sat::SatSolver</a>* sat_propagator)</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; : <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html">BopOptimizerBase</a>(<a class="code" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>),</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; use_lp_to_guide_sat_(use_lp_to_guide_sat),</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; neighborhood_generator_(neighborhood_generator),</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; sat_propagator_(sat_propagator),</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; adaptive_difficulty_(0.001) {</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(sat_propagator != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;}</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; </div>
<div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a24a6853a329f77a909de7c6ab7815f83"> 225</a></span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a24a6853a329f77a909de7c6ab7815f83">BopAdaptiveLNSOptimizer::~BopAdaptiveLNSOptimizer</a>() {}</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="keywordtype">bool</span> BopAdaptiveLNSOptimizer::ShouldBeRun(</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html">ProblemState</a>&amp; problem_state)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">return</span> problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>().<a class="code" href="classoperations__research_1_1bop_1_1_bop_solution.html#a894d87c5fddfc463c3ca3c779ba7f997">IsFeasible</a>();</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;}</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; </div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">BopOptimizerBase::Status</a> BopAdaptiveLNSOptimizer::Optimize(</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">const</span> BopParameters&amp; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keyword">const</span> ProblemState&amp; problem_state,</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; LearnedInfo* learned_info, <a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>* <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>) {</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <a class="code" href="stats_8h.html#a9995704aaaf45fc21e08c847551a8d04">SCOPED_TIME_STAT</a>(&amp;<a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a7c6fc06ca542eed0ff0b6ed4b1ecbcda">stats_</a>);</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(learned_info != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a> != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; learned_info-&gt;Clear();</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; </div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="comment">// Set-up a sat_propagator_ cleanup task to catch all the exit cases.</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> initial_dt = sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ae525d235b02bcfc962d845e28f5f0125">deterministic_time</a>();</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keyword">auto</span> sat_propagator_cleanup =</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <a class="code" href="namespaceabsl.html#a9bfb260a67150f0bc1da17aac9199866">::absl::MakeCleanup</a>([initial_dt, <span class="keyword">this</span>, &amp;learned_info, &amp;<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>]() {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">if</span> (!sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) {</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; sat_propagator_-&gt;SetAssumptionLevel(0);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; sat_propagator_-&gt;RestoreSolverToAssumptionLevel();</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; ExtractLearnedInfoFromSatSolver(sat_propagator_, learned_info);</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ae525d235b02bcfc962d845e28f5f0125">deterministic_time</a>() - initial_dt);</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; });</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; </div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="comment">// For the SAT conflicts limit of each LNS, we follow a luby sequence times</span></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="comment">// the base number of conflicts (num_conflicts_). Note that the numbers of the</span></div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="comment">// Luby sequence are always power of two.</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">// We dynamically change the size of the neighborhood depending on the</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// difficulty of the problem. There is one &quot;target&quot; difficulty for each</span></div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// different numbers in the Luby sequence. Note that the initial value is</span></div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="comment">// reused from the last run.</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">const</span> BopParameters&amp; local_parameters = <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordtype">int</span> num_tries = 0; <span class="comment">// TODO(user): remove? our limit is 1 by default.</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">while</span> (!<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;LimitReached() &amp;&amp;</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; num_tries &lt; local_parameters.num_random_lns_tries()) {</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// Compute the target problem difficulty and generate the neighborhood.</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#ac489923becd8061981981afc56893c07">UpdateLuby</a>();</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> difficulty = adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8143f86c8f0eab1ef9ba889d201439d8">GetParameterValue</a>();</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; neighborhood_generator_-&gt;GenerateNeighborhood(problem_state, difficulty,</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; sat_propagator_);</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; ++num_tries;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; num_tries &lt;&lt; <span class="stringliteral">&quot; difficulty:&quot;</span> &lt;&lt; difficulty</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; &lt;&lt; <span class="stringliteral">&quot; luby:&quot;</span> &lt;&lt; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#aaa20269bbaf1cc513e2bae1decb7de0a">luby_value</a>()</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; &lt;&lt; <span class="stringliteral">&quot; fixed:&quot;</span> &lt;&lt; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>() &lt;&lt; <span class="stringliteral">&quot;/&quot;</span></div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; &lt;&lt; problem_state.original_problem().num_variables();</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Special case if the difficulty is too high.</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keywordflow">if</span> (!sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) {</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">if</span> (sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() == 0) {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;Nothing fixed!&quot;</span>;</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#abb82bc89291c5c3ab40e5117b8a2e8ef">DecreaseParameter</a>();</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; }</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; }</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; </div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="comment">// Since everything is already set-up, we try the sat_propagator_ with</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="comment">// a really low conflict limit. This allow to quickly skip over UNSAT</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// cases without the costly new problem setup.</span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">if</span> (!sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) {</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; sat::SatParameters params;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; params.set_max_number_of_conflicts(</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; local_parameters.max_number_of_conflicts_for_quick_check());</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; params.set_max_time_in_seconds(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetTimeLeft());</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; params.set_max_deterministic_time(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetDeterministicTimeLeft());</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; params.set_random_seed(<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.random_seed());</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d584b84d7b882a6017b072b33475172">SetParameters</a>(params);</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>());</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; </div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">sat::SatSolver::Status</a> status = sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a2b006481369eb4f4cb7f3037dfdd8404">Solve</a>();</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordflow">if</span> (status == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">sat::SatSolver::FEASIBLE</a>) {</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">IncreaseParameter</a>();</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <a class="code" href="namespaceoperations__research_1_1bop.html#a49c2b7c159260e338438fc2e167a0c3d">SatAssignmentToBopSolution</a>(sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">Assignment</a>(),</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; &amp;learned_info-&gt;solution);</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba22ebbfba03095f407fb90f5a363a384b">BopOptimizerBase::SOLUTION_FOUND</a>;</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae5ba802809eb747ea486ca3fae32a885">sat::SatSolver::ASSUMPTIONS_UNSAT</a>) {</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="comment">// Local problem is infeasible.</span></div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">IncreaseParameter</a>();</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; }</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; }</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; </div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// Restore to the assumption level.</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="comment">// This is call is important since all the fixed variable in the</span></div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="comment">// propagator_ will be used to construct the local problem below.</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="comment">// Note that calling RestoreSolverToAssumptionLevel() might actually prove</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="comment">// the infeasibility. It is important to check the UNSAT status afterward.</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keywordflow">if</span> (!sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) {</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">RestoreSolverToAssumptionLevel</a>();</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; }</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; </div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="comment">// Check if the problem is proved UNSAT, by previous the search or the</span></div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="comment">// RestoreSolverToAssumptionLevel() call above.</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">if</span> (sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) {</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keywordflow">return</span> problem_state.solution().IsFeasible()</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; ? <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae276c6d6c33441e7bc41f349a9ba39e2">BopOptimizerBase::OPTIMAL_SOLUTION_FOUND</a></div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; : <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">BopOptimizerBase::INFEASIBLE</a>;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; }</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; </div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Construct and Solve the LNS subproblem.</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="comment">// Note that we don&#39;t use the sat_propagator_ all the way because using a</span></div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="comment">// clean solver on a really small problem is usually a lot faster (even we</span></div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">// the time to create the subproblem) that running a long solve under</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="comment">// assumption (like we did above with a really low conflit limit).</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> conflict_limit =</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#aaa20269bbaf1cc513e2bae1decb7de0a">luby_value</a>() *</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.max_number_of_conflicts_in_random_lns();</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; sat::SatParameters params;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; params.set_max_number_of_conflicts(conflict_limit);</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; params.set_max_time_in_seconds(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetTimeLeft());</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; params.set_max_deterministic_time(<a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;GetDeterministicTimeLeft());</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; params.set_random_seed(<a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.random_seed());</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; </div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; sat::SatSolver sat_solver;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; sat_solver.SetParameters(params);</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; </div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// Starts by adding the unit clauses to fix the variables.</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem = problem_state.original_problem();</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; sat_solver.SetNumVariables(problem.num_variables());</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">Index</a>(); ++i) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(sat_solver.AddUnitClause(sat_propagator_-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>()[i]));</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; }</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; </div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="comment">// Load the rest of the problem. This will automatically create the small</span></div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">// local subproblem using the already fixed variable.</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// TODO(user): modify LoadStateProblemToSatSolver() so that we can call it</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// instead and don&#39;t need to over constraint the objective below. As a</span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// bonus we will also have the learned binary clauses.</span></div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#add13e122d8861d6cac9b9bb4a51cfcb7">LoadBooleanProblem</a>(problem, &amp;sat_solver)) {</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="comment">// The local problem is infeasible.</span></div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">IncreaseParameter</a>();</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; }</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; </div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (use_lp_to_guide_sat_) {</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">if</span> (!UseLinearRelaxationForSatAssignmentPreference(</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, problem, &amp;sat_solver, <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>)) {</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed">BopOptimizerBase::LIMIT_REACHED</a>;</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <a class="code" href="namespaceoperations__research_1_1sat.html#a40254eb00d4590a09d811fe94c727c2a">UseObjectiveForSatAssignmentPreference</a>(problem, &amp;sat_solver);</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; }</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; </div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceoperations__research_1_1sat.html#a66979ace60178ae3fe59f6180e4db42f">AddObjectiveUpperBound</a>(</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; problem, sat::Coefficient(problem_state.solution().GetCost()) - 1,</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; &amp;sat_solver)) {</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// The local problem is infeasible.</span></div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">IncreaseParameter</a>();</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; }</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; </div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="comment">// Solve the local problem.</span></div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">sat::SatSolver::Status</a> status = sat_solver.Solve();</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <a class="code" href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a>-&gt;AdvanceDeterministicTime(sat_solver.deterministic_time());</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">if</span> (status == <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">sat::SatSolver::FEASIBLE</a>) {</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// We found a solution! abort now.</span></div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <a class="code" href="namespaceoperations__research_1_1bop.html#a49c2b7c159260e338438fc2e167a0c3d">SatAssignmentToBopSolution</a>(sat_solver.Assignment(),</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; &amp;learned_info-&gt;solution);</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba22ebbfba03095f407fb90f5a363a384b">BopOptimizerBase::SOLUTION_FOUND</a>;</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; }</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; </div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="comment">// Adapt the difficulty.</span></div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (sat_solver.num_failures() &lt; 0.5 * conflict_limit) {</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">IncreaseParameter</a>();</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sat_solver.num_failures() &gt; 0.95 * conflict_limit) {</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; adaptive_difficulty_.<a class="code" href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#abb82bc89291c5c3ab40e5117b8a2e8ef">DecreaseParameter</a>();</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; }</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; }</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; </div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">BopOptimizerBase::CONTINUE</a>;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;}</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; </div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160;<span class="comment">// Neighborhood generators.</span></div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; </div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; </div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;std::vector&lt;sat::Literal&gt; ObjectiveVariablesAssignedToTheirLowCostValue(</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keyword">const</span> ProblemState&amp; problem_state,</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceoperations__research_1_1bop.html#ac9c38b3de2073e14b57f06fb328dcdb4">BopConstraintTerms</a>&amp; objective_terms) {</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; std::vector&lt;sat::Literal&gt; result;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(problem_state.solution().IsFeasible());</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> BopConstraintTerm&amp; term : objective_terms) {</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">if</span> (((problem_state.solution().Value(term.var_id) &amp;&amp; term.weight &lt; 0) ||</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; (!problem_state.solution().Value(term.var_id) &amp;&amp; term.weight &gt; 0))) {</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; result.push_back(</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; sat::Literal(sat::BooleanVariable(term.var_id.value()),</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; problem_state.solution().Value(term.var_id)));</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; }</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; }</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160;}</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; </div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; </div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;<span class="keywordtype">void</span> ObjectiveBasedNeighborhood::GenerateNeighborhood(</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keyword">const</span> ProblemState&amp; problem_state, <span class="keywordtype">double</span> difficulty,</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; sat::SatSolver* sat_propagator) {</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="comment">// Generate the set of variable we may fix and randomize their order.</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; std::vector&lt;sat::Literal&gt; candidates =</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; ObjectiveVariablesAssignedToTheirLowCostValue(problem_state,</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; objective_terms_);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; std::shuffle(candidates.begin(), candidates.end(), *random_);</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; </div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="comment">// We will use the sat_propagator to fix some variables as long as the number</span></div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// of propagated variables in the solver is under our target.</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_propagator-&gt;NumVariables();</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target = round((1.0 - difficulty) * num_variables);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; </div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; sat_propagator-&gt;Backtrack(0);</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> sat::Literal <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : candidates) {</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;LiteralTrail().Index() == target) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;LiteralTrail().Index() &gt; target) {</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// We prefer to error on the large neighborhood side, so we backtrack the</span></div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="comment">// last enqueued literal.</span></div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; sat_propagator-&gt;Backtrack(</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <a class="code" href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">std::max</a>(0, sat_propagator-&gt;CurrentDecisionLevel() - 1));</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; sat_propagator-&gt;EnqueueDecisionAndBacktrackOnConflict(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160;}</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; </div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;<span class="keywordtype">void</span> ConstraintBasedNeighborhood::GenerateNeighborhood(</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> ProblemState&amp; problem_state, <span class="keywordtype">double</span> difficulty,</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; sat::SatSolver* sat_propagator) {</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// Randomize the set of constraint</span></div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem = problem_state.original_problem();</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_constraints = problem.constraints_size();</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; std::vector&lt;int&gt; ct_ids(num_constraints, 0);</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> ct_id = 0; ct_id &lt; num_constraints; ++ct_id) ct_ids[ct_id] = ct_id;</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; std::shuffle(ct_ids.begin(), ct_ids.end(), *random_);</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; </div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// Mark that we want to relax all the variables of these constraints as long</span></div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// as the number of relaxed variable is lower than our difficulty target.</span></div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_propagator-&gt;NumVariables();</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target = round(difficulty * num_variables);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordtype">int</span> num_relaxed = 0;</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; std::vector&lt;bool&gt; variable_is_relaxed(problem.num_variables(), <span class="keyword">false</span>);</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; ct_ids.size(); ++i) {</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keywordflow">if</span> (num_relaxed &gt;= target) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keyword">const</span> LinearBooleanConstraint&amp; constraint = problem.constraints(ct_ids[i]);</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; </div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// We exclude really large constraints since they are probably note helpful</span></div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// in picking a nice neighborhood.</span></div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span> (constraint.literals_size() &gt; 0.7 * num_variables) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; </div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; constraint.literals_size(); ++j) {</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">const</span> VariableIndex var_id(constraint.literals(j) - 1);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">if</span> (!variable_is_relaxed[var_id.value()]) {</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; ++num_relaxed;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; variable_is_relaxed[var_id.value()] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; }</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; </div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="comment">// Basic version: simply fix all the &quot;to_fix&quot; variable that are not relaxed.</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="comment">// TODO(user): Not fixing anything that propagates a variable in</span></div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="comment">// variable_is_relaxed may be better. It is actually a lot better in the</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="comment">// RelationGraphBasedNeighborhood. To investigate.</span></div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; sat_propagator-&gt;Backtrack(0);</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keyword">const</span> std::vector&lt;sat::Literal&gt; to_fix =</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; ObjectiveVariablesAssignedToTheirLowCostValue(problem_state,</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; objective_terms_);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> sat::Literal <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : to_fix) {</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">if</span> (variable_is_relaxed[<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable().value()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; sat_propagator-&gt;EnqueueDecisionAndBacktrackOnConflict(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;IsModelUnsat()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; }</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;}</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; </div>
<div class="line"><a name="l00508"></a><span class="lineno"><a class="line" href="classoperations__research_1_1bop_1_1_relation_graph_based_neighborhood.html#a15a6548fa6d727c6d5614a8107b3c1e9"> 508</a></span>&#160;<a class="code" href="classoperations__research_1_1bop_1_1_relation_graph_based_neighborhood.html#a15a6548fa6d727c6d5614a8107b3c1e9">RelationGraphBasedNeighborhood::RelationGraphBasedNeighborhood</a>(</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem, <a class="code" href="classoperations__research_1_1_m_t_random.html">MTRandom</a>* random)</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; : random_(random) {</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = problem.num_variables();</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; columns_.<a class="code" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(num_variables);</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; </div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="comment">// We will ignore constraints that have more variables than this percentage of</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="comment">// the total number of variables in this neighborhood computation.</span></div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="comment">// TODO(user): Factor this out with the similar factor in</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="comment">// ConstraintBasedNeighborhood? also maybe a better approach is to order the</span></div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="comment">// constraint, and stop the neighborhood extension without considering all of</span></div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="comment">// them.</span></div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> kSizeThreshold = 0.1;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; problem.constraints_size(); ++i) {</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keyword">const</span> LinearBooleanConstraint&amp; constraint = problem.constraints(i);</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keywordflow">if</span> (constraint.literals_size() &gt; kSizeThreshold * num_variables) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; constraint.literals_size(); ++j) {</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(constraint.literals(j));</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; columns_[VariableIndex(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable().value())].<a class="code" href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">push_back</a>(</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; ConstraintIndex(i));</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;}</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; </div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;<span class="keywordtype">void</span> RelationGraphBasedNeighborhood::GenerateNeighborhood(</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html">ProblemState</a>&amp; problem_state, <span class="keywordtype">double</span> difficulty,</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">sat::SatSolver</a>* sat_propagator) {</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="comment">// Simply walk the graph until enough variable are relaxed.</span></div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> target = round(difficulty * num_variables);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordtype">int</span> num_relaxed = 1;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; std::vector&lt;bool&gt; variable_is_relaxed(num_variables, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; std::deque&lt;int&gt; queue;</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// TODO(user): If one plan to try of lot of different LNS, maybe it will be</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="comment">// better to try to bias the distribution of &quot;center&quot; to be as spread as</span></div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="comment">// possible.</span></div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; queue.push_back(random_-&gt;<a class="code" href="classoperations__research_1_1_a_c_m_random.html#aafba9e8335b3dda5b131589cf852f414">Uniform</a>(num_variables));</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; variable_is_relaxed[queue.back()] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">while</span> (!queue.empty() &amp;&amp; num_relaxed &lt; target) {</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = queue.front();</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; queue.pop_front();</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">for</span> (ConstraintIndex ct_index : columns_[VariableIndex(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)]) {</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keyword">const</span> LinearBooleanConstraint&amp; constraint =</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#a1b5ceea7aa96a97466f8e91036367a5b">original_problem</a>().constraints(ct_index.value());</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; constraint.literals_size(); ++i) {</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_literal.html">sat::Literal</a> <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(constraint.literals(i));</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> next_var = <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable().value();</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="keywordflow">if</span> (!variable_is_relaxed[next_var]) {</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; ++num_relaxed;</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; variable_is_relaxed[next_var] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; queue.push_back(next_var);</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; }</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; }</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; </div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">// Loops over all the variables in order and only fix the ones that don&#39;t</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// propagate any relaxed variables.</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <a class="code" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>().<a class="code" href="classoperations__research_1_1bop_1_1_bop_solution.html#a894d87c5fddfc463c3ca3c779ba7f997">IsFeasible</a>());</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">Backtrack</a>(0);</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">for</span> (sat::BooleanVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>(0); <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> &lt; num_variables; ++<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keyword">const</span> sat::Literal <a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, problem_state.<a class="code" href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">solution</a>().<a class="code" href="classoperations__research_1_1bop_1_1_bop_solution.html#a6cd00223d6f5614e7a88064c55fd6080">Value</a>(VariableIndex(<a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>.value())));</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">if</span> (variable_is_relaxed[<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>.Variable().value()]) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> =</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ab63a08713131e63e9cc4109f98ecf859">EnqueueDecisionAndBacktrackOnConflict</a>(<a class="code" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() &gt; 0) {</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = <a class="code" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>; i &lt; sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">Index</a>(); ++i) {</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">if</span> (variable_is_relaxed</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; [sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>()[i].Variable().value()]) {</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">Backtrack</a>(sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() - 1);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; }</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; }</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; }</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">if</span> (sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; }</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <a class="code" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) &lt;&lt; <span class="stringliteral">&quot;target:&quot;</span> &lt;&lt; target &lt;&lt; <span class="stringliteral">&quot; relaxed:&quot;</span> &lt;&lt; num_relaxed &lt;&lt; <span class="stringliteral">&quot; actual:&quot;</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; &lt;&lt; num_variables - sat_propagator-&gt;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">LiteralTrail</a>().<a class="code" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160;}</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; </div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160;} <span class="comment">// namespace bop</span></div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;} <span class="comment">// namespace operations_research</span></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01858">expr_array.cc:1858</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_relation_graph_based_neighborhood_html_a15a6548fa6d727c6d5614a8107b3c1e9"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_relation_graph_based_neighborhood.html#a15a6548fa6d727c6d5614a8107b3c1e9">operations_research::bop::RelationGraphBasedNeighborhood::RelationGraphBasedNeighborhood</a></div><div class="ttdeci">RelationGraphBasedNeighborhood(const sat::LinearBooleanProblem &amp;problem, MTRandom *random)</div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8cc_source.html#l00508">bop_lns.cc:508</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a5ca47674a4a0b5e7f40eb430ab474440"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">operations_research::sat::SatSolver::SetAssumptionLevel</a></div><div class="ttdeci">void SetAssumptionLevel(int assumption_level)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00962">sat_solver.cc:962</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70b"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">operations_research::sat::SatSolver::Status</a></div><div class="ttdeci">Status</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00180">sat_solver.h:180</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_a4dc8ae0f97c4110f3cc770715b2bbd12"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#a4dc8ae0f97c4110f3cc770715b2bbd12">operations_research::glop::DenseRow</a></div><div class="ttdeci">StrictITIVector&lt; ColIndex, Fractional &gt; DenseRow</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00299">lp_types.h:299</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927"><div class="ttname"><a href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a></div><div class="ttdeci">#define VLOG(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00978">base/logging.h:978</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba22ebbfba03095f407fb90f5a363a384b"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba22ebbfba03095f407fb90f5a363a384b">operations_research::bop::BopOptimizerBase::SOLUTION_FOUND</a></div><div class="ttdeci">@ SOLUTION_FOUND</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00064">bop_base.h:64</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a9263000d449fdccb6cb70b303063e60b"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b">absl::StrongVector::push_back</a></div><div class="ttdeci">void push_back(const value_type &amp;x)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00158">strong_vector.h:158</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer_html_ae69a6901e444016287dcad9930ea500e"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#ae69a6901e444016287dcad9930ea500e">operations_research::bop::BopCompleteLNSOptimizer::~BopCompleteLNSOptimizer</a></div><div class="ttdeci">~BopCompleteLNSOptimizer() final</div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8cc_source.html#l00063">bop_lns.cc:63</a></div></div>
<div class="ttc" id="aalldiff__cst_8cc_html_a9d0c202d5fdd62f4fa2c613339ff168a"><div class="ttname"><a href="alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a">max</a></div><div class="ttdeci">int64 max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_problem_state_html_ac59ff8f3b21bdac22c9c53a7d82ba3ec"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_problem_state.html#ac59ff8f3b21bdac22c9c53a7d82ba3ec">operations_research::bop::ProblemState::solution</a></div><div class="ttdeci">const BopSolution &amp; solution() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00194">bop_base.h:194</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer_html_a24a6853a329f77a909de7c6ab7815f83"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a24a6853a329f77a909de7c6ab7815f83">operations_research::bop::BopAdaptiveLNSOptimizer::~BopAdaptiveLNSOptimizer</a></div><div class="ttdeci">~BopAdaptiveLNSOptimizer() final</div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8cc_source.html#l00225">bop_lns.cc:225</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9789bf03dba611e9be5679d6e902d0c8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9789bf03dba611e9be5679d6e902d0c8">operations_research::sat::SatSolver::Assignment</a></div><div class="ttdeci">const VariablesAssignment &amp; Assignment() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00362">sat_solver.h:362</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_a_c_m_random_html_aafba9e8335b3dda5b131589cf852f414"><div class="ttname"><a href="classoperations__research_1_1_a_c_m_random.html#aafba9e8335b3dda5b131589cf852f414">operations_research::ACMRandom::Uniform</a></div><div class="ttdeci">uint32 Uniform(uint32 n)</div><div class="ttdef"><b>Definition:</b> <a href="random_8cc_source.html#l00040">random.cc:40</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed">operations_research::bop::BopOptimizerBase::LIMIT_REACHED</a></div><div class="ttdeci">@ LIMIT_REACHED</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00066">bop_base.h:66</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html">operations_research::sat::SatSolver</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00057">sat_solver.h:57</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_luby_adaptive_parameter_value_html_ac489923becd8061981981afc56893c07"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#ac489923becd8061981981afc56893c07">operations_research::bop::LubyAdaptiveParameterValue::UpdateLuby</a></div><div class="ttdeci">void UpdateLuby()</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00195">bop_util.cc:195</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_a21edc7ca4cc5802c8779d68556bc09cf"><div class="ttname"><a href="demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf">value</a></div><div class="ttdeci">int64 value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00043">demon_profiler.cc:43</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a66979ace60178ae3fe59f6180e4db42f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a66979ace60178ae3fe59f6180e4db42f">operations_research::sat::AddObjectiveUpperBound</a></div><div class="ttdeci">bool AddObjectiveUpperBound(const LinearBooleanProblem &amp;problem, Coefficient upper_bound, SatSolver *solver)</div><div class="ttdef"><b>Definition:</b> <a href="boolean__problem_8cc_source.html#l00329">boolean_problem.cc:329</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ac714aeb75f0f6dd87e52e5d1a0d6edc7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">operations_research::sat::SatSolver::RestoreSolverToAssumptionLevel</a></div><div class="ttdeci">bool RestoreSolverToAssumptionLevel()</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00511">sat_solver.cc:511</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<div class="ttc" id="acleanup_8h_html"><div class="ttname"><a href="cleanup_8h.html">cleanup.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">operations_research::sat::SatSolver::FEASIBLE</a></div><div class="ttdeci">@ FEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00183">sat_solver.h:183</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1bop_html_a2c3c1538ecc101963e5c92ff9bfb33bb"><div class="ttname"><a href="namespaceoperations__research_1_1bop.html#a2c3c1538ecc101963e5c92ff9bfb33bb">operations_research::bop::LoadStateProblemToSatSolver</a></div><div class="ttdeci">BopOptimizerBase::Status LoadStateProblemToSatSolver(const ProblemState &amp;problem_state, sat::SatSolver *sat_solver)</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00087">bop_util.cc:87</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html">operations_research::bop::BopOptimizerBase</a></div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00041">bop_base.h:41</a></div></div>
<div class="ttc" id="anamespaceabsl_html_a9bfb260a67150f0bc1da17aac9199866"><div class="ttname"><a href="namespaceabsl.html#a9bfb260a67150f0bc1da17aac9199866">absl::MakeCleanup</a></div><div class="ttdeci">absl::Cleanup&lt; absl::decay_t&lt; Callback &gt; &gt; MakeCleanup(Callback &amp;&amp;callback)</div><div class="ttdef"><b>Definition:</b> <a href="cleanup_8h_source.html#l00120">cleanup.h:120</a></div></div>
<div class="ttc" id="asat__solver_8h_html"><div class="ttname"><a href="sat__solver_8h.html">sat_solver.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a4591e100a0f29a249169e5833995cd31"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a4591e100a0f29a249169e5833995cd31">operations_research::sat::ConvertBooleanProblemToLinearProgram</a></div><div class="ttdeci">void ConvertBooleanProblemToLinearProgram(const LinearBooleanProblem &amp;problem, glop::LinearProgram *lp)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2lp__utils_8cc_source.html#l01089">sat/lp_utils.cc:1089</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_solution_html_a6cd00223d6f5614e7a88064c55fd6080"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_solution.html#a6cd00223d6f5614e7a88064c55fd6080">operations_research::bop::BopSolution::Value</a></div><div class="ttdeci">bool Value(VariableIndex var) const</div><div class="ttdef"><b>Definition:</b> <a href="bop__solution_8h_source.html#l00044">bop_solution.h:44</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html">operations_research::TimeLimit</a></div><div class="ttdoc">A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00105">time_limit.h:105</a></div></div>
<div class="ttc" id="apack_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00508">pack.cc:508</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_a733947145e3e1631165b618b05c9ccb7"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#a733947145e3e1631165b618b05c9ccb7">operations_research::glop::Fractional</a></div><div class="ttdeci">double Fractional</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00077">lp_types.h:77</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html_a8ef12397d1682615bc3108c397734179"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">operations_research::sat::Trail::Index</a></div><div class="ttdeci">int Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00378">sat_base.h:378</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_luby_adaptive_parameter_value_html_aaa20269bbaf1cc513e2bae1decb7de0a"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#aaa20269bbaf1cc513e2bae1decb7de0a">operations_research::bop::LubyAdaptiveParameterValue::luby_value</a></div><div class="ttdeci">int luby_value() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8h_source.html#l00079">bop_util.h:79</a></div></div>
<div class="ttc" id="astats_8h_html_a9995704aaaf45fc21e08c847551a8d04"><div class="ttname"><a href="stats_8h.html#a9995704aaaf45fc21e08c847551a8d04">SCOPED_TIME_STAT</a></div><div class="ttdeci">#define SCOPED_TIME_STAT(stats)</div><div class="ttdef"><b>Definition:</b> <a href="stats_8h_source.html#l00436">stats.h:436</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ad63c4461a1384629cb99413c6df8b9ca"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">operations_research::sat::SatSolver::CurrentDecisionLevel</a></div><div class="ttdeci">int CurrentDecisionLevel() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00360">sat_solver.h:360</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a7c6fc06ca542eed0ff0b6ed4b1ecbcda"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a7c6fc06ca542eed0ff0b6ed4b1ecbcda">operations_research::bop::BopOptimizerBase::stats_</a></div><div class="ttdeci">StatsGroup stats_</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00101">bop_base.h:101</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a40254eb00d4590a09d811fe94c727c2a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a40254eb00d4590a09d811fe94c727c2a">operations_research::sat::UseObjectiveForSatAssignmentPreference</a></div><div class="ttdeci">void UseObjectiveForSatAssignmentPreference(const LinearBooleanProblem &amp;problem, SatSolver *solver)</div><div class="ttdef"><b>Definition:</b> <a href="boolean__problem_8cc_source.html#l00308">boolean_problem.cc:308</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_m_t_random_html"><div class="ttname"><a href="classoperations__research_1_1_m_t_random.html">operations_research::MTRandom</a></div><div class="ttdef"><b>Definition:</b> <a href="random_8h_source.html#l00055">random.h:55</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1bop_html_a49c2b7c159260e338438fc2e167a0c3d"><div class="ttname"><a href="namespaceoperations__research_1_1bop.html#a49c2b7c159260e338438fc2e167a0c3d">operations_research::bop::SatAssignmentToBopSolution</a></div><div class="ttdeci">void SatAssignmentToBopSolution(const sat::VariablesAssignment &amp;assignment, BopSolution *solution)</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00121">bop_util.cc:121</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a01fd4c9f5286534866c6c5ee2c160fe9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a01fd4c9f5286534866c6c5ee2c160fe9">operations_research::sat::SatSolver::LiteralTrail</a></div><div class="ttdeci">const Trail &amp; LiteralTrail() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00361">sat_solver.h:361</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">operations_research::bop::BopOptimizerBase::INFEASIBLE</a></div><div class="ttdeci">@ INFEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00065">bop_base.h:65</a></div></div>
<div class="ttc" id="acp__model__solver_8cc_html_ac3cf9db02b23ea1455b5ae6955d03e47"><div class="ttname"><a href="cp__model__solver_8cc.html#ac3cf9db02b23ea1455b5ae6955d03e47">time_limit</a></div><div class="ttdeci">SharedTimeLimit * time_limit</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02101">cp_model_solver.cc:2101</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_problem_state_html"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_problem_state.html">operations_research::bop::ProblemState</a></div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00112">bop_base.h:112</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_luby_adaptive_parameter_value_html_a8291583e9142df5b62f660a424daffba"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8291583e9142df5b62f660a424daffba">operations_research::bop::LubyAdaptiveParameterValue::IncreaseParameter</a></div><div class="ttdeci">void IncreaseParameter()</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00175">bop_util.cc:175</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70bae5ba802809eb747ea486ca3fae32a885"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae5ba802809eb747ea486ca3fae32a885">operations_research::sat::SatSolver::ASSUMPTIONS_UNSAT</a></div><div class="ttdeci">@ ASSUMPTIONS_UNSAT</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00181">sat_solver.h:181</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ae525d235b02bcfc962d845e28f5f0125"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ae525d235b02bcfc962d845e28f5f0125">operations_research::sat::SatSolver::deterministic_time</a></div><div class="ttdeci">double deterministic_time() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00092">sat_solver.cc:92</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_problem_state_html_a1b5ceea7aa96a97466f8e91036367a5b"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_problem_state.html#a1b5ceea7aa96a97466f8e91036367a5b">operations_research::bop::ProblemState::original_problem</a></div><div class="ttdeci">const sat::LinearBooleanProblem &amp; original_problem() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00199">bop_base.h:199</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1bop_html_ac9c38b3de2073e14b57f06fb328dcdb4"><div class="ttname"><a href="namespaceoperations__research_1_1bop.html#ac9c38b3de2073e14b57f06fb328dcdb4">operations_research::bop::BopConstraintTerms</a></div><div class="ttdeci">absl::StrongVector&lt; SparseIndex, BopConstraintTerm &gt; BopConstraintTerms</div><div class="ttdef"><b>Definition:</b> <a href="bop__types_8h_source.html#l00085">bop_types.h:85</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_ae17f8119c108cf3070bad3449c7e0006"><div class="ttname"><a href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a></div><div class="ttdeci">#define DCHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00884">base/logging.h:884</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer_html_a29f0d547269428a823f377a0aa2dd017"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_adaptive_l_n_s_optimizer.html#a29f0d547269428a823f377a0aa2dd017">operations_research::bop::BopAdaptiveLNSOptimizer::BopAdaptiveLNSOptimizer</a></div><div class="ttdeci">BopAdaptiveLNSOptimizer(const std::string &amp;name, bool use_lp_to_guide_sat, NeighborhoodGenerator *neighborhood_generator, sat::SatSolver *sat_propagator)</div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8cc_source.html#l00213">bop_lns.cc:213</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_add13e122d8861d6cac9b9bb4a51cfcb7"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#add13e122d8861d6cac9b9bb4a51cfcb7">operations_research::sat::LoadBooleanProblem</a></div><div class="ttdeci">bool LoadBooleanProblem(const LinearBooleanProblem &amp;problem, SatSolver *solver)</div><div class="ttdef"><b>Definition:</b> <a href="boolean__problem_8cc_source.html#l00220">boolean_problem.cc:220</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70bae276c6d6c33441e7bc41f349a9ba39e2"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae276c6d6c33441e7bc41f349a9ba39e2">operations_research::bop::BopOptimizerBase::OPTIMAL_SOLUTION_FOUND</a></div><div class="ttdeci">@ OPTIMAL_SOLUTION_FOUND</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00063">bop_base.h:63</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_luby_adaptive_parameter_value_html_a8143f86c8f0eab1ef9ba889d201439d8"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#a8143f86c8f0eab1ef9ba889d201439d8">operations_research::bop::LubyAdaptiveParameterValue::GetParameterValue</a></div><div class="ttdeci">double GetParameterValue() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00185">bop_util.cc:185</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#l00064">sat_base.h:64</a></div></div>
<div class="ttc" id="alp__print__utils_8h_html"><div class="ttname"><a href="lp__print__utils_8h.html">lp_print_utils.h</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; SparseIndex, BopConstraintTerm &gt;</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_ae8a885303349cb7807c7c87b405bc0c9af00c8dbdd6e1f11bdae06be94277d293"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#ae8a885303349cb7807c7c87b405bc0c9af00c8dbdd6e1f11bdae06be94277d293">operations_research::glop::ProblemStatus::OPTIMAL</a></div><div class="ttdeci">@ OPTIMAL</div></div>
<div class="ttc" id="amarkowitz_8cc_html_aa9d6c98fdf8d89b0e2321fda02adc82c"><div class="ttname"><a href="markowitz_8cc.html#aa9d6c98fdf8d89b0e2321fda02adc82c">col</a></div><div class="ttdeci">ColIndex col</div><div class="ttdef"><b>Definition:</b> <a href="markowitz_8cc_source.html#l00176">markowitz.cc:176</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer_html_a36297fc10df6b1b5effa82aeb9021766"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_complete_l_n_s_optimizer.html#a36297fc10df6b1b5effa82aeb9021766">operations_research::bop::BopCompleteLNSOptimizer::BopCompleteLNSOptimizer</a></div><div class="ttdeci">BopCompleteLNSOptimizer(const std::string &amp;name, const BopConstraintTerms &amp;objective_terms)</div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8cc_source.html#l00057">bop_lns.cc:57</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_solution_html_a894d87c5fddfc463c3ca3c779ba7f997"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_solution.html#a894d87c5fddfc463c3ca3c779ba7f997">operations_research::bop::BopSolution::IsFeasible</a></div><div class="ttdeci">bool IsFeasible() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__solution_8h_source.html#l00070">bop_solution.h:70</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_ae8a885303349cb7807c7c87b405bc0c9"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#ae8a885303349cb7807c7c87b405bc0c9">operations_research::glop::ProblemStatus</a></div><div class="ttdeci">ProblemStatus</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00101">lp_types.h:101</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="aclassoperations__research_1_1sat_1_1_sat_solver_html_a2b006481369eb4f4cb7f3037dfdd8404"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a2b006481369eb4f4cb7f3037dfdd8404">operations_research::sat::SatSolver::Solve</a></div><div class="ttdeci">Status Solve()</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00972">sat_solver.cc:972</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ab63a08713131e63e9cc4109f98ecf859"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ab63a08713131e63e9cc4109f98ecf859">operations_research::sat::SatSolver::EnqueueDecisionAndBacktrackOnConflict</a></div><div class="ttdeci">int EnqueueDecisionAndBacktrackOnConflict(Literal true_literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00861">sat_solver.cc:861</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ac035378cea0ed7b0978105547402faa8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ac035378cea0ed7b0978105547402faa8">operations_research::sat::SatSolver::Backtrack</a></div><div class="ttdeci">void Backtrack(int target_level)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00888">sat_solver.cc:888</a></div></div>
<div class="ttc" id="astructoperations__research_1_1sat_1_1_literal_with_coeff_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_literal_with_coeff.html">operations_research::sat::LiteralWithCoeff</a></div><div class="ttdef"><b>Definition:</b> <a href="pb__constraint_8h_source.html#l00049">pb_constraint.h:49</a></div></div>
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a4e3670a285a3642eaa07f66766cffa72"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">absl::StrongVector::resize</a></div><div class="ttdeci">void resize(size_type new_size)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00150">strong_vector.h:150</a></div></div>
<div class="ttc" id="asat_2lp__utils_8h_html"><div class="ttname"><a href="sat_2lp__utils_8h.html">lp_utils.h</a></div></div>
<div class="ttc" id="aboolean__problem_8h_html"><div class="ttname"><a href="boolean__problem_8h.html">boolean_problem.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1glop_html_abec9e934a51aa2ab519684cc0f446a41"><div class="ttname"><a href="namespaceoperations__research_1_1glop.html#abec9e934a51aa2ab519684cc0f446a41">operations_research::glop::Index</a></div><div class="ttdeci">int32 Index</div><div class="ttdef"><b>Definition:</b> <a href="lp__types_8h_source.html#l00037">lp_types.h:37</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba49959dd441dcda75d6898cf2c68fb374">operations_research::bop::BopOptimizerBase::CONTINUE</a></div><div class="ttdeci">@ CONTINUE</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00077">bop_base.h:77</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_neighborhood_generator_html"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_neighborhood_generator.html">operations_research::bop::NeighborhoodGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="bop__lns_8h_source.html#l00070">bop_lns.h:70</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_luby_adaptive_parameter_value_html_abb82bc89291c5c3ab40e5117b8a2e8ef"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_luby_adaptive_parameter_value.html#abb82bc89291c5c3ab40e5117b8a2e8ef">operations_research::bop::LubyAdaptiveParameterValue::DecreaseParameter</a></div><div class="ttdeci">void DecreaseParameter()</div><div class="ttdef"><b>Definition:</b> <a href="bop__util_8cc_source.html#l00180">bop_util.cc:180</a></div></div>
<div class="ttc" id="aoptimization_8cc_html_af63dcc00f2023fdf498e0829e6fb8a6b"><div class="ttname"><a href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a></div><div class="ttdeci">Literal literal</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00084">optimization.cc:84</a></div></div>
<div class="ttc" id="abop__lns_8h_html"><div class="ttname"><a href="bop__lns_8h.html">bop_lns.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70b"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">operations_research::bop::BopOptimizerBase::Status</a></div><div class="ttdeci">Status</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00062">bop_base.h:62</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba72c2402449caa8f3edc8aa0a3816baed">operations_research::sat::SatSolver::LIMIT_REACHED</a></div><div class="ttdeci">@ LIMIT_REACHED</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00184">sat_solver.h:184</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a3e1cfef60e774a81f30eaddf26a3a274"><div class="ttname"><a href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a></div><div class="ttdeci">#define CHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00495">base/logging.h:495</a></div></div>
<div class="ttc" id="acommandlineflags_8h_html"><div class="ttname"><a href="commandlineflags_8h.html">commandlineflags.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9d3beb2afe4ae647674b054bf29290e2"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">operations_research::sat::SatSolver::NumVariables</a></div><div class="ttdeci">int NumVariables() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00082">sat_solver.h:82</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ad2a33e1d9335cce63548abed6b5c8aab"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">operations_research::sat::SatSolver::IsModelUnsat</a></div><div class="ttdeci">bool IsModelUnsat() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00136">sat_solver.h:136</a></div></div>
<div class="ttc" id="acp__model__fz__solver_8cc_html_a10a1eab179b472c030bdc2a2efef7219"><div class="ttname"><a href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a></div><div class="ttdeci">SatParameters parameters</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__fz__solver_8cc_source.html#l00108">cp_model_fz_solver.cc:108</a></div></div>
<div class="ttc" id="adefault__search_8cc_html_ac673bc430bdc3fdaa09f7becf98ef267"><div class="ttname"><a href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a></div><div class="ttdeci">const std::string name</div><div class="ttdef"><b>Definition:</b> <a href="default__search_8cc_source.html#l00808">default_search.cc:808</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_bop_optimizer_base_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba781ad2788df9e25c59a70894c7832096"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_bop_optimizer_base.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba781ad2788df9e25c59a70894c7832096">operations_research::bop::BopOptimizerBase::ABORT</a></div><div class="ttdeci">@ ABORT</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00081">bop_base.h:80</a></div></div>
<div class="ttc" id="abitset_8h_html"><div class="ttname"><a href="bitset_8h.html">bitset.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1bop_1_1_problem_state_html_a05fdb14439563d77a1ce890279a7c762"><div class="ttname"><a href="classoperations__research_1_1bop_1_1_problem_state.html#a05fdb14439563d77a1ce890279a7c762">operations_research::bop::ProblemState::update_stamp</a></div><div class="ttdeci">int64 update_stamp() const</div><div class="ttdef"><b>Definition:</b> <a href="bop__base_8h_source.html#l00154">bop_base.h:154</a></div></div>
<div class="ttc" id="alp__solver_8h_html"><div class="ttname"><a href="lp__solver_8h.html">lp_solver.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9d584b84d7b882a6017b072b33475172"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d584b84d7b882a6017b072b33475172">operations_research::sat::SatSolver::SetParameters</a></div><div class="ttdeci">void SetParameters(const SatParameters &amp;parameters)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00115">sat_solver.cc:115</a></div></div>
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_749f8352630e023f1ab8040461e5d795.html">bop</a></li><li class="navelem"><a class="el" href="bop__lns_8cc.html">bop_lns.cc</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.20 </li>
</ul>
</div>
</body>
</html>