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

393 lines
64 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.3"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: optimization.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">9.3</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('optimization_8h_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">optimization.h</div></div>
</div><!--header-->
<div class="contents">
<a href="optimization_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#ifndef OR_TOOLS_SAT_OPTIMIZATION_H_</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#define OR_TOOLS_SAT_OPTIMIZATION_H_</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &quot;absl/random/bit_gen_ref.h&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &quot;ortools/sat/boolean_problem.pb.h&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &quot;<a class="code" href="cp__model__mapping_8h.html">ortools/sat/cp_model_mapping.h</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &quot;<a class="code" href="integer_8h.html">ortools/sat/integer.h</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &quot;<a class="code" href="integer__search_8h.html">ortools/sat/integer_search.h</a>&quot;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &quot;<a class="code" href="sat_2model_8h.html">ortools/sat/model.h</a>&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;<a class="code" href="pb__constraint_8h.html">ortools/sat/pb_constraint.h</a>&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;<a class="code" href="sat__base_8h.html">ortools/sat/sat_base.h</a>&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;ortools/sat/sat_parameters.pb.h&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &quot;<a class="code" href="sat__solver_8h.html">ortools/sat/sat_solver.h</a>&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &quot;<a class="code" href="time__limit_8h.html">ortools/util/time_limit.h</a>&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="keyword">namespace </span>sat {</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment">// Like MinimizeCore() with a slower but strictly better heuristic. This</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment">// algorithm should produce a minimal core with respect to propagation. We put</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment">// each literal of the initial core &quot;last&quot; at least once, so if such literal can</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="comment">// be inferred by propagation by any subset of the other literal, it will be</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="comment">// removed.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="comment">//</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment">// Note that the literal of the minimized core will stay in the same order.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="comment">//</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment">// TODO(user): Avoid spending too much time trying to minimize a core.</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ab76a35e6ff810ad9ea8b58c7c11606cb">MinimizeCoreWithPropagation</a>(TimeLimit* limit, SatSolver* solver,</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> std::vector&lt;Literal&gt;* core);</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">// Because the Solve*() functions below are also used in scripts that requires a</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment">// special output format, we use this to tell them whether or not to use the</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment">// default logging framework or simply stdout. Most users should just use</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment">// DEFAULT_LOG.</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c"> 51</a></span><span class="keyword">enum</span> <a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> { <a class="code hl_enumvalue" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c">DEFAULT_LOG</a>, <a class="code hl_enumvalue" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a6c3f20e225309c66fdb5481433e5bd2f">STDOUT_LOG</a> };</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment">// All the Solve*() functions below reuse the SatSolver::Status with a slightly</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment">// different meaning:</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment">// - FEASIBLE: The problem has been solved to optimality.</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment">// - INFEASIBLE: Same meaning, the decision version is already unsat.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment">// - LIMIT_REACHED: we may have some feasible solution (if solution is</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment">// non-empty), but the optimality is not proven.</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment">// Implements the &quot;Fu &amp; Malik&quot; algorithm described in:</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment">// Zhaohui Fu, Sharad Malik, &quot;On solving the Partial MAX-SAT problem&quot;, 2006,</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment">// International Conference on Theory and Applications of Satisfiability</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment">// Testing. (SAT06), LNCS 4121.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment">//</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment">// This algorithm requires all the objective weights to be the same (CHECKed)</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="comment">// and currently only works on minimization problems. The problem is assumed to</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment">// be already loaded into the given solver.</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="comment">//</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="comment">// TODO(user): double-check the correctness if the objective coefficients are</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="comment">// negative.</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ac8d4f52bbb23604c511dfeca406b1685">SolveWithFuMalik</a>(<a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> SatSolver* solver,</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="comment">// The WPM1 algorithm is a generalization of the Fu &amp; Malik algorithm to</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="comment">// weighted problems. Note that if all objective weights are the same, this is</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="comment">// almost the same as SolveWithFuMalik() but the encoding of the constraints is</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="comment">// slightly different.</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="comment">//</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="comment">// Ansotegui, C., Bonet, M.L., Levy, J.: Solving (weighted) partial MaxSAT</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="comment">// through satisfiability testing. In: Proc. of the 12th Int. Conf. on Theory and</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="comment">// Applications of Satisfiability Testing (SAT09). pp. 427-440 (2009)</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#aa4fe3dc3bb5374a3ae58ae0f551be128">SolveWithWPM1</a>(<a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> SatSolver* solver, std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="comment">// Solves num_times the decision version of the given problem with different</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment">// random parameters. Keep the best solution (regarding the objective) and</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="comment">// returns it in solution. The problem is assumed to be already loaded into the</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="comment">// given solver.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5fcb9c949843305a0682f8cac476f3ea">SolveWithRandomParameters</a>(</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log, <span class="keyword">const</span> LinearBooleanProblem&amp; problem, <span class="keywordtype">int</span> num_times,</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> absl::BitGenRef random, SatSolver* solver, std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> </div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="comment">// Starts by solving the decision version of the given LinearBooleanProblem and</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="comment">// then simply add a constraint to find a lower objective that the current best</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="comment">// solution and repeat until the problem becomes unsat.</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="comment">//</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="comment">// The problem is assumed to be already loaded into the given solver. If</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="comment">// solution is initially a feasible solution, the search will starts from there.</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="comment">// solution will be updated with the best solution found so far.</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5cafa03de29acf965c3fc23dfa7eba0a">SolveWithLinearScan</a>(<a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> SatSolver* solver,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="comment">// Similar algorithm as the one used by qmaxsat, this is a linear scan with the</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="comment">// at-most k constraint encoded in SAT. This only works on problems with</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment">// constant weights.</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ae471a0701f750ca0c32a3fe8828f04f2">SolveWithCardinalityEncoding</a>(</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log, <span class="keyword">const</span> LinearBooleanProblem&amp; problem, SatSolver* solver,</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="comment">// This is an original algorithm. It is a mix between the cardinality encoding</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="comment">// and the Fu &amp; Malik algorithm. It also works on general weighted instances.</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1b36a95b81f69a73d04b1b42fd40c4db">SolveWithCardinalityEncodingAndCore</a>(</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <a class="code hl_enumeration" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log, <span class="keyword">const</span> LinearBooleanProblem&amp; problem, SatSolver* solver,</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="comment">// Model-based API to minimize a given IntegerVariable by solving a sequence of</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="comment">// decision problem. Each problem is solved using SolveIntegerProblem(). Returns</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span><span class="comment">// the status of the last solved decision problem.</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span><span class="comment">//</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span><span class="comment">// The feasible_solution_observer function will be called each time a new</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="comment">// feasible solution is found.</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="comment">//</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="comment">// Note that this function will resume the search from the current state of the</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span><span class="comment">// solver, and it is up to the client to backtrack to the root node if needed.</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span><a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#affe1669ec9e0e7cbd54e895bbbff43af">MinimizeIntegerVariableWithLinearScanAndLazyEncoding</a>(</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> IntegerVariable objective_var,</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>()&gt;&amp; feasible_solution_observer, Model* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="comment">// Use a low conflict limit and performs a binary search to try to restrict the</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span><span class="comment">// domain of objective_var.</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a166c4d1be17bdfcad1986b1f72c49e52">RestrictObjectiveDomainWithBinarySearch</a>(</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> IntegerVariable objective_var,</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>()&gt;&amp; feasible_solution_observer, Model* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="comment">// Same as MinimizeIntegerVariableWithLinearScanAndLazyEncoding() but use</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="comment">// a core-based approach instead. Note that the given objective_var is just used</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><span class="comment">// for reporting the lower-bound/upper-bound and do not need to be linked with</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span><span class="comment">// its linear representation.</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span><span class="comment">//</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="comment">// Unlike MinimizeIntegerVariableWithLinearScanAndLazyEncoding() this function</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span><span class="comment">// just return the last solver status. In particular if it is INFEASIBLE but</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="comment">// feasible_solution_observer() was called, it means we are at OPTIMAL.</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html"> 148</a></span><span class="keyword">class </span><a class="code hl_class" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a> {</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a02a9dc1603fd32ca7d13e2db95316bb2">CoreBasedOptimizer</a>(IntegerVariable objective_var,</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; variables,</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code hl_variable" href="gscip__solver_8cc.html#aa59e74cc299dbf75fa6e2234dd0849a2">coefficients</a>,</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> std::function&lt;<span class="keywordtype">void</span>()&gt; feasible_solution_observer,</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="comment">// TODO(user): Change the algo slighlty to allow resuming from the last</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="comment">// aborted position. Currently, the search is &quot;resumable&quot;, but it will restart</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="comment">// some of the work already done, so it might just never find anything.</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a4398d89730acb3b628a3c81d55bac96f">Optimize</a>();</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="comment">// A different way to encode the objective as core are found. This one do</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="comment">// not introduce IntegerVariable and encode everything in Boolean.</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="comment">//</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="comment">// It seems to be more powerful, but it isn&#39;t completely implemented yet.</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="comment">// TODO(user):</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="comment">// - Make it work for integer variable in the objective.</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="comment">// - Only call it if the objective domain is not too large?</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="comment">// - Support resuming for interleaved search.</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="comment">// - Implement all core heurisitics.</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a45856917789a7fa03d7d2bb9733c6f0c">OptimizeWithSatEncoding</a>(</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keyword">const</span> std::vector&lt;Literal&gt;&amp; literals,</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keyword">const</span> std::vector&lt;Coefficient&gt;&amp; <a class="code hl_variable" href="gscip__solver_8cc.html#aa59e74cc299dbf75fa6e2234dd0849a2">coefficients</a>, <a class="code hl_typedef" href="namespaceoperations__research_1_1math__opt.html#ab61209db5b13f0d424da009e414298fc">Coefficient</a> offset);</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a02a9dc1603fd32ca7d13e2db95316bb2">CoreBasedOptimizer</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp; operator=(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keyword">struct </span>ObjectiveTerm {</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> IntegerVariable <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> IntegerValue <a class="code hl_variable" href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a>;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordtype">int</span> depth; <span class="comment">// Only for logging/debugging.</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> IntegerValue old_var_lb;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> </div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="comment">// An upper bound on the optimal solution if we were to optimize only this</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="comment">// term. This is used by the cover optimization code.</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> IntegerValue cover_ub;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> };</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="comment">// This will be called each time a feasible solution is found. Returns false</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="comment">// if a conflict was detected while trying to constrain the objective to a</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="comment">// smaller value.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keywordtype">bool</span> ProcessSolution();</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> </div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="comment">// Use the gap an implied bounds to propagated the bounds of the objective</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="comment">// variables and of its terms.</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordtype">bool</span> PropagateObjectiveBounds();</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> </div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="comment">// Heuristic that aim to find the &quot;real&quot; lower bound of the objective on each</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="comment">// core by using a linear scan optimization approach.</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keywordtype">bool</span> CoverOptimization();</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="comment">// Computes the next stratification threshold.</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// Sets it to zero if all the assumptions where already considered.</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordtype">void</span> ComputeNextStratificationThreshold();</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> </div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="comment">// If we have an &quot;at most one can be false&quot; between literals with a positive</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="comment">// cost, you then know that at least n - 1 will contribute to the cost, and</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="comment">// you can increase the objective lower bound. This is the same as having</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="comment">// a real &quot;at most one&quot; constraint on the negation of such literals.</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="comment">//</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="comment">// This detects such &quot;at most ones&quot; and rewrite the objective accordingly.</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="comment">// For each at most one, the rewrite create a new Boolean variable and update</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="comment">// the cost so that the trivial objective lower bound reflect the increase.</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="comment">//</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="comment">// TODO(user) : Code that as a general presolve rule? I am not sure adding</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="comment">// the extra Booleans is always a good idea though. Especially since the LP</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="comment">// will see the same lower bound that what is computed by this.</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keywordtype">void</span> PresolveObjectiveWithAtMostOne(std::vector&lt;Literal&gt;* literals,</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> std::vector&lt;Coefficient&gt;* <a class="code hl_variable" href="gscip__solver_8cc.html#aa59e74cc299dbf75fa6e2234dd0849a2">coefficients</a>,</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <a class="code hl_typedef" href="namespaceoperations__research_1_1math__opt.html#ab61209db5b13f0d424da009e414298fc">Coefficient</a>* offset);</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> </div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> SatParameters* parameters_;</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* sat_solver_;</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <a class="code hl_class" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>* time_limit_;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>* implications_;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail_;</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* integer_encoder_;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* model_;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> </div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> IntegerVariable objective_var_;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> std::vector&lt;ObjectiveTerm&gt; terms_;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> IntegerValue stratification_threshold_;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> std::function&lt;void()&gt; feasible_solution_observer_;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="comment">// This is used to not add the objective equation more than once if we</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="comment">// solve in &quot;chunk&quot;.</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keywordtype">bool</span> already_switched_to_linear_scan_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> </div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="comment">// Set to true when we need to abort early.</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <span class="comment">//</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="comment">// TODO(user): This is only used for the stop after first solution parameter</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="comment">// which should likely be handled differently by simply using the normal way</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="comment">// to stop a solver from the feasible solution callback.</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordtype">bool</span> stop_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span>};</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> </div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span>} <span class="comment">// namespace sat</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span>} <span class="comment">// namespace operations_research</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> </div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span><span class="preprocessor">#endif </span><span class="comment">// OR_TOOLS_SAT_OPTIMIZATION_H_</span></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#l00106">time_limit.h:106</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_binary_implication_graph_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">operations_research::sat::BinaryImplicationGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00457">clause.h:457</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_core_based_optimizer_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">operations_research::sat::CoreBasedOptimizer</a></div><div class="ttdef"><b>Definition:</b> <a href="optimization_8h_source.html#l00148">optimization.h:148</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_core_based_optimizer_html_a02a9dc1603fd32ca7d13e2db95316bb2"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a02a9dc1603fd32ca7d13e2db95316bb2">operations_research::sat::CoreBasedOptimizer::CoreBasedOptimizer</a></div><div class="ttdeci">CoreBasedOptimizer(IntegerVariable objective_var, const std::vector&lt; IntegerVariable &gt; &amp;variables, const std::vector&lt; IntegerValue &gt; &amp;coefficients, std::function&lt; void()&gt; feasible_solution_observer, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l01294">optimization.cc:1294</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_core_based_optimizer_html_a4398d89730acb3b628a3c81d55bac96f"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a4398d89730acb3b628a3c81d55bac96f">operations_research::sat::CoreBasedOptimizer::Optimize</a></div><div class="ttdeci">SatSolver::Status Optimize()</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l01771">optimization.cc:1771</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_core_based_optimizer_html_a45856917789a7fa03d7d2bb9733c6f0c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a45856917789a7fa03d7d2bb9733c6f0c">operations_research::sat::CoreBasedOptimizer::OptimizeWithSatEncoding</a></div><div class="ttdeci">SatSolver::Status OptimizeWithSatEncoding(const std::vector&lt; Literal &gt; &amp;literals, const std::vector&lt; Coefficient &gt; &amp;coefficients, Coefficient offset)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l01529">optimization.cc:1529</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_encoder_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_encoder.html">operations_research::sat::IntegerEncoder</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00362">integer.h:362</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00620">integer.h:620</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html">operations_research::sat::Model</a></div><div class="ttdoc">Class that owns everything related to a particular optimization model.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00042">sat/model.h:42</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_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#l00061">sat_solver.h:61</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#l00183">sat_solver.h:183</a></div></div>
<div class="ttc" id="acp__model__mapping_8h_html"><div class="ttname"><a href="cp__model__mapping_8h.html">cp_model_mapping.h</a></div></div>
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01874">expr_array.cc:1874</a></div></div>
<div class="ttc" id="agscip__solver_8cc_html_aa59e74cc299dbf75fa6e2234dd0849a2"><div class="ttname"><a href="gscip__solver_8cc.html#aa59e74cc299dbf75fa6e2234dd0849a2">coefficients</a></div><div class="ttdeci">absl::Span&lt; const double &gt; coefficients</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00140">gscip_solver.cc:140</a></div></div>
<div class="ttc" id="agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf"><div class="ttname"><a href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a></div><div class="ttdeci">GRBmodel * model</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00274">gurobi_interface.cc:274</a></div></div>
<div class="ttc" id="ainteger_8h_html"><div class="ttname"><a href="integer_8h.html">integer.h</a></div></div>
<div class="ttc" id="ainteger__search_8h_html"><div class="ttname"><a href="integer__search_8h.html">integer_search.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_ab61209db5b13f0d424da009e414298fc"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#ab61209db5b13f0d424da009e414298fc">operations_research::math_opt::Coefficient</a></div><div class="ttdeci">std::tuple&lt; int64_t, int64_t, const double &gt; Coefficient</div><div class="ttdef"><b>Definition:</b> <a href="sparse__collection__matchers_8h_source.html#l00061">sparse_collection_matchers.h:61</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a166c4d1be17bdfcad1986b1f72c49e52"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a166c4d1be17bdfcad1986b1f72c49e52">operations_research::sat::RestrictObjectiveDomainWithBinarySearch</a></div><div class="ttdeci">void RestrictObjectiveDomainWithBinarySearch(IntegerVariable objective_var, const std::function&lt; void()&gt; &amp;feasible_solution_observer, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l01109">optimization.cc:1109</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1b36a95b81f69a73d04b1b42fd40c4db"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1b36a95b81f69a73d04b1b42fd40c4db">operations_research::sat::SolveWithCardinalityEncodingAndCore</a></div><div class="ttdeci">SatSolver::Status SolveWithCardinalityEncodingAndCore(LogBehavior log, const LinearBooleanProblem &amp;problem, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00970">optimization.cc:970</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5cafa03de29acf965c3fc23dfa7eba0a"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5cafa03de29acf965c3fc23dfa7eba0a">operations_research::sat::SolveWithLinearScan</a></div><div class="ttdeci">SatSolver::Status SolveWithLinearScan(LogBehavior log, const LinearBooleanProblem &amp;problem, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00856">optimization.cc:856</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5fcb9c949843305a0682f8cac476f3ea"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5fcb9c949843305a0682f8cac476f3ea">operations_research::sat::SolveWithRandomParameters</a></div><div class="ttdeci">SatSolver::Status SolveWithRandomParameters(LogBehavior log, const LinearBooleanProblem &amp;problem, int num_times, absl::BitGenRef random, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00778">optimization.cc:778</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_aa4fe3dc3bb5374a3ae58ae0f551be128"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#aa4fe3dc3bb5374a3ae58ae0f551be128">operations_research::sat::SolveWithWPM1</a></div><div class="ttdeci">SatSolver::Status SolveWithWPM1(LogBehavior log, const LinearBooleanProblem &amp;problem, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00481">optimization.cc:481</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ab76a35e6ff810ad9ea8b58c7c11606cb"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ab76a35e6ff810ad9ea8b58c7c11606cb">operations_research::sat::MinimizeCoreWithPropagation</a></div><div class="ttdeci">void MinimizeCoreWithPropagation(TimeLimit *limit, SatSolver *solver, std::vector&lt; Literal &gt; *core)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00223">optimization.cc:223</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ac8d4f52bbb23604c511dfeca406b1685"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ac8d4f52bbb23604c511dfeca406b1685">operations_research::sat::SolveWithFuMalik</a></div><div class="ttdeci">SatSolver::Status SolveWithFuMalik(LogBehavior log, const LinearBooleanProblem &amp;problem, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00284">optimization.cc:284</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae471a0701f750ca0c32a3fe8828f04f2"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae471a0701f750ca0c32a3fe8828f04f2">operations_research::sat::SolveWithCardinalityEncoding</a></div><div class="ttdeci">SatSolver::Status SolveWithCardinalityEncoding(LogBehavior log, const LinearBooleanProblem &amp;problem, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00902">optimization.cc:902</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_af6b2a98aa9ebc72821c544fac3e01238"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">operations_research::sat::LogBehavior</a></div><div class="ttdeci">LogBehavior</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8h_source.html#l00051">optimization.h:51</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c">operations_research::sat::DEFAULT_LOG</a></div><div class="ttdeci">@ DEFAULT_LOG</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8h_source.html#l00051">optimization.h:51</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_af6b2a98aa9ebc72821c544fac3e01238a6c3f20e225309c66fdb5481433e5bd2f"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a6c3f20e225309c66fdb5481433e5bd2f">operations_research::sat::STDOUT_LOG</a></div><div class="ttdeci">@ STDOUT_LOG</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8h_source.html#l00051">optimization.h:51</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_affe1669ec9e0e7cbd54e895bbbff43af"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#affe1669ec9e0e7cbd54e895bbbff43af">operations_research::sat::MinimizeIntegerVariableWithLinearScanAndLazyEncoding</a></div><div class="ttdeci">SatSolver::Status MinimizeIntegerVariableWithLinearScanAndLazyEncoding(IntegerVariable objective_var, const std::function&lt; void()&gt; &amp;feasible_solution_observer, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l01075">optimization.cc:1075</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">Collection of objects used to extend the Constraint Solver library.</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<div class="ttc" id="apack_8cc_html_a4255f714cea26cdd64f6a0ee72d34a8c"><div class="ttname"><a href="pack_8cc.html#a4255f714cea26cdd64f6a0ee72d34a8c">weight</a></div><div class="ttdeci">int64_t weight</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00510">pack.cc:510</a></div></div>
<div class="ttc" id="apb__constraint_8h_html"><div class="ttname"><a href="pb__constraint_8h.html">pb_constraint.h</a></div></div>
<div class="ttc" id="asat_2model_8h_html"><div class="ttname"><a href="sat_2model_8h.html">model.h</a></div></div>
<div class="ttc" id="asat__base_8h_html"><div class="ttname"><a href="sat__base_8h.html">sat_base.h</a></div></div>
<div class="ttc" id="asat__solver_8h_html"><div class="ttname"><a href="sat__solver_8h.html">sat_solver.h</a></div></div>
<div class="ttc" id="atime__limit_8h_html"><div class="ttname"><a href="time__limit_8h.html">time_limit.h</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_dddac007a45022d9da6ea1dee012c3b9.html">sat</a></li><li class="navelem"><a class="el" href="optimization_8h.html">optimization.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.3 </li>
</ul>
</div>
</body>
</html>