<ahref="expr__cst_8cc.html">Go to the documentation of this file.</a><divclass="fragment"><divclass="line"><aname="l00001"></a><spanclass="lineno"> 1</span> <spanclass="comment">// Copyright 2010-2021 Google LLC</span></div><divclass="line"><aname="l00002"></a><spanclass="lineno"> 2</span> <spanclass="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></div><divclass="line"><aname="l00003"></a><spanclass="lineno"> 3</span> <spanclass="comment">// you may not use this file except in compliance with the License.</span></div><divclass="line"><aname="l00004"></a><spanclass="lineno"> 4</span> <spanclass="comment">// You may obtain a copy of the License at</span></div><divclass="line"><aname="l00005"></a><spanclass="lineno"> 5</span> <spanclass="comment">//</span></div><divclass="line"><aname="l00006"></a><spanclass="lineno"> 6</span> <spanclass="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div><divclass="line"><aname="l00007"></a><spanclass="lineno"> 7</span> <spanclass="comment">//</span></div><divclass="line"><aname="l00008"></a><spanclass="lineno"> 8</span> <spanclass="comment">// Unless required by applicable law or agreed to in writing, software</span></div><divclass="line"><aname="l00009"></a><spanclass="lineno"> 9</span> <spanclass="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></div><divclass="line"><aname="l00010"></a><spanclass="lineno"> 10</span> <spanclass="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><divclass="line"><aname="l00011"></a><spanclass="lineno"> 11</span> <spanclass="comment">// See the License for the specific language governing permissions and</span></div><divclass="line"><aname="l00012"></a><spanclass="lineno"> 12</span> <spanclass="comment">// limitations under the License.</span></div><divclass="line"><aname="l00013"></a><spanclass="lineno"> 13</span> </div><divclass="line"><aname="l00014"></a><spanclass="lineno"> 14</span> <spanclass="comment">//</span></div><divclass="line"><aname="l00015"></a><spanclass="lineno"> 15</span> <spanclass="comment">// Expression constraints</span></div><divclass="line"><aname="l00016"></a><spanclass="lineno"> 16</span> </div><divclass="line"><aname="l00017"></a><spanclass="lineno"> 17</span> <spanclass="preprocessor">#include <cstddef></span></div><divclass="line"><aname="l00018"></a><spanclass="lineno"> 18</span> <spanclass="preprocessor">#include <cstdint></span></div><divclass="line"><aname="l00019"></a><spanclass="lineno"> 19</span> <spanclass="preprocessor">#include <limits></span></div><divclass="line"><aname="l00020"></a><spanclass="lineno"> 20</span> <spanclass="preprocessor">#include <set></span></div><divclass="line"><aname="l00021"></a><spanclass="lineno"> 21</span> <spanclass="preprocessor">#include <string></span></div><divclass="line"><aname="l00022"></a><spanclass="lineno"> 22</span> <spanclass="preprocessor">#include <vector></span></div><divclass="line"><aname="l00023"></a><spanclass="lineno"> 23</span> </div><divclass="line"><aname="l00024"></a><spanclass="lineno"> 24</span> <spanclass="preprocessor">#include "absl/strings/str_format.h"</span></div><divclass="line"><aname="l00025"></a><spanclass="lineno"> 25</span> <spanclass="preprocessor">#include "absl/strings/str_join.h"</span></div><divclass="line"><aname="l00026"></a><spanclass="lineno"> 26</span> <spanclass="preprocessor">#include "<aclass="code"href="commandlineflags_8h.html">ortools/base/commandlineflags.h</a>"</span></div><divclass="line"><aname="l00027"></a><spanclass="lineno"> 27</span> <spanclass="preprocessor">#include "<aclass="code"href="integral_
<divclass="ttc"id="classoperations__research_1_1_cast_constraint_html"><divclass="ttname"><ahref="classoperations__research_1_1_cast_constraint.html">operations_research::CastConstraint</a></div><divclass="ttdoc">Cast constraints are special channeling constraints designed to keep a variable in sync with an expre...</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03623">constraint_solver.h:3623</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a23edac56b118ef933e3ba15df9f91f92"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a23edac56b118ef933e3ba15df9f91f92">operations_research::Solver::MakeIsGreaterOrEqualCstVar</a></div><divclass="ttdeci">IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var >= value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00679">expr_cst.cc:679</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_aecc1416849d286531c1820b42d2292fc"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#aecc1416849d286531c1820b42d2292fc">operations_research::Solver::MakeIsEqualCstVar</a></div><divclass="ttdeci">IntVar * MakeIsEqualCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var == value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00462">expr_cst.cc:462</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html_ade1945fe75ec08245775fc4df20153d6"><divclass="ttname"><ahref="namespaceoperations__research.html#ade1945fe75ec08245775fc4df20153d6">operations_research::PosIntDivDown</a></div><divclass="ttdeci">int64_t PosIntDivDown(int64_t e, int64_t v)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l03015">constraint_solveri.h:3015</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html_a36d71f28bff7448b6490fe4720ab2fe0"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#a36d71f28bff7448b6490fe4720ab2fe0">operations_research::IntVar::Var</a></div><divclass="ttdeci">IntVar * Var() override</div><divclass="ttdoc">Creates a variable from the expression.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l04008">constraint_solver.h:4008</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html_a4ad6e7b43ae5f8c2bf2c865960e578fe"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#a4ad6e7b43ae5f8c2bf2c865960e578fe">operations_research::IntVar::RemoveValue</a></div><divclass="ttdeci">virtual void RemoveValue(int64_t v)=0</div><divclass="ttdoc">This method removes the value 'v' from the domain of the variable.</div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a43a6dc7053a01035ce1599d50d823b7c"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a43a6dc7053a01035ce1599d50d823b7c">operations_research::Solver::MakeIsLessCstVar</a></div><divclass="ttdeci">IntVar * MakeIsLessCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var < value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00796">expr_cst.cc:796</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html_afb0903025d265c67199f5f09cee57ed0"><divclass="ttname"><ahref="namespaceoperations__research.html#afb0903025d265c67199f5f09cee57ed0">operations_research::PosIntDivUp</a></div><divclass="ttdeci">int64_t PosIntDivUp(int64_t e, int64_t v)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l03010">constraint_solveri.h:3010</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a13e8a8f8144963f9b7d337e34aed616d"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a13e8a8f8144963f9b7d337e34aed616d">operations_research::Solver::MakeIsGreaterCstVar</a></div><divclass="ttdeci">IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var > value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00696">expr_cst.cc:696</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html_a0723abf37f7a5a8a604fd1bcd96a7be0"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#a0723abf37f7a5a8a604fd1bcd96a7be0">operations_research::IntVar::Contains</a></div><divclass="ttdeci">virtual bool Contains(int64_t v) const =0</div><divclass="ttdoc">This method returns whether the value 'v' is in the domain of the variable.</div></div>
<divclass="ttc"id="namespaceoperations__research_1_1math__opt_html_a5de89a1f6e3f80a49a0d76136d8044e2"><divclass="ttname"><ahref="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">operations_research::math_opt::swap</a></div><divclass="ttdeci">void swap(IdMap< K, V >&a, IdMap< K, V >&b)</div><divclass="ttdef"><b>Definition:</b><ahref="id__map_8h_source.html#l00263">id_map.h:263</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a38dd8015b2a97716a49dd5be4695aeea"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a38dd8015b2a97716a49dd5be4695aeea">operations_research::Solver::MakeIsEqualVar</a></div><divclass="ttdeci">IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)</div><divclass="ttdoc">status var of (v1 == v2)</div><divclass="ttdef"><b>Definition:</b><ahref="range__cst_8cc_source.html#l00577">range_cst.cc:577</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_constraint_html"><divclass="ttname"><ahref="classoperations__research_1_1_constraint.html">operations_research::Constraint</a></div><divclass="ttdoc">A constraint is the main modeling object.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03587">constraint_solver.h:3587</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a5931080c9bfda8dedfef0e3adf313ab3"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">operations_research::Solver::AddConstraint</a></div><divclass="ttdeci">void AddConstraint(Constraint *const c)</div><divclass="ttdoc">Adds the constraint 'c' to the model.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8cc_source.html#l01662">constraint_solver.cc:1662</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html_af5d847a82550308399c315915ef8408f"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#af5d847a82550308399c315915ef8408f">operations_research::IntVar::IsVar</a></div><divclass="ttdeci">bool IsVar() const override</div><divclass="ttdoc">Returns true if the expression is indeed a variable.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l04007">constraint_solver.h:4007</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_a1d04569b37cb7fe6ed0956ab71e08bc9"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">operations_research::IntExpr::Bound</a></div><divclass="ttdeci">virtual bool Bound() const</div><divclass="ttdoc">Returns true if the min and the max of the expression are equal.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03865">constraint_solver.h:3865</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_a07173db6ca3b22fdb35ad963831a962b"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b">operations_research::IntExpr::Var</a></div><divclass="ttdeci">virtual IntVar * Var()=0</div><divclass="ttdoc">Creates a variable from the expression.</div></div>
<divclass="ttc"id="classoperations__research_1_1_sorted_disjoint_interval_list_html"><divclass="ttname"><ahref="classoperations__research_1_1_sorted_disjoint_interval_list.html">operations_research::SortedDisjointIntervalList</a></div><divclass="ttdoc">This class represents a sorted list of disjoint, closed intervals.</div><divclass="ttdef"><b>Definition:</b><ahref="sorted__interval__list_8h_source.html#l00470">sorted_interval_list.h:470</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html_af8625719d57e4a61b5aa251d99762966"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">operations_research::IntVar::Size</a></div><divclass="ttdeci">virtual uint64_t Size() const =0</div><divclass="ttdoc">This method returns the number of values in the domain of the variable.</div></div>
<divclass="ttc"id="classoperations__research_1_1_int_var_html"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html">operations_research::IntVar</a></div><divclass="ttdoc">The class IntVar is a subset of IntExpr.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l04001">constraint_solver.h:4001</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html">operations_research::IntExpr</a></div><divclass="ttdoc">The class IntExpr is the base of all integer expressions in constraint programming.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03839">constraint_solver.h:3839</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_a2e57f8b497596533aae4607d8a89dd10"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#a2e57f8b497596533aae4607d8a89dd10">operations_research::IntExpr::SetValue</a></div><divclass="ttdeci">virtual void SetValue(int64_t v)</div><divclass="ttdoc">This method sets the value of the expression.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03862">constraint_solver.h:3862</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_ab741cb25dd32d1cbe02fbfb36337d9bb"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#ab741cb25dd32d1cbe02fbfb36337d9bb">operations_research::Solver::RevAlloc</a></div><divclass="ttdeci">T * RevAlloc(T *object)</div><divclass="ttdoc">Registers the given object as being reversible.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l00789">constraint_solver.h:789</a></div></div>
<divclass="ttc"id="expr__cst_8cc_html_a94ea72a6aec382f0882fc34f91a23fec"><divclass="ttname"><ahref="expr__cst_8cc.html#a94ea72a6aec382f0882fc34f91a23fec">ABSL_FLAG</a></div><divclass="ttdeci">ABSL_FLAG(int, cache_initial_size, 1024, "Initial size of the array of the hash ""table of caches for objects of type Var(x == 3)")</div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a527c9139e9c7a67de20f23ae85f40461"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a527c9139e9c7a67de20f23ae85f40461">operations_research::Solver::MakeNotBetweenCt</a></div><divclass="ttdeci">Constraint * MakeNotBetweenCt(IntExpr *const expr, int64_t l, int64_t u)</div><divclass="ttdoc">(expr < l || expr > u) This constraint is lazy as it will not make holes in the domain of variables.</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00956">expr_cst.cc:956</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_aa79e6e327b1680b72ad39b2e2af9e52c"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#aa79e6e327b1680b72ad39b2e2af9e52c">operations_research::Solver::MakeIsDifferentCstVar</a></div><divclass="ttdeci">IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var != value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00580">expr_cst.cc:580</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html"><divclass="ttname"><ahref="namespaceoperations__research.html">operations_research</a></div><divclass="ttdoc">Collection of objects used to extend the Constraint Solver library.</div><divclass="ttdef"><b>Definition:</b><ahref="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_ace746bea8d19ba6bbf319dafbd5f5e5c"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#ace746bea8d19ba6bbf319dafbd5f5e5c">operations_research::IntExpr::Range</a></div><divclass="ttdeci">virtual void Range(int64_t *l, int64_t *u)</div><divclass="ttdoc">By default calls Min() and Max(), but can be redefined when Min and Max code can be factorized.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03851">constraint_solver.h:3851</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a37f4cb0801309b89498ea22004c60f71"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a37f4cb0801309b89498ea22004c60f71">operations_research::Solver::MakeIsDifferentVar</a></div><divclass="ttdeci">IntVar * MakeIsDifferentVar(IntExpr *const v1, IntExpr *const v2)</div><divclass="ttdoc">status var of (v1 != v2)</div><divclass="ttdef"><b>Definition:</b><ahref="range__cst_8cc_source.html#l00641">range_cst.cc:641</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_af13b2ea301c6800bb6d43bd70716bf6d"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#af13b2ea301c6800bb6d43bd70716bf6d">operations_research::IntExpr::WhenRange</a></div><divclass="ttdeci">virtual void WhenRange(Demon *d)=0</div><divclass="ttdoc">Attach a demon that will watch the min or the max of the expression.</div></div>
<divclass="ttc"id="classoperations__research_1_1_demon_html_a0c1ff1e86b1eb08d0f87eab2943dac2a"><divclass="ttname"><ahref="classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a">operations_research::Demon::inhibit</a></div><divclass="ttdeci">void inhibit(Solver *const s)</div><divclass="ttdoc">This method inhibits the demon in the search tree below the current position.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8cc_source.html#l00202">constraint_solver.cc:202</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a8e9b36ec9914650dc5fa119a8ba54179"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a8e9b36ec9914650dc5fa119a8ba54179">operations_research::Solver::MakeIsLessOrEqualCstVar</a></div><divclass="ttdeci">IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64_t value)</div><divclass="ttdoc">status var of (var <= value)</div><divclass="ttdef"><b>Definition:</b><ahref="expr__cst_8cc_source.html#l00779">expr_cst.cc:779</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_a2e9b93ea445f156328eaa782adf7cb8b"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#a2e9b93ea445f156328eaa782adf7cb8b">operations_research::IntExpr::IsVar</a></div><divclass="ttdeci">virtual bool IsVar() const</div><divclass="ttdoc">Returns true if the expression is indeed a variable.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03868">constraint_solver.h:3868</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_aa2ccc3c5683cdbf7b7651894f4054385"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#aa2ccc3c5683cdbf7b7651894f4054385">operations_research::Solver::MakeBoolVar</a></div><divclass="ttdeci">IntVar * MakeBoolVar()</div><divclass="ttdoc">MakeBoolVar will create a variable with a {0, 1} domain.</div><divclass="ttdef"><b>Definition:</b><ahref="expressions_8cc_source.html#l06412">expressions.cc:6412</a></div></div>