Files
ortools-clone/docs/cpp/math__opt__proto__utils_8h_source.html
2021-12-14 13:41:01 +01:00

258 lines
34 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.2"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: math_opt_proto_utils.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.2 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('math__opt__proto__utils_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle"><div class="title">math_opt_proto_utils.h</div></div>
</div><!--header-->
<div class="contents">
<a href="math__opt__proto__utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#ifndef OR_TOOLS_MATH_OPT_CORE_MATH_OPT_PROTO_UTILS_H_</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#define OR_TOOLS_MATH_OPT_CORE_MATH_OPT_PROTO_UTILS_H_</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &quot;<a class="code" href="integral__types_8h.html">ortools/base/integral_types.h</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &quot;<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &quot;absl/container/flat_hash_set.h&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &quot;ortools/math_opt/callback.pb.h&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &quot;ortools/math_opt/model.pb.h&quot;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &quot;ortools/math_opt/model_update.pb.h&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;ortools/math_opt/sparse_containers.pb.h&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="keyword">namespace </span>math_opt {</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1math__opt.html#a3055f8b845cde39af2c3bed9007d4a06"> 31</a></span><span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a3055f8b845cde39af2c3bed9007d4a06">NumVariables</a>(<span class="keyword">const</span> VariablesProto&amp; variables) {</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">return</span> variables.ids_size();</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span>}</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1math__opt.html#a98600a28f0f805ae0cbe04802b0dcbc4"> 35</a></span><span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a98600a28f0f805ae0cbe04802b0dcbc4">NumConstraints</a>(<span class="keyword">const</span> LinearConstraintsProto&amp; linear_constraints) {</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">return</span> linear_constraints.ids_size();</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span>}</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1math__opt.html#a1c3bab427ac8280d7b32019b88ec59b4"> 39</a></span><span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a1c3bab427ac8280d7b32019b88ec59b4">NumMatrixNonzeros</a>(<span class="keyword">const</span> SparseDoubleMatrixProto&amp; matrix) {</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keywordflow">return</span> matrix.row_ids_size();</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span>}</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment">// Removes the items in the sparse double vector for all indices whose value is</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="comment">// exactly 0.0.</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment">//</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment">// NaN values are kept in place.</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">//</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment">// The function asserts that input is a valid sparse vector, i.e. that the</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment">// number of values and ids match.</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#af649365c28596912460bb9375e377b63">RemoveSparseDoubleVectorZeros</a>(SparseDoubleVectorProto&amp; sparse_vector);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment">// A utility class that tests if a pair (id, value) should be filtered based on</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment">// an input SparseVectorFilterProto.</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment">//</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment">// This predicate expects the input is sorted by ids. In non-optimized builds,</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment">// it will check that this is the case.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html"> 57</a></span><span class="keyword">class </span><a class="code hl_class" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html">SparseVectorFilterPredicate</a> {</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// Builds a predicate based on the input filter. A reference to this filter is</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// kept so the caller must make sure this filter outlives the predicate.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="comment">//</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="comment">// The filter.filtered_ids is expected to be sorted and not contain</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// duplicates. In non-optimized builds, it will be CHECKed.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keyword">explicit</span> <a class="code hl_function" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#a4b629c158cb9a96810d39b72b3a2a587">SparseVectorFilterPredicate</a>(<span class="keyword">const</span> SparseVectorFilterProto&amp; filter);</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="comment">// Returns true if the input value should be kept, false if it should be</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="comment">// ignored since it is not selected by the filter.</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">//</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="comment">// This function is expected to be called with strictly increasing ids. In</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="comment">// non-optimized builds it will CHECK that this is the case. It updates an</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="comment">// internal counter when filtering by ids.</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Value&gt;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#ac85e9cc171a845c8fe097f9306544181">AcceptsAndUpdate</a>(<span class="keyword">const</span> int64_t <span class="keywordtype">id</span>, <span class="keyword">const</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a96eab70b5ead3894afac4d4fff0fd984">Value</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>);</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keyword">const</span> SparseVectorFilterProto&amp; filter_;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> </div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="comment">// Index of the next element to consider in filter_.filtered_ids().</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordtype">int</span> next_filtered_id_index_ = 0;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="comment">// Invariant: next input id must be &gt;= next_input_id_lower_bound_.</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="comment">//</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="comment">// The initial value is 0 since all ids are expected to be non-negative.</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">int</span> next_input_id_lower_bound_ = 0;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="preprocessor">#endif </span><span class="comment">// NDEBUG</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>};</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment">// Returns the callback_registration.request_registration as a set of enums.</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span>absl::flat_hash_set&lt;CallbackEventProto&gt; <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#af457f60ebac293554106c3ee3898607e">EventSet</a>(</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keyword">const</span> CallbackRegistrationProto&amp; callback_registration);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> </div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="comment">// Inline functions implementations.</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="comment"></span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Value&gt;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"><a class="line" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#ac85e9cc171a845c8fe097f9306544181"> 98</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#ac85e9cc171a845c8fe097f9306544181">SparseVectorFilterPredicate::AcceptsAndUpdate</a>(<span class="keyword">const</span> int64_t <span class="keywordtype">id</span>,</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keyword">const</span> <a class="code hl_function" href="namespaceoperations__research_1_1sat.html#a96eab70b5ead3894afac4d4fff0fd984">Value</a>&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>) {</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(<span class="keywordtype">id</span>, next_input_id_lower_bound_)</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> &lt;&lt; <span class="stringliteral">&quot;This function must be called with strictly increasing ids.&quot;</span>;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="comment">// Update the range of the next expected id. We expect input to be strictly</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="comment">// increasing.</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> next_input_id_lower_bound_ = <span class="keywordtype">id</span> + 1;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="preprocessor">#endif </span><span class="comment">// NDEBUG</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="comment">// For this predicate we use `0` as the zero to test with since as of today we</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="comment">// only have SparseDoubleVectorProto and SparseBoolVectorProto. The `bool`</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="comment">// type is an integral type so the comparison with 0 will indeed be equivalent</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="comment">// to keeping only `true` values.</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">if</span> (filter_.skip_zero_values() &amp;&amp; <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> == 0) {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</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> <span class="keywordflow">if</span> (!filter_.filter_by_ids()) {</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> }</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="comment">// Skip all filtered_ids that are smaller than the input id.</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">while</span> (next_filtered_id_index_ &lt; filter_.filtered_ids_size() &amp;&amp;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> filter_.filtered_ids(next_filtered_id_index_) &lt; <span class="keywordtype">id</span>) {</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> ++next_filtered_id_index_;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> }</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keywordflow">if</span> (next_filtered_id_index_ == filter_.filtered_ids_size()) {</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="comment">// We filter by ids and there are no more ids that should pass.</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> }</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="comment">// The previous loop ensured that the element at next_filtered_id_index_ is</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="comment">// the first element greater or equal to id.</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">return</span> <span class="keywordtype">id</span> == filter_.filtered_ids(next_filtered_id_index_);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span>}</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span>} <span class="comment">// namespace math_opt</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span>} <span class="comment">// namespace operations_research</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="preprocessor">#endif </span><span class="comment">// OR_TOOLS_MATH_OPT_CORE_MATH_OPT_PROTO_UTILS_H_</span></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_a7cc25402ecd7591b4c39934dd656b1f9"><div class="ttname"><a href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a></div><div class="ttdeci">#define CHECK_GE(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="aclassoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate_html"><div class="ttname"><a href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html">operations_research::math_opt::SparseVectorFilterPredicate</a></div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8h_source.html#l00057">math_opt_proto_utils.h:57</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate_html_a4b629c158cb9a96810d39b72b3a2a587"><div class="ttname"><a href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#a4b629c158cb9a96810d39b72b3a2a587">operations_research::math_opt::SparseVectorFilterPredicate::SparseVectorFilterPredicate</a></div><div class="ttdeci">SparseVectorFilterPredicate(const SparseVectorFilterProto &amp;filter)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8cc_source.html#l00051">math_opt_proto_utils.cc:51</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate_html_ac85e9cc171a845c8fe097f9306544181"><div class="ttname"><a href="classoperations__research_1_1math__opt_1_1_sparse_vector_filter_predicate.html#ac85e9cc171a845c8fe097f9306544181">operations_research::math_opt::SparseVectorFilterPredicate::AcceptsAndUpdate</a></div><div class="ttdeci">bool AcceptsAndUpdate(const int64_t id, const Value &amp;value)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8h_source.html#l00098">math_opt_proto_utils.h:98</a></div></div>
<div class="ttc" id="ademon__profiler_8cc_html_ac072af30c4ffbc834bb4c681f6ecb514"><div class="ttname"><a href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a></div><div class="ttdeci">int64_t value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00044">demon_profiler.cc:44</a></div></div>
<div class="ttc" id="aintegral__types_8h_html"><div class="ttname"><a href="integral__types_8h.html">integral_types.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_a1c3bab427ac8280d7b32019b88ec59b4"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a1c3bab427ac8280d7b32019b88ec59b4">operations_research::math_opt::NumMatrixNonzeros</a></div><div class="ttdeci">int NumMatrixNonzeros(const SparseDoubleMatrixProto &amp;matrix)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8h_source.html#l00039">math_opt_proto_utils.h:39</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_a3055f8b845cde39af2c3bed9007d4a06"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a3055f8b845cde39af2c3bed9007d4a06">operations_research::math_opt::NumVariables</a></div><div class="ttdeci">int NumVariables(const VariablesProto &amp;variables)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8h_source.html#l00031">math_opt_proto_utils.h:31</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_a98600a28f0f805ae0cbe04802b0dcbc4"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a98600a28f0f805ae0cbe04802b0dcbc4">operations_research::math_opt::NumConstraints</a></div><div class="ttdeci">int NumConstraints(const LinearConstraintsProto &amp;linear_constraints)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8h_source.html#l00035">math_opt_proto_utils.h:35</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_af457f60ebac293554106c3ee3898607e"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#af457f60ebac293554106c3ee3898607e">operations_research::math_opt::EventSet</a></div><div class="ttdeci">absl::flat_hash_set&lt; CallbackEventProto &gt; EventSet(const CallbackRegistrationProto &amp;callback_registration)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8cc_source.html#l00066">math_opt_proto_utils.cc:66</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_af649365c28596912460bb9375e377b63"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#af649365c28596912460bb9375e377b63">operations_research::math_opt::RemoveSparseDoubleVectorZeros</a></div><div class="ttdeci">void RemoveSparseDoubleVectorZeros(SparseDoubleVectorProto &amp;sparse_vector)</div><div class="ttdef"><b>Definition:</b> <a href="math__opt__proto__utils_8cc_source.html#l00031">math_opt_proto_utils.cc:31</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1sat_html_a96eab70b5ead3894afac4d4fff0fd984"><div class="ttname"><a href="namespaceoperations__research_1_1sat.html#a96eab70b5ead3894afac4d4fff0fd984">operations_research::sat::Value</a></div><div class="ttdeci">std::function&lt; int64_t(const Model &amp;)&gt; Value(IntegerVariable v)</div><div class="ttdef"><b>Definition:</b> <a href="integer_8h_source.html#l01673">integer.h:1673</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><!-- 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_1defc00030ff81d309105e053121082f.html">math_opt</a></li><li class="navelem"><a class="el" href="dir_d5b95ec3710e8b09bb3a6564ed5074d8.html">core</a></li><li class="navelem"><a class="el" href="math__opt__proto__utils_8h.html">math_opt_proto_utils.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.2 </li>
</ul>
</div>
</body>
</html>