985 lines
196 KiB
HTML
985 lines
196 KiB
HTML
<!-- HTML header for doxygen 1.8.18-->
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.9.3"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>OR-Tools: probing.cc Source File</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">OR-Tools
|
|
 <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&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&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&dn=expat.txt MIT */
|
|
$(document).ready(function(){initNavTree('probing_8cc_source.html',''); initResizable(); });
|
|
/* @license-end */
|
|
</script>
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle"><div class="title">probing.cc</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="probing_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
|
|
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</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 "AS IS" BASIS,</span></div>
|
|
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
|
|
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
|
|
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
|
|
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
|
|
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include "<a class="code" href="probing_8h.html">ortools/sat/probing.h</a>"</span></div>
|
|
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
|
|
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include <cstdint></span></div>
|
|
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include <utility></span></div>
|
|
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include <vector></span></div>
|
|
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
|
|
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include "absl/container/inlined_vector.h"</span></div>
|
|
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include "absl/types/span.h"</span></div>
|
|
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include "<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>"</span></div>
|
|
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include "<a class="code" href="strong__vector_8h.html">ortools/base/strong_vector.h</a>"</span></div>
|
|
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include "<a class="code" href="timer_8h.html">ortools/base/timer.h</a>"</span></div>
|
|
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include "<a class="code" href="clause_8h.html">ortools/sat/clause.h</a>"</span></div>
|
|
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include "<a class="code" href="implied__bounds_8h.html">ortools/sat/implied_bounds.h</a>"</span></div>
|
|
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include "<a class="code" href="integer_8h.html">ortools/sat/integer.h</a>"</span></div>
|
|
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include "<a class="code" href="sat_2model_8h.html">ortools/sat/model.h</a>"</span></div>
|
|
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include "<a class="code" href="sat__base_8h.html">ortools/sat/sat_base.h</a>"</span></div>
|
|
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include "ortools/sat/sat_parameters.pb.h"</span></div>
|
|
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include "<a class="code" href="sat__solver_8h.html">ortools/sat/sat_solver.h</a>"</span></div>
|
|
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include "<a class="code" href="sat_2util_8h.html">ortools/sat/util.h</a>"</span></div>
|
|
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include "<a class="code" href="bitset_8h.html">ortools/util/bitset.h</a>"</span></div>
|
|
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include "<a class="code" href="util_2logging_8h.html">ortools/util/logging.h</a>"</span></div>
|
|
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#include "<a class="code" href="sorted__interval__list_8h.html">ortools/util/sorted_interval_list.h</a>"</span></div>
|
|
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include "<a class="code" href="strong__integers_8h.html">ortools/util/strong_integers.h</a>"</span></div>
|
|
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#include "<a class="code" href="time__limit_8h.html">ortools/util/time_limit.h</a>"</span></div>
|
|
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
|
|
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
|
|
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="keyword">namespace </span>sat {</div>
|
|
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
|
|
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_prober.html#ab10b5a52f5a6dd0a183f208f85be1503"> 43</a></span><a class="code hl_function" href="classoperations__research_1_1sat_1_1_prober.html#ab10b5a52f5a6dd0a183f208f85be1503">Prober::Prober</a>(<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="l00044" name="l00044"></a><span class="lineno"> 44</span> : trail_(*<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>>()),</div>
|
|
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> assignment_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>>()-><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>()),</div>
|
|
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> integer_trail_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_integer_trail.html">IntegerTrail</a>>()),</div>
|
|
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> implied_bounds_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_implied_bounds.html">ImpliedBounds</a>>()),</div>
|
|
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> sat_solver_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>>()),</div>
|
|
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> time_limit_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>>()),</div>
|
|
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> implication_graph_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>>()),</div>
|
|
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> logger_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1_solver_logger.html">SolverLogger</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"><a class="line" href="classoperations__research_1_1sat_1_1_prober.html#a85633e19f7fa9ac7f6155b23ce845fa6"> 53</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_prober.html#a85633e19f7fa9ac7f6155b23ce845fa6">Prober::ProbeBooleanVariables</a>(<span class="keyword">const</span> <span class="keywordtype">double</span> deterministic_time_limit) {</div>
|
|
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
|
|
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> std::vector<BooleanVariable> bool_vars;</div>
|
|
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordflow">for</span> (BooleanVariable <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>(0); <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a> < num_variables; ++<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
|
|
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordflow">if</span> (implication_graph_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html#a6fac58ca16fd746d7488a0a97f6965bd">RepresentativeOf</a>(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) != <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) {</div>
|
|
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> }</div>
|
|
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> bool_vars.push_back(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>);</div>
|
|
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> }</div>
|
|
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_prober.html#a85633e19f7fa9ac7f6155b23ce845fa6">ProbeBooleanVariables</a>(deterministic_time_limit, bool_vars);</div>
|
|
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>}</div>
|
|
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
|
|
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="keywordtype">bool</span> Prober::ProbeOneVariableInternal(BooleanVariable <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
|
|
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> new_integer_bounds_.clear();</div>
|
|
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> propagated_.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#ab4bc8236a9bfe59526e353800a0f0470">SparseClearAll</a>();</div>
|
|
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> decision : {<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>, <span class="keyword">true</span>), <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>, <span class="keyword">false</span>)}) {</div>
|
|
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordflow">if</span> (assignment_.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">LiteralIsAssigned</a>(decision)) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> </div>
|
|
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>(), 0);</div>
|
|
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">const</span> <span class="keywordtype">int</span> saved_index = trail_.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
|
|
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9ae69b015a43c1a94e8815ab0dd8189c">EnqueueDecisionAndBackjumpOnConflict</a>(decision);</div>
|
|
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a705eddd5baee23097daf34b73e66eae3">AdvanceDeterministicTime</a>(time_limit_);</div>
|
|
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
|
|
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">if</span> (sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">IsModelUnsat</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">if</span> (sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">CurrentDecisionLevel</a>() == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
|
|
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> implied_bounds_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_implied_bounds.html#af55df3ca81000daf46c6096a71778c40">ProcessIntegerTrail</a>(decision);</div>
|
|
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> integer_trail_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#aab182be7f1a6eccbc2b14c21fce5e9dd">AppendNewBounds</a>(&new_integer_bounds_);</div>
|
|
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = saved_index + 1; i < trail_.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>(); ++i) {</div>
|
|
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keyword">const</span> Literal l = trail_[i];</div>
|
|
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
|
|
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="comment">// We mark on the first run (b.IsPositive()) and check on the second.</span></div>
|
|
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keywordflow">if</span> (decision.IsPositive()) {</div>
|
|
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> propagated_.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(l.Index());</div>
|
|
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keywordflow">if</span> (propagated_[l.Index()]) {</div>
|
|
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> to_fix_at_true_.push_back(l);</div>
|
|
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> }</div>
|
|
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> }</div>
|
|
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
|
|
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="comment">// Anything not propagated by the BinaryImplicationGraph is a "new"</span></div>
|
|
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="comment">// binary clause. This is because the BinaryImplicationGraph has the</span></div>
|
|
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="comment">// highest priority of all propagators.</span></div>
|
|
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">if</span> (trail_.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a5ed9d5f5c759afe4a008adaabd80c6f8">AssignmentType</a>(l.Variable()) !=</div>
|
|
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> implication_graph_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">PropagatorId</a>()) {</div>
|
|
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> new_binary_clauses_.push_back({decision.Negated(), l});</div>
|
|
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> }</div>
|
|
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> }</div>
|
|
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> </div>
|
|
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="comment">// Fix variable and add new binary clauses.</span></div>
|
|
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordflow">if</span> (!sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">RestoreSolverToAssumptionLevel</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Literal l : to_fix_at_true_) {</div>
|
|
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">AddUnitClause</a>(l);</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> to_fix_at_true_.clear();</div>
|
|
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">if</span> (!sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a607d97ccada862073f297bc2d495124d">FinishPropagation</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> num_new_binary_ += new_binary_clauses_.size();</div>
|
|
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> binary : new_binary_clauses_) {</div>
|
|
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#aac912e9410b8989493f492fcbb2d9094">AddBinaryClause</a>(binary.first, binary.second);</div>
|
|
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> }</div>
|
|
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> new_binary_clauses_.clear();</div>
|
|
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">if</span> (!sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a607d97ccada862073f297bc2d495124d">FinishPropagation</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> }</div>
|
|
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
|
|
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="comment">// We have at most two lower bounds for each variables (one for b==0 and one</span></div>
|
|
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="comment">// for b==1), so the min of the two is a valid level zero bound! More</span></div>
|
|
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="comment">// generally, the domain of a variable can be intersected with the union</span></div>
|
|
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="comment">// of the two propagated domains. This also allow to detect "holes".</span></div>
|
|
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="comment">// TODO(user): More generally, for any clauses (b or not(b) is one), we</span></div>
|
|
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="comment">// could probe all the literal inside, and for any integer variable, we can</span></div>
|
|
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="comment">// take the union of the propagated domain as a new domain.</span></div>
|
|
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="comment">// TODO(user): fix binary variable in the same way? It might not be as</span></div>
|
|
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="comment">// useful since probing on such variable will also fix it. But then we might</span></div>
|
|
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="comment">// abort probing early, so it might still be good.</span></div>
|
|
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> std::sort(new_integer_bounds_.begin(), new_integer_bounds_.end(),</div>
|
|
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> [](IntegerLiteral <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, IntegerLiteral <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) { return a.var < b.var; });</div>
|
|
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
|
|
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="comment">// This is used for the hole detection.</span></div>
|
|
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> IntegerVariable prev_var = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">kNoIntegerVariable</a>;</div>
|
|
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> IntegerValue lb_max = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
|
|
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> IntegerValue ub_min = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
|
|
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> new_integer_bounds_.push_back(IntegerLiteral()); <span class="comment">// Sentinel.</span></div>
|
|
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
|
|
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < new_integer_bounds_.size(); ++i) {</div>
|
|
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keyword">const</span> IntegerVariable <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = new_integer_bounds_[i].var;</div>
|
|
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
|
|
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="comment">// Hole detection.</span></div>
|
|
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordflow">if</span> (i > 0 && <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) != prev_var) {</div>
|
|
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">if</span> (ub_min + 1 < lb_max) {</div>
|
|
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="comment">// The variable cannot take value in (ub_min, lb_max) !</span></div>
|
|
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="comment">// TODO(user): do not create domain with a complexity that is too</span></div>
|
|
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="comment">// large?</span></div>
|
|
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">const</span> Domain old_domain =</div>
|
|
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> integer_trail_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#af4303d31360f06c50729f156b1fbc2a9">InitialVariableDomain</a>(prev_var);</div>
|
|
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keyword">const</span> Domain new_domain = old_domain.<a class="code hl_function" href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">IntersectionWith</a>(</div>
|
|
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> Domain(ub_min.value() + 1, lb_max.value() - 1).Complement());</div>
|
|
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">if</span> (new_domain != old_domain) {</div>
|
|
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> ++num_new_holes_;</div>
|
|
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">if</span> (!integer_trail_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#af931801f592e954a6623cab8cf9a4485">UpdateInitialDomain</a>(prev_var, new_domain)) {</div>
|
|
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> }</div>
|
|
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> }</div>
|
|
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> }</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">// Reinitialize.</span></div>
|
|
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> lb_max = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">kMinIntegerValue</a>;</div>
|
|
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> ub_min = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">kMaxIntegerValue</a>;</div>
|
|
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> }</div>
|
|
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> </div>
|
|
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> prev_var = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">PositiveVariable</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#ae2544d2a3a5ef4c78f8e5891f104ab41">VariableIsPositive</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
|
|
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> lb_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(lb_max, new_integer_bounds_[i].<a class="code hl_variable" href="routing__filters_8cc.html#a4f1e8002734902ae1c65ccc3fc30c98e">bound</a>);</div>
|
|
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> ub_min = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(ub_min, -new_integer_bounds_[i].<a class="code hl_variable" href="routing__filters_8cc.html#a4f1e8002734902ae1c65ccc3fc30c98e">bound</a>);</div>
|
|
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> }</div>
|
|
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
|
|
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="comment">// Bound tightening.</span></div>
|
|
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keywordflow">if</span> (i == 0 || new_integer_bounds_[i - 1].<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> != <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="keyword">const</span> IntegerValue new_bound = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(new_integer_bounds_[i - 1].<a class="code hl_variable" href="routing__filters_8cc.html#a4f1e8002734902ae1c65ccc3fc30c98e">bound</a>,</div>
|
|
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> new_integer_bounds_[i].<a class="code hl_variable" href="routing__filters_8cc.html#a4f1e8002734902ae1c65ccc3fc30c98e">bound</a>);</div>
|
|
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keywordflow">if</span> (new_bound > integer_trail_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">LowerBound</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) {</div>
|
|
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> ++num_new_integer_bounds_;</div>
|
|
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordflow">if</span> (!integer_trail_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_integer_trail.html#a05e837bb93eeabbbd94e8f690dd59d32">Enqueue</a>(</div>
|
|
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <a class="code hl_function" href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">IntegerLiteral::GreaterOrEqual</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, new_bound), {}, {})) {</div>
|
|
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> }</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> }</div>
|
|
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> </div>
|
|
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="comment">// We might have updated some integer domain, let's propagate.</span></div>
|
|
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">return</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a607d97ccada862073f297bc2d495124d">FinishPropagation</a>();</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> </div>
|
|
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_prober.html#a7d6a8a15f30eb61684dbad769f7a557f"> 190</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_prober.html#a7d6a8a15f30eb61684dbad769f7a557f">Prober::ProbeOneVariable</a>(BooleanVariable <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
|
|
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="comment">// Resize the propagated sparse bitset.</span></div>
|
|
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
|
|
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> propagated_.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#ae09e38958e558d2c776bc555a0dc2fc7">ClearAndResize</a>(LiteralIndex(2 * num_variables));</div>
|
|
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> </div>
|
|
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="comment">// Reset the solver in case it was already used.</span></div>
|
|
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
|
|
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">if</span> (!sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">RestoreSolverToAssumptionLevel</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
|
|
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5b06f24fb581de78b321dfd793931439">LiteralTrail</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
|
|
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keywordflow">if</span> (!ProbeOneVariableInternal(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</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">// Statistics</span></div>
|
|
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5b06f24fb581de78b321dfd793931439">LiteralTrail</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
|
|
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> num_new_literals_fixed_ += num_fixed - initial_num_fixed;</div>
|
|
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span>}</div>
|
|
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> </div>
|
|
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"><a class="line" href="classoperations__research_1_1sat_1_1_prober.html#a40f6edf9f9c19c241dd7d220da9acaab"> 208</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1sat_1_1_prober.html#a85633e19f7fa9ac7f6155b23ce845fa6">Prober::ProbeBooleanVariables</a>(</div>
|
|
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">const</span> <span class="keywordtype">double</span> deterministic_time_limit,</div>
|
|
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> absl::Span<const BooleanVariable> bool_vars) {</div>
|
|
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <a class="code hl_class" href="class_wall_timer.html">WallTimer</a> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
|
|
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
|
|
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
|
|
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="comment">// Reset statistics.</span></div>
|
|
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> num_new_binary_ = 0;</div>
|
|
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> num_new_holes_ = 0;</div>
|
|
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> num_new_integer_bounds_ = 0;</div>
|
|
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> num_new_literals_fixed_ = 0;</div>
|
|
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> </div>
|
|
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// Resize the propagated sparse bitset.</span></div>
|
|
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>();</div>
|
|
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> propagated_.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#ae09e38958e558d2c776bc555a0dc2fc7">ClearAndResize</a>(LiteralIndex(2 * num_variables));</div>
|
|
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> </div>
|
|
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="comment">// Reset the solver in case it was already used.</span></div>
|
|
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
|
|
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keywordflow">if</span> (!sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">RestoreSolverToAssumptionLevel</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> </div>
|
|
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5b06f24fb581de78b321dfd793931439">LiteralTrail</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
|
|
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">const</span> <span class="keywordtype">double</span> initial_deterministic_time =</div>
|
|
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> time_limit_-><a class="code hl_function" href="classoperations__research_1_1_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>();</div>
|
|
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keyword">const</span> <span class="keywordtype">double</span> limit = initial_deterministic_time + deterministic_time_limit;</div>
|
|
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
|
|
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="keywordtype">bool</span> limit_reached = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keywordtype">int</span> num_probed = 0;</div>
|
|
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> </div>
|
|
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> BooleanVariable <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a> : bool_vars) {</div>
|
|
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">if</span> (implication_graph_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html#a6fac58ca16fd746d7488a0a97f6965bd">RepresentativeOf</a>(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) != <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>) {</div>
|
|
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> }</div>
|
|
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> </div>
|
|
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="comment">// TODO(user): Instead of an hard deterministic limit, we should probably</span></div>
|
|
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="comment">// use a lower one, but reset it each time we have found something useful.</span></div>
|
|
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">if</span> (time_limit_-><a class="code hl_function" href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">LimitReached</a>() ||</div>
|
|
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> time_limit_-><a class="code hl_function" href="classoperations__research_1_1_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>() > limit) {</div>
|
|
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> limit_reached = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</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="comment">// Propagate b=1 and then b=0.</span></div>
|
|
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> ++num_probed;</div>
|
|
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keywordflow">if</span> (!ProbeOneVariableInternal(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>)) {</div>
|
|
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> }</div>
|
|
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> }</div>
|
|
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> </div>
|
|
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// Update stats.</span></div>
|
|
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5b06f24fb581de78b321dfd793931439">LiteralTrail</a>().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">Index</a>();</div>
|
|
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> num_new_literals_fixed_ = num_fixed - initial_num_fixed;</div>
|
|
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
|
|
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="comment">// Display stats.</span></div>
|
|
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keywordflow">if</span> (logger_-><a class="code hl_function" href="classoperations__research_1_1_solver_logger.html#a9492cb97f5ec0ecbce0b5ef1b085738b">LoggingIsEnabled</a>()) {</div>
|
|
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keyword">const</span> <span class="keywordtype">double</span> time_diff =</div>
|
|
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> time_limit_-><a class="code hl_function" href="classoperations__research_1_1_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>() - initial_deterministic_time;</div>
|
|
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger_, <span class="stringliteral">"[Probing] deterministic_time: "</span>, time_diff,</div>
|
|
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="stringliteral">" (limit: "</span>, deterministic_time_limit,</div>
|
|
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="stringliteral">") wall_time: "</span>, <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>(), <span class="stringliteral">" ("</span>,</div>
|
|
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> (limit_reached ? <span class="stringliteral">"Aborted "</span> : <span class="stringliteral">""</span>), num_probed, <span class="stringliteral">"/"</span>,</div>
|
|
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> bool_vars.size(), <span class="stringliteral">")"</span>);</div>
|
|
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keywordflow">if</span> (num_new_literals_fixed_ > 0) {</div>
|
|
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger_,</div>
|
|
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="stringliteral">"[Probing] - new fixed Boolean: "</span>, num_new_literals_fixed_,</div>
|
|
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="stringliteral">" ("</span>, num_fixed, <span class="stringliteral">"/"</span>, sat_solver_-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">NumVariables</a>(), <span class="stringliteral">")"</span>);</div>
|
|
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> }</div>
|
|
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="keywordflow">if</span> (num_new_holes_ > 0) {</div>
|
|
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger_, <span class="stringliteral">"[Probing] - new integer holes: "</span>, num_new_holes_);</div>
|
|
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> }</div>
|
|
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="keywordflow">if</span> (num_new_integer_bounds_ > 0) {</div>
|
|
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger_,</div>
|
|
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="stringliteral">"[Probing] - new integer bounds: "</span>, num_new_integer_bounds_);</div>
|
|
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> }</div>
|
|
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordflow">if</span> (num_new_binary_ > 0) {</div>
|
|
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger_, <span class="stringliteral">"[Probing] - new binary clause: "</span>, num_new_binary_);</div>
|
|
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> }</div>
|
|
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> }</div>
|
|
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> </div>
|
|
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span>}</div>
|
|
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> </div>
|
|
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a227161ebe5ee0b44d69f7bd8655a3e49"> 290</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a227161ebe5ee0b44d69f7bd8655a3e49">LookForTrivialSatSolution</a>(<span class="keywordtype">double</span> deterministic_time_limit, <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="l00291" name="l00291"></a><span class="lineno"> 291</span> <a class="code hl_class" href="class_wall_timer.html">WallTimer</a> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
|
|
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
|
|
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
|
|
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="comment">// Reset the solver in case it was already used.</span></div>
|
|
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <span class="keyword">auto</span>* sat_solver = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>>();</div>
|
|
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> sat_solver-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
|
|
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keywordflow">if</span> (!sat_solver->RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> </div>
|
|
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="keyword">auto</span>* <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a> = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>>();</div>
|
|
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver->LiteralTrail().Index();</div>
|
|
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <span class="keyword">auto</span>* logger = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1_solver_logger.html">SolverLogger</a>>();</div>
|
|
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> </div>
|
|
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <span class="comment">// Note that this code do not care about the non-Boolean part and just try to</span></div>
|
|
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="comment">// assign the existing Booleans.</span></div>
|
|
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> SatParameters initial_params = *<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<SatParameters>();</div>
|
|
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> SatParameters new_params = initial_params;</div>
|
|
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> new_params.set_log_search_progress(<span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> new_params.set_max_number_of_conflicts(1);</div>
|
|
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> new_params.set_max_deterministic_time(deterministic_time_limit);</div>
|
|
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> </div>
|
|
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordtype">double</span> elapsed_dtime = 0.0;</div>
|
|
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> </div>
|
|
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_times = 1000;</div>
|
|
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="keywordtype">bool</span> limit_reached = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keyword">auto</span>* random = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_model_random_generator.html">ModelRandomGenerator</a>>();</div>
|
|
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < num_times; ++i) {</div>
|
|
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ad837e6231722ead53bbaf1c6e8f66032">LimitReached</a>() ||</div>
|
|
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> elapsed_dtime > deterministic_time_limit) {</div>
|
|
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> limit_reached = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> }</div>
|
|
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
|
|
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="comment">// SetParameters() reset the deterministic time to zero inside time_limit.</span></div>
|
|
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> sat_solver->SetParameters(new_params);</div>
|
|
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> sat_solver->ResetDecisionHeuristic();</div>
|
|
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">SatSolver::Status</a> result = sat_solver->SolveWithTimeLimit(<a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>);</div>
|
|
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> elapsed_dtime += <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>();</div>
|
|
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
|
|
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">if</span> (result == <a class="code hl_enumvalue" href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">SatSolver::FEASIBLE</a>) {</div>
|
|
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger, <span class="stringliteral">"Trivial exploration found feasible solution!"</span>);</div>
|
|
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#af90cfd1fc238433fc303ee28c5914eb9">AdvanceDeterministicTime</a>(elapsed_dtime);</div>
|
|
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> }</div>
|
|
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
|
|
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keywordflow">if</span> (!sat_solver->RestoreSolverToAssumptionLevel()) {</div>
|
|
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger, <span class="stringliteral">"UNSAT during trivial exploration heuristic."</span>);</div>
|
|
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#af90cfd1fc238433fc303ee28c5914eb9">AdvanceDeterministicTime</a>(elapsed_dtime);</div>
|
|
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> }</div>
|
|
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> </div>
|
|
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="comment">// We randomize at the end so that the default params is executed</span></div>
|
|
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="comment">// at least once.</span></div>
|
|
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a0441e1a54fe203c0707131e587de8fae">RandomizeDecisionHeuristic</a>(*random, &new_params);</div>
|
|
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> new_params.set_random_seed(i);</div>
|
|
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> new_params.set_max_deterministic_time(deterministic_time_limit -</div>
|
|
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> elapsed_dtime);</div>
|
|
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> }</div>
|
|
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
|
|
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> <span class="comment">// Restore the initial parameters.</span></div>
|
|
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> sat_solver->SetParameters(initial_params);</div>
|
|
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> sat_solver->ResetDecisionHeuristic();</div>
|
|
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#af90cfd1fc238433fc303ee28c5914eb9">AdvanceDeterministicTime</a>(elapsed_dtime);</div>
|
|
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="keywordflow">if</span> (!sat_solver->RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> </div>
|
|
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordflow">if</span> (logger->LoggingIsEnabled()) {</div>
|
|
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver->LiteralTrail().Index();</div>
|
|
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_newly_fixed = num_fixed - initial_num_fixed;</div>
|
|
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver->NumVariables();</div>
|
|
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <a class="code hl_define" href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a>(logger, <span class="stringliteral">"Random exploration."</span>, <span class="stringliteral">" num_fixed: +"</span>, num_newly_fixed,</div>
|
|
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> <span class="stringliteral">" ("</span>, num_fixed, <span class="stringliteral">"/"</span>, num_variables, <span class="stringliteral">")"</span>,</div>
|
|
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="stringliteral">" dtime: "</span>, elapsed_dtime, <span class="stringliteral">"/"</span>, deterministic_time_limit,</div>
|
|
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="stringliteral">" wtime: "</span>, <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>(),</div>
|
|
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> (limit_reached ? <span class="stringliteral">" (Aborted)"</span> : <span class="stringliteral">""</span>));</div>
|
|
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> }</div>
|
|
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <span class="keywordflow">return</span> sat_solver->FinishPropagation();</div>
|
|
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span>}</div>
|
|
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
|
|
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2"> 368</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2">FailedLiteralProbingRound</a>(<a class="code hl_struct" href="structoperations__research_1_1sat_1_1_probing_options.html">ProbingOptions</a> options, <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="l00369" name="l00369"></a><span class="lineno"> 369</span> <a class="code hl_class" href="class_wall_timer.html">WallTimer</a> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>;</div>
|
|
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">Start</a>();</div>
|
|
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a> |= <a class="code hl_define" href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a>(1);</div>
|
|
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> </div>
|
|
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> <span class="comment">// Reset the solver in case it was already used.</span></div>
|
|
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keyword">auto</span>* sat_solver = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_sat_solver.html">SatSolver</a>>();</div>
|
|
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> sat_solver-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">SetAssumptionLevel</a>(0);</div>
|
|
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <span class="keywordflow">if</span> (!sat_solver->RestoreSolverToAssumptionLevel()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> </div>
|
|
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <span class="comment">// When called from Inprocessing, the implication graph should already be a</span></div>
|
|
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> <span class="comment">// DAG, so these two calls should return right away. But we do need them to</span></div>
|
|
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <span class="comment">// get the topological order if this is used in isolation.</span></div>
|
|
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keyword">auto</span>* implication_graph = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_binary_implication_graph.html">BinaryImplicationGraph</a>>();</div>
|
|
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <span class="keywordflow">if</span> (!implication_graph->DetectEquivalences()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="keywordflow">if</span> (!sat_solver->FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> </div>
|
|
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keyword">auto</span>* <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a> = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1_time_limit.html">TimeLimit</a>>();</div>
|
|
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keyword">const</span> <span class="keywordtype">int</span> initial_num_fixed = sat_solver->LiteralTrail().Index();</div>
|
|
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keyword">const</span> <span class="keywordtype">double</span> initial_deterministic_time =</div>
|
|
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>();</div>
|
|
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keyword">const</span> <span class="keywordtype">double</span> limit = initial_deterministic_time + options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a4f572c68b7bf3aac70b3f5292398ff7b">deterministic_limit</a>;</div>
|
|
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> </div>
|
|
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = sat_solver->NumVariables();</div>
|
|
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <a class="code hl_class" href="classoperations__research_1_1_sparse_bitset.html">SparseBitset<LiteralIndex></a> processed(LiteralIndex(2 * num_variables));</div>
|
|
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> </div>
|
|
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> int64_t num_probed = 0;</div>
|
|
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> int64_t num_explicit_fix = 0;</div>
|
|
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> int64_t num_conflicts = 0;</div>
|
|
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> int64_t num_new_binary = 0;</div>
|
|
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> int64_t num_subsumed = 0;</div>
|
|
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> </div>
|
|
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <span class="keyword">const</span> <span class="keyword">auto</span>& trail = *(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Get<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_trail.html">Trail</a>>());</div>
|
|
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="keyword">const</span> <span class="keyword">auto</span>& assignment = trail.Assignment();</div>
|
|
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="keyword">auto</span>* clause_manager = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetOrCreate<<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal_watchers.html">LiteralWatchers</a>>();</div>
|
|
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <span class="keywordtype">id</span> = implication_graph-><a class="code hl_function" href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">PropagatorId</a>();</div>
|
|
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="keyword">const</span> <span class="keywordtype">int</span> clause_id = clause_manager->PropagatorId();</div>
|
|
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> </div>
|
|
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="comment">// This is only needed when options.use_queue is true.</span></div>
|
|
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="keyword">struct </span>SavedNextLiteral {</div>
|
|
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> LiteralIndex literal_index; <span class="comment">// kNoLiteralIndex if we need to backtrack.</span></div>
|
|
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="keywordtype">int</span> rank; <span class="comment">// Cached position_in_order, we prefer lower positions.</span></div>
|
|
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> </div>
|
|
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> SavedNextLiteral& o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rank < o.rank; }</div>
|
|
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> };</div>
|
|
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> std::vector<SavedNextLiteral> queue;</div>
|
|
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector<LiteralIndex, int></a> position_in_order;</div>
|
|
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> </div>
|
|
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="comment">// This is only needed when options use_queue is false;</span></div>
|
|
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <a class="code hl_class" href="classabsl_1_1_strong_vector.html">absl::StrongVector<LiteralIndex, int></a> starts;</div>
|
|
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordflow">if</span> (!options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) starts.<a class="code hl_function" href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">resize</a>(2 * num_variables, 0);</div>
|
|
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> </div>
|
|
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="comment">// We delay fixing of already assigned literal once we go back to level</span></div>
|
|
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> <span class="comment">// zero.</span></div>
|
|
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> std::vector<Literal> to_fix;</div>
|
|
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> </div>
|
|
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="comment">// Depending on the options. we do not use the same order.</span></div>
|
|
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <span class="comment">// With tree look, it is better to start with "leaf" first since we try</span></div>
|
|
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="comment">// to reuse propagation as much as possible. This is also interesting to</span></div>
|
|
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <span class="comment">// do when extracting binary clauses since we will need to propagate</span></div>
|
|
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="comment">// everyone anyway, and this should result in less clauses that can be</span></div>
|
|
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="comment">// removed later by transitive reduction.</span></div>
|
|
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <span class="comment">// However, without tree-look and without the need to extract all binary</span></div>
|
|
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="comment">// clauses, it is better to just probe the root of the binary implication</span></div>
|
|
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> <span class="comment">// graph. This is exactly what happen when we probe using the topological</span></div>
|
|
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <span class="comment">// order.</span></div>
|
|
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> <span class="keywordtype">int</span> order_index(0);</div>
|
|
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> std::vector<LiteralIndex> probing_order =</div>
|
|
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> implication_graph->ReverseTopologicalOrder();</div>
|
|
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> <span class="keywordflow">if</span> (!options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">use_tree_look</a> && !options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">extract_binary_clauses</a>) {</div>
|
|
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> std::reverse(probing_order.begin(), probing_order.end());</div>
|
|
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> }</div>
|
|
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
|
|
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="comment">// We only use this for the queue version.</span></div>
|
|
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) {</div>
|
|
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> position_in_order.<a class="code hl_function" href="classabsl_1_1_strong_vector.html#a184fe69018ae421dcf31c964bfe40576">assign</a>(2 * num_variables, -1);</div>
|
|
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < probing_order.size(); ++i) {</div>
|
|
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> position_in_order[probing_order[i]] = i;</div>
|
|
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> }</div>
|
|
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> }</div>
|
|
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> </div>
|
|
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="keywordflow">while</span> (!<a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ad837e6231722ead53bbaf1c6e8f66032">LimitReached</a>() &&</div>
|
|
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>() <= limit) {</div>
|
|
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="comment">// We only enqueue literal at level zero if we don't use "tree look".</span></div>
|
|
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keywordflow">if</span> (!options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">use_tree_look</a>) sat_solver->Backtrack(0);</div>
|
|
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> </div>
|
|
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> LiteralIndex next_decision = <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>;</div>
|
|
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a> && sat_solver->CurrentDecisionLevel() > 0) {</div>
|
|
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="comment">// TODO(user): Instead of minimizing index in topo order (which might be</span></div>
|
|
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="comment">// nice for binary extraction), we could try to maximize reusability in</span></div>
|
|
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="comment">// some way.</span></div>
|
|
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> prev_decision =</div>
|
|
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> sat_solver->Decisions()[sat_solver->CurrentDecisionLevel() - 1]</div>
|
|
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> .literal;</div>
|
|
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> <span class="keyword">const</span> <span class="keyword">auto</span>& list =</div>
|
|
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> implication_graph->Implications(prev_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
|
|
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="keyword">const</span> <span class="keywordtype">int</span> saved_queue_size = queue.size();</div>
|
|
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l : list) {</div>
|
|
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate = l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
|
|
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">if</span> (processed[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keywordflow">if</span> (position_in_order[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()] == -1) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) {</div>
|
|
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
|
|
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> to_fix.push_back(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
|
|
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> }</div>
|
|
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> }</div>
|
|
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> queue.push_back(</div>
|
|
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> {candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>(), -position_in_order[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]});</div>
|
|
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> }</div>
|
|
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> std::sort(queue.begin() + saved_queue_size, queue.end());</div>
|
|
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> </div>
|
|
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> <span class="comment">// Probe a literal that implies previous decision.</span></div>
|
|
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> <span class="keywordflow">while</span> (!queue.empty()) {</div>
|
|
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> <span class="keyword">const</span> LiteralIndex <a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = queue.back().literal_index;</div>
|
|
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> queue.pop_back();</div>
|
|
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
|
|
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <span class="comment">// This is a backtrack marker, go back one level.</span></div>
|
|
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <a class="code hl_define" href="base_2logging_8h.html#a7e03ec13560fa94a8fea569960d7efc6">CHECK_GT</a>(sat_solver->CurrentDecisionLevel(), 0);</div>
|
|
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> sat_solver->Backtrack(sat_solver->CurrentDecisionLevel() - 1);</div>
|
|
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> }</div>
|
|
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate(<a class="code hl_variable" href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordflow">if</span> (processed[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) {</div>
|
|
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
|
|
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> to_fix.push_back(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
|
|
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> }</div>
|
|
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> }</div>
|
|
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> next_decision = candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
|
|
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> }</div>
|
|
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> }</div>
|
|
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> </div>
|
|
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">if</span> (sat_solver->CurrentDecisionLevel() == 0) {</div>
|
|
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="comment">// Fix any delayed fixed literal.</span></div>
|
|
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : to_fix) {</div>
|
|
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="keywordflow">if</span> (!assignment.LiteralIsTrue(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>)) {</div>
|
|
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> ++num_explicit_fix;</div>
|
|
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> sat_solver->AddUnitClause(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
|
|
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> }</div>
|
|
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> }</div>
|
|
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> to_fix.clear();</div>
|
|
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keywordflow">if</span> (!sat_solver->FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> </div>
|
|
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="comment">// Probe an unexplored node.</span></div>
|
|
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> <span class="keywordflow">for</span> (; order_index < probing_order.size(); ++order_index) {</div>
|
|
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate(probing_order[order_index]);</div>
|
|
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordflow">if</span> (processed[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keywordflow">if</span> (assignment.LiteralIsAssigned(candidate)) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> next_decision = candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
|
|
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> }</div>
|
|
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> </div>
|
|
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="comment">// The pass is finished.</span></div>
|
|
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">if</span> (next_decision == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (next_decision == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
|
|
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="keyword">const</span> <span class="keywordtype">int</span> level = sat_solver->CurrentDecisionLevel();</div>
|
|
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> prev_decision = sat_solver->Decisions()[level - 1].literal;</div>
|
|
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keyword">const</span> <span class="keyword">auto</span>& list =</div>
|
|
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> implication_graph->Implications(prev_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
|
|
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> </div>
|
|
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <span class="comment">// Probe a literal that implies previous decision.</span></div>
|
|
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <span class="comment">// Note that contrary to the queue based implementation, this do not</span></div>
|
|
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="comment">// process them in a particular order.</span></div>
|
|
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> <span class="keywordtype">int</span> j = starts[prev_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()];</div>
|
|
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < list.size(); ++i, ++j) {</div>
|
|
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> j %= list.<a class="code hl_function" href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">size</a>();</div>
|
|
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> candidate = <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(list[j]).<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>();</div>
|
|
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keywordflow">if</span> (processed[candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>()]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <span class="keywordflow">if</span> (assignment.LiteralIsFalse(candidate)) {</div>
|
|
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> <span class="comment">// candidate => previous => not(candidate), so we can fix it.</span></div>
|
|
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> to_fix.push_back(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()));</div>
|
|
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> }</div>
|
|
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> <span class="comment">// This shouldn't happen if extract_binary_clauses is false.</span></div>
|
|
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> <span class="comment">// We have an equivalence.</span></div>
|
|
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <span class="keywordflow">if</span> (assignment.LiteralIsTrue(candidate)) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> next_decision = candidate.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
|
|
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> }</div>
|
|
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> starts[prev_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">NegatedIndex</a>()] = j;</div>
|
|
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <span class="keywordflow">if</span> (next_decision == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) {</div>
|
|
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> sat_solver->Backtrack(level - 1);</div>
|
|
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> }</div>
|
|
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> }</div>
|
|
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> </div>
|
|
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> ++num_probed;</div>
|
|
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> processed.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(next_decision);</div>
|
|
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <a class="code hl_define" href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a>(next_decision, <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>);</div>
|
|
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> queue.push_back({<a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>, 0}); <span class="comment">// Backtrack marker.</span></div>
|
|
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keyword">const</span> <span class="keywordtype">int</span> level = sat_solver->CurrentDecisionLevel();</div>
|
|
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <span class="keyword">const</span> <span class="keywordtype">int</span> first_new_trail_index =</div>
|
|
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> sat_solver->EnqueueDecisionAndBackjumpOnConflict(</div>
|
|
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision));</div>
|
|
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> <span class="keyword">const</span> <span class="keywordtype">int</span> new_level = sat_solver->CurrentDecisionLevel();</div>
|
|
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> sat_solver->AdvanceDeterministicTime(<a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>);</div>
|
|
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> <span class="keywordflow">if</span> (sat_solver->IsModelUnsat()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> <span class="keywordflow">if</span> (new_level <= level) {</div>
|
|
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> ++num_conflicts;</div>
|
|
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> </div>
|
|
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="comment">// Sync the queue with the new level.</span></div>
|
|
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">use_queue</a>) {</div>
|
|
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> <span class="keywordflow">if</span> (new_level == 0) {</div>
|
|
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> queue.clear();</div>
|
|
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordtype">int</span> queue_level = level + 1;</div>
|
|
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="keywordflow">while</span> (queue_level > new_level) {</div>
|
|
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!queue.empty());</div>
|
|
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="keywordflow">if</span> (queue.back().literal_index == <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">kNoLiteralIndex</a>) --queue_level;</div>
|
|
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> queue.pop_back();</div>
|
|
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> }</div>
|
|
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
|
|
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> }</div>
|
|
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> </div>
|
|
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="comment">// Fix next_decision to false if not already done.</span></div>
|
|
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> <span class="comment">// Even if we fixed something at evel zero, next_decision might not be</span></div>
|
|
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> <span class="comment">// fixed! But we can fix it. It can happen because when we propagate</span></div>
|
|
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> <span class="comment">// with clauses, we might have a => b but not not(b) => not(a). Like a</span></div>
|
|
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="comment">// => b and clause (not(a), not(b), c), propagating a will set c, but</span></div>
|
|
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> <span class="comment">// propagating not(c) will not do anything.</span></div>
|
|
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <span class="comment">// We "delay" the fixing if we are not at level zero so that we can</span></div>
|
|
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <span class="comment">// still reuse the current propagation work via tree look.</span></div>
|
|
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="comment">// TODO(user): Can we be smarter here? Maybe we can still fix the</span></div>
|
|
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> <span class="comment">// literal without going back to level zero by simply enqueing it with</span></div>
|
|
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> <span class="comment">// no reason? it will be bactracked over, but we will still lazily fix</span></div>
|
|
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> <span class="comment">// it later.</span></div>
|
|
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> <span class="keywordflow">if</span> (sat_solver->CurrentDecisionLevel() != 0 ||</div>
|
|
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> assignment.LiteralIsFalse(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision))) {</div>
|
|
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> to_fix.push_back(<a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a>(next_decision).Negated());</div>
|
|
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> }</div>
|
|
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> }</div>
|
|
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> </div>
|
|
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> <span class="comment">// Inspect the newly propagated literals. Depending on the options, try to</span></div>
|
|
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <span class="comment">// extract binary clauses via hyper binary resolution and/or mark the</span></div>
|
|
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="comment">// literals on the trail so that they do not need to be probed later.</span></div>
|
|
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> <span class="keywordflow">if</span> (new_level == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> last_decision =</div>
|
|
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> sat_solver->Decisions()[new_level - 1].literal;</div>
|
|
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <span class="keywordtype">int</span> num_new_subsumed = 0;</div>
|
|
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = first_new_trail_index; i < trail.Index(); ++i) {</div>
|
|
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> l = trail[i];</div>
|
|
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <span class="keywordflow">if</span> (l == last_decision) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> </div>
|
|
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> <span class="comment">// If we can extract a binary clause that subsume the reason clause, we</span></div>
|
|
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="comment">// do add the binary and remove the subsumed clause.</span></div>
|
|
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> <span class="comment">// TODO(user): We could be slightly more generic and subsume some</span></div>
|
|
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="comment">// clauses that do not contains last_decision.Negated().</span></div>
|
|
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="keywordtype">bool</span> subsumed = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">subsume_with_binary_clause</a> &&</div>
|
|
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> trail.AssignmentType(l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()) == clause_id) {</div>
|
|
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> lit : trail.Reason(l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>())) {</div>
|
|
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keywordflow">if</span> (lit == last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) {</div>
|
|
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> subsumed = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> }</div>
|
|
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> }</div>
|
|
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="keywordflow">if</span> (subsumed) {</div>
|
|
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> ++num_new_subsumed;</div>
|
|
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> ++num_new_binary;</div>
|
|
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> implication_graph->AddBinaryClause(last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(), l);</div>
|
|
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="keyword">const</span> <span class="keywordtype">int</span> trail_index = trail.Info(l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()).trail_index;</div>
|
|
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> </div>
|
|
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keywordtype">int</span> test = 0;</div>
|
|
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> lit :</div>
|
|
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> clause_manager->ReasonClause(trail_index)->AsSpan()) {</div>
|
|
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="keywordflow">if</span> (lit == l) ++test;</div>
|
|
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <span class="keywordflow">if</span> (lit == last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>()) ++test;</div>
|
|
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> }</div>
|
|
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(test, 2);</div>
|
|
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> clause_manager->LazyDetach(clause_manager->ReasonClause(trail_index));</div>
|
|
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> </div>
|
|
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="comment">// We need to change the reason now that the clause is cleared.</span></div>
|
|
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> implication_graph->ChangeReason(trail_index, last_decision);</div>
|
|
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> }</div>
|
|
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> }</div>
|
|
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> </div>
|
|
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">extract_binary_clauses</a>) {</div>
|
|
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> <span class="comment">// Anything not propagated by the BinaryImplicationGraph is a "new"</span></div>
|
|
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="comment">// binary clause. This is because the BinaryImplicationGraph has the</span></div>
|
|
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> <span class="comment">// highest priority of all propagators.</span></div>
|
|
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="comment">// Note(user): This is not 100% true, since when we launch the clause</span></div>
|
|
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="comment">// propagation for one literal we do finish it before calling again</span></div>
|
|
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <span class="comment">// the binary propagation.</span></div>
|
|
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> <span class="comment">// TODO(user): Think about trying to extract clause that will not</span></div>
|
|
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> <span class="comment">// get removed by transitive reduction later. If we can both extract</span></div>
|
|
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <span class="comment">// a => c and b => c , ideally we don't want to extract a => c first</span></div>
|
|
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="comment">// if we already know that a => b.</span></div>
|
|
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <span class="comment">// TODO(user): Similar to previous point, we could find the LCA</span></div>
|
|
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="comment">// of all literals in the reason for this propagation. And use this</span></div>
|
|
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> <span class="comment">// as a reason for later hyber binary resolution. Like we do when</span></div>
|
|
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> <span class="comment">// this clause subsume the reason.</span></div>
|
|
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> <span class="keywordflow">if</span> (!subsumed && trail.AssignmentType(l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">Variable</a>()) != <span class="keywordtype">id</span>) {</div>
|
|
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> ++num_new_binary;</div>
|
|
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> implication_graph->AddBinaryClause(last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(), l);</div>
|
|
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> }</div>
|
|
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> <span class="comment">// If we don't extract binary, we don't need to explore any of</span></div>
|
|
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> <span class="comment">// these literal until more variables are fixed.</span></div>
|
|
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> processed.<a class="code hl_function" href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">Set</a>(l.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>());</div>
|
|
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> }</div>
|
|
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> }</div>
|
|
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> </div>
|
|
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> <span class="comment">// Inspect the watcher list for last_decision, If we have a blocking</span></div>
|
|
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="comment">// literal at true (implied by last decision), then we have subsumptions.</span></div>
|
|
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <span class="comment">// The intuition behind this is that if a binary clause (a,b) subsume a</span></div>
|
|
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="comment">// clause, and we watch a.Negated() for this clause with a blocking</span></div>
|
|
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="comment">// literal b, then this watch entry will never change because we always</span></div>
|
|
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="comment">// propagate binary clauses first and the blocking literal will always be</span></div>
|
|
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="comment">// true. So after many propagations, we hope to have such configuration</span></div>
|
|
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="comment">// which is quite cheap to test here.</span></div>
|
|
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keywordflow">if</span> (options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">subsume_with_binary_clause</a>) {</div>
|
|
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& w :</div>
|
|
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> clause_manager->WatcherListOnFalse(last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>())) {</div>
|
|
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keywordflow">if</span> (assignment.LiteralIsTrue(w.blocking_literal)) {</div>
|
|
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keywordflow">if</span> (w.clause->empty()) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <a class="code hl_define" href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a>(w.blocking_literal, last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>());</div>
|
|
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> </div>
|
|
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="comment">// Add the binary clause if needed. Note that we change the reason</span></div>
|
|
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="comment">// to a binary one so that we never add the same clause twice.</span></div>
|
|
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> <span class="comment">// Tricky: while last_decision would be a valid reason, we need a</span></div>
|
|
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="comment">// reason that was assigned before this literal, so we use the</span></div>
|
|
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="comment">// decision at the level where this literal was assigne which is an</span></div>
|
|
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="comment">// even better reasony. Maybe it is just better to change all the</span></div>
|
|
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="comment">// reason above to a binary one so we don't have an issue here.</span></div>
|
|
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> <span class="keywordflow">if</span> (trail.AssignmentType(w.blocking_literal.Variable()) != <span class="keywordtype">id</span>) {</div>
|
|
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="comment">// If the variable was true at level zero, there is no point</span></div>
|
|
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="comment">// adding the clause.</span></div>
|
|
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> <span class="keyword">const</span> <span class="keyword">auto</span>& info = trail.Info(w.blocking_literal.Variable());</div>
|
|
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="keywordflow">if</span> (info.level > 0) {</div>
|
|
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> ++num_new_binary;</div>
|
|
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> implication_graph->AddBinaryClause(last_decision.<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">Negated</a>(),</div>
|
|
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> w.blocking_literal);</div>
|
|
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> </div>
|
|
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> d = sat_solver->Decisions()[info.level - 1].literal;</div>
|
|
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="keywordflow">if</span> (d != w.blocking_literal) {</div>
|
|
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> implication_graph->ChangeReason(info.trail_index, d);</div>
|
|
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> }</div>
|
|
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> }</div>
|
|
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> }</div>
|
|
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> </div>
|
|
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> ++num_new_subsumed;</div>
|
|
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> clause_manager->LazyDetach(w.clause);</div>
|
|
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> }</div>
|
|
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> }</div>
|
|
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> }</div>
|
|
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> </div>
|
|
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <span class="keywordflow">if</span> (num_new_subsumed > 0) {</div>
|
|
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> <span class="comment">// TODO(user): We might just want to do that even more lazily by</span></div>
|
|
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="comment">// checking for detached clause while propagating here? and do a big</span></div>
|
|
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <span class="comment">// cleanup at the end.</span></div>
|
|
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> clause_manager->CleanUpWatchers();</div>
|
|
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> num_subsumed += num_new_subsumed;</div>
|
|
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> }</div>
|
|
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> }</div>
|
|
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> </div>
|
|
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordflow">if</span> (!sat_solver->ResetToLevelZero()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1sat_1_1_literal.html">Literal</a> <a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a> : to_fix) {</div>
|
|
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> ++num_explicit_fix;</div>
|
|
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> sat_solver->AddUnitClause(<a class="code hl_variable" href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a>);</div>
|
|
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> }</div>
|
|
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> to_fix.clear();</div>
|
|
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <span class="keywordflow">if</span> (!sat_solver->FinishPropagation()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> </div>
|
|
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <span class="comment">// Display stats.</span></div>
|
|
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_fixed = sat_solver->LiteralTrail().<a class="code hl_function" href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">Index</a>();</div>
|
|
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_newly_fixed = num_fixed - initial_num_fixed;</div>
|
|
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="keyword">const</span> <span class="keywordtype">double</span> time_diff =</div>
|
|
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>() - initial_deterministic_time;</div>
|
|
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> limit_reached = <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ad837e6231722ead53bbaf1c6e8f66032">LimitReached</a>() ||</div>
|
|
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <a class="code hl_variable" href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a>-><a class="code hl_function" href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">GetElapsedDeterministicTime</a>() > limit;</div>
|
|
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <a class="code hl_define" href="base_2logging_8h.html#a09f7d88282cf92c9f231270ac113e5c6">LOG_IF</a>(<a class="code hl_variable" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>, options.<a class="code hl_variable" href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">log_info</a>)</div>
|
|
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> << <span class="stringliteral">"Probing. "</span></div>
|
|
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> << <span class="stringliteral">" num_probed: "</span> << num_probed << <span class="stringliteral">" num_fixed: +"</span> << num_newly_fixed</div>
|
|
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> << <span class="stringliteral">" ("</span> << num_fixed << <span class="stringliteral">"/"</span> << num_variables << <span class="stringliteral">")"</span></div>
|
|
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> << <span class="stringliteral">" explicit_fix:"</span> << num_explicit_fix</div>
|
|
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> << <span class="stringliteral">" num_conflicts:"</span> << num_conflicts</div>
|
|
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> << <span class="stringliteral">" new_binary_clauses: "</span> << num_new_binary</div>
|
|
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> << <span class="stringliteral">" subsumed: "</span> << num_subsumed << <span class="stringliteral">" dtime: "</span> << time_diff</div>
|
|
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> << <span class="stringliteral">" wtime: "</span> << <a class="code hl_variable" href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a>.<a class="code hl_function" href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">Get</a>() << (limit_reached ? <span class="stringliteral">" (Aborted)"</span> : <span class="stringliteral">""</span>);</div>
|
|
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> <span class="keywordflow">return</span> sat_solver->FinishPropagation();</div>
|
|
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span>}</div>
|
|
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> </div>
|
|
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span>} <span class="comment">// namespace sat</span></div>
|
|
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span>} <span class="comment">// namespace operations_research</span></div>
|
|
<div class="ttc" id="aalldiff__cst_8cc_html_a26e6db9bcc64b584051ecc28171ed11f"><div class="ttname"><a href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a></div><div class="ttdeci">int64_t max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00140">alldiff_cst.cc:140</a></div></div>
|
|
<div class="ttc" id="aalldiff__cst_8cc_html_ad10edae0a852d72fb76afb1c77735045"><div class="ttname"><a href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a></div><div class="ttdeci">int64_t min</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a09f7d88282cf92c9f231270ac113e5c6"><div class="ttname"><a href="base_2logging_8h.html#a09f7d88282cf92c9f231270ac113e5c6">LOG_IF</a></div><div class="ttdeci">#define LOG_IF(severity, condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00479">base/logging.h:479</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a3e1cfef60e774a81f30eaddf26a3a274"><div class="ttname"><a href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a></div><div class="ttdeci">#define CHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00495">base/logging.h:495</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a7c0ce053b28d53aa4eaf3eb7fb71663b"><div class="ttname"><a href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a></div><div class="ttdeci">#define CHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00703">base/logging.h:703</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a7e03ec13560fa94a8fea569960d7efc6"><div class="ttname"><a href="base_2logging_8h.html#a7e03ec13560fa94a8fea569960d7efc6">CHECK_GT</a></div><div class="ttdeci">#define CHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00708">base/logging.h:708</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ab25e01a2942b821d66371fc68d53f2eb"><div class="ttname"><a href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a></div><div class="ttdeci">#define CHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00704">base/logging.h:704</a></div></div>
|
|
<div class="ttc" id="abitset_8h_html"><div class="ttname"><a href="bitset_8h.html">bitset.h</a></div></div>
|
|
<div class="ttc" id="aclass_wall_timer_html"><div class="ttname"><a href="class_wall_timer.html">WallTimer</a></div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00023">timer.h:23</a></div></div>
|
|
<div class="ttc" id="aclass_wall_timer_html_a07aaf1227e4d645f15e0a964f54ef291"><div class="ttname"><a href="class_wall_timer.html#a07aaf1227e4d645f15e0a964f54ef291">WallTimer::Start</a></div><div class="ttdeci">void Start()</div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00031">timer.h:31</a></div></div>
|
|
<div class="ttc" id="aclass_wall_timer_html_aec56fe080959ecebec3feaed9dafde84"><div class="ttname"><a href="class_wall_timer.html#aec56fe080959ecebec3feaed9dafde84">WallTimer::Get</a></div><div class="ttdeci">double Get() const</div><div class="ttdef"><b>Definition:</b> <a href="timer_8h_source.html#l00045">timer.h:45</a></div></div>
|
|
<div class="ttc" id="aclassabsl_1_1_strong_vector_html"><div class="ttname"><a href="classabsl_1_1_strong_vector.html">absl::StrongVector< LiteralIndex, int ></a></div></div>
|
|
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a184fe69018ae421dcf31c964bfe40576"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a184fe69018ae421dcf31c964bfe40576">absl::StrongVector::assign</a></div><div class="ttdeci">void assign(size_type n, const value_type &val)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00131">strong_vector.h:131</a></div></div>
|
|
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a4e3670a285a3642eaa07f66766cffa72"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72">absl::StrongVector::resize</a></div><div class="ttdeci">void resize(size_type new_size)</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00150">strong_vector.h:150</a></div></div>
|
|
<div class="ttc" id="aclassabsl_1_1_strong_vector_html_a60304b65bf89363bcc3165d3cde67f86"><div class="ttname"><a href="classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86">absl::StrongVector::size</a></div><div class="ttdeci">size_type size() const</div><div class="ttdef"><b>Definition:</b> <a href="strong__vector_8h_source.html#l00147">strong_vector.h:147</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html"><div class="ttname"><a href="classoperations__research_1_1_assignment.html">operations_research::Assignment</a></div><div class="ttdoc">An Assignment is a variable -> domains mapping, used to report solutions to the user.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l05081">constraint_solver.h:5081</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_domain_html_a835826c4c5129b74553042a357a721ff"><div class="ttname"><a href="classoperations__research_1_1_domain.html#a835826c4c5129b74553042a357a721ff">operations_research::Domain::IntersectionWith</a></div><div class="ttdeci">Domain IntersectionWith(const Domain &domain) const</div><div class="ttdoc">Returns the intersection of D and domain.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00303">sorted_interval_list.cc:303</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_shared_time_limit_html_ac7e861414a70fc937d18bc7ca743fc98"><div class="ttname"><a href="classoperations__research_1_1_shared_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">operations_research::SharedTimeLimit::GetElapsedDeterministicTime</a></div><div class="ttdeci">double GetElapsedDeterministicTime() const</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00397">time_limit.h:397</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_shared_time_limit_html_ad837e6231722ead53bbaf1c6e8f66032"><div class="ttname"><a href="classoperations__research_1_1_shared_time_limit.html#ad837e6231722ead53bbaf1c6e8f66032">operations_research::SharedTimeLimit::LimitReached</a></div><div class="ttdeci">bool LimitReached() const</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00370">time_limit.h:370</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_shared_time_limit_html_af90cfd1fc238433fc303ee28c5914eb9"><div class="ttname"><a href="classoperations__research_1_1_shared_time_limit.html#af90cfd1fc238433fc303ee28c5914eb9">operations_research::SharedTimeLimit::AdvanceDeterministicTime</a></div><div class="ttdeci">void AdvanceDeterministicTime(double deterministic_duration)</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00387">time_limit.h:387</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_logger_html"><div class="ttname"><a href="classoperations__research_1_1_solver_logger.html">operations_research::SolverLogger</a></div><div class="ttdef"><b>Definition:</b> <a href="util_2logging_8h_source.html#l00033">util/logging.h:33</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_logger_html_a9492cb97f5ec0ecbce0b5ef1b085738b"><div class="ttname"><a href="classoperations__research_1_1_solver_logger.html#a9492cb97f5ec0ecbce0b5ef1b085738b">operations_research::SolverLogger::LoggingIsEnabled</a></div><div class="ttdeci">bool LoggingIsEnabled() const</div><div class="ttdef"><b>Definition:</b> <a href="util_2logging_8h_source.html#l00042">util/logging.h:42</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html">operations_research::SparseBitset< LiteralIndex ></a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html_a41f798a04019147982b29c576ff9d8b7"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html#a41f798a04019147982b29c576ff9d8b7">operations_research::SparseBitset::Set</a></div><div class="ttdeci">void Set(IntegerType index)</div><div class="ttdef"><b>Definition:</b> <a href="bitset_8h_source.html#l00809">bitset.h:809</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html_ab4bc8236a9bfe59526e353800a0f0470"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html#ab4bc8236a9bfe59526e353800a0f0470">operations_research::SparseBitset::SparseClearAll</a></div><div class="ttdeci">void SparseClearAll()</div><div class="ttdef"><b>Definition:</b> <a href="bitset_8h_source.html#l00776">bitset.h:776</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sparse_bitset_html_ae09e38958e558d2c776bc555a0dc2fc7"><div class="ttname"><a href="classoperations__research_1_1_sparse_bitset.html#ae09e38958e558d2c776bc555a0dc2fc7">operations_research::SparseBitset::ClearAndResize</a></div><div class="ttdeci">void ClearAndResize(IntegerType size)</div><div class="ttdef"><b>Definition:</b> <a href="bitset_8h_source.html#l00784">bitset.h:784</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#l00106">time_limit.h:106</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html_a810d5f7aaf80cc09cf5a094e20c1aaca"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html#a810d5f7aaf80cc09cf5a094e20c1aaca">operations_research::TimeLimit::LimitReached</a></div><div class="ttdeci">bool LimitReached()</div><div class="ttdoc">Returns true when the external limit is true, or the deterministic time is over the deterministic lim...</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00546">time_limit.h:546</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_time_limit_html_ac7e861414a70fc937d18bc7ca743fc98"><div class="ttname"><a href="classoperations__research_1_1_time_limit.html#ac7e861414a70fc937d18bc7ca743fc98">operations_research::TimeLimit::GetElapsedDeterministicTime</a></div><div class="ttdeci">double GetElapsedDeterministicTime() const</div><div class="ttdoc">Returns the elapsed deterministic time since the construction of this object.</div><div class="ttdef"><b>Definition:</b> <a href="time__limit_8h_source.html#l00261">time_limit.h:261</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_binary_implication_graph_html_a6fac58ca16fd746d7488a0a97f6965bd"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_binary_implication_graph.html#a6fac58ca16fd746d7488a0a97f6965bd">operations_research::sat::BinaryImplicationGraph::RepresentativeOf</a></div><div class="ttdeci">Literal RepresentativeOf(Literal l) const</div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00564">clause.h:564</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds.html">operations_research::sat::ImpliedBounds</a></div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8h_source.html#l00082">implied_bounds.h:82</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_implied_bounds_html_af55df3ca81000daf46c6096a71778c40"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_implied_bounds.html#af55df3ca81000daf46c6096a71778c40">operations_research::sat::ImpliedBounds::ProcessIntegerTrail</a></div><div class="ttdeci">void ProcessIntegerTrail(Literal first_decision)</div><div class="ttdef"><b>Definition:</b> <a href="implied__bounds_8cc_source.html#l00214">implied_bounds.cc:214</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html">operations_research::sat::IntegerTrail</a></div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00620">integer.h:620</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_a05e837bb93eeabbbd94e8f690dd59d32"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#a05e837bb93eeabbbd94e8f690dd59d32">operations_research::sat::IntegerTrail::Enqueue</a></div><div class="ttdeci">ABSL_MUST_USE_RESULT bool Enqueue(IntegerLiteral i_lit, absl::Span< const Literal > literal_reason, absl::Span< const IntegerLiteral > integer_reason)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l01048">integer.cc:1048</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_aab182be7f1a6eccbc2b14c21fce5e9dd"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#aab182be7f1a6eccbc2b14c21fce5e9dd">operations_research::sat::IntegerTrail::AppendNewBounds</a></div><div class="ttdeci">void AppendNewBounds(std::vector< IntegerLiteral > *output) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l01805">integer.cc:1805</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_ab857cd2aead68952d9fe92a8ad8d3ac9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#ab857cd2aead68952d9fe92a8ad8d3ac9">operations_research::sat::IntegerTrail::LowerBound</a></div><div class="ttdeci">IntegerValue LowerBound(IntegerVariable i) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01445">integer.h:1445</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_af4303d31360f06c50729f156b1fbc2a9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#af4303d31360f06c50729f156b1fbc2a9">operations_research::sat::IntegerTrail::InitialVariableDomain</a></div><div class="ttdeci">const Domain & InitialVariableDomain(IntegerVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00685">integer.cc:685</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_integer_trail_html_af931801f592e954a6623cab8cf9a4485"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_integer_trail.html#af931801f592e954a6623cab8cf9a4485">operations_research::sat::IntegerTrail::UpdateInitialDomain</a></div><div class="ttdeci">bool UpdateInitialDomain(IntegerVariable var, Domain domain)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8cc_source.html#l00689">integer.cc:689</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html">operations_research::sat::Literal</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00067">sat_base.h:67</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a239e1315c4e975a35537790ba0d913a7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a239e1315c4e975a35537790ba0d913a7">operations_research::sat::Literal::NegatedIndex</a></div><div class="ttdeci">LiteralIndex NegatedIndex() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00088">sat_base.h:88</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a4a11c7c4d7706c09de5e18707c3b5c62"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a4a11c7c4d7706c09de5e18707c3b5c62">operations_research::sat::Literal::Index</a></div><div class="ttdeci">LiteralIndex Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00087">sat_base.h:87</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a6a5dcff82096cd7a7147bf996dbaa5a8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a6a5dcff82096cd7a7147bf996dbaa5a8">operations_research::sat::Literal::Variable</a></div><div class="ttdeci">BooleanVariable Variable() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00083">sat_base.h:83</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_html_a886e9c024f7209181c0a850b6e90c644"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal.html#a886e9c024f7209181c0a850b6e90c644">operations_research::sat::Literal::Negated</a></div><div class="ttdeci">Literal Negated() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00094">sat_base.h:94</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_literal_watchers_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_literal_watchers.html">operations_research::sat::LiteralWatchers</a></div><div class="ttdef"><b>Definition:</b> <a href="clause_8h_source.html#l00163">clause.h:163</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_model_random_generator_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_model_random_generator.html">operations_research::sat::ModelRandomGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="sat_2util_8h_source.html#l00115">sat/util.h:115</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_prober_html_a7d6a8a15f30eb61684dbad769f7a557f"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_prober.html#a7d6a8a15f30eb61684dbad769f7a557f">operations_research::sat::Prober::ProbeOneVariable</a></div><div class="ttdeci">bool ProbeOneVariable(BooleanVariable b)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00190">probing.cc:190</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_prober_html_a85633e19f7fa9ac7f6155b23ce845fa6"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_prober.html#a85633e19f7fa9ac7f6155b23ce845fa6">operations_research::sat::Prober::ProbeBooleanVariables</a></div><div class="ttdeci">bool ProbeBooleanVariables(double deterministic_time_limit)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00053">probing.cc:53</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_prober_html_ab10b5a52f5a6dd0a183f208f85be1503"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_prober.html#ab10b5a52f5a6dd0a183f208f85be1503">operations_research::sat::Prober::Prober</a></div><div class="ttdeci">Prober(Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00043">probing.cc:43</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_propagator_html_a5298758773353d79435345e19a7b3a38"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_propagator.html#a5298758773353d79435345e19a7b3a38">operations_research::sat::SatPropagator::PropagatorId</a></div><div class="ttdeci">int PropagatorId() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00456">sat_base.h:456</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_a5b06f24fb581de78b321dfd793931439"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a5b06f24fb581de78b321dfd793931439">operations_research::sat::SatSolver::LiteralTrail</a></div><div class="ttdeci">const Trail & LiteralTrail() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00377">sat_solver.h:377</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a5ca47674a4a0b5e7f40eb430ab474440"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a5ca47674a4a0b5e7f40eb430ab474440">operations_research::sat::SatSolver::SetAssumptionLevel</a></div><div class="ttdeci">void SetAssumptionLevel(int assumption_level)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l01060">sat_solver.cc:1060</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a607d97ccada862073f297bc2d495124d"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a607d97ccada862073f297bc2d495124d">operations_research::sat::SatSolver::FinishPropagation</a></div><div class="ttdeci">bool FinishPropagation()</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00561">sat_solver.cc:561</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="aclassoperations__research_1_1sat_1_1_sat_solver_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">operations_research::sat::SatSolver::FEASIBLE</a></div><div class="ttdeci">@ FEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00186">sat_solver.h:186</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a705eddd5baee23097daf34b73e66eae3"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a705eddd5baee23097daf34b73e66eae3">operations_research::sat::SatSolver::AdvanceDeterministicTime</a></div><div class="ttdeci">void AdvanceDeterministicTime(TimeLimit *limit)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00444">sat_solver.h:444</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9ae69b015a43c1a94e8815ab0dd8189c"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9ae69b015a43c1a94e8815ab0dd8189c">operations_research::sat::SatSolver::EnqueueDecisionAndBackjumpOnConflict</a></div><div class="ttdeci">int EnqueueDecisionAndBackjumpOnConflict(Literal true_literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00536">sat_solver.cc:536</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_a9d3beb2afe4ae647674b054bf29290e2"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#a9d3beb2afe4ae647674b054bf29290e2">operations_research::sat::SatSolver::NumVariables</a></div><div class="ttdeci">int NumVariables() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00086">sat_solver.h:86</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_aac912e9410b8989493f492fcbb2d9094"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#aac912e9410b8989493f492fcbb2d9094">operations_research::sat::SatSolver::AddBinaryClause</a></div><div class="ttdeci">bool AddBinaryClause(Literal a, Literal b)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00189">sat_solver.cc:189</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ac714aeb75f0f6dd87e52e5d1a0d6edc7"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ac714aeb75f0f6dd87e52e5d1a0d6edc7">operations_research::sat::SatSolver::RestoreSolverToAssumptionLevel</a></div><div class="ttdeci">bool RestoreSolverToAssumptionLevel()</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00551">sat_solver.cc:551</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ad2a33e1d9335cce63548abed6b5c8aab"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ad2a33e1d9335cce63548abed6b5c8aab">operations_research::sat::SatSolver::IsModelUnsat</a></div><div class="ttdeci">bool IsModelUnsat() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00139">sat_solver.h:139</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_ad63c4461a1384629cb99413c6df8b9ca"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#ad63c4461a1384629cb99413c6df8b9ca">operations_research::sat::SatSolver::CurrentDecisionLevel</a></div><div class="ttdeci">int CurrentDecisionLevel() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8h_source.html#l00376">sat_solver.h:376</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_sat_solver_html_afbbbc2f0845a82a5a5cfb3f00a61abe9"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_sat_solver.html#afbbbc2f0845a82a5a5cfb3f00a61abe9">operations_research::sat::SatSolver::AddUnitClause</a></div><div class="ttdeci">bool AddUnitClause(Literal true_literal)</div><div class="ttdef"><b>Definition:</b> <a href="sat__solver_8cc_source.html#l00185">sat_solver.cc:185</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html">operations_research::sat::Trail</a></div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00236">sat_base.h:236</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html_a5ed9d5f5c759afe4a008adaabd80c6f8"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html#a5ed9d5f5c759afe4a008adaabd80c6f8">operations_research::sat::Trail::AssignmentType</a></div><div class="ttdeci">int AssignmentType(BooleanVariable var) const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00581">sat_base.h:581</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_trail_html_a8ef12397d1682615bc3108c397734179"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_trail.html#a8ef12397d1682615bc3108c397734179">operations_research::sat::Trail::Index</a></div><div class="ttdeci">int Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00381">sat_base.h:381</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1sat_1_1_variables_assignment_html_a142694366986039454f53b38e8378815"><div class="ttname"><a href="classoperations__research_1_1sat_1_1_variables_assignment.html#a142694366986039454f53b38e8378815">operations_research::sat::VariablesAssignment::LiteralIsAssigned</a></div><div class="ttdeci">bool LiteralIsAssigned(Literal literal) const</div><div class="ttdef"><b>Definition:</b> <a href="sat__base_8h_source.html#l00156">sat_base.h:156</a></div></div>
|
|
<div class="ttc" id="aclause_8h_html"><div class="ttname"><a href="clause_8h.html">clause.h</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_2table_8cc_html_a9293e4d29cac928301645070dd307683"><div class="ttname"><a href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a></div><div class="ttdeci">int64_t b</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00047">constraint_solver/table.cc:47</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_2table_8cc_html_acb18315d548212835cd8ed4287e6c0b6"><div class="ttname"><a href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a></div><div class="ttdeci">int64_t a</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00046">constraint_solver/table.cc:46</a></div></div>
|
|
<div class="ttc" id="acp__model__solver_8cc_html_ace0951799e72ee99fc07d5e509bc7cbf"><div class="ttname"><a href="cp__model__solver_8cc.html#ace0951799e72ee99fc07d5e509bc7cbf">wall_timer</a></div><div class="ttdeci">WallTimer * wall_timer</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02049">cp_model_solver.cc:2049</a></div></div>
|
|
<div class="ttc" id="acp__model__solver_8cc_html_aec8af5c1be4e1b6d4330e1161028de21"><div class="ttname"><a href="cp__model__solver_8cc.html#aec8af5c1be4e1b6d4330e1161028de21">time_limit</a></div><div class="ttdeci">ModelSharedTimeLimit * time_limit</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__solver_8cc_source.html#l02050">cp_model_solver.cc:2050</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="agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf"><div class="ttname"><a href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a></div><div class="ttdeci">GRBmodel * model</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00274">gurobi_interface.cc:274</a></div></div>
|
|
<div class="ttc" id="aimplied__bounds_8h_html"><div class="ttname"><a href="implied__bounds_8h.html">implied_bounds.h</a></div></div>
|
|
<div class="ttc" id="ainteger_8h_html"><div class="ttname"><a href="integer_8h.html">integer.h</a></div></div>
|
|
<div class="ttc" id="alocal__search_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="local__search_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="local__search_8cc_source.html#l02750">local_search.cc:2750</a></div></div>
|
|
<div class="ttc" id="alog__severity_8h_html_ab4a2cbab234914b320b7fae11b6e8cb9"><div class="ttname"><a href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a></div><div class="ttdeci">const int INFO</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a0441e1a54fe203c0707131e587de8fae"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a0441e1a54fe203c0707131e587de8fae">operations_research::sat::RandomizeDecisionHeuristic</a></div><div class="ttdeci">void RandomizeDecisionHeuristic(absl::BitGenRef random, SatParameters *parameters)</div><div class="ttdef"><b>Definition:</b> <a href="sat_2util_8cc_source.html#l00059">sat/util.cc:59</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a1227e67513602591fb959e35c9de66e8"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a1227e67513602591fb959e35c9de66e8">operations_research::sat::kMaxIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMaxIntegerValue(std::numeric_limits< IntegerValue::ValueType >::max() - 1)</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a227161ebe5ee0b44d69f7bd8655a3e49"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a227161ebe5ee0b44d69f7bd8655a3e49">operations_research::sat::LookForTrivialSatSolution</a></div><div class="ttdeci">bool LookForTrivialSatSolution(double deterministic_time_limit, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00290">probing.cc:290</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a2dbcb7017d468a17bdb30252af5c6c31"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a2dbcb7017d468a17bdb30252af5c6c31">operations_research::sat::kNoLiteralIndex</a></div><div class="ttdeci">const LiteralIndex kNoLiteralIndex(-1)</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5316808a2d5007c3b489e844801385e5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5316808a2d5007c3b489e844801385e5">operations_research::sat::kMinIntegerValue</a></div><div class="ttdeci">constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue.value())</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a5bd8c44473618b7eafd33ba978db2f06"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a5bd8c44473618b7eafd33ba978db2f06">operations_research::sat::kNoIntegerVariable</a></div><div class="ttdeci">const IntegerVariable kNoIntegerVariable(-1)</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a7f1ac774d4646a83631f8117f4ea03f5"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a7f1ac774d4646a83631f8117f4ea03f5">operations_research::sat::PositiveVariable</a></div><div class="ttdeci">IntegerVariable PositiveVariable(IntegerVariable i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00149">integer.h:149</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a865df3eeca0b96bf7fda22b016b80bc2"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a865df3eeca0b96bf7fda22b016b80bc2">operations_research::sat::FailedLiteralProbingRound</a></div><div class="ttdeci">bool FailedLiteralProbingRound(ProbingOptions options, Model *model)</div><div class="ttdef"><b>Definition:</b> <a href="probing_8cc_source.html#l00368">probing.cc:368</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_ae2544d2a3a5ef4c78f8e5891f104ab41"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#ae2544d2a3a5ef4c78f8e5891f104ab41">operations_research::sat::VariableIsPositive</a></div><div class="ttdeci">bool VariableIsPositive(IntegerVariable i)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l00145">integer.h:145</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="aoptimization_8cc_html_af63dcc00f2023fdf498e0829e6fb8a6b"><div class="ttname"><a href="optimization_8cc.html#af63dcc00f2023fdf498e0829e6fb8a6b">literal</a></div><div class="ttdeci">Literal literal</div><div class="ttdef"><b>Definition:</b> <a href="optimization_8cc_source.html#l00089">optimization.cc:89</a></div></div>
|
|
<div class="ttc" id="aprobing_8h_html"><div class="ttname"><a href="probing_8h.html">probing.h</a></div></div>
|
|
<div class="ttc" id="arouting__filters_8cc_html_a4f1e8002734902ae1c65ccc3fc30c98e"><div class="ttname"><a href="routing__filters_8cc.html#a4f1e8002734902ae1c65ccc3fc30c98e">bound</a></div><div class="ttdeci">int64_t bound</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00968">routing_filters.cc:968</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_2util_8h_html"><div class="ttname"><a href="sat_2util_8h.html">util.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="asorted__interval__list_8h_html"><div class="ttname"><a href="sorted__interval__list_8h.html">sorted_interval_list.h</a></div></div>
|
|
<div class="ttc" id="astrong__integers_8h_html"><div class="ttname"><a href="strong__integers_8h.html">strong_integers.h</a></div></div>
|
|
<div class="ttc" id="astrong__vector_8h_html"><div class="ttname"><a href="strong__vector_8h.html">strong_vector.h</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_integer_literal_html_a6c233aafac25ea66d69de93a83c9be63"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_integer_literal.html#a6c233aafac25ea66d69de93a83c9be63">operations_research::sat::IntegerLiteral::GreaterOrEqual</a></div><div class="ttdeci">static IntegerLiteral GreaterOrEqual(IntegerVariable i, IntegerValue bound)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01387">integer.h:1387</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html">operations_research::sat::ProbingOptions</a></div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00138">probing.h:138</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a19601d926c1322ba3e11da2a386397dd"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a19601d926c1322ba3e11da2a386397dd">operations_research::sat::ProbingOptions::use_queue</a></div><div class="ttdeci">bool use_queue</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00192">probing.h:192</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a4f572c68b7bf3aac70b3f5292398ff7b"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a4f572c68b7bf3aac70b3f5292398ff7b">operations_research::sat::ProbingOptions::deterministic_limit</a></div><div class="ttdeci">double deterministic_limit</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00159">probing.h:159</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a54320231778412ca00e50eb821c95aa6"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a54320231778412ca00e50eb821c95aa6">operations_research::sat::ProbingOptions::log_info</a></div><div class="ttdeci">bool log_info</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00201">probing.h:201</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a63d303690279f2933007e2dde7f28541"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a63d303690279f2933007e2dde7f28541">operations_research::sat::ProbingOptions::subsume_with_binary_clause</a></div><div class="ttdeci">bool subsume_with_binary_clause</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00198">probing.h:198</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a935644a2da13a1ac84cb06649b840283"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a935644a2da13a1ac84cb06649b840283">operations_research::sat::ProbingOptions::use_tree_look</a></div><div class="ttdeci">bool use_tree_look</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00186">probing.h:186</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1sat_1_1_probing_options_html_a9d4ed6726cbb0ec29c0d62faec4b6405"><div class="ttname"><a href="structoperations__research_1_1sat_1_1_probing_options.html#a9d4ed6726cbb0ec29c0d62faec4b6405">operations_research::sat::ProbingOptions::extract_binary_clauses</a></div><div class="ttdeci">bool extract_binary_clauses</div><div class="ttdef"><b>Definition:</b> <a href="probing_8h_source.html#l00179">probing.h:179</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 class="ttc" id="atimer_8h_html"><div class="ttname"><a href="timer_8h.html">timer.h</a></div></div>
|
|
<div class="ttc" id="autil_2logging_8h_html"><div class="ttname"><a href="util_2logging_8h.html">logging.h</a></div></div>
|
|
<div class="ttc" id="autil_2logging_8h_html_a5f67b653dd99ddbe5e3367e3b4b7b532"><div class="ttname"><a href="util_2logging_8h.html#a5f67b653dd99ddbe5e3367e3b4b7b532">SOLVER_LOG</a></div><div class="ttdeci">#define SOLVER_LOG(logger,...)</div><div class="ttdef"><b>Definition:</b> <a href="util_2logging_8h_source.html#l00069">util/logging.h:69</a></div></div>
|
|
<div class="ttc" id="avlog__is__on_8h_html_a956152cad330225654d128f35c00efce"><div class="ttname"><a href="vlog__is__on_8h.html#a956152cad330225654d128f35c00efce">VLOG_IS_ON</a></div><div class="ttdeci">#define VLOG_IS_ON(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="vlog__is__on_8h_source.html#l00044">vlog_is_on.h:44</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="probing_8cc.html">probing.cc</a></li>
|
|
<li class="footer">Generated by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.3 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|