Files
ortools-clone/docs/cpp/optimization_8h_source.html
2021-02-26 14:48:18 +01:00

377 lines
59 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: 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">8.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('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 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">#ifndef OR_TOOLS_SAT_OPTIMIZATION_H_</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#define OR_TOOLS_SAT_OPTIMIZATION_H_</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;functional&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;<a class="code" href="boolean__problem_8pb_8h.html">ortools/sat/boolean_problem.pb.h</a>&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cp__model__loader_8h.html">ortools/sat/cp_model_loader.h</a>&quot;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="integer_8h.html">ortools/sat/integer.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="integer__search_8h.html">ortools/sat/integer_search.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="sat_2model_8h.html">ortools/sat/model.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="sat__base_8h.html">ortools/sat/sat_base.h</a>&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sat__solver_8h.html">ortools/sat/sat_solver.h</a>&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">namespace </span>sat {</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">// Like MinimizeCore() with a slower but strictly better heuristic. This</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">// algorithm should produce a minimal core with respect to propagation. We put</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<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 name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">// be inferred by propagation by any subset of the other literal, it will be</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment">// removed.</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">// Note that this function doest NOT preserve the order of Literal in the core.</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment">// TODO(user): Avoid spending too much time trying to minimize a core.</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#ab76a35e6ff810ad9ea8b58c7c11606cb">MinimizeCoreWithPropagation</a>(TimeLimit* limit, SatSolver* solver,</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; std::vector&lt;Literal&gt;* core);</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; </div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">// Because the Solve*() functions below are also used in scripts that requires a</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// special output format, we use this to tell them whether or not to use the</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">// default logging framework or simply stdout. Most users should just use</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">// DEFAULT_LOG.</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c"> 47</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> { <a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a42baf94aedd2ab641e93fa64d392906c">DEFAULT_LOG</a>, <a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238a6c3f20e225309c66fdb5481433e5bd2f">STDOUT_LOG</a> };</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment">// All the Solve*() functions below reuse the SatSolver::Status with a slightly</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment">// different meaning:</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment">// - FEASIBLE: The problem has been solved to optimality.</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment">// - INFEASIBLE: Same meaning, the decision version is already unsat.</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment">// - LIMIT_REACHED: we may have some feasible solution (if solution is</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment">// non-empty), but the optimality is not proven.</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; </div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment">// Implements the &quot;Fu &amp; Malik&quot; algorithm described in:</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment">// Zhaohui Fu, Sharad Malik, &quot;On solving the Partial MAX-SAT problem&quot;, 2006,</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment">// International Conference on Theory and Applications of Satisfiability</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment">// Testing. (SAT06), LNCS 4121.</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment">// This algorithm requires all the objective weights to be the same (CHECKed)</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment">// and currently only works on minimization problems. The problem is assumed to</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment">// be already loaded into the given solver.</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">// TODO(user): double-check the correctness if the objective coefficients are</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="comment">// negative.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#ac8d4f52bbb23604c511dfeca406b1685">SolveWithFuMalik</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; SatSolver* solver,</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; std::vector&lt;bool&gt;* solution);</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">// The WPM1 algorithm is a generalization of the Fu &amp; Malik algorithm to</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="comment">// weighted problems. Note that if all objective weights are the same, this is</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;<span class="comment">// almost the same as SolveWithFuMalik() but the encoding of the constraints is</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="comment">// slightly different.</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="comment">// Ansotegui, C., Bonet, M.L., Levy, J.: Solving (weighted) partial MaxSAT</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="comment">// through satisfiability testing. In: Proc. of the 12th Int. Conf. on Theory and</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="comment">// Applications of Satisfiability Testing (SAT09). pp. 427-440 (2009)</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#aa4fe3dc3bb5374a3ae58ae0f551be128">SolveWithWPM1</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; SatSolver* solver, std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="comment">// Solves num_times the decision version of the given problem with different</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="comment">// random parameters. Keep the best solution (regarding the objective) and</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment">// returns it in solution. The problem is assumed to be already loaded into the</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment">// given solver.</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#adb8f016144f3565c4b693b59f9dc69b8">SolveWithRandomParameters</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordtype">int</span> num_times, SatSolver* solver,</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment">// Starts by solving the decision version of the given LinearBooleanProblem and</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment">// then simply add a constraint to find a lower objective that the current best</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="comment">// solution and repeat until the problem becomes unsat.</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="comment">// The problem is assumed to be already loaded into the given solver. If</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment">// solution is initially a feasible solution, the search will starts from there.</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment">// solution will be updated with the best solution found so far.</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a5cafa03de29acf965c3fc23dfa7eba0a">SolveWithLinearScan</a>(<a class="code" href="namespaceoperations__research_1_1sat.html#af6b2a98aa9ebc72821c544fac3e01238">LogBehavior</a> log,</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">const</span> LinearBooleanProblem&amp; problem,</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; SatSolver* solver,</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="comment">// Similar algorithm as the one used by qmaxsat, this is a linear scan with the</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="comment">// at-most k constraint encoded in SAT. This only works on problems with</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="comment">// constant weights.</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#ae471a0701f750ca0c32a3fe8828f04f2">SolveWithCardinalityEncoding</a>(</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <a class="code" 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 name="l00110"></a><span class="lineno"> 110</span>&#160; std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="comment">// This is an original algorithm. It is a mix between the cardinality encoding</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="comment">// and the Fu &amp; Malik algorithm. It also works on general weighted instances.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a1b36a95b81f69a73d04b1b42fd40c4db">SolveWithCardinalityEncodingAndCore</a>(</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" 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 name="l00116"></a><span class="lineno"> 116</span>&#160; std::vector&lt;bool&gt;* solution);</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="comment">// Model-based API, for now we just provide a basic algorithm that minimizes a</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="comment">// given IntegerVariable by solving a sequence of decision problem by using</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="comment">// SolveIntegerProblem(). Returns the status of the last solved decision</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="comment">// problem.</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="comment">// The feasible_solution_observer function will be called each time a new</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="comment">// feasible solution is found.</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="comment">// Note that this function will resume the search from the current state of the</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<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 name="l00128"></a><span class="lineno"> 128</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#affe1669ec9e0e7cbd54e895bbbff43af">MinimizeIntegerVariableWithLinearScanAndLazyEncoding</a>(</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; IntegerVariable objective_var,</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>()&gt;&amp; feasible_solution_observer, Model* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">// Use a low conflict limit and performs a binary search to try to restrict the</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">// domain of objective_var.</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceoperations__research_1_1sat.html#a166c4d1be17bdfcad1986b1f72c49e52">RestrictObjectiveDomainWithBinarySearch</a>(</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; IntegerVariable objective_var,</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>()&gt;&amp; feasible_solution_observer, Model* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment">// Same as MinimizeIntegerVariableWithLinearScanAndLazyEncoding() but use</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment">// a core-based approach instead. Note that the given objective_var is just used</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment">// for reporting the lower-bound/upper-bound and do not need to be linked with</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="comment">// its linear representation.</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="comment">// Unlike MinimizeIntegerVariableWithLinearScanAndLazyEncoding() this function</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="comment">// just return the last solver status. In particular if it is INFEASIBLE but</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment">// feasible_solution_observer() was called, it means we are at OPTIMAL.</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html"> 146</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a> {</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a02a9dc1603fd32ca7d13e2db95316bb2">CoreBasedOptimizer</a>(IntegerVariable objective_var,</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerVariable&gt;&amp; variables,</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keyword">const</span> std::vector&lt;IntegerValue&gt;&amp; <a class="code" href="sat_2lp__utils_8cc.html#ab1734711414da2e668957d24a41b1ddf">coefficients</a>,</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; std::function&lt;<span class="keywordtype">void</span>()&gt; feasible_solution_observer,</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// TODO(user): Change the algo slighlty to allow resuming from the last</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// aborted position. Currently, the search is &quot;resumable&quot;, but it will restart</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// some of the work already done, so it might just never find anything.</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a4398d89730acb3b628a3c81d55bac96f">Optimize</a>();</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html#a02a9dc1603fd32ca7d13e2db95316bb2">CoreBasedOptimizer</a>(<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1sat_1_1_core_based_optimizer.html">CoreBasedOptimizer</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">struct </span>ObjectiveTerm {</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; IntegerVariable <a class="code" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; IntegerValue <a class="code" href="pack_8cc.html#ae42ca38a167164c07831993889216903">weight</a>;</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keywordtype">int</span> depth; <span class="comment">// Only for logging/debugging.</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; IntegerValue old_var_lb;</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">// An upper bound on the optimal solution if we were to optimize only this</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="comment">// term. This is used by the cover optimization code.</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; IntegerValue cover_ub;</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; };</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="comment">// This will be called each time a feasible solution is found. Returns false</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// if a conflict was detected while trying to constrain the objective to a</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="comment">// smaller value.</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordtype">bool</span> ProcessSolution();</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="comment">// Use the gap an implied bounds to propagated the bounds of the objective</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="comment">// variables and of its terms.</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordtype">bool</span> PropagateObjectiveBounds();</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <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 name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// core by using a linear scan optimization approach.</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordtype">bool</span> CoverOptimization();</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// Computes the next stratification threshold.</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="comment">// Sets it to zero if all the assumptions where already considered.</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordtype">void</span> ComputeNextStratificationThreshold();</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; SatParameters* parameters_;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>* sat_solver_;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>* time_limit_;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>* integer_trail_;</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_integer_encoder.html">IntegerEncoder</a>* integer_encoder_;</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* model_; <span class="comment">// TODO(user): remove this one.</span></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; IntegerVariable objective_var_;</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; std::vector&lt;ObjectiveTerm&gt; terms_;</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; IntegerValue stratification_threshold_;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; std::function&lt;void()&gt; feasible_solution_observer_;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">// This is used to not add the objective equation more than once if we</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// solve in &quot;chunk&quot;.</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordtype">bool</span> already_switched_to_linear_scan_ = <span class="keyword">false</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">// Set to true when we need to abort early.</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// TODO(user): This is only used for the stop after first solution parameter</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">// which should likely be handled differently by simply using the normal way</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="comment">// to stop a solver from the feasible solution callback.</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordtype">bool</span> stop_ = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;};</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; </div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;<span class="comment">// Generalization of the max-HS algorithm (HS stands for Hitting Set). This is</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;<span class="comment">// similar to MinimizeWithCoreAndLazyEncoding() but it uses a hybrid approach</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;<span class="comment">// with a MIP solver to handle the discovered infeasibility cores.</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;<span class="comment">// See, Jessica Davies and Fahiem Bacchus, &quot;Solving MAXSAT by Solving a</span></div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;<span class="comment">// Sequence of Simpler SAT Instances&quot;,</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;<span class="comment">// http://www.cs.toronto.edu/~jdavies/daviesCP11.pdf&quot;</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;<span class="comment">// Note that an implementation of this approach won the 2016 max-SAT competition</span></div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;<span class="comment">// on the industrial category, see</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;<span class="comment">// http://maxsat.ia.udl.cat/results/#wpms-industrial</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="comment">// TODO(user): This function brings dependency to the SCIP MIP solver which is</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;<span class="comment">// quite big, maybe we should find a way not to do that.</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<a class="code" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> <a class="code" href="namespaceoperations__research_1_1sat.html#a7d1c65f24756bb9dad18da1f5e82bb9c">MinimizeWithHittingSetAndLazyEncoding</a>(</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keyword">const</span> <a class="code" href="structoperations__research_1_1sat_1_1_objective_definition.html">ObjectiveDefinition</a>&amp; objective_definition,</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>()&gt;&amp; feasible_solution_observer, <a class="code" href="classoperations__research_1_1sat_1_1_model.html">Model</a>* <a class="code" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;} <span class="comment">// namespace sat</span></div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;} <span class="comment">// namespace operations_research</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; </div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// OR_TOOLS_SAT_OPTIMIZATION_H_</span></div>
<div class="ttc" id="aboolean__problem_8pb_8h_html"><div class="ttname"><a href="boolean__problem_8pb_8h.html">boolean_problem.pb.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html">operations_research::TimeLimit</a></div><div class="ttdoc">A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00105">time_limit.h:105</a></div></div>
<div class="ttc" id="aclassoperations__research_1_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#l00146">optimization.h:146</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#l01310">optimization.cc:1310</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#l01540">optimization.cc:1540</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#l00276">integer.h:276</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#l00540">integer.h:540</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_model_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model.html">operations_research::sat::Model</a></div><div class="ttdoc">Class that owns everything related to a particular optimization model.</div><div class="ttdef"><b>Definition:</b> <a href="sat_2model_8h_source.html#l00038">sat/model.h:38</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_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_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="acp__model__loader_8h_html"><div class="ttname"><a href="cp__model__loader_8h.html">cp_model_loader.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#l01858">expr_array.cc:1858</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#l00272">gurobi_interface.cc:272</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_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#l01091">optimization.cc:1091</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#l00956">optimization.cc:956</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#l00842">optimization.cc:842</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7d1c65f24756bb9dad18da1f5e82bb9c"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7d1c65f24756bb9dad18da1f5e82bb9c">operations_research::sat::MinimizeWithHittingSetAndLazyEncoding</a></div><div class="ttdeci">SatSolver::Status MinimizeWithHittingSetAndLazyEncoding(const ObjectiveDefinition &amp;objective_definition, 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#l01757">optimization.cc:1757</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#l00465">optimization.cc:465</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#l00218">optimization.cc:218</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#l00268">optimization.cc:268</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_adb8f016144f3565c4b693b59f9dc69b8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#adb8f016144f3565c4b693b59f9dc69b8">operations_research::sat::SolveWithRandomParameters</a></div><div class="ttdeci">SatSolver::Status SolveWithRandomParameters(LogBehavior log, const LinearBooleanProblem &amp;problem, int num_times, SatSolver *solver, std::vector&lt; bool &gt; *solution)</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00762">optimization.cc:762</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#l00888">optimization.cc:888</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#l00047">optimization.h:47</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#l00047">optimization.h:47</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#l00047">optimization.h:47</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#l01058">optimization.cc:1058</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="apack_8cc_html_ae42ca38a167164c07831993889216903"><div class="ttname"><a href="pack_8cc.html#ae42ca38a167164c07831993889216903">weight</a></div><div class="ttdeci">int64 weight</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00509">pack.cc:509</a></div></div>
<div class="ttc" id="asat_2lp__utils_8cc_html_ab1734711414da2e668957d24a41b1ddf"><div class="ttname"><a href="sat_2lp__utils_8cc.html#ab1734711414da2e668957d24a41b1ddf">coefficients</a></div><div class="ttdeci">std::vector&lt; double &gt; coefficients</div><div class="ttdef"><b>Definition:</b> <a href="sat_2lp__utils_8cc_source.html#l00496">sat/lp_utils.cc:496</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="astructoperations__research_1_1sat_1_1_objective_definition_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_objective_definition.html">operations_research::sat::ObjectiveDefinition</a></div><div class="ttdef"><b>Definition:</b> <a href="cp__model__loader_8h_source.html#l00038">cp_model_loader.h:38</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.1 </li>
</ul>
</div>
</body>
</html>