<ahref="element_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="preprocessor">#include <algorithm></span></div><divclass="line"><aname="l00015"></a><spanclass="lineno"> 15</span> <spanclass="preprocessor">#include <cstdint></span></div><divclass="line"><aname="l00016"></a><spanclass="lineno"> 16</span> <spanclass="preprocessor">#include <limits></span></div><divclass="line"><aname="l00017"></a><spanclass="lineno"> 17</span> <spanclass="preprocessor">#include <memory></span></div><divclass="line"><aname="l00018"></a><spanclass="lineno"> 18</span> <spanclass="preprocessor">#include <numeric></span></div><divclass="line"><aname="l00019"></a><spanclass="lineno"> 19</span> <spanclass="preprocessor">#include <string></span></div><divclass="line"><aname="l00020"></a><spanclass="lineno"> 20</span> <spanclass="preprocessor">#include <utility></span></div><divclass="line"><aname="l00021"></a><spanclass="lineno"> 21</span> <spanclass="preprocessor">#include <vector></span></div><divclass="line"><aname="l00022"></a><spanclass="lineno"> 22</span> </div><divclass="line"><aname="l00023"></a><spanclass="lineno"> 23</span> <spanclass="preprocessor">#include "absl/strings/str_format.h"</span></div><divclass="line"><aname="l00024"></a><spanclass="lineno"> 24</span> <spanclass="preprocessor">#include "absl/strings/str_join.h"</span></div><divclass="line"><aname="l00025"></a><spanclass="lineno"> 25</span> <spanclass="preprocessor">#include "<aclass="code"href="integral__types_8h.html">ortools/base/integral_types.h</a>"</span></div><divclass="line"><aname="l00026"></a><spanclass="lineno"> 26</span> <spanclass="preprocessor">#include "<aclass="code"href="base_2logging_8h.html">ortools/base/logging.h</a>"</span><
<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_int_var_html_a6e33a313eaf507bae0eb7068455a5bdc"><divclass="ttname"><ahref="classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc">operations_research::IntVar::WhenBound</a></div><divclass="ttdeci">virtual void WhenBound(Demon *d)=0</div><divclass="ttdoc">This method attaches a demon that will be awakened when the variable is bound.</div></div>
<divclass="ttc"id="namespaceoperations__research_html_a3f4525e71a6b05d97c868f0832750a60"><divclass="ttname"><ahref="namespaceoperations__research.html#a3f4525e71a6b05d97c868f0832750a60">operations_research::IsArrayBoolean</a></div><divclass="ttdeci">bool IsArrayBoolean(const std::vector< T >&values)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l02855">constraint_solveri.h:2855</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html_aea04391e4d85555ed4fde9b89e8139f2"><divclass="ttname"><ahref="namespaceoperations__research.html#aea04391e4d85555ed4fde9b89e8139f2">operations_research::JoinNamePtr</a></div><divclass="ttdeci">std::string JoinNamePtr(const std::vector< T >&v, const std::string &separator)</div><divclass="ttdef"><b>Definition:</b><ahref="string__array_8h_source.html#l00052">string_array.h:52</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="classoperations__research_1_1_demon_html"><divclass="ttname"><ahref="classoperations__research_1_1_demon.html">operations_research::Demon</a></div><divclass="ttdoc">A Demon is the base element of a propagation queue.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03303">constraint_solver.h:3303</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_a14f5f5eb80fe6b09d39ff1c0f0b816a3"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a14f5f5eb80fe6b09d39ff1c0f0b816a3">operations_research::Solver::RegisterIntExpr</a></div><divclass="ttdeci">IntExpr * RegisterIntExpr(IntExpr *const expr)</div><divclass="ttdoc">Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.</div><divclass="ttdef"><b>Definition:</b><ahref="trace_8cc_source.html#l00849">trace.cc:849</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="namespaceoperations__research_1_1sat_html_a3bd2b0a66b0f1c16476487ad3ddc72ea"><divclass="ttname"><ahref="namespaceoperations__research_1_1sat.html#a3bd2b0a66b0f1c16476487ad3ddc72ea">operations_research::sat::Value</a></div><divclass="ttdeci">std::function< int64_t(const Model &)> Value(IntegerVariable v)</div><divclass="ttdef"><b>Definition:</b><ahref="integer_8h_source.html#l01544">integer.h:1544</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_solver_html_a757134fa69300766dced7f3ed9cd1810"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a757134fa69300766dced7f3ed9cd1810">operations_research::Solver::MakeConstraintInitialPropagateCallback</a></div><divclass="ttdeci">Demon * MakeConstraintInitialPropagateCallback(Constraint *const ct)</div><divclass="ttdoc">This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...</div><divclass="ttdef"><b>Definition:</b><ahref="constraints_8cc_source.html#l00035">constraints.cc:35</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_if_then_else_ct_html_a36d844f2722273b190ed9a069dd25938"><divclass="ttname"><ahref="classoperations__research_1_1_if_then_else_ct.html#a36d844f2722273b190ed9a069dd25938">operations_research::IfThenElseCt::InitialPropagate</a></div><divclass="ttdeci">void InitialPropagate() override</div><divclass="ttdoc">This method performs the initial propagation of the constraint.</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01145">element.cc:1145</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html_aafac7375c23337f25821aa6f86ca627c"><divclass="ttname"><ahref="namespaceoperations__research.html#aafac7375c23337f25821aa6f86ca627c">operations_research::IsIncreasingContiguous</a></div><divclass="ttdeci">bool IsIncreasingContiguous(const std::vector< T >&values)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l02915">constraint_solveri.h:2915</a></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="namespaceoperations__research_html_a12527c82ffc8b31c5d8dc836c366d624"><divclass="ttname"><ahref="namespaceoperations__research.html#a12527c82ffc8b31c5d8dc836c366d624">operations_research::IsArrayConstant</a></div><divclass="ttdeci">bool IsArrayConstant(const std::vector< T >&values, const T &value)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l02845">constraint_solveri.h:2845</a></div></div>
<divclass="ttc"id="element_8cc_html_ac0db2d451cc038ba5425ebb07a91c6bf"><divclass="ttname"><ahref="element_8cc.html#ac0db2d451cc038ba5425ebb07a91c6bf">ABSL_FLAG</a></div><divclass="ttdeci">ABSL_FLAG(bool, cp_disable_element_cache, true, "If true, caching for IntElement is disabled.")</div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a141ceaeede5f00e9a4c798e55048cf99"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a141ceaeede5f00e9a4c798e55048cf99">operations_research::Solver::MakeIndexExpression</a></div><divclass="ttdeci">IntExpr * MakeIndexExpression(const std::vector< IntVar * >&vars, int64_t value)</div><divclass="ttdoc">Returns the expression expr such that vars[expr] == value.</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01759">element.cc:1759</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_a495aac6fec0fd7a6780cde3fc6128fdc"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a495aac6fec0fd7a6780cde3fc6128fdc">operations_research::Solver::MakeIntVar</a></div><divclass="ttdeci">IntVar * MakeIntVar(int64_t min, int64_t max, const std::string &name)</div><divclass="ttdoc">MakeIntVar will create the best range based int var for the bounds given.</div><divclass="ttdef"><b>Definition:</b><ahref="expressions_8cc_source.html#l06388">expressions.cc:6388</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="classoperations__research_1_1_solver_html_a74b8b1a83df2cb86a4e3606c747e202c"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a74b8b1a83df2cb86a4e3606c747e202c">operations_research::Solver::MakeIfThenElseCt</a></div><divclass="ttdeci">Constraint * MakeIfThenElseCt(IntVar *const condition, IntExpr *const then_expr, IntExpr *const else_expr, IntVar *const target_var)</div><divclass="ttdoc">Special cases with arrays of size two.</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01609">element.cc:1609</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_if_then_else_ct_html_aa30c84aec5e60d6b74e1e1eb15011d4a"><divclass="ttname"><ahref="classoperations__research_1_1_if_then_else_ct.html#aa30c84aec5e60d6b74e1e1eb15011d4a">operations_research::IfThenElseCt::Accept</a></div><divclass="ttdeci">void Accept(ModelVisitor *const visitor) const override</div><divclass="ttdoc">Accepts the given visitor.</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01186">element.cc:1186</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="namespaceoperations__research_html_a9be76edcbd5ccb982d92c8d90421a73c"><divclass="ttname"><ahref="namespaceoperations__research.html#a9be76edcbd5ccb982d92c8d90421a73c">operations_research::JoinDebugStringPtr</a></div><divclass="ttdeci">std::string JoinDebugStringPtr(const std::vector< T >&v, const std::string &separator)</div><divclass="ttdef"><b>Definition:</b><ahref="string__array_8h_source.html#l00045">string_array.h:45</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_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_if_then_else_ct_html_a19d94d32f3bde30deeebb883c6f71f84"><divclass="ttname"><ahref="classoperations__research_1_1_if_then_else_ct.html#a19d94d32f3bde30deeebb883c6f71f84">operations_research::IfThenElseCt::Post</a></div><divclass="ttdeci">void Post() override</div><divclass="ttdoc">This method is called when the constraint is processed by the solver.</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01137">element.cc:1137</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_int_expr_html_a076a8890703df019ca737781b376cbe3"><divclass="ttname"><ahref="classoperations__research_1_1_int_expr.html#a076a8890703df019ca737781b376cbe3">operations_research::IntExpr::SetRange</a></div><divclass="ttdeci">virtual void SetRange(int64_t l, int64_t u)</div><divclass="ttdoc">This method sets both the min and the max of the expression.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03856">constraint_solver.h:3856</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_solver_html_a814f10c84ca9b8ee0b25453b8c381a02"><divclass="ttname"><ahref="classoperations__research_1_1_solver.html#a814f10c84ca9b8ee0b25453b8c381a02">operations_research::Solver::MakeIndexOfConstraint</a></div><divclass="ttdeci">Constraint * MakeIndexOfConstraint(const std::vector< IntVar * >&vars, IntVar *const index, int64_t target)</div><divclass="ttdoc">This constraint is a special case of the element constraint with an array of integer variables,...</div><divclass="ttdef"><b>Definition:</b><ahref="element_8cc_source.html#l01744">element.cc:1744</a></div></div>
<divclass="ttc"id="classoperations__research_1_1_init_and_get_values_html"><divclass="ttname"><ahref="classoperations__research_1_1_init_and_get_values.html">operations_research::InitAndGetValues</a></div><divclass="ttdoc">Utility class to encapsulate an IntVarIterator and use it in a range-based loop.</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solver_8h_source.html#l03944">constraint_solver.h:3944</a></div></div>
<divclass="ttc"id="namespaceoperations__research_html_a3d434774c07815a25ffaa7adb343c19e"><divclass="ttname"><ahref="namespaceoperations__research.html#a3d434774c07815a25ffaa7adb343c19e">operations_research::IsIncreasing</a></div><divclass="ttdeci">bool IsIncreasing(const std::vector< T >&values)</div><divclass="ttdef"><b>Definition:</b><ahref="constraint__solveri_8h_source.html#l02925">constraint_solveri.h:2925</a></div></div>