2020-09-02 09:42:51 +02:00
<!-- 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" / >
2021-01-26 11:28:50 +01:00
< meta name = "generator" content = "Doxygen 1.9.1" / >
2020-09-02 09:42:51 +02:00
< meta name = "viewport" content = "width=device-width, initial-scale=1" / >
< title > OR-Tools: routing.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
2021-01-26 11:28:50 +01:00
  < span id = "projectnumber" > 8.2< / span >
2020-09-02 09:42:51 +02:00
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
<!-- end header part -->
2021-01-26 11:28:50 +01:00
<!-- Generated by Doxygen 1.9.1 -->
2020-09-02 09:42:51 +02:00
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3& dn=gpl-2.0.txt GPL-v2 */
2021-01-26 11:28:50 +01:00
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
2020-09-02 09:42:51 +02:00
/* @license-end */
< / script >
< script type = "text/javascript" src = "menudata.js" > < / script >
< script type = "text/javascript" src = "menu.js" > < / script >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3& dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */< / script >
< div id = "main-nav" > < / div >
< / div > <!-- top -->
< div id = "side-nav" class = "ui-resizable side-nav-resizable" >
< div id = "nav-tree" >
< div id = "nav-tree-contents" >
< div id = "nav-sync" class = "sync" > < / div >
< / div >
< / div >
< div id = "splitbar" style = "-moz-user-select:none;"
class="ui-resizable-handle">
< / div >
< / div >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3& dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('routing_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" > routing.cc< / div > < / div >
< / div > <!-- header -->
< div class = "contents" >
< a href = "routing_8cc.html" > Go to the documentation of this file.< / a > < div class = "fragment" > < div class = "line" > < a name = "l00001" > < / a > < span class = "lineno" > 1< / span >   < span class = "comment" > // Copyright 2010-2018 Google LLC< / span > < / div >
< div class = "line" > < a 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 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 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 name = "l00005" > < / a > < span class = "lineno" > 5< / span >   < span class = "comment" > //< / span > < / div >
< div class = "line" > < a 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 name = "l00007" > < / a > < span class = "lineno" > 7< / span >   < span class = "comment" > //< / span > < / div >
< div class = "line" > < a 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 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 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 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 name = "l00012" > < / a > < span class = "lineno" > 12< / span >   < span class = "comment" > // limitations under the License.< / span > < / div >
< div class = "line" > < a name = "l00013" > < / a > < span class = "lineno" > 13< / span >   < / div >
< div class = "line" > < a name = "l00014" > < / a > < span class = "lineno" > 14< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "routing_8h.html" > ortools/constraint_solver/routing.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00015" > < / a > < span class = "lineno" > 15< / span >   < / div >
< div class = "line" > < a name = "l00016" > < / a > < span class = "lineno" > 16< / span >   < span class = "preprocessor" > #include < algorithm> < / span > < / div >
< div class = "line" > < a name = "l00017" > < / a > < span class = "lineno" > 17< / span >   < span class = "preprocessor" > #include < cmath> < / span > < / div >
< div class = "line" > < a name = "l00018" > < / a > < span class = "lineno" > 18< / span >   < span class = "preprocessor" > #include < cstddef> < / span > < / div >
< div class = "line" > < a name = "l00019" > < / a > < span class = "lineno" > 19< / span >   < span class = "preprocessor" > #include < cstring> < / span > < / div >
< div class = "line" > < a name = "l00020" > < / a > < span class = "lineno" > 20< / span >   < span class = "preprocessor" > #include < functional> < / span > < / div >
< div class = "line" > < a name = "l00021" > < / a > < span class = "lineno" > 21< / span >   < span class = "preprocessor" > #include < initializer_list> < / span > < / div >
< div class = "line" > < a name = "l00022" > < / a > < span class = "lineno" > 22< / span >   < span class = "preprocessor" > #include < map> < / span > < / div >
< div class = "line" > < a name = "l00023" > < / a > < span class = "lineno" > 23< / span >   < span class = "preprocessor" > #include < memory> < / span > < / div >
< div class = "line" > < a name = "l00024" > < / a > < span class = "lineno" > 24< / span >   < span class = "preprocessor" > #include < numeric> < / span > < / div >
< div class = "line" > < a name = "l00025" > < / a > < span class = "lineno" > 25< / span >   < span class = "preprocessor" > #include < tuple> < / span > < / div >
< div class = "line" > < a name = "l00026" > < / a > < span class = "lineno" > 26< / span >   < span class = "preprocessor" > #include < utility> < / span > < / div >
< div class = "line" > < a name = "l00027" > < / a > < span class = "lineno" > 27< / span >   < / div >
< div class = "line" > < a name = "l00028" > < / a > < span class = "lineno" > 28< / span >   < span class = "preprocessor" > #include " absl/base/casts.h" < / span > < / div >
< div class = "line" > < a name = "l00029" > < / a > < span class = "lineno" > 29< / span >   < span class = "preprocessor" > #include " absl/container/flat_hash_map.h" < / span > < / div >
< div class = "line" > < a name = "l00030" > < / a > < span class = "lineno" > 30< / span >   < span class = "preprocessor" > #include " absl/container/flat_hash_set.h" < / span > < / div >
< div class = "line" > < a name = "l00031" > < / a > < span class = "lineno" > 31< / span >   < span class = "preprocessor" > #include " absl/memory/memory.h" < / span > < / div >
< div class = "line" > < a name = "l00032" > < / a > < span class = "lineno" > 32< / span >   < span class = "preprocessor" > #include " absl/strings/str_cat.h" < / span > < / div >
< div class = "line" > < a name = "l00033" > < / a > < span class = "lineno" > 33< / span >   < span class = "preprocessor" > #include " absl/strings/str_format.h" < / span > < / div >
< div class = "line" > < a name = "l00034" > < / a > < span class = "lineno" > 34< / span >   < span class = "preprocessor" > #include " absl/time/time.h" < / span > < / div >
< div class = "line" > < a name = "l00035" > < / a > < span class = "lineno" > 35< / span >   < span class = "preprocessor" > #include " google/protobuf/duration.pb.h" < / span > < / div >
< div class = "line" > < a name = "l00036" > < / a > < span class = "lineno" > 36< / span >   < span class = "preprocessor" > #include " google/protobuf/text_format.h" < / span > < / div >
< div class = "line" > < a name = "l00037" > < / a > < span class = "lineno" > 37< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "commandlineflags_8h.html" > ortools/base/commandlineflags.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00038" > < / a > < span class = "lineno" > 38< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "hash_8h.html" > ortools/base/hash.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00039" > < / a > < span class = "lineno" > 39< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "integral__types_8h.html" > ortools/base/integral_types.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00040" > < / a > < span class = "lineno" > 40< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "base_2logging_8h.html" > ortools/base/logging.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00041" > < / a > < span class = "lineno" > 41< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "map__util_8h.html" > ortools/base/map_util.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00042" > < / a > < span class = "lineno" > 42< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "mathutil_8h.html" > ortools/base/mathutil.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00043" > < / a > < span class = "lineno" > 43< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "protoutil_8h.html" > ortools/base/protoutil.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00044" > < / a > < span class = "lineno" > 44< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "stl__util_8h.html" > ortools/base/stl_util.h< / a > " < / span > < / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l00045" > < / a > < span class = "lineno" > 45< / 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 name = "l00046" > < / a > < span class = "lineno" > 46< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "thorough__hash_8h.html" > ortools/base/thorough_hash.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00047" > < / a > < span class = "lineno" > 47< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "constraint__solver_8h.html" > ortools/constraint_solver/constraint_solver.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00048" > < / a > < span class = "lineno" > 48< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "routing__enums_8pb_8h.html" > ortools/constraint_solver/routing_enums.pb.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00049" > < / a > < span class = "lineno" > 49< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "routing__lp__scheduling_8h.html" > ortools/constraint_solver/routing_lp_scheduling.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00050" > < / a > < span class = "lineno" > 50< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "routing__neighborhoods_8h.html" > ortools/constraint_solver/routing_neighborhoods.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00051" > < / a > < span class = "lineno" > 51< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "routing__parameters_8h.html" > ortools/constraint_solver/routing_parameters.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00052" > < / a > < span class = "lineno" > 52< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "connected__components_8h.html" > ortools/graph/connected_components.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00053" > < / a > < span class = "lineno" > 53< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "linear__assignment_8h.html" > ortools/graph/linear_assignment.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00054" > < / a > < span class = "lineno" > 54< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "min__cost__flow_8h.html" > ortools/graph/min_cost_flow.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00055" > < / a > < span class = "lineno" > 55< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "topologicalsorter_8h.html" > ortools/graph/topologicalsorter.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00056" > < / a > < span class = "lineno" > 56< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "lp__data_8h.html" > ortools/lp_data/lp_data.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00057" > < / a > < span class = "lineno" > 57< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "lp__types_8h.html" > ortools/lp_data/lp_types.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00058" > < / a > < span class = "lineno" > 58< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "bitset_8h.html" > ortools/util/bitset.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00059" > < / a > < span class = "lineno" > 59< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "optional__boolean_8pb_8h.html" > ortools/util/optional_boolean.pb.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00060" > < / a > < span class = "lineno" > 60< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "saturated__arithmetic_8h.html" > ortools/util/saturated_arithmetic.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00061" > < / a > < span class = "lineno" > 61< / span >   < span class = "preprocessor" > #include " < a class = "code" href = "stats_8h.html" > ortools/util/stats.h< / a > " < / span > < / div >
< div class = "line" > < a name = "l00062" > < / a > < span class = "lineno" > 62< / span >   < / div >
< div class = "line" > < a name = "l00063" > < / a > < span class = "lineno" > 63< / span >   < span class = "keyword" > namespace < / span > < a class = "code" href = "namespaceoperations__research.html" > operations_research< / a > {< / div >
< div class = "line" > < a name = "l00064" > < / a > < span class = "lineno" > 64< / span >   < span class = "keyword" > class < / span > LocalSearchPhaseParameters;< / div >
< div class = "line" > < a name = "l00065" > < / a > < span class = "lineno" > 65< / span >   } < span class = "comment" > // namespace operations_research< / span > < / div >
< div class = "line" > < a name = "l00066" > < / a > < span class = "lineno" > 66< / span >   < / div >
< div class = "line" > < a name = "l00067" > < / a > < span class = "lineno" > < a class = "line" href = "routing_8cc.html#a1672e1017f4a78d0f4979681b5693470" > 67< / a > < / span >   < a class = "code" href = "routing_8cc.html#a1672e1017f4a78d0f4979681b5693470" > ABSL_FLAG< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > , sweep_sectors, 1,< / div >
< div class = "line" > < a name = "l00068" > < / a > < span class = "lineno" > 68< / span >   < span class = "stringliteral" > " The number of sectors the space is divided before it is sweeped " < / span > < / div >
< div class = "line" > < a name = "l00069" > < / a > < span class = "lineno" > 69< / span >   < span class = "stringliteral" > " by the ray." < / span > );< / div >
< div class = "line" > < a name = "l00070" > < / a > < span class = "lineno" > 70< / span >   < / div >
< div class = "line" > < a name = "l00071" > < / a > < span class = "lineno" > 71< / span >   < span class = "comment" > // Trace settings< / span > < / div >
< div class = "line" > < a name = "l00072" > < / a > < span class = "lineno" > 72< / span >   < / div >
< div class = "line" > < a name = "l00073" > < / a > < span class = "lineno" > 73< / span >   < span class = "comment" > // TODO(user): Move most of the following settings to a model parameter< / span > < / div >
< div class = "line" > < a name = "l00074" > < / a > < span class = "lineno" > 74< / span >   < span class = "comment" > // proto.< / span > < / div >
< div class = "line" > < a name = "l00075" > < / a > < span class = "lineno" > 75< / span >   < / div >
< div class = "line" > < a name = "l00076" > < / a > < span class = "lineno" > 76< / span >   < span class = "keyword" > namespace < / span > < a class = "code" href = "namespaceoperations__research.html" > operations_research< / a > {< / div >
< div class = "line" > < a name = "l00077" > < / a > < span class = "lineno" > 77< / span >   < / div >
< div class = "line" > < a name = "l00078" > < / a > < span class = "lineno" > 78< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l00079" > < / a > < span class = "lineno" > 79< / span >   < span class = "comment" > // A decision builder which tries to assign values to variables as close as< / span > < / div >
< div class = "line" > < a name = "l00080" > < / a > < span class = "lineno" > 80< / span >   < span class = "comment" > // possible to target values first.< / span > < / div >
< div class = "line" > < a name = "l00081" > < / a > < span class = "lineno" > 81< / span >   < span class = "comment" > // TODO(user): Move to CP solver.< / span > < / div >
< div class = "line" > < a name = "l00082" > < / a > < span class = "lineno" > 82< / span >   < span class = "keyword" > class < / span > SetValuesFromTargets : < span class = "keyword" > public< / span > DecisionBuilder {< / div >
< div class = "line" > < a name = "l00083" > < / a > < span class = "lineno" > 83< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00084" > < / a > < span class = "lineno" > 84< / span >   SetValuesFromTargets(std::vector< IntVar*> variables,< / div >
< div class = "line" > < a name = "l00085" > < / a > < span class = "lineno" > 85< / span >   std::vector< int64> targets)< / div >
< div class = "line" > < a name = "l00086" > < / a > < span class = "lineno" > 86< / span >   : variables_(std::move(variables)),< / div >
< div class = "line" > < a name = "l00087" > < / a > < span class = "lineno" > 87< / span >   targets_(std::move(targets)),< / div >
< div class = "line" > < a name = "l00088" > < / a > < span class = "lineno" > 88< / span >   index_(0),< / div >
< div class = "line" > < a name = "l00089" > < / a > < span class = "lineno" > 89< / span >   steps_(variables_.size(), 0) {< / div >
< div class = "line" > < a name = "l00090" > < / a > < span class = "lineno" > 90< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (variables_.size(), targets_.size());< / div >
< div class = "line" > < a name = "l00091" > < / a > < span class = "lineno" > 91< / span >   }< / div >
< div class = "line" > < a name = "l00092" > < / a > < span class = "lineno" > 92< / span >   Decision* Next(Solver* < span class = "keyword" > const< / span > solver)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00093" > < / a > < span class = "lineno" > 93< / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = index_.Value();< / div >
< div class = "line" > < a name = "l00094" > < / a > < span class = "lineno" > 94< / span >   < span class = "keywordflow" > while< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < variables_.size() & & variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> Bound()) {< / div >
< div class = "line" > < a name = "l00095" > < / a > < span class = "lineno" > 95< / span >   ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ;< / div >
< div class = "line" > < a name = "l00096" > < / a > < span class = "lineno" > 96< / span >   }< / div >
< div class = "line" > < a name = "l00097" > < / a > < span class = "lineno" > 97< / span >   index_.SetValue(solver, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l00098" > < / a > < span class = "lineno" > 98< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > > = variables_.size()) < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l00099" > < / a > < span class = "lineno" > 99< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > variable_min = variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> Min();< / div >
< div class = "line" > < a name = "l00100" > < / a > < span class = "lineno" > 100< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > variable_max = variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> Max();< / div >
< div class = "line" > < a name = "l00101" > < / a > < span class = "lineno" > 101< / span >   < span class = "comment" > // Target can be before, inside, or after the variable range.< / span > < / div >
< div class = "line" > < a name = "l00102" > < / a > < span class = "lineno" > 102< / span >   < span class = "comment" > // We do a trichotomy on this for clarity.< / span > < / div >
< div class = "line" > < a name = "l00103" > < / a > < span class = "lineno" > 103< / span >   < span class = "keywordflow" > if< / span > (targets_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] < = variable_min) {< / div >
< div class = "line" > < a name = "l00104" > < / a > < span class = "lineno" > 104< / span >   < span class = "keywordflow" > return< / span > solver-> MakeAssignVariableValue(variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], variable_min);< / div >
< div class = "line" > < a name = "l00105" > < / a > < span class = "lineno" > 105< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (targets_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] > = variable_max) {< / div >
< div class = "line" > < a name = "l00106" > < / a > < span class = "lineno" > 106< / span >   < span class = "keywordflow" > return< / span > solver-> MakeAssignVariableValue(variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], variable_max);< / div >
< div class = "line" > < a name = "l00107" > < / a > < span class = "lineno" > 107< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00108" > < / a > < span class = "lineno" > 108< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > step = steps_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l00109" > < / a > < span class = "lineno" > 109< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (targets_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], step);< / div >
< div class = "line" > < a name = "l00110" > < / a > < span class = "lineno" > 110< / span >   < span class = "comment" > // If value is out of variable' s range, we can remove the interval of< / span > < / div >
< div class = "line" > < a name = "l00111" > < / a > < span class = "lineno" > 111< / span >   < span class = "comment" > // values already explored (which can make the solver fail) and< / span > < / div >
< div class = "line" > < a name = "l00112" > < / a > < span class = "lineno" > 112< / span >   < span class = "comment" > // recall Next() to get back into the trichotomy above.< / span > < / div >
< div class = "line" > < a name = "l00113" > < / a > < span class = "lineno" > 113< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > < variable_min || variable_max < < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ) {< / div >
< div class = "line" > < a name = "l00114" > < / a > < span class = "lineno" > 114< / span >   step = GetNextStep(step);< / div >
< div class = "line" > < a name = "l00115" > < / a > < span class = "lineno" > 115< / span >   < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (targets_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], step);< / div >
< div class = "line" > < a name = "l00116" > < / a > < span class = "lineno" > 116< / span >   < span class = "keywordflow" > if< / span > (step > 0) {< / div >
< div class = "line" > < a name = "l00117" > < / a > < span class = "lineno" > 117< / span >   < span class = "comment" > // Values in [variable_min, value) were already explored.< / span > < / div >
< div class = "line" > < a name = "l00118" > < / a > < span class = "lineno" > 118< / span >   variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> SetMin(< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > );< / div >
< div class = "line" > < a name = "l00119" > < / a > < span class = "lineno" > 119< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00120" > < / a > < span class = "lineno" > 120< / span >   < span class = "comment" > // Values in (value, variable_max] were already explored.< / span > < / div >
< div class = "line" > < a name = "l00121" > < / a > < span class = "lineno" > 121< / span >   variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> SetMax(< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > );< / div >
< div class = "line" > < a name = "l00122" > < / a > < span class = "lineno" > 122< / span >   }< / div >
< div class = "line" > < a name = "l00123" > < / a > < span class = "lineno" > 123< / span >   < span class = "keywordflow" > return< / span > Next(solver);< / div >
< div class = "line" > < a name = "l00124" > < / a > < span class = "lineno" > 124< / span >   }< / div >
< div class = "line" > < a name = "l00125" > < / a > < span class = "lineno" > 125< / span >   steps_.SetValue(solver, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , GetNextStep(step));< / div >
< div class = "line" > < a name = "l00126" > < / a > < span class = "lineno" > 126< / span >   < span class = "keywordflow" > return< / span > solver-> MakeAssignVariableValueOrDoNothing(variables_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ],< / div >
< div class = "line" > < a name = "l00127" > < / a > < span class = "lineno" > 127< / span >   < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > );< / div >
< div class = "line" > < a name = "l00128" > < / a > < span class = "lineno" > 128< / span >   }< / div >
< div class = "line" > < a name = "l00129" > < / a > < span class = "lineno" > 129< / span >   }< / div >
< div class = "line" > < a name = "l00130" > < / a > < span class = "lineno" > 130< / span >   < / div >
< div class = "line" > < a name = "l00131" > < / a > < span class = "lineno" > 131< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00132" > < / a > < span class = "lineno" > 132< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > GetNextStep(< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > step)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l00133" > < / a > < span class = "lineno" > 133< / span >   < span class = "keywordflow" > return< / span > (step > 0) ? -step : < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (1, step);< / div >
< div class = "line" > < a name = "l00134" > < / a > < span class = "lineno" > 134< / span >   }< / div >
< div class = "line" > < a name = "l00135" > < / a > < span class = "lineno" > 135< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> variables_;< / div >
< div class = "line" > < a name = "l00136" > < / a > < span class = "lineno" > 136< / span >   < span class = "keyword" > const< / span > std::vector< int64> targets_;< / div >
< div class = "line" > < a name = "l00137" > < / a > < span class = "lineno" > 137< / span >   Rev< int> index_;< / div >
< div class = "line" > < a name = "l00138" > < / a > < span class = "lineno" > 138< / span >   RevArray< int64> steps_;< / div >
< div class = "line" > < a name = "l00139" > < / a > < span class = "lineno" > 139< / span >   };< / div >
< div class = "line" > < a name = "l00140" > < / a > < span class = "lineno" > 140< / span >   < / div >
< div class = "line" > < a name = "l00141" > < / a > < span class = "lineno" > 141< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l00142" > < / a > < span class = "lineno" > 142< / span >   < / div >
< div class = "line" > < a name = "l00143" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > 143< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_decision_builder.html" > DecisionBuilder< / a > * < a class = "code" href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > MakeSetValuesFromTargets< / a > (< a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * solver,< / div >
< div class = "line" > < a name = "l00144" > < / a > < span class = "lineno" > 144< / span >   std::vector< IntVar*> variables,< / div >
< div class = "line" > < a name = "l00145" > < / a > < span class = "lineno" > 145< / span >   std::vector< int64> targets) {< / div >
< div class = "line" > < a name = "l00146" > < / a > < span class = "lineno" > 146< / span >   < span class = "keywordflow" > return< / span > solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ab741cb25dd32d1cbe02fbfb36337d9bb" > RevAlloc< / a > (< / div >
< div class = "line" > < a name = "l00147" > < / a > < span class = "lineno" > 147< / span >   < span class = "keyword" > new< / span > SetValuesFromTargets(std::move(variables), std::move(targets)));< / div >
< div class = "line" > < a name = "l00148" > < / a > < span class = "lineno" > 148< / span >   }< / div >
< div class = "line" > < a name = "l00149" > < / a > < span class = "lineno" > 149< / span >   < / div >
< div class = "line" > < a name = "l00150" > < / a > < span class = "lineno" > 150< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l00151" > < / a > < span class = "lineno" > 151< / span >   < / div >
< div class = "line" > < a name = "l00152" > < / a > < span class = "lineno" > 152< / span >   < span class = "keywordtype" > bool< / span > DimensionFixedTransitsEqualTransitEvaluatorForVehicle(< / div >
< div class = "line" > < a name = "l00153" > < / a > < span class = "lineno" > 153< / span >   < span class = "keyword" > const< / span > RoutingDimension& dimension, < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l00154" > < / a > < span class = "lineno" > 154< / span >   < span class = "keyword" > const< / span > RoutingModel* < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > = dimension.model();< / div >
< div class = "line" > < a name = "l00155" > < / a > < span class = "lineno" > 155< / span >   < span class = "keywordtype" > int< / span > node = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> Start(vehicle);< / div >
< div class = "line" > < a name = "l00156" > < / a > < span class = "lineno" > 156< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> IsEnd(node)) {< / div >
< div class = "line" > < a name = "l00157" > < / a > < span class = "lineno" > 157< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(node)-> Bound()) {< / div >
< div class = "line" > < a name = "l00158" > < / a > < span class = "lineno" > 158< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00159" > < / a > < span class = "lineno" > 159< / span >   }< / div >
< div class = "line" > < a name = "l00160" > < / a > < span class = "lineno" > 160< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(node)-> Value();< / div >
< div class = "line" > < a name = "l00161" > < / a > < span class = "lineno" > 161< / span >   < span class = "keywordflow" > if< / span > (dimension.transit_evaluator(vehicle)(node, < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > ) !=< / div >
< div class = "line" > < a name = "l00162" > < / a > < span class = "lineno" > 162< / span >   dimension.FixedTransitVar(node)-> Value()) {< / div >
< div class = "line" > < a name = "l00163" > < / a > < span class = "lineno" > 163< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00164" > < / a > < span class = "lineno" > 164< / span >   }< / div >
< div class = "line" > < a name = "l00165" > < / a > < span class = "lineno" > 165< / span >   node = < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > ;< / div >
< div class = "line" > < a name = "l00166" > < / a > < span class = "lineno" > 166< / span >   }< / div >
< div class = "line" > < a name = "l00167" > < / a > < span class = "lineno" > 167< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00168" > < / a > < span class = "lineno" > 168< / span >   }< / div >
< div class = "line" > < a name = "l00169" > < / a > < span class = "lineno" > 169< / span >   < / div >
< div class = "line" > < a name = "l00170" > < / a > < span class = "lineno" > 170< / span >   < span class = "keywordtype" > bool< / span > DimensionFixedTransitsEqualTransitEvaluators(< / div >
< div class = "line" > < a name = "l00171" > < / a > < span class = "lineno" > 171< / span >   < span class = "keyword" > const< / span > RoutingDimension& dimension) {< / div >
< div class = "line" > < a name = "l00172" > < / a > < span class = "lineno" > 172< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < dimension.model()-> vehicles(); vehicle++) {< / div >
< div class = "line" > < a name = "l00173" > < / a > < span class = "lineno" > 173< / span >   < span class = "keywordflow" > if< / span > (!DimensionFixedTransitsEqualTransitEvaluatorForVehicle(dimension,< / div >
< div class = "line" > < a name = "l00174" > < / a > < span class = "lineno" > 174< / span >   vehicle)) {< / div >
< div class = "line" > < a name = "l00175" > < / a > < span class = "lineno" > 175< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00176" > < / a > < span class = "lineno" > 176< / span >   }< / div >
< div class = "line" > < a name = "l00177" > < / a > < span class = "lineno" > 177< / span >   }< / div >
< div class = "line" > < a name = "l00178" > < / a > < span class = "lineno" > 178< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00179" > < / a > < span class = "lineno" > 179< / span >   }< / div >
< div class = "line" > < a name = "l00180" > < / a > < span class = "lineno" > 180< / span >   < / div >
< div class = "line" > < a name = "l00181" > < / a > < span class = "lineno" > 181< / span >   < span class = "keyword" > class < / span > SetCumulsFromLocalDimensionCosts : < span class = "keyword" > public< / span > DecisionBuilder {< / div >
< div class = "line" > < a name = "l00182" > < / a > < span class = "lineno" > 182< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00183" > < / a > < span class = "lineno" > 183< / span >   SetCumulsFromLocalDimensionCosts(< / div >
< div class = "line" > < a name = "l00184" > < / a > < span class = "lineno" > 184< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< LocalDimensionCumulOptimizer> > *< / div >
< div class = "line" > < a name = "l00185" > < / a > < span class = "lineno" > 185< / span >   local_optimizers,< / div >
< div class = "line" > < a name = "l00186" > < / a > < span class = "lineno" > 186< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< LocalDimensionCumulOptimizer> > *< / div >
< div class = "line" > < a name = "l00187" > < / a > < span class = "lineno" > 187< / span >   local_mp_optimizers,< / div >
< div class = "line" > < a name = "l00188" > < / a > < span class = "lineno" > 188< / span >   SearchMonitor* monitor, < span class = "keywordtype" > bool< / span > optimize_and_pack = < span class = "keyword" > false< / span > )< / div >
< div class = "line" > < a name = "l00189" > < / a > < span class = "lineno" > 189< / span >   : local_optimizers_(*local_optimizers),< / div >
< div class = "line" > < a name = "l00190" > < / a > < span class = "lineno" > 190< / span >   local_mp_optimizers_(*local_mp_optimizers),< / div >
< div class = "line" > < a name = "l00191" > < / a > < span class = "lineno" > 191< / span >   monitor_(monitor),< / div >
< div class = "line" > < a name = "l00192" > < / a > < span class = "lineno" > 192< / span >   optimize_and_pack_(optimize_and_pack) {}< / div >
< div class = "line" > < a name = "l00193" > < / a > < span class = "lineno" > 193< / span >   Decision* Next(Solver* < span class = "keyword" > const< / span > solver)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00194" > < / a > < span class = "lineno" > 194< / span >   < span class = "comment" > // The following boolean variable indicates if the solver should fail, in< / span > < / div >
< div class = "line" > < a name = "l00195" > < / a > < span class = "lineno" > 195< / span >   < span class = "comment" > // order to postpone the Fail() call until after the internal for loop, so< / span > < / div >
< div class = "line" > < a name = "l00196" > < / a > < span class = "lineno" > 196< / span >   < span class = "comment" > // there are no memory leaks related to the cumul_values vector.< / span > < / div >
< div class = "line" > < a name = "l00197" > < / a > < span class = "lineno" > 197< / span >   < span class = "keywordtype" > bool< / span > should_fail = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00198" > < / a > < span class = "lineno" > 198< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < local_optimizers_.size(); ++i) {< / div >
< div class = "line" > < a name = "l00199" > < / a > < span class = "lineno" > 199< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & local_optimizer = local_optimizers_[i];< / div >
< div class = "line" > < a name = "l00200" > < / a > < span class = "lineno" > 200< / span >   < span class = "keyword" > const< / span > RoutingDimension* < span class = "keyword" > const< / span > dimension = local_optimizer-> dimension();< / div >
< div class = "line" > < a name = "l00201" > < / a > < span class = "lineno" > 201< / span >   RoutingModel* < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > = dimension-> model();< / div >
< div class = "line" > < a name = "l00202" > < / a > < span class = "lineno" > 202< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > = [< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i) { < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(i)-> Value(); };< / div >
< div class = "line" > < a name = "l00203" > < / a > < span class = "lineno" > 203< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > compute_cumul_values =< / div >
< div class = "line" > < a name = "l00204" > < / a > < span class = "lineno" > 204< / span >   [< span class = "keyword" > this< / span > , & < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > ](LocalDimensionCumulOptimizer* optimizer, < span class = "keywordtype" > int< / span > vehicle,< / div >
< div class = "line" > < a name = "l00205" > < / a > < span class = "lineno" > 205< / span >   std::vector< int64> * cumul_values,< / div >
< div class = "line" > < a name = "l00206" > < / a > < span class = "lineno" > 206< / span >   std::vector< int64> * break_start_end_values) {< / div >
< div class = "line" > < a name = "l00207" > < / a > < span class = "lineno" > 207< / span >   < span class = "keywordflow" > if< / span > (optimize_and_pack_) {< / div >
< div class = "line" > < a name = "l00208" > < / a > < span class = "lineno" > 208< / span >   < span class = "keywordflow" > return< / span > optimizer-> ComputePackedRouteCumuls(< / div >
< div class = "line" > < a name = "l00209" > < / a > < span class = "lineno" > 209< / span >   vehicle, < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , cumul_values, break_start_end_values);< / div >
< div class = "line" > < a name = "l00210" > < / a > < span class = "lineno" > 210< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00211" > < / a > < span class = "lineno" > 211< / span >   < span class = "keywordflow" > return< / span > optimizer-> ComputeRouteCumuls(vehicle, < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , cumul_values,< / div >
< div class = "line" > < a name = "l00212" > < / a > < span class = "lineno" > 212< / span >   break_start_end_values);< / div >
< div class = "line" > < a name = "l00213" > < / a > < span class = "lineno" > 213< / span >   }< / div >
< div class = "line" > < a name = "l00214" > < / a > < span class = "lineno" > 214< / span >   };< / div >
< div class = "line" > < a name = "l00215" > < / a > < span class = "lineno" > 215< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> vehicles(); ++vehicle) {< / div >
< div class = "line" > < a name = "l00216" > < / a > < span class = "lineno" > 216< / span >   < span class = "comment" > // TODO(user): Investigate if we should skip unused vehicles.< / span > < / div >
< div class = "line" > < a name = "l00217" > < / a > < span class = "lineno" > 217< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (DimensionFixedTransitsEqualTransitEvaluatorForVehicle(*dimension,< / div >
< div class = "line" > < a name = "l00218" > < / a > < span class = "lineno" > 218< / span >   vehicle));< / div >
< div class = "line" > < a name = "l00219" > < / a > < span class = "lineno" > 219< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > vehicle_has_break_constraint =< / div >
< div class = "line" > < a name = "l00220" > < / a > < span class = "lineno" > 220< / span >   dimension-> HasBreakConstraints() & & < / div >
< div class = "line" > < a name = "l00221" > < / a > < span class = "lineno" > 221< / span >   !dimension-> GetBreakIntervalsOfVehicle(vehicle).empty();< / div >
< div class = "line" > < a name = "l00222" > < / a > < span class = "lineno" > 222< / span >   LocalDimensionCumulOptimizer* < span class = "keyword" > const< / span > optimizer =< / div >
< div class = "line" > < a name = "l00223" > < / a > < span class = "lineno" > 223< / span >   vehicle_has_break_constraint ? local_mp_optimizers_[i].get()< / div >
< div class = "line" > < a name = "l00224" > < / a > < span class = "lineno" > 224< / span >   : local_optimizer.get();< / div >
< div class = "line" > < a name = "l00225" > < / a > < span class = "lineno" > 225< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (optimizer != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00226" > < / a > < span class = "lineno" > 226< / span >   std::vector< int64> cumul_values;< / div >
< div class = "line" > < a name = "l00227" > < / a > < span class = "lineno" > 227< / span >   std::vector< int64> break_start_end_values;< / div >
< div class = "line" > < a name = "l00228" > < / a > < span class = "lineno" > 228< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8" > DimensionSchedulingStatus< / a > status = compute_cumul_values(< / div >
< div class = "line" > < a name = "l00229" > < / a > < span class = "lineno" > 229< / span >   optimizer, vehicle, & cumul_values, & break_start_end_values);< / div >
< div class = "line" > < a name = "l00230" > < / a > < span class = "lineno" > 230< / span >   < span class = "keywordflow" > if< / span > (status == < a class = "code" href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93" > DimensionSchedulingStatus::INFEASIBLE< / a > ) {< / div >
< div class = "line" > < a name = "l00231" > < / a > < span class = "lineno" > 231< / span >   should_fail = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00232" > < / a > < span class = "lineno" > 232< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00233" > < / a > < span class = "lineno" > 233< / span >   }< / div >
< div class = "line" > < a name = "l00234" > < / a > < span class = "lineno" > 234< / span >   < span class = "comment" > // If relaxation is not feasible, try the MILP optimizer.< / span > < / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l00235" > < / a > < span class = "lineno" > 235< / span >   < span class = "keywordflow" > if< / span > (status == < a class = "code" href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285" > DimensionSchedulingStatus::RELAXED_OPTIMAL_ONLY< / a > ) {< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l00236" > < / a > < span class = "lineno" > 236< / span >   cumul_values.clear();< / div >
< div class = "line" > < a name = "l00237" > < / a > < span class = "lineno" > 237< / span >   break_start_end_values.clear();< / div >
< div class = "line" > < a name = "l00238" > < / a > < span class = "lineno" > 238< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (local_mp_optimizers_[i] != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00239" > < / a > < span class = "lineno" > 239< / span >   < span class = "keywordflow" > if< / span > (compute_cumul_values(local_mp_optimizers_[i].get(), vehicle,< / div >
< div class = "line" > < a name = "l00240" > < / a > < span class = "lineno" > 240< / span >   & cumul_values, & break_start_end_values) ==< / div >
< div class = "line" > < a name = "l00241" > < / a > < span class = "lineno" > 241< / span >   < a class = "code" href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93" > DimensionSchedulingStatus::INFEASIBLE< / a > ) {< / div >
< div class = "line" > < a name = "l00242" > < / a > < span class = "lineno" > 242< / span >   should_fail = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00243" > < / a > < span class = "lineno" > 243< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00244" > < / a > < span class = "lineno" > 244< / span >   }< / div >
< div class = "line" > < a name = "l00245" > < / a > < span class = "lineno" > 245< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00246" > < / a > < span class = "lineno" > 246< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (status == < a class = "code" href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293" > DimensionSchedulingStatus::OPTIMAL< / a > );< / div >
< div class = "line" > < a name = "l00247" > < / a > < span class = "lineno" > 247< / span >   }< / div >
< div class = "line" > < a name = "l00248" > < / a > < span class = "lineno" > 248< / span >   < span class = "comment" > // Concatenate cumul_values and break_start_end_values into cp_values,< / span > < / div >
< div class = "line" > < a name = "l00249" > < / a > < span class = "lineno" > 249< / span >   < span class = "comment" > // generate corresponding cp_variables vector.< / span > < / div >
< div class = "line" > < a name = "l00250" > < / a > < span class = "lineno" > 250< / span >   std::vector< IntVar*> cp_variables;< / div >
< div class = "line" > < a name = "l00251" > < / a > < span class = "lineno" > 251< / span >   std::vector< int64> cp_values;< / div >
< div class = "line" > < a name = "l00252" > < / a > < span class = "lineno" > 252< / span >   std::swap(cp_values, cumul_values);< / div >
< div class = "line" > < a name = "l00253" > < / a > < span class = "lineno" > 253< / span >   {< / div >
< div class = "line" > < a name = "l00254" > < / a > < span class = "lineno" > 254< / span >   < span class = "keywordtype" > int< / span > current = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> Start(vehicle);< / div >
< div class = "line" > < a name = "l00255" > < / a > < span class = "lineno" > 255< / span >   < span class = "keywordflow" > while< / span > (< span class = "keyword" > true< / span > ) {< / div >
< div class = "line" > < a name = "l00256" > < / a > < span class = "lineno" > 256< / span >   cp_variables.push_back(dimension-> CumulVar(current));< / div >
< div class = "line" > < a name = "l00257" > < / a > < span class = "lineno" > 257< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> IsEnd(current)) {< / div >
< div class = "line" > < a name = "l00258" > < / a > < span class = "lineno" > 258< / span >   current = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(current)-> Value();< / div >
< div class = "line" > < a name = "l00259" > < / a > < span class = "lineno" > 259< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00260" > < / a > < span class = "lineno" > 260< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00261" > < / a > < span class = "lineno" > 261< / span >   }< / div >
< div class = "line" > < a name = "l00262" > < / a > < span class = "lineno" > 262< / span >   }< / div >
< div class = "line" > < a name = "l00263" > < / a > < span class = "lineno" > 263< / span >   }< / div >
< div class = "line" > < a name = "l00264" > < / a > < span class = "lineno" > 264< / span >   < span class = "comment" > // Setting the cumuls of path start/end first is more efficient than< / span > < / div >
< div class = "line" > < a name = "l00265" > < / a > < span class = "lineno" > 265< / span >   < span class = "comment" > // setting the cumuls in order of path appearance, because setting start< / span > < / div >
< div class = "line" > < a name = "l00266" > < / a > < span class = "lineno" > 266< / span >   < span class = "comment" > // and end cumuls gives an opportunity to fix all cumuls with two< / span > < / div >
< div class = "line" > < a name = "l00267" > < / a > < span class = "lineno" > 267< / span >   < span class = "comment" > // decisions instead of |path| decisions.< / span > < / div >
< div class = "line" > < a name = "l00268" > < / a > < span class = "lineno" > 268< / span >   < span class = "comment" > // To this effect, we put end cumul just after the start cumul.< / span > < / div >
< div class = "line" > < a name = "l00269" > < / a > < span class = "lineno" > 269< / span >   std::swap(cp_variables[1], cp_variables.back());< / div >
< div class = "line" > < a name = "l00270" > < / a > < span class = "lineno" > 270< / span >   std::swap(cp_values[1], cp_values.back());< / div >
< div class = "line" > < a name = "l00271" > < / a > < span class = "lineno" > 271< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasBreakConstraints()) {< / div >
< div class = "line" > < a name = "l00272" > < / a > < span class = "lineno" > 272< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > :< / div >
< div class = "line" > < a name = "l00273" > < / a > < span class = "lineno" > 273< / span >   dimension-> GetBreakIntervalsOfVehicle(vehicle)) {< / div >
< div class = "line" > < a name = "l00274" > < / a > < span class = "lineno" > 274< / span >   cp_variables.push_back(< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeStartExpr(0)-> Var());< / div >
< div class = "line" > < a name = "l00275" > < / a > < span class = "lineno" > 275< / span >   cp_variables.push_back(< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeEndExpr(0)-> Var());< / div >
< div class = "line" > < a name = "l00276" > < / a > < span class = "lineno" > 276< / span >   }< / div >
< div class = "line" > < a name = "l00277" > < / a > < span class = "lineno" > 277< / span >   cp_values.insert(cp_values.end(), break_start_end_values.begin(),< / div >
< div class = "line" > < a name = "l00278" > < / a > < span class = "lineno" > 278< / span >   break_start_end_values.end());< / div >
< div class = "line" > < a name = "l00279" > < / a > < span class = "lineno" > 279< / span >   }< / div >
< div class = "line" > < a name = "l00280" > < / a > < span class = "lineno" > 280< / span >   < span class = "comment" > // Value kint64min signals an unoptimized variable, set to min instead.< / span > < / div >
< div class = "line" > < a name = "l00281" > < / a > < span class = "lineno" > 281< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cp_values.size(); ++i) {< / div >
< div class = "line" > < a name = "l00282" > < / a > < span class = "lineno" > 282< / span >   < span class = "keywordflow" > if< / span > (cp_values[i] == < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > ) {< / div >
< div class = "line" > < a name = "l00283" > < / a > < span class = "lineno" > 283< / span >   cp_values[i] = cp_variables[i]-> Min();< / div >
< div class = "line" > < a name = "l00284" > < / a > < span class = "lineno" > 284< / span >   }< / div >
< div class = "line" > < a name = "l00285" > < / a > < span class = "lineno" > 285< / span >   }< / div >
< div class = "line" > < a name = "l00286" > < / a > < span class = "lineno" > 286< / span >   < span class = "keywordflow" > if< / span > (!solver-> SolveAndCommit(< / div >
< div class = "line" > < a name = "l00287" > < / a > < span class = "lineno" > 287< / span >   < a class = "code" href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > MakeSetValuesFromTargets< / a > (solver, std::move(cp_variables),< / div >
< div class = "line" > < a name = "l00288" > < / a > < span class = "lineno" > 288< / span >   std::move(cp_values)),< / div >
< div class = "line" > < a name = "l00289" > < / a > < span class = "lineno" > 289< / span >   monitor_)) {< / div >
< div class = "line" > < a name = "l00290" > < / a > < span class = "lineno" > 290< / span >   should_fail = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00291" > < / a > < span class = "lineno" > 291< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00292" > < / a > < span class = "lineno" > 292< / span >   }< / div >
< div class = "line" > < a name = "l00293" > < / a > < span class = "lineno" > 293< / span >   }< / div >
< div class = "line" > < a name = "l00294" > < / a > < span class = "lineno" > 294< / span >   < span class = "keywordflow" > if< / span > (should_fail) {< / div >
< div class = "line" > < a name = "l00295" > < / a > < span class = "lineno" > 295< / span >   solver-> Fail();< / div >
< div class = "line" > < a name = "l00296" > < / a > < span class = "lineno" > 296< / span >   }< / div >
< div class = "line" > < a name = "l00297" > < / a > < span class = "lineno" > 297< / span >   }< / div >
< div class = "line" > < a name = "l00298" > < / a > < span class = "lineno" > 298< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l00299" > < / a > < span class = "lineno" > 299< / span >   }< / div >
< div class = "line" > < a name = "l00300" > < / a > < span class = "lineno" > 300< / span >   < / div >
< div class = "line" > < a name = "l00301" > < / a > < span class = "lineno" > 301< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00302" > < / a > < span class = "lineno" > 302< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< LocalDimensionCumulOptimizer> > & < / div >
< div class = "line" > < a name = "l00303" > < / a > < span class = "lineno" > 303< / span >   local_optimizers_;< / div >
< div class = "line" > < a name = "l00304" > < / a > < span class = "lineno" > 304< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< LocalDimensionCumulOptimizer> > & < / div >
< div class = "line" > < a name = "l00305" > < / a > < span class = "lineno" > 305< / span >   local_mp_optimizers_;< / div >
< div class = "line" > < a name = "l00306" > < / a > < span class = "lineno" > 306< / span >   SearchMonitor* < span class = "keyword" > const< / span > monitor_;< / div >
< div class = "line" > < a name = "l00307" > < / a > < span class = "lineno" > 307< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > optimize_and_pack_;< / div >
< div class = "line" > < a name = "l00308" > < / a > < span class = "lineno" > 308< / span >   };< / div >
< div class = "line" > < a name = "l00309" > < / a > < span class = "lineno" > 309< / span >   < / div >
< div class = "line" > < a name = "l00310" > < / a > < span class = "lineno" > 310< / span >   < span class = "keyword" > class < / span > SetCumulsFromGlobalDimensionCosts : < span class = "keyword" > public< / span > DecisionBuilder {< / div >
< div class = "line" > < a name = "l00311" > < / a > < span class = "lineno" > 311< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00312" > < / a > < span class = "lineno" > 312< / span >   SetCumulsFromGlobalDimensionCosts(< / div >
< div class = "line" > < a name = "l00313" > < / a > < span class = "lineno" > 313< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< GlobalDimensionCumulOptimizer> > *< / div >
< div class = "line" > < a name = "l00314" > < / a > < span class = "lineno" > 314< / span >   global_optimizers,< / div >
< div class = "line" > < a name = "l00315" > < / a > < span class = "lineno" > 315< / span >   SearchMonitor* monitor, < span class = "keywordtype" > bool< / span > optimize_and_pack = < span class = "keyword" > false< / span > )< / div >
< div class = "line" > < a name = "l00316" > < / a > < span class = "lineno" > 316< / span >   : global_optimizers_(*global_optimizers),< / div >
< div class = "line" > < a name = "l00317" > < / a > < span class = "lineno" > 317< / span >   monitor_(monitor),< / div >
< div class = "line" > < a name = "l00318" > < / a > < span class = "lineno" > 318< / span >   optimize_and_pack_(optimize_and_pack) {}< / div >
< div class = "line" > < a name = "l00319" > < / a > < span class = "lineno" > 319< / span >   Decision* Next(Solver* < span class = "keyword" > const< / span > solver)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00320" > < / a > < span class = "lineno" > 320< / span >   < span class = "comment" > // The following boolean variable indicates if the solver should fail, in< / span > < / div >
< div class = "line" > < a name = "l00321" > < / a > < span class = "lineno" > 321< / span >   < span class = "comment" > // order to postpone the Fail() call until after the for loop, so there are< / span > < / div >
< div class = "line" > < a name = "l00322" > < / a > < span class = "lineno" > 322< / span >   < span class = "comment" > // no memory leaks related to the cumul_values vector.< / span > < / div >
< div class = "line" > < a name = "l00323" > < / a > < span class = "lineno" > 323< / span >   < span class = "keywordtype" > bool< / span > should_fail = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00324" > < / a > < span class = "lineno" > 324< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & global_optimizer : global_optimizers_) {< / div >
< div class = "line" > < a name = "l00325" > < / a > < span class = "lineno" > 325< / span >   < span class = "keyword" > const< / span > RoutingDimension* dimension = global_optimizer-> dimension();< / div >
< div class = "line" > < a name = "l00326" > < / a > < span class = "lineno" > 326< / span >   RoutingModel* < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > = dimension-> model();< / div >
< div class = "line" > < a name = "l00327" > < / a > < span class = "lineno" > 327< / span >   < / div >
< div class = "line" > < a name = "l00328" > < / a > < span class = "lineno" > 328< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > = [< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i) { < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(i)-> Value(); };< / div >
< div class = "line" > < a name = "l00329" > < / a > < span class = "lineno" > 329< / span >   < / div >
< div class = "line" > < a name = "l00330" > < / a > < span class = "lineno" > 330< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (DimensionFixedTransitsEqualTransitEvaluators(*dimension));< / div >
< div class = "line" > < a name = "l00331" > < / a > < span class = "lineno" > 331< / span >   < / div >
< div class = "line" > < a name = "l00332" > < / a > < span class = "lineno" > 332< / span >   std::vector< int64> cumul_values;< / div >
< div class = "line" > < a name = "l00333" > < / a > < span class = "lineno" > 333< / span >   std::vector< int64> break_start_end_values;< / div >
< div class = "line" > < a name = "l00334" > < / a > < span class = "lineno" > 334< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > cumuls_optimized =< / div >
< div class = "line" > < a name = "l00335" > < / a > < span class = "lineno" > 335< / span >   optimize_and_pack_< / div >
< div class = "line" > < a name = "l00336" > < / a > < span class = "lineno" > 336< / span >   ? global_optimizer-> ComputePackedCumuls(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , & cumul_values,< / div >
< div class = "line" > < a name = "l00337" > < / a > < span class = "lineno" > 337< / span >   & break_start_end_values)< / div >
< div class = "line" > < a name = "l00338" > < / a > < span class = "lineno" > 338< / span >   : global_optimizer-> ComputeCumuls(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , & cumul_values,< / div >
< div class = "line" > < a name = "l00339" > < / a > < span class = "lineno" > 339< / span >   & break_start_end_values);< / div >
< div class = "line" > < a name = "l00340" > < / a > < span class = "lineno" > 340< / span >   < span class = "keywordflow" > if< / span > (!cumuls_optimized) {< / div >
< div class = "line" > < a name = "l00341" > < / a > < span class = "lineno" > 341< / span >   should_fail = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00342" > < / a > < span class = "lineno" > 342< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00343" > < / a > < span class = "lineno" > 343< / span >   }< / div >
< div class = "line" > < a name = "l00344" > < / a > < span class = "lineno" > 344< / span >   < span class = "comment" > // Concatenate cumul_values and break_start_end_values into cp_values,< / span > < / div >
< div class = "line" > < a name = "l00345" > < / a > < span class = "lineno" > 345< / span >   < span class = "comment" > // generate corresponding cp_variables vector.< / span > < / div >
< div class = "line" > < a name = "l00346" > < / a > < span class = "lineno" > 346< / span >   std::vector< IntVar*> cp_variables = dimension-> cumuls();< / div >
< div class = "line" > < a name = "l00347" > < / a > < span class = "lineno" > 347< / span >   std::vector< int64> cp_values;< / div >
< div class = "line" > < a name = "l00348" > < / a > < span class = "lineno" > 348< / span >   std::swap(cp_values, cumul_values);< / div >
< div class = "line" > < a name = "l00349" > < / a > < span class = "lineno" > 349< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasBreakConstraints()) {< / div >
< div class = "line" > < a name = "l00350" > < / a > < span class = "lineno" > 350< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_vehicles = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> vehicles();< / div >
< div class = "line" > < a name = "l00351" > < / a > < span class = "lineno" > 351< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < num_vehicles; ++vehicle) {< / div >
< div class = "line" > < a name = "l00352" > < / a > < span class = "lineno" > 352< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > :< / div >
< div class = "line" > < a name = "l00353" > < / a > < span class = "lineno" > 353< / span >   dimension-> GetBreakIntervalsOfVehicle(vehicle)) {< / div >
< div class = "line" > < a name = "l00354" > < / a > < span class = "lineno" > 354< / span >   cp_variables.push_back(< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeStartExpr(0)-> Var());< / div >
< div class = "line" > < a name = "l00355" > < / a > < span class = "lineno" > 355< / span >   cp_variables.push_back(< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeEndExpr(0)-> Var());< / div >
< div class = "line" > < a name = "l00356" > < / a > < span class = "lineno" > 356< / span >   }< / div >
< div class = "line" > < a name = "l00357" > < / a > < span class = "lineno" > 357< / span >   }< / div >
< div class = "line" > < a name = "l00358" > < / a > < span class = "lineno" > 358< / span >   cp_values.insert(cp_values.end(), break_start_end_values.begin(),< / div >
< div class = "line" > < a name = "l00359" > < / a > < span class = "lineno" > 359< / span >   break_start_end_values.end());< / div >
< div class = "line" > < a name = "l00360" > < / a > < span class = "lineno" > 360< / span >   }< / div >
< div class = "line" > < a name = "l00361" > < / a > < span class = "lineno" > 361< / span >   < span class = "comment" > // Value kint64min signals an unoptimized variable, set to min instead.< / span > < / div >
< div class = "line" > < a name = "l00362" > < / a > < span class = "lineno" > 362< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cp_values.size(); ++i) {< / div >
< div class = "line" > < a name = "l00363" > < / a > < span class = "lineno" > 363< / span >   < span class = "keywordflow" > if< / span > (cp_values[i] == < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > ) {< / div >
< div class = "line" > < a name = "l00364" > < / a > < span class = "lineno" > 364< / span >   cp_values[i] = cp_variables[i]-> Min();< / div >
< div class = "line" > < a name = "l00365" > < / a > < span class = "lineno" > 365< / span >   }< / div >
< div class = "line" > < a name = "l00366" > < / a > < span class = "lineno" > 366< / span >   }< / div >
< div class = "line" > < a name = "l00367" > < / a > < span class = "lineno" > 367< / span >   < span class = "keywordflow" > if< / span > (!solver-> SolveAndCommit(< / div >
< div class = "line" > < a name = "l00368" > < / a > < span class = "lineno" > 368< / span >   < a class = "code" href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > MakeSetValuesFromTargets< / a > (solver, std::move(cp_variables),< / div >
< div class = "line" > < a name = "l00369" > < / a > < span class = "lineno" > 369< / span >   std::move(cp_values)),< / div >
< div class = "line" > < a name = "l00370" > < / a > < span class = "lineno" > 370< / span >   monitor_)) {< / div >
< div class = "line" > < a name = "l00371" > < / a > < span class = "lineno" > 371< / span >   should_fail = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00372" > < / a > < span class = "lineno" > 372< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00373" > < / a > < span class = "lineno" > 373< / span >   }< / div >
< div class = "line" > < a name = "l00374" > < / a > < span class = "lineno" > 374< / span >   }< / div >
< div class = "line" > < a name = "l00375" > < / a > < span class = "lineno" > 375< / span >   < span class = "keywordflow" > if< / span > (should_fail) {< / div >
< div class = "line" > < a name = "l00376" > < / a > < span class = "lineno" > 376< / span >   solver-> Fail();< / div >
< div class = "line" > < a name = "l00377" > < / a > < span class = "lineno" > 377< / span >   }< / div >
< div class = "line" > < a name = "l00378" > < / a > < span class = "lineno" > 378< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l00379" > < / a > < span class = "lineno" > 379< / span >   }< / div >
< div class = "line" > < a name = "l00380" > < / a > < span class = "lineno" > 380< / span >   < / div >
< div class = "line" > < a name = "l00381" > < / a > < span class = "lineno" > 381< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00382" > < / a > < span class = "lineno" > 382< / span >   < span class = "keyword" > const< / span > std::vector< std::unique_ptr< GlobalDimensionCumulOptimizer> > & < / div >
< div class = "line" > < a name = "l00383" > < / a > < span class = "lineno" > 383< / span >   global_optimizers_;< / div >
< div class = "line" > < a name = "l00384" > < / a > < span class = "lineno" > 384< / span >   SearchMonitor* < span class = "keyword" > const< / span > monitor_;< / div >
< div class = "line" > < a name = "l00385" > < / a > < span class = "lineno" > 385< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > optimize_and_pack_;< / div >
< div class = "line" > < a name = "l00386" > < / a > < span class = "lineno" > 386< / span >   };< / div >
< div class = "line" > < a name = "l00387" > < / a > < span class = "lineno" > 387< / span >   < / div >
< div class = "line" > < a name = "l00388" > < / a > < span class = "lineno" > 388< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l00389" > < / a > < span class = "lineno" > 389< / span >   < / div >
< div class = "line" > < a name = "l00390" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7" > 390< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7" > RoutingModel::PackCumulsOfOptimizerDimensionsFromAssignment< / a > (< / div >
< div class = "line" > < a name = "l00391" > < / a > < span class = "lineno" > 391< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * original_assignment, absl::Duration duration_limit) {< / div >
< div class = "line" > < a name = "l00392" > < / a > < span class = "lineno" > 392< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (closed_);< / div >
< div class = "line" > < a name = "l00393" > < / a > < span class = "lineno" > 393< / span >   < span class = "keywordflow" > if< / span > (original_assignment == < span class = "keyword" > nullptr< / span > ) < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l00394" > < / a > < span class = "lineno" > 394< / span >   < span class = "keywordflow" > if< / span > (duration_limit < = absl::ZeroDuration()) < span class = "keywordflow" > return< / span > original_assignment;< / div >
< div class = "line" > < a name = "l00395" > < / a > < span class = "lineno" > 395< / span >   < span class = "keywordflow" > if< / span > (global_dimension_optimizers_.empty() & & < / div >
< div class = "line" > < a name = "l00396" > < / a > < span class = "lineno" > 396< / span >   local_dimension_optimizers_.empty()) {< / div >
< div class = "line" > < a name = "l00397" > < / a > < span class = "lineno" > 397< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (local_dimension_mp_optimizers_.empty());< / div >
< div class = "line" > < a name = "l00398" > < / a > < span class = "lineno" > 398< / span >   < span class = "keywordflow" > return< / span > original_assignment;< / div >
< div class = "line" > < a name = "l00399" > < / a > < span class = "lineno" > 399< / span >   }< / div >
< div class = "line" > < a name = "l00400" > < / a > < span class = "lineno" > 400< / span >   < a class = "code" href = "classoperations__research_1_1_regular_limit.html" > RegularLimit< / a > * < span class = "keyword" > const< / span > limit = GetOrCreateLimit();< / div >
< div class = "line" > < a name = "l00401" > < / a > < span class = "lineno" > 401< / span >   limit-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (duration_limit, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l00402" > < / a > < span class = "lineno" > 402< / span >   < / div >
< div class = "line" > < a name = "l00403" > < / a > < span class = "lineno" > 403< / span >   < span class = "comment" > // Initialize the packed_assignment with the Next values in the< / span > < / div >
< div class = "line" > < a name = "l00404" > < / a > < span class = "lineno" > 404< / span >   < span class = "comment" > // original_assignment.< / span > < / div >
< div class = "line" > < a name = "l00405" > < / a > < span class = "lineno" > 405< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * packed_assignment = solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l00406" > < / a > < span class = "lineno" > 406< / span >   packed_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > ());< / div >
< div class = "line" > < a name = "l00407" > < / a > < span class = "lineno" > 407< / span >   packed_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (original_assignment);< / div >
< div class = "line" > < a name = "l00408" > < / a > < span class = "lineno" > 408< / span >   < / div >
< div class = "line" > < a name = "l00409" > < / a > < span class = "lineno" > 409< / span >   std::vector< DecisionBuilder*> decision_builders;< / div >
< div class = "line" > < a name = "l00410" > < / a > < span class = "lineno" > 410< / span >   decision_builders.push_back(solver_-> MakeRestoreAssignment(preassignment_));< / div >
< div class = "line" > < a name = "l00411" > < / a > < span class = "lineno" > 411< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l00412" > < / a > < span class = "lineno" > 412< / span >   solver_-> MakeRestoreAssignment(packed_assignment));< / div >
< div class = "line" > < a name = "l00413" > < / a > < span class = "lineno" > 413< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l00414" > < / a > < span class = "lineno" > 414< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SetCumulsFromLocalDimensionCosts(< / div >
< div class = "line" > < a name = "l00415" > < / a > < span class = "lineno" > 415< / span >   & local_dimension_optimizers_, & local_dimension_mp_optimizers_,< / div >
< div class = "line" > < a name = "l00416" > < / a > < span class = "lineno" > 416< / span >   GetOrCreateLargeNeighborhoodSearchLimit(),< / div >
< div class = "line" > < a name = "l00417" > < / a > < span class = "lineno" > 417< / span >   < span class = "comment" > /*optimize_and_pack=*/< / span > < span class = "keyword" > true< / span > )));< / div >
< div class = "line" > < a name = "l00418" > < / a > < span class = "lineno" > 418< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l00419" > < / a > < span class = "lineno" > 419< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SetCumulsFromGlobalDimensionCosts(< / div >
< div class = "line" > < a name = "l00420" > < / a > < span class = "lineno" > 420< / span >   & global_dimension_optimizers_,< / div >
< div class = "line" > < a name = "l00421" > < / a > < span class = "lineno" > 421< / span >   GetOrCreateLargeNeighborhoodSearchLimit(),< / div >
< div class = "line" > < a name = "l00422" > < / a > < span class = "lineno" > 422< / span >   < span class = "comment" > /*optimize_and_pack=*/< / span > < span class = "keyword" > true< / span > )));< / div >
< div class = "line" > < a name = "l00423" > < / a > < span class = "lineno" > 423< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l00424" > < / a > < span class = "lineno" > 424< / span >   CreateFinalizerForMinimizedAndMaximizedVariables());< / div >
< div class = "line" > < a name = "l00425" > < / a > < span class = "lineno" > 425< / span >   < / div >
< div class = "line" > < a name = "l00426" > < / a > < span class = "lineno" > 426< / span >   < a class = "code" href = "classoperations__research_1_1_decision_builder.html" > DecisionBuilder< / a > * restore_pack_and_finalize =< / div >
< div class = "line" > < a name = "l00427" > < / a > < span class = "lineno" > 427< / span >   solver_-> Compose(decision_builders);< / div >
< div class = "line" > < a name = "l00428" > < / a > < span class = "lineno" > 428< / span >   solver_-> Solve(restore_pack_and_finalize,< / div >
< div class = "line" > < a name = "l00429" > < / a > < span class = "lineno" > 429< / span >   packed_dimensions_assignment_collector_, limit);< / div >
< div class = "line" > < a name = "l00430" > < / a > < span class = "lineno" > 430< / span >   < / div >
< div class = "line" > < a name = "l00431" > < / a > < span class = "lineno" > 431< / span >   < span class = "keywordflow" > if< / span > (packed_dimensions_assignment_collector_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > () != 1) {< / div >
< div class = "line" > < a name = "l00432" > < / a > < span class = "lineno" > 432< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " The given assignment is not valid for this model, or cannot " < / span > < / div >
< div class = "line" > < a name = "l00433" > < / a > < span class = "lineno" > 433< / span >   < span class = "stringliteral" > " be packed." < / span > ;< / div >
< div class = "line" > < a name = "l00434" > < / a > < span class = "lineno" > 434< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l00435" > < / a > < span class = "lineno" > 435< / span >   }< / div >
< div class = "line" > < a name = "l00436" > < / a > < span class = "lineno" > 436< / span >   < / div >
< div class = "line" > < a name = "l00437" > < / a > < span class = "lineno" > 437< / span >   packed_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac97eab84adb6cc33ae0124c944a4f8c7" > Copy< / a > (original_assignment);< / div >
< div class = "line" > < a name = "l00438" > < / a > < span class = "lineno" > 438< / span >   packed_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (< / div >
< div class = "line" > < a name = "l00439" > < / a > < span class = "lineno" > 439< / span >   packed_dimensions_assignment_collector_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (0));< / div >
< div class = "line" > < a name = "l00440" > < / a > < span class = "lineno" > 440< / span >   < / div >
< div class = "line" > < a name = "l00441" > < / a > < span class = "lineno" > 441< / span >   < span class = "keywordflow" > return< / span > packed_assignment;< / div >
< div class = "line" > < a name = "l00442" > < / a > < span class = "lineno" > 442< / span >   }< / div >
< div class = "line" > < a name = "l00443" > < / a > < span class = "lineno" > 443< / span >   < / div >
< div class = "line" > < a name = "l00444" > < / a > < span class = "lineno" > 444< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l00445" > < / a > < span class = "lineno" > 445< / span >   < span class = "comment" > // Constraint which ensures that var != values.< / span > < / div >
< div class = "line" > < a name = "l00446" > < / a > < span class = "lineno" > 446< / span >   < span class = "keyword" > class < / span > DifferentFromValues : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > {< / div >
< div class = "line" > < a name = "l00447" > < / a > < span class = "lineno" > 447< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00448" > < / a > < span class = "lineno" > 448< / span >   DifferentFromValues(< a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * solver, < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , std::vector< int64> values)< / div >
< div class = "line" > < a name = "l00449" > < / a > < span class = "lineno" > 449< / span >   : < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > (solver), var_(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ), values_(std::move(values)) {}< / div >
< div class = "line" > < a name = "l00450" > < / a > < span class = "lineno" > 450< / span >   < span class = "keywordtype" > void< / span > Post()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l00451" > < / a > < span class = "lineno" > 451< / span >   < span class = "keywordtype" > void< / span > InitialPropagate()< span class = "keyword" > override < / span > { var_-> RemoveValues(values_); }< / div >
< div class = "line" > < a name = "l00452" > < / a > < span class = "lineno" > 452< / span >   std::string DebugString()< span class = "keyword" > const override < / span > { < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " DifferentFromValues" < / span > ; }< / div >
< div class = "line" > < a name = "l00453" > < / a > < span class = "lineno" > 453< / span >   < span class = "keywordtype" > void< / span > Accept(ModelVisitor* < span class = "keyword" > const< / span > visitor)< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00454" > < / a > < span class = "lineno" > 454< / span >   visitor-> BeginVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0" > RoutingModelVisitor::kRemoveValues< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00455" > < / a > < span class = "lineno" > 455< / span >   visitor-> VisitIntegerVariableArrayArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#aa9175e7f7c9d2598d26293435ecd89ce" > ModelVisitor::kVarsArgument< / a > ,< / div >
< div class = "line" > < a name = "l00456" > < / a > < span class = "lineno" > 456< / span >   {var_});< / div >
< div class = "line" > < a name = "l00457" > < / a > < span class = "lineno" > 457< / span >   visitor-> VisitIntegerArrayArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#adc9534f3f00f5aa6046609988d38967b" > ModelVisitor::kValuesArgument< / a > , values_);< / div >
< div class = "line" > < a name = "l00458" > < / a > < span class = "lineno" > 458< / span >   visitor-> EndVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0" > RoutingModelVisitor::kRemoveValues< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00459" > < / a > < span class = "lineno" > 459< / span >   }< / div >
< div class = "line" > < a name = "l00460" > < / a > < span class = "lineno" > 460< / span >   < / div >
< div class = "line" > < a name = "l00461" > < / a > < span class = "lineno" > 461< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00462" > < / a > < span class = "lineno" > 462< / span >   IntVar* < span class = "keyword" > const< / span > var_;< / div >
< div class = "line" > < a name = "l00463" > < / a > < span class = "lineno" > 463< / span >   < span class = "keyword" > const< / span > std::vector< int64> values_;< / div >
< div class = "line" > < a name = "l00464" > < / a > < span class = "lineno" > 464< / span >   };< / div >
< div class = "line" > < a name = "l00465" > < / a > < span class = "lineno" > 465< / span >   < / div >
< div class = "line" > < a name = "l00466" > < / a > < span class = "lineno" > 466< / span >   < span class = "comment" > // Set of " light" constraints, well-suited for use within Local Search.< / span > < / div >
< div class = "line" > < a name = "l00467" > < / a > < span class = "lineno" > 467< / span >   < span class = "comment" > // These constraints are " checking" constraints, only triggered on WhenBound< / span > < / div >
< div class = "line" > < a name = "l00468" > < / a > < span class = "lineno" > 468< / span >   < span class = "comment" > // events. The provide very little (or no) domain filtering.< / span > < / div >
< div class = "line" > < a name = "l00469" > < / a > < span class = "lineno" > 469< / span >   < span class = "comment" > // TODO(user): Move to core constraintsolver library.< / span > < / div >
< div class = "line" > < a name = "l00470" > < / a > < span class = "lineno" > 470< / span >   < / div >
< div class = "line" > < a name = "l00471" > < / a > < span class = "lineno" > 471< / span >   < span class = "comment" > // Light one-dimension function-based element constraint ensuring:< / span > < / div >
< div class = "line" > < a name = "l00472" > < / a > < span class = "lineno" > 472< / span >   < span class = "comment" > // var == values(index).< / span > < / div >
< div class = "line" > < a name = "l00473" > < / a > < span class = "lineno" > 473< / span >   < span class = "comment" > // Doesn' t perform bound reduction of the resulting variable until the index< / span > < / div >
< div class = "line" > < a name = "l00474" > < / a > < span class = "lineno" > 474< / span >   < span class = "comment" > // variable is bound.< / span > < / div >
< div class = "line" > < a name = "l00475" > < / a > < span class = "lineno" > 475< / span >   < span class = "comment" > // If deep_serialize returns false, the model visitor will not extract all< / span > < / div >
< div class = "line" > < a name = "l00476" > < / a > < span class = "lineno" > 476< / span >   < span class = "comment" > // possible values from the values function.< / span > < / div >
< div class = "line" > < a name = "l00477" > < / a > < span class = "lineno" > 477< / span >   < span class = "keyword" > template< / span > < < span class = "keyword" > typename< / span > F> < / div >
< div class = "line" > < a name = "l00478" > < / a > < span class = "lineno" > 478< / span >   < span class = "keyword" > class < / span > LightFunctionElementConstraint : < span class = "keyword" > public< / span > Constraint {< / div >
< div class = "line" > < a name = "l00479" > < / a > < span class = "lineno" > 479< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00480" > < / a > < span class = "lineno" > 480< / span >   LightFunctionElementConstraint(Solver* < span class = "keyword" > const< / span > solver, IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l00481" > < / a > < span class = "lineno" > 481< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , F values,< / div >
< div class = "line" > < a name = "l00482" > < / a > < span class = "lineno" > 482< / span >   std::function< < span class = "keywordtype" > bool< / span > ()> deep_serialize)< / div >
< div class = "line" > < a name = "l00483" > < / a > < span class = "lineno" > 483< / span >   : Constraint(solver),< / div >
< div class = "line" > < a name = "l00484" > < / a > < span class = "lineno" > 484< / span >   var_(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ),< / div >
< div class = "line" > < a name = "l00485" > < / a > < span class = "lineno" > 485< / span >   index_(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ),< / div >
< div class = "line" > < a name = "l00486" > < / a > < span class = "lineno" > 486< / span >   values_(std::move(values)),< / div >
< div class = "line" > < a name = "l00487" > < / a > < span class = "lineno" > 487< / span >   deep_serialize_(std::move(deep_serialize)) {}< / div >
< div class = "line" > < a name = "l00488" > < / a > < span class = "lineno" > 488< / span >   ~LightFunctionElementConstraint()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l00489" > < / a > < span class = "lineno" > 489< / span >   < / div >
< div class = "line" > < a name = "l00490" > < / a > < span class = "lineno" > 490< / span >   < span class = "keywordtype" > void< / span > Post()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00491" > < / a > < span class = "lineno" > 491< / span >   Demon* demon = < a class = "code" href = "namespaceoperations__research.html#a3ea6af6581e6922832918c97753146a7" > MakeConstraintDemon0< / a > (< / div >
< div class = "line" > < a name = "l00492" > < / a > < span class = "lineno" > 492< / span >   solver(), < span class = "keyword" > this< / span > , & LightFunctionElementConstraint::IndexBound,< / div >
< div class = "line" > < a name = "l00493" > < / a > < span class = "lineno" > 493< / span >   < span class = "stringliteral" > " IndexBound" < / span > );< / div >
< div class = "line" > < a name = "l00494" > < / a > < span class = "lineno" > 494< / span >   index_-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l00495" > < / a > < span class = "lineno" > 495< / span >   }< / div >
< div class = "line" > < a name = "l00496" > < / a > < span class = "lineno" > 496< / span >   < / div >
< div class = "line" > < a name = "l00497" > < / a > < span class = "lineno" > 497< / span >   < span class = "keywordtype" > void< / span > InitialPropagate()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00498" > < / a > < span class = "lineno" > 498< / span >   < span class = "keywordflow" > if< / span > (index_-> Bound()) {< / div >
< div class = "line" > < a name = "l00499" > < / a > < span class = "lineno" > 499< / span >   IndexBound();< / div >
< div class = "line" > < a name = "l00500" > < / a > < span class = "lineno" > 500< / span >   }< / div >
< div class = "line" > < a name = "l00501" > < / a > < span class = "lineno" > 501< / span >   }< / div >
< div class = "line" > < a name = "l00502" > < / a > < span class = "lineno" > 502< / span >   < / div >
< div class = "line" > < a name = "l00503" > < / a > < span class = "lineno" > 503< / span >   std::string DebugString()< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00504" > < / a > < span class = "lineno" > 504< / span >   < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " LightFunctionElementConstraint" < / span > ;< / div >
< div class = "line" > < a name = "l00505" > < / a > < span class = "lineno" > 505< / span >   }< / div >
< div class = "line" > < a name = "l00506" > < / a > < span class = "lineno" > 506< / span >   < / div >
< div class = "line" > < a name = "l00507" > < / a > < span class = "lineno" > 507< / span >   < span class = "keywordtype" > void< / span > Accept(ModelVisitor* < span class = "keyword" > const< / span > visitor)< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00508" > < / a > < span class = "lineno" > 508< / span >   visitor-> BeginVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343" > RoutingModelVisitor::kLightElement< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00509" > < / a > < span class = "lineno" > 509< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754" > ModelVisitor::kTargetArgument< / a > ,< / div >
< div class = "line" > < a name = "l00510" > < / a > < span class = "lineno" > 510< / span >   var_);< / div >
< div class = "line" > < a name = "l00511" > < / a > < span class = "lineno" > 511< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e" > ModelVisitor::kIndexArgument< / a > ,< / div >
< div class = "line" > < a name = "l00512" > < / a > < span class = "lineno" > 512< / span >   index_);< / div >
< div class = "line" > < a name = "l00513" > < / a > < span class = "lineno" > 513< / span >   < span class = "comment" > // Warning: This will expand all values into a vector.< / span > < / div >
< div class = "line" > < a name = "l00514" > < / a > < span class = "lineno" > 514< / span >   < span class = "keywordflow" > if< / span > (deep_serialize_()) {< / div >
< div class = "line" > < a name = "l00515" > < / a > < span class = "lineno" > 515< / span >   visitor-> VisitInt64ToInt64Extension(values_, index_-> Min(),< / div >
< div class = "line" > < a name = "l00516" > < / a > < span class = "lineno" > 516< / span >   index_-> Max());< / div >
< div class = "line" > < a name = "l00517" > < / a > < span class = "lineno" > 517< / span >   }< / div >
< div class = "line" > < a name = "l00518" > < / a > < span class = "lineno" > 518< / span >   visitor-> EndVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343" > RoutingModelVisitor::kLightElement< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00519" > < / a > < span class = "lineno" > 519< / span >   }< / div >
< div class = "line" > < a name = "l00520" > < / a > < span class = "lineno" > 520< / span >   < / div >
< div class = "line" > < a name = "l00521" > < / a > < span class = "lineno" > 521< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00522" > < / a > < span class = "lineno" > 522< / span >   < span class = "keywordtype" > void< / span > IndexBound() { var_-> SetValue(values_(index_-> Min())); }< / div >
< div class = "line" > < a name = "l00523" > < / a > < span class = "lineno" > 523< / span >   < / div >
< div class = "line" > < a name = "l00524" > < / a > < span class = "lineno" > 524< / span >   IntVar* < span class = "keyword" > const< / span > var_;< / div >
< div class = "line" > < a name = "l00525" > < / a > < span class = "lineno" > 525< / span >   IntVar* < span class = "keyword" > const< / span > index_;< / div >
< div class = "line" > < a name = "l00526" > < / a > < span class = "lineno" > 526< / span >   F values_;< / div >
< div class = "line" > < a name = "l00527" > < / a > < span class = "lineno" > 527< / span >   std::function< bool()> deep_serialize_;< / div >
< div class = "line" > < a name = "l00528" > < / a > < span class = "lineno" > 528< / span >   };< / div >
< div class = "line" > < a name = "l00529" > < / a > < span class = "lineno" > 529< / span >   < / div >
< div class = "line" > < a name = "l00530" > < / a > < span class = "lineno" > 530< / span >   < span class = "keyword" > template< / span > < < span class = "keyword" > typename< / span > F> < / div >
< div class = "line" > < a name = "l00531" > < / a > < span class = "lineno" > 531< / span >   Constraint* MakeLightElement(Solver* < span class = "keyword" > const< / span > solver, IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l00532" > < / a > < span class = "lineno" > 532< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , F values,< / div >
< div class = "line" > < a name = "l00533" > < / a > < span class = "lineno" > 533< / span >   std::function< < span class = "keywordtype" > bool< / span > ()> deep_serialize) {< / div >
< div class = "line" > < a name = "l00534" > < / a > < span class = "lineno" > 534< / span >   < span class = "keywordflow" > return< / span > solver-> RevAlloc(< span class = "keyword" > new< / span > LightFunctionElementConstraint< F> (< / div >
< div class = "line" > < a name = "l00535" > < / a > < span class = "lineno" > 535< / span >   solver, < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , std::move(values), std::move(deep_serialize)));< / div >
< div class = "line" > < a name = "l00536" > < / a > < span class = "lineno" > 536< / span >   }< / div >
< div class = "line" > < a name = "l00537" > < / a > < span class = "lineno" > 537< / span >   < / div >
< div class = "line" > < a name = "l00538" > < / a > < span class = "lineno" > 538< / span >   < span class = "comment" > // Light two-dimension function-based element constraint ensuring:< / span > < / div >
< div class = "line" > < a name = "l00539" > < / a > < span class = "lineno" > 539< / span >   < span class = "comment" > // var == values(index1, index2).< / span > < / div >
< div class = "line" > < a name = "l00540" > < / a > < span class = "lineno" > 540< / span >   < span class = "comment" > // Doesn' t perform bound reduction of the resulting variable until the index< / span > < / div >
< div class = "line" > < a name = "l00541" > < / a > < span class = "lineno" > 541< / span >   < span class = "comment" > // variables are bound.< / span > < / div >
< div class = "line" > < a name = "l00542" > < / a > < span class = "lineno" > 542< / span >   < span class = "comment" > // Ownership of the ' values' callback is taken by the constraint.< / span > < / div >
< div class = "line" > < a name = "l00543" > < / a > < span class = "lineno" > 543< / span >   < span class = "keyword" > template< / span > < < span class = "keyword" > typename< / span > F> < / div >
< div class = "line" > < a name = "l00544" > < / a > < span class = "lineno" > 544< / span >   < span class = "keyword" > class < / span > LightFunctionElement2Constraint : < span class = "keyword" > public< / span > Constraint {< / div >
< div class = "line" > < a name = "l00545" > < / a > < span class = "lineno" > 545< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00546" > < / a > < span class = "lineno" > 546< / span >   LightFunctionElement2Constraint(Solver* < span class = "keyword" > const< / span > solver, IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l00547" > < / a > < span class = "lineno" > 547< / span >   IntVar* < span class = "keyword" > const< / span > index1, IntVar* < span class = "keyword" > const< / span > index2,< / div >
< div class = "line" > < a name = "l00548" > < / a > < span class = "lineno" > 548< / span >   F values,< / div >
< div class = "line" > < a name = "l00549" > < / a > < span class = "lineno" > 549< / span >   std::function< < span class = "keywordtype" > bool< / span > ()> deep_serialize)< / div >
< div class = "line" > < a name = "l00550" > < / a > < span class = "lineno" > 550< / span >   : Constraint(solver),< / div >
< div class = "line" > < a name = "l00551" > < / a > < span class = "lineno" > 551< / span >   var_(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ),< / div >
< div class = "line" > < a name = "l00552" > < / a > < span class = "lineno" > 552< / span >   index1_(index1),< / div >
< div class = "line" > < a name = "l00553" > < / a > < span class = "lineno" > 553< / span >   index2_(index2),< / div >
< div class = "line" > < a name = "l00554" > < / a > < span class = "lineno" > 554< / span >   values_(std::move(values)),< / div >
< div class = "line" > < a name = "l00555" > < / a > < span class = "lineno" > 555< / span >   deep_serialize_(std::move(deep_serialize)) {}< / div >
< div class = "line" > < a name = "l00556" > < / a > < span class = "lineno" > 556< / span >   ~LightFunctionElement2Constraint()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l00557" > < / a > < span class = "lineno" > 557< / span >   < span class = "keywordtype" > void< / span > Post()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l00558" > < / a > < span class = "lineno" > 558< / span >   Demon* demon = < a class = "code" href = "namespaceoperations__research.html#a3ea6af6581e6922832918c97753146a7" > MakeConstraintDemon0< / a > (< / div >
< div class = "line" > < a name = "l00559" > < / a > < span class = "lineno" > 559< / span >   solver(), < span class = "keyword" > this< / span > , & LightFunctionElement2Constraint::IndexBound,< / div >
< div class = "line" > < a name = "l00560" > < / a > < span class = "lineno" > 560< / span >   < span class = "stringliteral" > " IndexBound" < / span > );< / div >
< div class = "line" > < a name = "l00561" > < / a > < span class = "lineno" > 561< / span >   index1_-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l00562" > < / a > < span class = "lineno" > 562< / span >   index2_-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l00563" > < / a > < span class = "lineno" > 563< / span >   }< / div >
< div class = "line" > < a name = "l00564" > < / a > < span class = "lineno" > 564< / span >   < span class = "keywordtype" > void< / span > InitialPropagate()< span class = "keyword" > override < / span > { IndexBound(); }< / div >
< div class = "line" > < a name = "l00565" > < / a > < span class = "lineno" > 565< / span >   < / div >
< div class = "line" > < a name = "l00566" > < / a > < span class = "lineno" > 566< / span >   std::string DebugString()< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00567" > < / a > < span class = "lineno" > 567< / span >   < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " LightFunctionElement2Constraint" < / span > ;< / div >
< div class = "line" > < a name = "l00568" > < / a > < span class = "lineno" > 568< / span >   }< / div >
< div class = "line" > < a name = "l00569" > < / a > < span class = "lineno" > 569< / span >   < / div >
< div class = "line" > < a name = "l00570" > < / a > < span class = "lineno" > 570< / span >   < span class = "keywordtype" > void< / span > Accept(ModelVisitor* < span class = "keyword" > const< / span > visitor)< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00571" > < / a > < span class = "lineno" > 571< / span >   visitor-> BeginVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d" > RoutingModelVisitor::kLightElement2< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00572" > < / a > < span class = "lineno" > 572< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754" > ModelVisitor::kTargetArgument< / a > ,< / div >
< div class = "line" > < a name = "l00573" > < / a > < span class = "lineno" > 573< / span >   var_);< / div >
< div class = "line" > < a name = "l00574" > < / a > < span class = "lineno" > 574< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e" > ModelVisitor::kIndexArgument< / a > ,< / div >
< div class = "line" > < a name = "l00575" > < / a > < span class = "lineno" > 575< / span >   index1_);< / div >
< div class = "line" > < a name = "l00576" > < / a > < span class = "lineno" > 576< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a18ba1952015fae2770ace40c811c2efb" > ModelVisitor::kIndex2Argument< / a > ,< / div >
< div class = "line" > < a name = "l00577" > < / a > < span class = "lineno" > 577< / span >   index2_);< / div >
< div class = "line" > < a name = "l00578" > < / a > < span class = "lineno" > 578< / span >   < span class = "comment" > // Warning: This will expand all values into a vector.< / span > < / div >
< div class = "line" > < a name = "l00579" > < / a > < span class = "lineno" > 579< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > index1_min = index1_-> Min();< / div >
< div class = "line" > < a name = "l00580" > < / a > < span class = "lineno" > 580< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > index1_max = index1_-> Max();< / div >
< div class = "line" > < a name = "l00581" > < / a > < span class = "lineno" > 581< / span >   visitor-> VisitIntegerArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a1a1c411b20f73c324361e8eff94f12bd" > ModelVisitor::kMinArgument< / a > , index1_min);< / div >
< div class = "line" > < a name = "l00582" > < / a > < span class = "lineno" > 582< / span >   visitor-> VisitIntegerArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a5f9d5cd2badcf4361bfebd07c9cb63d8" > ModelVisitor::kMaxArgument< / a > , index1_max);< / div >
< div class = "line" > < a name = "l00583" > < / a > < span class = "lineno" > 583< / span >   < span class = "keywordflow" > if< / span > (deep_serialize_()) {< / div >
< div class = "line" > < a name = "l00584" > < / a > < span class = "lineno" > 584< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = index1_min; i < = index1_max; ++i) {< / div >
< div class = "line" > < a name = "l00585" > < / a > < span class = "lineno" > 585< / span >   visitor-> VisitInt64ToInt64Extension(< / div >
< div class = "line" > < a name = "l00586" > < / a > < span class = "lineno" > 586< / span >   [< span class = "keyword" > this< / span > , i](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) { < span class = "keywordflow" > return< / span > values_(i, j); }, index2_-> Min(),< / div >
< div class = "line" > < a name = "l00587" > < / a > < span class = "lineno" > 587< / span >   index2_-> Max());< / div >
< div class = "line" > < a name = "l00588" > < / a > < span class = "lineno" > 588< / span >   }< / div >
< div class = "line" > < a name = "l00589" > < / a > < span class = "lineno" > 589< / span >   }< / div >
< div class = "line" > < a name = "l00590" > < / a > < span class = "lineno" > 590< / span >   visitor-> EndVisitConstraint(< a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d" > RoutingModelVisitor::kLightElement2< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00591" > < / a > < span class = "lineno" > 591< / span >   }< / div >
< div class = "line" > < a name = "l00592" > < / a > < span class = "lineno" > 592< / span >   < / div >
< div class = "line" > < a name = "l00593" > < / a > < span class = "lineno" > 593< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l00594" > < / a > < span class = "lineno" > 594< / span >   < span class = "keywordtype" > void< / span > IndexBound() {< / div >
< div class = "line" > < a name = "l00595" > < / a > < span class = "lineno" > 595< / span >   < span class = "keywordflow" > if< / span > (index1_-> Bound() & & index2_-> Bound()) {< / div >
< div class = "line" > < a name = "l00596" > < / a > < span class = "lineno" > 596< / span >   var_-> SetValue(values_(index1_-> Min(), index2_-> Min()));< / div >
< div class = "line" > < a name = "l00597" > < / a > < span class = "lineno" > 597< / span >   }< / div >
< div class = "line" > < a name = "l00598" > < / a > < span class = "lineno" > 598< / span >   }< / div >
< div class = "line" > < a name = "l00599" > < / a > < span class = "lineno" > 599< / span >   < / div >
< div class = "line" > < a name = "l00600" > < / a > < span class = "lineno" > 600< / span >   IntVar* < span class = "keyword" > const< / span > var_;< / div >
< div class = "line" > < a name = "l00601" > < / a > < span class = "lineno" > 601< / span >   IntVar* < span class = "keyword" > const< / span > index1_;< / div >
< div class = "line" > < a name = "l00602" > < / a > < span class = "lineno" > 602< / span >   IntVar* < span class = "keyword" > const< / span > index2_;< / div >
< div class = "line" > < a name = "l00603" > < / a > < span class = "lineno" > 603< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#abb24034fec2804ac3c0172f043087321" > Solver::IndexEvaluator2< / a > values_;< / div >
< div class = "line" > < a name = "l00604" > < / a > < span class = "lineno" > 604< / span >   std::function< bool()> deep_serialize_;< / div >
< div class = "line" > < a name = "l00605" > < / a > < span class = "lineno" > 605< / span >   };< / div >
< div class = "line" > < a name = "l00606" > < / a > < span class = "lineno" > 606< / span >   < / div >
< div class = "line" > < a name = "l00607" > < / a > < span class = "lineno" > 607< / span >   < span class = "keyword" > template< / span > < < span class = "keyword" > typename< / span > F> < / div >
< div class = "line" > < a name = "l00608" > < / a > < span class = "lineno" > 608< / span >   Constraint* MakeLightElement2(Solver* < span class = "keyword" > const< / span > solver, IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l00609" > < / a > < span class = "lineno" > 609< / span >   IntVar* < span class = "keyword" > const< / span > index1, IntVar* < span class = "keyword" > const< / span > index2,< / div >
< div class = "line" > < a name = "l00610" > < / a > < span class = "lineno" > 610< / span >   F values, std::function< < span class = "keywordtype" > bool< / span > ()> deep_serialize) {< / div >
< div class = "line" > < a name = "l00611" > < / a > < span class = "lineno" > 611< / span >   < span class = "keywordflow" > return< / span > solver-> RevAlloc(< span class = "keyword" > new< / span > LightFunctionElement2Constraint< F> (< / div >
< div class = "line" > < a name = "l00612" > < / a > < span class = "lineno" > 612< / span >   solver, < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , index1, index2, std::move(values),< / div >
< div class = "line" > < a name = "l00613" > < / a > < span class = "lineno" > 613< / span >   std::move(deep_serialize)));< / div >
< div class = "line" > < a name = "l00614" > < / a > < span class = "lineno" > 614< / span >   }< / div >
< div class = "line" > < a name = "l00615" > < / a > < span class = "lineno" > 615< / span >   < / div >
< div class = "line" > < a name = "l00616" > < / a > < span class = "lineno" > 616< / span >   < span class = "comment" > // Evaluators< / span > < / div >
< div class = "line" > < a name = "l00617" > < / a > < span class = "lineno" > 617< / span >   < span class = "keyword" > template< / span > < < span class = "keyword" > class< / span > A, < span class = "keyword" > class< / span > B> < / div >
< div class = "line" > < a name = "l00618" > < / a > < span class = "lineno" > 618< / span >   < span class = "keyword" > static< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > ReturnZero(A < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > , B < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > ) {< / div >
< div class = "line" > < a name = "l00619" > < / a > < span class = "lineno" > 619< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l00620" > < / a > < span class = "lineno" > 620< / span >   }< / div >
< div class = "line" > < a name = "l00621" > < / a > < span class = "lineno" > 621< / span >   < / div >
< div class = "line" > < a name = "l00622" > < / a > < span class = "lineno" > 622< / span >   < span class = "keywordtype" > bool< / span > TransitCallbackPositive(< span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research.html#ab35e9f27307e9c5273c9d77fcf30de0e" > RoutingTransitCallback2< / a > & < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < span class = "keywordtype" > int< / span > size1,< / div >
< div class = "line" > < a name = "l00623" > < / a > < span class = "lineno" > 623< / span >   < span class = "keywordtype" > int< / span > size2) {< / div >
< div class = "line" > < a name = "l00624" > < / a > < span class = "lineno" > 624< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size1; i++) {< / div >
< div class = "line" > < a name = "l00625" > < / a > < span class = "lineno" > 625< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > j = 0; j < size2; j++) {< / div >
< div class = "line" > < a name = "l00626" > < / a > < span class = "lineno" > 626< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > (i, j) < 0) {< / div >
< div class = "line" > < a name = "l00627" > < / a > < span class = "lineno" > 627< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00628" > < / a > < span class = "lineno" > 628< / span >   }< / div >
< div class = "line" > < a name = "l00629" > < / a > < span class = "lineno" > 629< / span >   }< / div >
< div class = "line" > < a name = "l00630" > < / a > < span class = "lineno" > 630< / span >   }< / div >
< div class = "line" > < a name = "l00631" > < / a > < span class = "lineno" > 631< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00632" > < / a > < span class = "lineno" > 632< / span >   }< / div >
< div class = "line" > < a name = "l00633" > < / a > < span class = "lineno" > 633< / span >   < / div >
< div class = "line" > < a name = "l00634" > < / a > < span class = "lineno" > 634< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l00635" > < / a > < span class = "lineno" > 635< / span >   < / div >
< div class = "line" > < a name = "l00636" > < / a > < span class = "lineno" > 636< / span >   < span class = "comment" > // ----- Routing model -----< / span > < / div >
< div class = "line" > < a name = "l00637" > < / a > < span class = "lineno" > 637< / span >   < / div >
< div class = "line" > < a name = "l00638" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > 638< / a > < / span >   < span class = "keyword" > static< / span > < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > = -1;< / div >
< div class = "line" > < a name = "l00639" > < / a > < span class = "lineno" > 639< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a89db28c1da47c5aef8a0aa380a1800ec" > RoutingModel::kNoPenalty< / a > = -1;< / div >
< div class = "line" > < a name = "l00640" > < / a > < span class = "lineno" > 640< / span >   < / div >
< div class = "line" > < a name = "l00641" > < / a > < span class = "lineno" > 641< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > RoutingModel::DisjunctionIndex< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f" > RoutingModel::kNoDisjunction< / a > (-1);< / div >
< div class = "line" > < a name = "l00642" > < / a > < span class = "lineno" > 642< / span >   < / div >
< div class = "line" > < a name = "l00643" > < / a > < span class = "lineno" > 643< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > RoutingModel::DimensionIndex< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1" > RoutingModel::kNoDimension< / a > (-1);< / div >
< div class = "line" > < a name = "l00644" > < / a > < span class = "lineno" > 644< / span >   < / div >
< div class = "line" > < a name = "l00645" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > 645< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > RoutingModel::RoutingModel< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_index_manager.html" > RoutingIndexManager< / a > & index_manager)< / div >
< div class = "line" > < a name = "l00646" > < / a > < span class = "lineno" > 646< / span >   : < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > (index_manager, < a class = "code" href = "namespaceoperations__research.html#a2fb66556abf59bfcf2fc1b87789d2a8e" > DefaultRoutingModelParameters< / a > ()) {}< / div >
< div class = "line" > < a name = "l00647" > < / a > < span class = "lineno" > 647< / span >   < / div >
< div class = "line" > < a name = "l00648" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a33cbb6c72596f866cb9cd105c5fee8ff" > 648< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > RoutingModel::RoutingModel< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_index_manager.html" > RoutingIndexManager< / a > & index_manager,< / div >
< div class = "line" > < a name = "l00649" > < / a > < span class = "lineno" > 649< / span >   < span class = "keyword" > const< / span > RoutingModelParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )< / div >
< div class = "line" > < a name = "l00650" > < / a > < span class = "lineno" > 650< / span >   : nodes_(index_manager.num_nodes()),< / div >
< div class = "line" > < a name = "l00651" > < / a > < span class = "lineno" > 651< / span >   vehicles_(index_manager.num_vehicles()),< / div >
< div class = "line" > < a name = "l00652" > < / a > < span class = "lineno" > 652< / span >   max_active_vehicles_(vehicles_),< / div >
< div class = "line" > < a name = "l00653" > < / a > < span class = "lineno" > 653< / span >   fixed_cost_of_vehicle_(vehicles_, 0),< / div >
< div class = "line" > < a name = "l00654" > < / a > < span class = "lineno" > 654< / span >   cost_class_index_of_vehicle_(vehicles_, < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > (-1)),< / div >
< div class = "line" > < a name = "l00655" > < / a > < span class = "lineno" > 655< / span >   linear_cost_factor_of_vehicle_(vehicles_, 0),< / div >
< div class = "line" > < a name = "l00656" > < / a > < span class = "lineno" > 656< / span >   quadratic_cost_factor_of_vehicle_(vehicles_, 0),< / div >
< div class = "line" > < a name = "l00657" > < / a > < span class = "lineno" > 657< / span >   vehicle_amortized_cost_factors_set_(false),< / div >
< div class = "line" > < a name = "l00658" > < / a > < span class = "lineno" > 658< / span >   consider_empty_route_costs_(vehicles_, false),< / div >
< div class = "line" > < a name = "l00659" > < / a > < span class = "lineno" > 659< / span >   cost_classes_(),< / div >
< div class = "line" > < a name = "l00660" > < / a > < span class = "lineno" > 660< / span >   costs_are_homogeneous_across_vehicles_(< / div >
< div class = "line" > < a name = "l00661" > < / a > < span class = "lineno" > 661< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .reduce_vehicle_cost_model()),< / div >
< div class = "line" > < a name = "l00662" > < / a > < span class = "lineno" > 662< / span >   cache_callbacks_(false),< / div >
< div class = "line" > < a name = "l00663" > < / a > < span class = "lineno" > 663< / span >   vehicle_class_index_of_vehicle_(vehicles_, < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922" > VehicleClassIndex< / a > (-1)),< / div >
< div class = "line" > < a name = "l00664" > < / a > < span class = "lineno" > 664< / span >   vehicle_pickup_delivery_policy_(vehicles_, PICKUP_AND_DELIVERY_NO_ORDER),< / div >
< div class = "line" > < a name = "l00665" > < / a > < span class = "lineno" > 665< / span >   has_hard_type_incompatibilities_(false),< / div >
< div class = "line" > < a name = "l00666" > < / a > < span class = "lineno" > 666< / span >   has_temporal_type_incompatibilities_(false),< / div >
< div class = "line" > < a name = "l00667" > < / a > < span class = "lineno" > 667< / span >   has_same_vehicle_type_requirements_(false),< / div >
< div class = "line" > < a name = "l00668" > < / a > < span class = "lineno" > 668< / span >   has_temporal_type_requirements_(false),< / div >
< div class = "line" > < a name = "l00669" > < / a > < span class = "lineno" > 669< / span >   num_visit_types_(0),< / div >
< div class = "line" > < a name = "l00670" > < / a > < span class = "lineno" > 670< / span >   starts_(vehicles_),< / div >
< div class = "line" > < a name = "l00671" > < / a > < span class = "lineno" > 671< / span >   ends_(vehicles_),< / div >
< div class = "line" > < a name = "l00672" > < / a > < span class = "lineno" > 672< / span >   manager_(index_manager) {< / div >
< div class = "line" > < a name = "l00673" > < / a > < span class = "lineno" > 673< / span >   < span class = "comment" > // Initialize vehicle costs to the zero evaluator.< / span > < / div >
< div class = "line" > < a name = "l00674" > < / a > < span class = "lineno" > 674< / span >   vehicle_to_transit_cost_.assign(< / div >
< div class = "line" > < a name = "l00675" > < / a > < span class = "lineno" > 675< / span >   vehicles_, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > (ReturnZero< int64, int64> ));< / div >
< div class = "line" > < a name = "l00676" > < / a > < span class = "lineno" > 676< / span >   < span class = "comment" > // Active caching after initializing vehicle_to_transit_cost_ to avoid< / span > < / div >
< div class = "line" > < a name = "l00677" > < / a > < span class = "lineno" > 677< / span >   < span class = "comment" > // uselessly caching ReturnZero.< / span > < / div >
< div class = "line" > < a name = "l00678" > < / a > < span class = "lineno" > 678< / span >   cache_callbacks_ = (nodes_ < = < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .max_callback_cache_size());< / div >
< div class = "line" > < a name = "l00679" > < / a > < span class = "lineno" > 679< / span >   < / div >
< div class = "line" > < a name = "l00680" > < / a > < span class = "lineno" > 680< / span >   < a class = "code" href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > (1) < < < span class = "stringliteral" > " Model parameters:\n" < / span > < < < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .DebugString();< / div >
< div class = "line" > < a name = "l00681" > < / a > < span class = "lineno" > 681< / span >   ConstraintSolverParameters solver_parameters =< / div >
< div class = "line" > < a name = "l00682" > < / a > < span class = "lineno" > 682< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .has_solver_parameters() ? < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .solver_parameters()< / div >
< div class = "line" > < a name = "l00683" > < / a > < span class = "lineno" > 683< / span >   : < a class = "code" href = "classoperations__research_1_1_solver.html#aaa825d53a4aec98b8e8d5694b99a0c33" > Solver::DefaultSolverParameters< / a > ();< / div >
< div class = "line" > < a name = "l00684" > < / a > < span class = "lineno" > 684< / span >   solver_ = absl::make_unique< Solver> (< span class = "stringliteral" > " Routing" < / span > , solver_parameters);< / div >
< div class = "line" > < a name = "l00685" > < / a > < span class = "lineno" > 685< / span >   < span class = "comment" > // TODO(user): Remove when removal of NodeIndex is complete.< / span > < / div >
< div class = "line" > < a name = "l00686" > < / a > < span class = "lineno" > 686< / span >   start_end_count_ = index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#a77ea1e8bec366bf225bad6732c7eec63" > num_unique_depots< / a > ();< / div >
< div class = "line" > < a name = "l00687" > < / a > < span class = "lineno" > 687< / span >   Initialize();< / div >
< div class = "line" > < a name = "l00688" > < / a > < span class = "lineno" > 688< / span >   < / div >
< div class = "line" > < a name = "l00689" > < / a > < span class = "lineno" > 689< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l00690" > < / a > < span class = "lineno" > 690< / span >   index_to_pickup_index_pairs_.resize(size);< / div >
< div class = "line" > < a name = "l00691" > < / a > < span class = "lineno" > 691< / span >   index_to_delivery_index_pairs_.resize(size);< / div >
< div class = "line" > < a name = "l00692" > < / a > < span class = "lineno" > 692< / span >   index_to_visit_type_.resize(index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2" > num_indices< / a > (), < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > );< / div >
< div class = "line" > < a name = "l00693" > < / a > < span class = "lineno" > 693< / span >   index_to_type_policy_.resize(index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2" > num_indices< / a > ());< / div >
< div class = "line" > < a name = "l00694" > < / a > < span class = "lineno" > 694< / span >   < / div >
< div class = "line" > < a name = "l00695" > < / a > < span class = "lineno" > 695< / span >   index_to_vehicle_.resize(index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2" > num_indices< / a > (), < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > );< / div >
< div class = "line" > < a name = "l00696" > < / a > < span class = "lineno" > 696< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > v = 0; v < index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ad422f8593b66956120c8a5b1959b2623" > num_vehicles< / a > (); ++v) {< / div >
< div class = "line" > < a name = "l00697" > < / a > < span class = "lineno" > 697< / span >   starts_[v] = index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#afdff7b98df32a8859b0b69dc4c412803" > GetStartIndex< / a > (v);< / div >
< div class = "line" > < a name = "l00698" > < / a > < span class = "lineno" > 698< / span >   index_to_vehicle_[starts_[v]] = v;< / div >
< div class = "line" > < a name = "l00699" > < / a > < span class = "lineno" > 699< / span >   ends_[v] = index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#a43a3b21b32a5c173a34d9c3128554818" > GetEndIndex< / a > (v);< / div >
< div class = "line" > < a name = "l00700" > < / a > < span class = "lineno" > 700< / span >   index_to_vehicle_[ends_[v]] = v;< / div >
< div class = "line" > < a name = "l00701" > < / a > < span class = "lineno" > 701< / span >   }< / div >
< div class = "line" > < a name = "l00702" > < / a > < span class = "lineno" > 702< / span >   < / div >
< div class = "line" > < a name = "l00703" > < / a > < span class = "lineno" > 703< / span >   < span class = "keyword" > const< / span > std::vector< RoutingIndexManager::NodeIndex> & index_to_node =< / div >
< div class = "line" > < a name = "l00704" > < / a > < span class = "lineno" > 704< / span >   index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#a3bb0169ed51340380c189a23a9416ee1" > GetIndexToNodeMap< / a > ();< / div >
< div class = "line" > < a name = "l00705" > < / a > < span class = "lineno" > 705< / span >   index_to_equivalence_class_.resize(index_manager.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2" > num_indices< / a > ());< / div >
< div class = "line" > < a name = "l00706" > < / a > < span class = "lineno" > 706< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < index_to_node.size(); ++i) {< / div >
< div class = "line" > < a name = "l00707" > < / a > < span class = "lineno" > 707< / span >   index_to_equivalence_class_[i] = index_to_node[i].value();< / div >
< div class = "line" > < a name = "l00708" > < / a > < span class = "lineno" > 708< / span >   }< / div >
< div class = "line" > < a name = "l00709" > < / a > < span class = "lineno" > 709< / span >   allowed_vehicles_.resize(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + vehicles_);< / div >
< div class = "line" > < a name = "l00710" > < / a > < span class = "lineno" > 710< / span >   }< / div >
< div class = "line" > < a name = "l00711" > < / a > < span class = "lineno" > 711< / span >   < / div >
< div class = "line" > < a name = "l00712" > < / a > < span class = "lineno" > 712< / span >   < span class = "keywordtype" > void< / span > RoutingModel::Initialize() {< / div >
< div class = "line" > < a name = "l00713" > < / a > < span class = "lineno" > 713< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l00714" > < / a > < span class = "lineno" > 714< / span >   < span class = "comment" > // Next variables< / span > < / div >
< div class = "line" > < a name = "l00715" > < / a > < span class = "lineno" > 715< / span >   solver_-> MakeIntVarArray(size, 0, size + vehicles_ - 1, < span class = "stringliteral" > " Nexts" < / span > , & nexts_);< / div >
< div class = "line" > < a name = "l00716" > < / a > < span class = "lineno" > 716< / span >   solver_-> AddConstraint(solver_-> MakeAllDifferent(nexts_, < span class = "keyword" > false< / span > ));< / div >
< div class = "line" > < a name = "l00717" > < / a > < span class = "lineno" > 717< / span >   index_to_disjunctions_.resize(size + vehicles_);< / div >
< div class = "line" > < a name = "l00718" > < / a > < span class = "lineno" > 718< / span >   < span class = "comment" > // Vehicle variables. In case that node i is not active, vehicle_vars_[i] is< / span > < / div >
< div class = "line" > < a name = "l00719" > < / a > < span class = "lineno" > 719< / span >   < span class = "comment" > // bound to -1.< / span > < / div >
< div class = "line" > < a name = "l00720" > < / a > < span class = "lineno" > 720< / span >   solver_-> MakeIntVarArray(size + vehicles_, -1, vehicles_ - 1, < span class = "stringliteral" > " Vehicles" < / span > ,< / div >
< div class = "line" > < a name = "l00721" > < / a > < span class = "lineno" > 721< / span >   & vehicle_vars_);< / div >
< div class = "line" > < a name = "l00722" > < / a > < span class = "lineno" > 722< / span >   < span class = "comment" > // Active variables< / span > < / div >
< div class = "line" > < a name = "l00723" > < / a > < span class = "lineno" > 723< / span >   solver_-> MakeBoolVarArray(size, < span class = "stringliteral" > " Active" < / span > , & active_);< / div >
< div class = "line" > < a name = "l00724" > < / a > < span class = "lineno" > 724< / span >   < span class = "comment" > // Active vehicle variables< / span > < / div >
< div class = "line" > < a name = "l00725" > < / a > < span class = "lineno" > 725< / span >   solver_-> MakeBoolVarArray(vehicles_, < span class = "stringliteral" > " ActiveVehicle" < / span > , & vehicle_active_);< / div >
< div class = "line" > < a name = "l00726" > < / a > < span class = "lineno" > 726< / span >   < span class = "comment" > // Variables representing vehicles contributing to cost.< / span > < / div >
< div class = "line" > < a name = "l00727" > < / a > < span class = "lineno" > 727< / span >   solver_-> MakeBoolVarArray(vehicles_, < span class = "stringliteral" > " VehicleCostsConsidered" < / span > ,< / div >
< div class = "line" > < a name = "l00728" > < / a > < span class = "lineno" > 728< / span >   & vehicle_costs_considered_);< / div >
< div class = "line" > < a name = "l00729" > < / a > < span class = "lineno" > 729< / span >   < span class = "comment" > // Is-bound-to-end variables.< / span > < / div >
< div class = "line" > < a name = "l00730" > < / a > < span class = "lineno" > 730< / span >   solver_-> MakeBoolVarArray(size + vehicles_, < span class = "stringliteral" > " IsBoundToEnd" < / span > ,< / div >
< div class = "line" > < a name = "l00731" > < / a > < span class = "lineno" > 731< / span >   & is_bound_to_end_);< / div >
< div class = "line" > < a name = "l00732" > < / a > < span class = "lineno" > 732< / span >   < span class = "comment" > // Cost cache< / span > < / div >
< div class = "line" > < a name = "l00733" > < / a > < span class = "lineno" > 733< / span >   cost_cache_.clear();< / div >
< div class = "line" > < a name = "l00734" > < / a > < span class = "lineno" > 734< / span >   cost_cache_.resize(size + vehicles_, {< a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > , < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > (-1), 0});< / div >
< div class = "line" > < a name = "l00735" > < / a > < span class = "lineno" > 735< / span >   preassignment_ = solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l00736" > < / a > < span class = "lineno" > 736< / span >   }< / div >
< div class = "line" > < a name = "l00737" > < / a > < span class = "lineno" > 737< / span >   < / div >
< div class = "line" > < a name = "l00738" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2" > 738< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2" > RoutingModel::~RoutingModel< / a > () {< / div >
< div class = "line" > < a name = "l00739" > < / a > < span class = "lineno" > 739< / span >   < a class = "code" href = "namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6" > gtl::STLDeleteElements< / a > (& dimensions_);< / div >
< div class = "line" > < a name = "l00740" > < / a > < span class = "lineno" > 740< / span >   < / div >
< div class = "line" > < a name = "l00741" > < / a > < span class = "lineno" > 741< / span >   < span class = "comment" > // State dependent transit callbacks.< / span > < / div >
< div class = "line" > < a name = "l00742" > < / a > < span class = "lineno" > 742< / span >   absl::flat_hash_set< RangeIntToIntFunction*> value_functions_delete;< / div >
< div class = "line" > < a name = "l00743" > < / a > < span class = "lineno" > 743< / span >   absl::flat_hash_set< RangeMinMaxIndexFunction*> index_functions_delete;< / div >
< div class = "line" > < a name = "l00744" > < / a > < span class = "lineno" > 744< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & cache_line : state_dependent_transit_evaluators_cache_) {< / div >
< div class = "line" > < a name = "l00745" > < / a > < span class = "lineno" > 745< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & key_transit : *cache_line) {< / div >
< div class = "line" > < a name = "l00746" > < / a > < span class = "lineno" > 746< / span >   value_functions_delete.insert(key_transit.second.transit);< / div >
< div class = "line" > < a name = "l00747" > < / a > < span class = "lineno" > 747< / span >   index_functions_delete.insert(key_transit.second.transit_plus_identity);< / div >
< div class = "line" > < a name = "l00748" > < / a > < span class = "lineno" > 748< / span >   }< / div >
< div class = "line" > < a name = "l00749" > < / a > < span class = "lineno" > 749< / span >   }< / div >
< div class = "line" > < a name = "l00750" > < / a > < span class = "lineno" > 750< / span >   < a class = "code" href = "namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6" > gtl::STLDeleteElements< / a > (& value_functions_delete);< / div >
< div class = "line" > < a name = "l00751" > < / a > < span class = "lineno" > 751< / span >   < a class = "code" href = "namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6" > gtl::STLDeleteElements< / a > (& index_functions_delete);< / div >
< div class = "line" > < a name = "l00752" > < / a > < span class = "lineno" > 752< / span >   }< / div >
< div class = "line" > < a name = "l00753" > < / a > < span class = "lineno" > 753< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l00754" > < / a > < span class = "lineno" > 754< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l00755" > < / a > < span class = "lineno" > 755< / span >   < span class = "keywordtype" > int< / span > RegisterCallback(< a class = "code" href = "namespaceoperations__research.html#ab35e9f27307e9c5273c9d77fcf30de0e" > RoutingTransitCallback2< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < span class = "keywordtype" > bool< / span > is_positive,< / div >
< div class = "line" > < a name = "l00756" > < / a > < span class = "lineno" > 756< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) {< / div >
< div class = "line" > < a name = "l00757" > < / a > < span class = "lineno" > 757< / span >   < span class = "keywordflow" > if< / span > (is_positive) {< / div >
< div class = "line" > < a name = "l00758" > < / a > < span class = "lineno" > 758< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> RegisterPositiveTransitCallback(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00759" > < / a > < span class = "lineno" > 759< / span >   }< / div >
< div class = "line" > < a name = "l00760" > < / a > < span class = "lineno" > 760< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> RegisterTransitCallback(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00761" > < / a > < span class = "lineno" > 761< / span >   }< / div >
< div class = "line" > < a name = "l00762" > < / a > < span class = "lineno" > 762< / span >   < / div >
< div class = "line" > < a name = "l00763" > < / a > < span class = "lineno" > 763< / span >   < span class = "keywordtype" > int< / span > RegisterUnaryCallback(< a class = "code" href = "namespaceoperations__research.html#abec0698c301a7fe57265985e2d30e7c7" > RoutingTransitCallback1< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < span class = "keywordtype" > bool< / span > is_positive,< / div >
< div class = "line" > < a name = "l00764" > < / a > < span class = "lineno" > 764< / span >   RoutingModel* < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) {< / div >
< div class = "line" > < a name = "l00765" > < / a > < span class = "lineno" > 765< / span >   < span class = "keywordflow" > if< / span > (is_positive) {< / div >
< div class = "line" > < a name = "l00766" > < / a > < span class = "lineno" > 766< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> RegisterPositiveUnaryTransitCallback(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00767" > < / a > < span class = "lineno" > 767< / span >   }< / div >
< div class = "line" > < a name = "l00768" > < / a > < span class = "lineno" > 768< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> RegisterUnaryTransitCallback(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00769" > < / a > < span class = "lineno" > 769< / span >   }< / div >
< div class = "line" > < a name = "l00770" > < / a > < span class = "lineno" > 770< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l00771" > < / a > < span class = "lineno" > 771< / span >   < / div >
< div class = "line" > < a name = "l00772" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ab6f52a34eec59c1b1895d960ff446af1" > 772< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6f52a34eec59c1b1895d960ff446af1" > RoutingModel::RegisterUnaryTransitVector< / a > (std::vector< int64> values) {< / div >
< div class = "line" > < a name = "l00773" > < / a > < span class = "lineno" > 773< / span >   < span class = "keywordflow" > return< / span > RegisterUnaryCallback(< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l00774" > < / a > < span class = "lineno" > 774< / span >   [< span class = "keyword" > this< / span > , values = std::move(values)](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i) {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l00775" > < / a > < span class = "lineno" > 775< / span >   < span class = "keywordflow" > return< / span > values[manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (i).< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ()];< / div >
< div class = "line" > < a name = "l00776" > < / a > < span class = "lineno" > 776< / span >   },< / div >
< div class = "line" > < a name = "l00777" > < / a > < span class = "lineno" > 777< / span >   < span class = "comment" > /*is_positive=*/< / span > < / div >
< div class = "line" > < a name = "l00778" > < / a > < span class = "lineno" > 778< / span >   std::all_of(std::cbegin(values), std::cend(values),< / div >
< div class = "line" > < a name = "l00779" > < / a > < span class = "lineno" > 779< / span >   [](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > transit) { < span class = "keywordflow" > return< / span > transit > = 0; }),< / div >
< div class = "line" > < a name = "l00780" > < / a > < span class = "lineno" > 780< / span >   < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00781" > < / a > < span class = "lineno" > 781< / span >   }< / div >
< div class = "line" > < a name = "l00782" > < / a > < span class = "lineno" > 782< / span >   < / div >
< div class = "line" > < a name = "l00783" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b" > 783< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b" > RoutingModel::RegisterUnaryTransitCallback< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3" > TransitCallback1< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l00784" > < / a > < span class = "lineno" > 784< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = unary_transit_evaluators_.size();< / div >
< div class = "line" > < a name = "l00785" > < / a > < span class = "lineno" > 785< / span >   unary_transit_evaluators_.push_back(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00786" > < / a > < span class = "lineno" > 786< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > ([< span class = "keyword" > this< / span > , < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ](< span class = "keywordtype" > int< / span > i, < span class = "keywordtype" > int< / span > j) {< / div >
< div class = "line" > < a name = "l00787" > < / a > < span class = "lineno" > 787< / span >   < span class = "keywordflow" > return< / span > unary_transit_evaluators_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ](i);< / div >
< div class = "line" > < a name = "l00788" > < / a > < span class = "lineno" > 788< / span >   });< / div >
< div class = "line" > < a name = "l00789" > < / a > < span class = "lineno" > 789< / span >   }< / div >
< div class = "line" > < a name = "l00790" > < / a > < span class = "lineno" > 790< / span >   < / div >
< div class = "line" > < a name = "l00791" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ac3eda2d546d3908c490fda5cea849a8d" > 791< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac3eda2d546d3908c490fda5cea849a8d" > RoutingModel::RegisterTransitMatrix< / a > (< / div >
< div class = "line" > < a name = "l00792" > < / a > < span class = "lineno" > 792< / span >   std::vector< std::vector< int64> < span class = "comment" > /*needed_for_swig*/< / span > > values) {< / div >
< div class = "line" > < a name = "l00793" > < / a > < span class = "lineno" > 793< / span >   < span class = "keywordtype" > bool< / span > all_transits_positive = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00794" > < / a > < span class = "lineno" > 794< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::vector< int64> & transit_values : values) {< / div >
< div class = "line" > < a name = "l00795" > < / a > < span class = "lineno" > 795< / span >   all_transits_positive =< / div >
< div class = "line" > < a name = "l00796" > < / a > < span class = "lineno" > 796< / span >   std::all_of(std::cbegin(transit_values), std::cend(transit_values),< / div >
< div class = "line" > < a name = "l00797" > < / a > < span class = "lineno" > 797< / span >   [](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > transit) { < span class = "keywordflow" > return< / span > transit > = 0; });< / div >
< div class = "line" > < a name = "l00798" > < / a > < span class = "lineno" > 798< / span >   < span class = "keywordflow" > if< / span > (!all_transits_positive) {< / div >
< div class = "line" > < a name = "l00799" > < / a > < span class = "lineno" > 799< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l00800" > < / a > < span class = "lineno" > 800< / span >   }< / div >
< div class = "line" > < a name = "l00801" > < / a > < span class = "lineno" > 801< / span >   }< / div >
< div class = "line" > < a name = "l00802" > < / a > < span class = "lineno" > 802< / span >   < span class = "keywordflow" > return< / span > RegisterCallback(< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l00803" > < / a > < span class = "lineno" > 803< / span >   [< span class = "keyword" > this< / span > , values = std::move(values)](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l00804" > < / a > < span class = "lineno" > 804< / span >   < span class = "keywordflow" > return< / span > values[manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (i).< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ()]< / div >
< div class = "line" > < a name = "l00805" > < / a > < span class = "lineno" > 805< / span >   [manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (j).value()];< / div >
< div class = "line" > < a name = "l00806" > < / a > < span class = "lineno" > 806< / span >   },< / div >
< div class = "line" > < a name = "l00807" > < / a > < span class = "lineno" > 807< / span >   all_transits_positive, < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00808" > < / a > < span class = "lineno" > 808< / span >   }< / div >
< div class = "line" > < a name = "l00809" > < / a > < span class = "lineno" > 809< / span >   < / div >
< div class = "line" > < a name = "l00810" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed" > 810< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed" > RoutingModel::RegisterPositiveUnaryTransitCallback< / a > (< / div >
< div class = "line" > < a name = "l00811" > < / a > < span class = "lineno" > 811< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3" > TransitCallback1< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l00812" > < / a > < span class = "lineno" > 812< / span >   is_transit_evaluator_positive_.push_back(< span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l00813" > < / a > < span class = "lineno" > 813< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (TransitCallbackPositive(< / div >
< div class = "line" > < a name = "l00814" > < / a > < span class = "lineno" > 814< / span >   [& < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ](< span class = "keywordtype" > int< / span > i, < span class = "keywordtype" > int< / span > ) { < span class = "keywordflow" > return< / span > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > (i); }, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), 1));< / div >
< div class = "line" > < a name = "l00815" > < / a > < span class = "lineno" > 815< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b" > RegisterUnaryTransitCallback< / a > (std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00816" > < / a > < span class = "lineno" > 816< / span >   }< / div >
< div class = "line" > < a name = "l00817" > < / a > < span class = "lineno" > 817< / span >   < / div >
< div class = "line" > < a name = "l00818" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > 818< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RoutingModel::RegisterTransitCallback< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a" > TransitCallback2< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l00819" > < / a > < span class = "lineno" > 819< / span >   < span class = "keywordflow" > if< / span > (cache_callbacks_) {< / div >
< div class = "line" > < a name = "l00820" > < / a > < span class = "lineno" > 820< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ();< / div >
< div class = "line" > < a name = "l00821" > < / a > < span class = "lineno" > 821< / span >   std::vector< int64> cache(size * size, 0);< / div >
< div class = "line" > < a name = "l00822" > < / a > < span class = "lineno" > 822< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l00823" > < / a > < span class = "lineno" > 823< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > j = 0; j < size; ++j) {< / div >
< div class = "line" > < a name = "l00824" > < / a > < span class = "lineno" > 824< / span >   cache[i * size + j] = < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > (i, j);< / div >
< div class = "line" > < a name = "l00825" > < / a > < span class = "lineno" > 825< / span >   }< / div >
< div class = "line" > < a name = "l00826" > < / a > < span class = "lineno" > 826< / span >   }< / div >
< div class = "line" > < a name = "l00827" > < / a > < span class = "lineno" > 827< / span >   transit_evaluators_.push_back(< / div >
< div class = "line" > < a name = "l00828" > < / a > < span class = "lineno" > 828< / span >   [cache, size](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) { < span class = "keywordflow" > return< / span > cache[i * size + j]; });< / div >
< div class = "line" > < a name = "l00829" > < / a > < span class = "lineno" > 829< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l00830" > < / a > < span class = "lineno" > 830< / span >   transit_evaluators_.push_back(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00831" > < / a > < span class = "lineno" > 831< / span >   }< / div >
< div class = "line" > < a name = "l00832" > < / a > < span class = "lineno" > 832< / span >   < span class = "keywordflow" > if< / span > (transit_evaluators_.size() != unary_transit_evaluators_.size()) {< / div >
< div class = "line" > < a name = "l00833" > < / a > < span class = "lineno" > 833< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (transit_evaluators_.size(), unary_transit_evaluators_.size() + 1);< / div >
< div class = "line" > < a name = "l00834" > < / a > < span class = "lineno" > 834< / span >   unary_transit_evaluators_.push_back(< span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00835" > < / a > < span class = "lineno" > 835< / span >   }< / div >
< div class = "line" > < a name = "l00836" > < / a > < span class = "lineno" > 836< / span >   < span class = "keywordflow" > if< / span > (transit_evaluators_.size() != is_transit_evaluator_positive_.size()) {< / div >
< div class = "line" > < a name = "l00837" > < / a > < span class = "lineno" > 837< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (transit_evaluators_.size(),< / div >
< div class = "line" > < a name = "l00838" > < / a > < span class = "lineno" > 838< / span >   is_transit_evaluator_positive_.size() + 1);< / div >
< div class = "line" > < a name = "l00839" > < / a > < span class = "lineno" > 839< / span >   is_transit_evaluator_positive_.push_back(< span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l00840" > < / a > < span class = "lineno" > 840< / span >   }< / div >
< div class = "line" > < a name = "l00841" > < / a > < span class = "lineno" > 841< / span >   < span class = "keywordflow" > return< / span > transit_evaluators_.size() - 1;< / div >
< div class = "line" > < a name = "l00842" > < / a > < span class = "lineno" > 842< / span >   }< / div >
< div class = "line" > < a name = "l00843" > < / a > < span class = "lineno" > 843< / span >   < / div >
< div class = "line" > < a name = "l00844" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623" > 844< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623" > RoutingModel::RegisterPositiveTransitCallback< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a" > TransitCallback2< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l00845" > < / a > < span class = "lineno" > 845< / span >   is_transit_evaluator_positive_.push_back(< span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l00846" > < / a > < span class = "lineno" > 846< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (TransitCallbackPositive(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (),< / div >
< div class = "line" > < a name = "l00847" > < / a > < span class = "lineno" > 847< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ()));< / div >
< div class = "line" > < a name = "l00848" > < / a > < span class = "lineno" > 848< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > (std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ));< / div >
< div class = "line" > < a name = "l00849" > < / a > < span class = "lineno" > 849< / span >   }< / div >
< div class = "line" > < a name = "l00850" > < / a > < span class = "lineno" > 850< / span >   < / div >
< div class = "line" > < a name = "l00851" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7" > 851< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7" > RoutingModel::RegisterStateDependentTransitCallback< / a > (< / div >
< div class = "line" > < a name = "l00852" > < / a > < span class = "lineno" > 852< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6719229c28ba88ce65968989bb85616b" > VariableIndexEvaluator2< / a > < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l00853" > < / a > < span class = "lineno" > 853< / span >   state_dependent_transit_evaluators_cache_.push_back(< / div >
< div class = "line" > < a name = "l00854" > < / a > < span class = "lineno" > 854< / span >   absl::make_unique< StateDependentTransitCallbackCache> ());< / div >
< div class = "line" > < a name = "l00855" > < / a > < span class = "lineno" > 855< / span >   StateDependentTransitCallbackCache* < span class = "keyword" > const< / span > cache =< / div >
< div class = "line" > < a name = "l00856" > < / a > < span class = "lineno" > 856< / span >   state_dependent_transit_evaluators_cache_.back().get();< / div >
< div class = "line" > < a name = "l00857" > < / a > < span class = "lineno" > 857< / span >   state_dependent_transit_evaluators_.push_back(< / div >
< div class = "line" > < a name = "l00858" > < / a > < span class = "lineno" > 858< / span >   [cache, < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) {< / div >
< div class = "line" > < a name = "l00859" > < / a > < span class = "lineno" > 859< / span >   < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html" > StateDependentTransit< / a > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ;< / div >
< div class = "line" > < a name = "l00860" > < / a > < span class = "lineno" > 860< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (*cache, CacheKey(i, j), & < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > )) < span class = "keywordflow" > return< / span > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ;< / div >
< div class = "line" > < a name = "l00861" > < / a > < span class = "lineno" > 861< / span >   < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > = < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > (i, j);< / div >
< div class = "line" > < a name = "l00862" > < / a > < span class = "lineno" > 862< / span >   cache-> insert({CacheKey(i, j), < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > });< / div >
< div class = "line" > < a name = "l00863" > < / a > < span class = "lineno" > 863< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ;< / div >
< div class = "line" > < a name = "l00864" > < / a > < span class = "lineno" > 864< / span >   });< / div >
< div class = "line" > < a name = "l00865" > < / a > < span class = "lineno" > 865< / span >   < span class = "keywordflow" > return< / span > state_dependent_transit_evaluators_.size() - 1;< / div >
< div class = "line" > < a name = "l00866" > < / a > < span class = "lineno" > 866< / span >   }< / div >
< div class = "line" > < a name = "l00867" > < / a > < span class = "lineno" > 867< / span >   < / div >
< div class = "line" > < a name = "l00868" > < / a > < span class = "lineno" > 868< / span >   < span class = "keywordtype" > void< / span > RoutingModel::AddNoCycleConstraintInternal() {< / div >
< div class = "line" > < a name = "l00869" > < / a > < span class = "lineno" > 869< / span >   < span class = "keywordflow" > if< / span > (no_cycle_constraint_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l00870" > < / a > < span class = "lineno" > 870< / span >   no_cycle_constraint_ = solver_-> MakeNoCycle(nexts_, active_);< / div >
< div class = "line" > < a name = "l00871" > < / a > < span class = "lineno" > 871< / span >   solver_-> AddConstraint(no_cycle_constraint_);< / div >
< div class = "line" > < a name = "l00872" > < / a > < span class = "lineno" > 872< / span >   }< / div >
< div class = "line" > < a name = "l00873" > < / a > < span class = "lineno" > 873< / span >   }< / div >
< div class = "line" > < a name = "l00874" > < / a > < span class = "lineno" > 874< / span >   < / div >
< div class = "line" > < a name = "l00875" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > 875< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > RoutingModel::AddDimension< / a > (< span class = "keywordtype" > int< / span > evaluator_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l00876" > < / a > < span class = "lineno" > 876< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > , < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00877" > < / a > < span class = "lineno" > 877< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l00878" > < / a > < span class = "lineno" > 878< / span >   < span class = "keyword" > const< / span > std::vector< int> evaluator_indices(vehicles_, evaluator_index);< / div >
< div class = "line" > < a name = "l00879" > < / a > < span class = "lineno" > 879< / span >   std::vector< int64> capacities(vehicles_, < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > );< / div >
< div class = "line" > < a name = "l00880" > < / a > < span class = "lineno" > 880< / span >   < span class = "keywordflow" > return< / span > AddDimensionWithCapacityInternal(evaluator_indices, slack_max,< / div >
< div class = "line" > < a name = "l00881" > < / a > < span class = "lineno" > 881< / span >   std::move(capacities),< / div >
< div class = "line" > < a name = "l00882" > < / a > < span class = "lineno" > 882< / span >   fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l00883" > < / a > < span class = "lineno" > 883< / span >   }< / div >
< div class = "line" > < a name = "l00884" > < / a > < span class = "lineno" > 884< / span >   < / div >
< div class = "line" > < a name = "l00885" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a66b87fec514d648c751ad9d4df09d05b" > 885< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66b87fec514d648c751ad9d4df09d05b" > RoutingModel::AddDimensionWithVehicleTransits< / a > (< / div >
< div class = "line" > < a name = "l00886" > < / a > < span class = "lineno" > 886< / span >   < span class = "keyword" > const< / span > std::vector< int> & evaluator_indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > ,< / div >
< div class = "line" > < a name = "l00887" > < / a > < span class = "lineno" > 887< / span >   < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero, < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l00888" > < / a > < span class = "lineno" > 888< / span >   std::vector< int64> capacities(vehicles_, < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > );< / div >
< div class = "line" > < a name = "l00889" > < / a > < span class = "lineno" > 889< / span >   < span class = "keywordflow" > return< / span > AddDimensionWithCapacityInternal(evaluator_indices, slack_max,< / div >
< div class = "line" > < a name = "l00890" > < / a > < span class = "lineno" > 890< / span >   std::move(capacities),< / div >
< div class = "line" > < a name = "l00891" > < / a > < span class = "lineno" > 891< / span >   fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l00892" > < / a > < span class = "lineno" > 892< / span >   }< / div >
< div class = "line" > < a name = "l00893" > < / a > < span class = "lineno" > 893< / span >   < / div >
< div class = "line" > < a name = "l00894" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aca85cf6d63540a9ed592a1d7b3236d2d" > 894< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aca85cf6d63540a9ed592a1d7b3236d2d" > RoutingModel::AddDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l00895" > < / a > < span class = "lineno" > 895< / span >   < span class = "keywordtype" > int< / span > evaluator_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max, std::vector< int64> vehicle_capacities,< / div >
< div class = "line" > < a name = "l00896" > < / a > < span class = "lineno" > 896< / span >   < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero, < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l00897" > < / a > < span class = "lineno" > 897< / span >   < span class = "keyword" > const< / span > std::vector< int> evaluator_indices(vehicles_, evaluator_index);< / div >
< div class = "line" > < a name = "l00898" > < / a > < span class = "lineno" > 898< / span >   < span class = "keywordflow" > return< / span > AddDimensionWithCapacityInternal(evaluator_indices, slack_max,< / div >
< div class = "line" > < a name = "l00899" > < / a > < span class = "lineno" > 899< / span >   std::move(vehicle_capacities),< / div >
< div class = "line" > < a name = "l00900" > < / a > < span class = "lineno" > 900< / span >   fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l00901" > < / a > < span class = "lineno" > 901< / span >   }< / div >
< div class = "line" > < a name = "l00902" > < / a > < span class = "lineno" > 902< / span >   < / div >
< div class = "line" > < a name = "l00903" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a0446229ea281bc2be5055b79825b9a9c" > 903< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0446229ea281bc2be5055b79825b9a9c" > RoutingModel::AddDimensionWithVehicleTransitAndCapacity< / a > (< / div >
< div class = "line" > < a name = "l00904" > < / a > < span class = "lineno" > 904< / span >   < span class = "keyword" > const< / span > std::vector< int> & evaluator_indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l00905" > < / a > < span class = "lineno" > 905< / span >   std::vector< int64> vehicle_capacities, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00906" > < / a > < span class = "lineno" > 906< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l00907" > < / a > < span class = "lineno" > 907< / span >   < span class = "keywordflow" > return< / span > AddDimensionWithCapacityInternal(evaluator_indices, slack_max,< / div >
< div class = "line" > < a name = "l00908" > < / a > < span class = "lineno" > 908< / span >   std::move(vehicle_capacities),< / div >
< div class = "line" > < a name = "l00909" > < / a > < span class = "lineno" > 909< / span >   fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l00910" > < / a > < span class = "lineno" > 910< / span >   }< / div >
< div class = "line" > < a name = "l00911" > < / a > < span class = "lineno" > 911< / span >   < / div >
< div class = "line" > < a name = "l00912" > < / a > < span class = "lineno" > 912< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::AddDimensionWithCapacityInternal(< / div >
< div class = "line" > < a name = "l00913" > < / a > < span class = "lineno" > 913< / span >   < span class = "keyword" > const< / span > std::vector< int> & evaluator_indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l00914" > < / a > < span class = "lineno" > 914< / span >   std::vector< int64> vehicle_capacities, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00915" > < / a > < span class = "lineno" > 915< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l00916" > < / a > < span class = "lineno" > 916< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, vehicle_capacities.size());< / div >
< div class = "line" > < a name = "l00917" > < / a > < span class = "lineno" > 917< / span >   < span class = "keywordflow" > return< / span > InitializeDimensionInternal(< / div >
< div class = "line" > < a name = "l00918" > < / a > < span class = "lineno" > 918< / span >   evaluator_indices, std::vector< int> (), slack_max, fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00919" > < / a > < span class = "lineno" > 919< / span >   < span class = "keyword" > new< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > (< span class = "keyword" > this< / span > , std::move(vehicle_capacities), < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > , < span class = "keyword" > nullptr< / span > ));< / div >
< div class = "line" > < a name = "l00920" > < / a > < span class = "lineno" > 920< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l00921" > < / a > < span class = "lineno" > 921< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l00922" > < / a > < span class = "lineno" > 922< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::InitializeDimensionInternal(< / div >
< div class = "line" > < a name = "l00923" > < / a > < span class = "lineno" > 923< / span >   < span class = "keyword" > const< / span > std::vector< int> & evaluator_indices,< / div >
< div class = "line" > < a name = "l00924" > < / a > < span class = "lineno" > 924< / span >   < span class = "keyword" > const< / span > std::vector< int> & state_dependent_evaluator_indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l00925" > < / a > < span class = "lineno" > 925< / span >   < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero, RoutingDimension* dimension) {< / div >
< div class = "line" > < a name = "l00926" > < / a > < span class = "lineno" > 926< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (dimension != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00927" > < / a > < span class = "lineno" > 927< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, evaluator_indices.size());< / div >
< div class = "line" > < a name = "l00928" > < / a > < span class = "lineno" > 928< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > ((dimension-> base_dimension_ == < span class = "keyword" > nullptr< / span > & & < / div >
< div class = "line" > < a name = "l00929" > < / a > < span class = "lineno" > 929< / span >   state_dependent_evaluator_indices.empty()) ||< / div >
< div class = "line" > < a name = "l00930" > < / a > < span class = "lineno" > 930< / span >   vehicles_ == state_dependent_evaluator_indices.size());< / div >
< div class = "line" > < a name = "l00931" > < / a > < span class = "lineno" > 931< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009" > HasDimension< / a > (dimension-> name())) {< / div >
< div class = "line" > < a name = "l00932" > < / a > < span class = "lineno" > 932< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > dimension_index(dimensions_.size());< / div >
< div class = "line" > < a name = "l00933" > < / a > < span class = "lineno" > 933< / span >   dimension_name_to_index_[dimension-> name()] = dimension_index;< / div >
< div class = "line" > < a name = "l00934" > < / a > < span class = "lineno" > 934< / span >   dimensions_.push_back(dimension);< / div >
< div class = "line" > < a name = "l00935" > < / a > < span class = "lineno" > 935< / span >   dimension-> Initialize(evaluator_indices, state_dependent_evaluator_indices,< / div >
< div class = "line" > < a name = "l00936" > < / a > < span class = "lineno" > 936< / span >   slack_max);< / div >
< div class = "line" > < a name = "l00937" > < / a > < span class = "lineno" > 937< / span >   solver_-> AddConstraint(solver_-> MakeDelayedPathCumul(< / div >
< div class = "line" > < a name = "l00938" > < / a > < span class = "lineno" > 938< / span >   nexts_, active_, dimension-> cumuls(), dimension-> transits()));< / div >
< div class = "line" > < a name = "l00939" > < / a > < span class = "lineno" > 939< / span >   < span class = "keywordflow" > if< / span > (fix_start_cumul_to_zero) {< / div >
< div class = "line" > < a name = "l00940" > < / a > < span class = "lineno" > 940< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l00941" > < / a > < span class = "lineno" > 941< / span >   IntVar* < span class = "keyword" > const< / span > start_cumul = dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (i));< / div >
< div class = "line" > < a name = "l00942" > < / a > < span class = "lineno" > 942< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (0, start_cumul-> Min());< / div >
< div class = "line" > < a name = "l00943" > < / a > < span class = "lineno" > 943< / span >   start_cumul-> SetValue(0);< / div >
< div class = "line" > < a name = "l00944" > < / a > < span class = "lineno" > 944< / span >   }< / div >
< div class = "line" > < a name = "l00945" > < / a > < span class = "lineno" > 945< / span >   }< / div >
< div class = "line" > < a name = "l00946" > < / a > < span class = "lineno" > 946< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l00947" > < / a > < span class = "lineno" > 947< / span >   }< / div >
< div class = "line" > < a name = "l00948" > < / a > < span class = "lineno" > 948< / span >   < span class = "keyword" > delete< / span > dimension;< / div >
< div class = "line" > < a name = "l00949" > < / a > < span class = "lineno" > 949< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l00950" > < / a > < span class = "lineno" > 950< / span >   }< / div >
< div class = "line" > < a name = "l00951" > < / a > < span class = "lineno" > 951< / span >   < / div >
< div class = "line" > < a name = "l00952" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a0a69fba2cad4f27c71a0c552ab7503f3" > 952< / a > < / span >   std::pair< int, bool> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0a69fba2cad4f27c71a0c552ab7503f3" > RoutingModel::AddConstantDimensionWithSlack< / a > (< / div >
< div class = "line" > < a name = "l00953" > < / a > < span class = "lineno" > 953< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00954" > < / a > < span class = "lineno" > 954< / span >   < span class = "keyword" > const< / span > std::string& dimension_name) {< / div >
< div class = "line" > < a name = "l00955" > < / a > < span class = "lineno" > 955< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > evaluator_index =< / div >
< div class = "line" > < a name = "l00956" > < / a > < span class = "lineno" > 956< / span >   RegisterUnaryCallback([< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > ) { < span class = "keywordflow" > return< / span > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ; },< / div >
< div class = "line" > < a name = "l00957" > < / a > < span class = "lineno" > 957< / span >   < span class = "comment" > /*is_positive=*/< / span > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > > = 0, < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l00958" > < / a > < span class = "lineno" > 958< / span >   < span class = "keywordflow" > return< / span > std::make_pair(evaluator_index,< / div >
< div class = "line" > < a name = "l00959" > < / a > < span class = "lineno" > 959< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > AddDimension< / a > (evaluator_index, slack_max, < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > ,< / div >
< div class = "line" > < a name = "l00960" > < / a > < span class = "lineno" > 960< / span >   fix_start_cumul_to_zero, dimension_name));< / div >
< div class = "line" > < a name = "l00961" > < / a > < span class = "lineno" > 961< / span >   }< / div >
< div class = "line" > < a name = "l00962" > < / a > < span class = "lineno" > 962< / span >   < / div >
< div class = "line" > < a name = "l00963" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a8969bceed6043461feec372d8324b14d" > 963< / a > < / span >   std::pair< int, bool> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8969bceed6043461feec372d8324b14d" > RoutingModel::AddVectorDimension< / a > (< / div >
< div class = "line" > < a name = "l00964" > < / a > < span class = "lineno" > 964< / span >   std::vector< int64> values, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > , < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l00965" > < / a > < span class = "lineno" > 965< / span >   < span class = "keyword" > const< / span > std::string& dimension_name) {< / div >
< div class = "line" > < a name = "l00966" > < / a > < span class = "lineno" > 966< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > evaluator_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6f52a34eec59c1b1895d960ff446af1" > RegisterUnaryTransitVector< / a > (std::move(values));< / div >
< div class = "line" > < a name = "l00967" > < / a > < span class = "lineno" > 967< / span >   < span class = "keywordflow" > return< / span > std::make_pair(evaluator_index,< / div >
< div class = "line" > < a name = "l00968" > < / a > < span class = "lineno" > 968< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > AddDimension< / a > (evaluator_index, 0, < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > ,< / div >
< div class = "line" > < a name = "l00969" > < / a > < span class = "lineno" > 969< / span >   fix_start_cumul_to_zero, dimension_name));< / div >
< div class = "line" > < a name = "l00970" > < / a > < span class = "lineno" > 970< / span >   }< / div >
< div class = "line" > < a name = "l00971" > < / a > < span class = "lineno" > 971< / span >   < / div >
< div class = "line" > < a name = "l00972" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a994bcaa8b63247dee303d91f75b4a88c" > 972< / a > < / span >   std::pair< int, bool> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a994bcaa8b63247dee303d91f75b4a88c" > RoutingModel::AddMatrixDimension< / a > (< / div >
< div class = "line" > < a name = "l00973" > < / a > < span class = "lineno" > 973< / span >   std::vector< std::vector< int64> > values, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > ,< / div >
< div class = "line" > < a name = "l00974" > < / a > < span class = "lineno" > 974< / span >   < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero, < span class = "keyword" > const< / span > std::string& dimension_name) {< / div >
< div class = "line" > < a name = "l00975" > < / a > < span class = "lineno" > 975< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > evaluator_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac3eda2d546d3908c490fda5cea849a8d" > RegisterTransitMatrix< / a > (std::move(values));< / div >
< div class = "line" > < a name = "l00976" > < / a > < span class = "lineno" > 976< / span >   < span class = "keywordflow" > return< / span > std::make_pair(evaluator_index,< / div >
< div class = "line" > < a name = "l00977" > < / a > < span class = "lineno" > 977< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > AddDimension< / a > (evaluator_index, 0, < a class = "code" href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > ,< / div >
< div class = "line" > < a name = "l00978" > < / a > < span class = "lineno" > 978< / span >   fix_start_cumul_to_zero, dimension_name));< / div >
< div class = "line" > < a name = "l00979" > < / a > < span class = "lineno" > 979< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l00980" > < / a > < span class = "lineno" > 980< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l00981" > < / a > < span class = "lineno" > 981< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l00982" > < / a > < span class = "lineno" > 982< / span >   < span class = "comment" > // RangeMakeElementExpr is an IntExpr that corresponds to a< / span > < / div >
< div class = "line" > < a name = "l00983" > < / a > < span class = "lineno" > 983< / span >   < span class = "comment" > // RangeIntToIntFunction indexed by an IntVar.< / span > < / div >
< div class = "line" > < a name = "l00984" > < / a > < span class = "lineno" > 984< / span >   < span class = "comment" > // Do not create this class dicretly, but rather use MakeRangeMakeElementExpr.< / span > < / div >
< div class = "line" > < a name = "l00985" > < / a > < span class = "lineno" > 985< / span >   < span class = "keyword" > class < / span > RangeMakeElementExpr : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_base_int_expr.html" > BaseIntExpr< / a > {< / div >
< div class = "line" > < a name = "l00986" > < / a > < span class = "lineno" > 986< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l00987" > < / a > < span class = "lineno" > 987< / span >   RangeMakeElementExpr(< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_range_int_to_int_function.html" > RangeIntToIntFunction< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ,< / div >
< div class = "line" > < a name = "l00988" > < / a > < span class = "lineno" > 988< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * s)< / div >
< div class = "line" > < a name = "l00989" > < / a > < span class = "lineno" > 989< / span >   : < a class = "code" href = "classoperations__research_1_1_base_int_expr.html" > BaseIntExpr< / a > (s), callback_(< a class = "code" href = "base_2logging_8h.html#aeef651f886eb5252c08835194213efe2" > ABSL_DIE_IF_NULL< / a > (< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > )), index_(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l00990" > < / a > < span class = "lineno" > 990< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (callback_ != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00991" > < / a > < span class = "lineno" > 991< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l00992" > < / a > < span class = "lineno" > 992< / span >   }< / div >
< div class = "line" > < a name = "l00993" > < / a > < span class = "lineno" > 993< / span >   < / div >
< div class = "line" > < a name = "l00994" > < / a > < span class = "lineno" > 994< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > Min()< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l00995" > < / a > < span class = "lineno" > 995< / span >   < span class = "comment" > // Converting [index_-> Min(), index_-> Max()] to [idx_min, idx_max).< / span > < / div >
< div class = "line" > < a name = "l00996" > < / a > < span class = "lineno" > 996< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > idx_min = index_-> Min();< / div >
< div class = "line" > < a name = "l00997" > < / a > < span class = "lineno" > 997< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > idx_max = index_-> Max() + 1;< / div >
< div class = "line" > < a name = "l00998" > < / a > < span class = "lineno" > 998< / span >   < span class = "keywordflow" > return< / span > (idx_min < idx_max) ? callback_-> RangeMin(idx_min, idx_max)< / div >
< div class = "line" > < a name = "l00999" > < / a > < span class = "lineno" > 999< / span >   : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l01000" > < / a > < span class = "lineno" > 1000< / span >   }< / div >
< div class = "line" > < a name = "l01001" > < / a > < span class = "lineno" > 1001< / span >   < span class = "keywordtype" > void< / span > SetMin(< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_min)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l01002" > < / a > < span class = "lineno" > 1002< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_min = Min();< / div >
< div class = "line" > < a name = "l01003" > < / a > < span class = "lineno" > 1003< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_max = Max();< / div >
< div class = "line" > < a name = "l01004" > < / a > < span class = "lineno" > 1004< / span >   < span class = "keywordflow" > if< / span > (old_min < new_min & & new_min < = old_max) {< / div >
< div class = "line" > < a name = "l01005" > < / a > < span class = "lineno" > 1005< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_idx_min = index_-> Min();< / div >
< div class = "line" > < a name = "l01006" > < / a > < span class = "lineno" > 1006< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_idx_max = index_-> Max() + 1;< / div >
< div class = "line" > < a name = "l01007" > < / a > < span class = "lineno" > 1007< / span >   < span class = "keywordflow" > if< / span > (old_idx_min < old_idx_max) {< / div >
< div class = "line" > < a name = "l01008" > < / a > < span class = "lineno" > 1008< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_idx_min = callback_-> RangeFirstInsideInterval(< / div >
< div class = "line" > < a name = "l01009" > < / a > < span class = "lineno" > 1009< / span >   old_idx_min, old_idx_max, new_min, old_max + 1);< / div >
< div class = "line" > < a name = "l01010" > < / a > < span class = "lineno" > 1010< / span >   index_-> SetMin(new_idx_min);< / div >
< div class = "line" > < a name = "l01011" > < / a > < span class = "lineno" > 1011< / span >   < span class = "keywordflow" > if< / span > (new_idx_min < old_idx_max) {< / div >
< div class = "line" > < a name = "l01012" > < / a > < span class = "lineno" > 1012< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_idx_max = callback_-> RangeLastInsideInterval(< / div >
< div class = "line" > < a name = "l01013" > < / a > < span class = "lineno" > 1013< / span >   new_idx_min, old_idx_max, new_min, old_max + 1);< / div >
< div class = "line" > < a name = "l01014" > < / a > < span class = "lineno" > 1014< / span >   index_-> SetMax(new_idx_max);< / div >
< div class = "line" > < a name = "l01015" > < / a > < span class = "lineno" > 1015< / span >   }< / div >
< div class = "line" > < a name = "l01016" > < / a > < span class = "lineno" > 1016< / span >   }< / div >
< div class = "line" > < a name = "l01017" > < / a > < span class = "lineno" > 1017< / span >   }< / div >
< div class = "line" > < a name = "l01018" > < / a > < span class = "lineno" > 1018< / span >   }< / div >
< div class = "line" > < a name = "l01019" > < / a > < span class = "lineno" > 1019< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > Max()< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l01020" > < / a > < span class = "lineno" > 1020< / span >   < span class = "comment" > // Converting [index_-> Min(), index_-> Max()] to [idx_min, idx_max).< / span > < / div >
< div class = "line" > < a name = "l01021" > < / a > < span class = "lineno" > 1021< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > idx_min = index_-> Min();< / div >
< div class = "line" > < a name = "l01022" > < / a > < span class = "lineno" > 1022< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > idx_max = index_-> Max() + 1;< / div >
< div class = "line" > < a name = "l01023" > < / a > < span class = "lineno" > 1023< / span >   < span class = "keywordflow" > return< / span > (idx_min < idx_max) ? callback_-> RangeMax(idx_min, idx_max)< / div >
< div class = "line" > < a name = "l01024" > < / a > < span class = "lineno" > 1024< / span >   : < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > ;< / div >
< div class = "line" > < a name = "l01025" > < / a > < span class = "lineno" > 1025< / span >   }< / div >
< div class = "line" > < a name = "l01026" > < / a > < span class = "lineno" > 1026< / span >   < span class = "keywordtype" > void< / span > SetMax(< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_max)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l01027" > < / a > < span class = "lineno" > 1027< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_min = Min();< / div >
< div class = "line" > < a name = "l01028" > < / a > < span class = "lineno" > 1028< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_max = Max();< / div >
< div class = "line" > < a name = "l01029" > < / a > < span class = "lineno" > 1029< / span >   < span class = "keywordflow" > if< / span > (old_min < = new_max & & new_max < old_max) {< / div >
< div class = "line" > < a name = "l01030" > < / a > < span class = "lineno" > 1030< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_idx_min = index_-> Min();< / div >
< div class = "line" > < a name = "l01031" > < / a > < span class = "lineno" > 1031< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_idx_max = index_-> Max() + 1;< / div >
< div class = "line" > < a name = "l01032" > < / a > < span class = "lineno" > 1032< / span >   < span class = "keywordflow" > if< / span > (old_idx_min < old_idx_max) {< / div >
< div class = "line" > < a name = "l01033" > < / a > < span class = "lineno" > 1033< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_idx_min = callback_-> RangeFirstInsideInterval(< / div >
< div class = "line" > < a name = "l01034" > < / a > < span class = "lineno" > 1034< / span >   old_idx_min, old_idx_max, old_min, new_max + 1);< / div >
< div class = "line" > < a name = "l01035" > < / a > < span class = "lineno" > 1035< / span >   index_-> SetMin(new_idx_min);< / div >
< div class = "line" > < a name = "l01036" > < / a > < span class = "lineno" > 1036< / span >   < span class = "keywordflow" > if< / span > (new_idx_min < old_idx_max) {< / div >
< div class = "line" > < a name = "l01037" > < / a > < span class = "lineno" > 1037< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_idx_max = callback_-> RangeLastInsideInterval(< / div >
< div class = "line" > < a name = "l01038" > < / a > < span class = "lineno" > 1038< / span >   new_idx_min, old_idx_max, old_min, new_max + 1);< / div >
< div class = "line" > < a name = "l01039" > < / a > < span class = "lineno" > 1039< / span >   index_-> SetMax(new_idx_max);< / div >
< div class = "line" > < a name = "l01040" > < / a > < span class = "lineno" > 1040< / span >   }< / div >
< div class = "line" > < a name = "l01041" > < / a > < span class = "lineno" > 1041< / span >   }< / div >
< div class = "line" > < a name = "l01042" > < / a > < span class = "lineno" > 1042< / span >   }< / div >
< div class = "line" > < a name = "l01043" > < / a > < span class = "lineno" > 1043< / span >   }< / div >
< div class = "line" > < a name = "l01044" > < / a > < span class = "lineno" > 1044< / span >   < span class = "keywordtype" > void< / span > WhenRange(Demon* d)< span class = "keyword" > override < / span > { index_-> WhenRange(d); }< / div >
< div class = "line" > < a name = "l01045" > < / a > < span class = "lineno" > 1045< / span >   < / div >
< div class = "line" > < a name = "l01046" > < / a > < span class = "lineno" > 1046< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l01047" > < / a > < span class = "lineno" > 1047< / span >   < span class = "keyword" > const< / span > RangeIntToIntFunction* < span class = "keyword" > const< / span > callback_;< / div >
< div class = "line" > < a name = "l01048" > < / a > < span class = "lineno" > 1048< / span >   IntVar* < span class = "keyword" > const< / span > index_;< / div >
< div class = "line" > < a name = "l01049" > < / a > < span class = "lineno" > 1049< / span >   };< / div >
< div class = "line" > < a name = "l01050" > < / a > < span class = "lineno" > 1050< / span >   < / div >
< div class = "line" > < a name = "l01051" > < / a > < span class = "lineno" > 1051< / span >   IntExpr* MakeRangeMakeElementExpr(< span class = "keyword" > const< / span > RangeIntToIntFunction* < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ,< / div >
< div class = "line" > < a name = "l01052" > < / a > < span class = "lineno" > 1052< / span >   IntVar* < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , Solver* s) {< / div >
< div class = "line" > < a name = "l01053" > < / a > < span class = "lineno" > 1053< / span >   < span class = "keywordflow" > return< / span > s-> RegisterIntExpr(< / div >
< div class = "line" > < a name = "l01054" > < / a > < span class = "lineno" > 1054< / span >   s-> RevAlloc(< span class = "keyword" > new< / span > RangeMakeElementExpr(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > , < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , s)));< / div >
< div class = "line" > < a name = "l01055" > < / a > < span class = "lineno" > 1055< / span >   }< / div >
< div class = "line" > < a name = "l01056" > < / a > < span class = "lineno" > 1056< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l01057" > < / a > < span class = "lineno" > 1057< / span >   < / div >
< div class = "line" > < a name = "l01058" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aa3570966e8c66b444e02256805094be4" > 1058< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l01059" > < / a > < span class = "lineno" > 1059< / span >   < span class = "keyword" > const< / span > std::vector< int> & dependent_transits,< / div >
< div class = "line" > < a name = "l01060" > < / a > < span class = "lineno" > 1060< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * base_dimension, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l01061" > < / a > < span class = "lineno" > 1061< / span >   std::vector< int64> vehicle_capacities, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l01062" > < / a > < span class = "lineno" > 1062< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l01063" > < / a > < span class = "lineno" > 1063< / span >   < span class = "keyword" > const< / span > std::vector< int> pure_transits(vehicles_, < span class = "comment" > /*zero_evaluator*/< / span > 0);< / div >
< div class = "line" > < a name = "l01064" > < / a > < span class = "lineno" > 1064< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > AddDimensionDependentDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l01065" > < / a > < span class = "lineno" > 1065< / span >   pure_transits, dependent_transits, base_dimension, slack_max,< / div >
< div class = "line" > < a name = "l01066" > < / a > < span class = "lineno" > 1066< / span >   std::move(vehicle_capacities), fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l01067" > < / a > < span class = "lineno" > 1067< / span >   }< / div >
< div class = "line" > < a name = "l01068" > < / a > < span class = "lineno" > 1068< / span >   < / div >
< div class = "line" > < a name = "l01069" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a9681fce3b255669812d0eb7fd7e372b2" > 1069< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l01070" > < / a > < span class = "lineno" > 1070< / span >   < span class = "keywordtype" > int< / span > transit, < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l01071" > < / a > < span class = "lineno" > 1071< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_capacity, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l01072" > < / a > < span class = "lineno" > 1072< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l01073" > < / a > < span class = "lineno" > 1073< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > AddDimensionDependentDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l01074" > < / a > < span class = "lineno" > 1074< / span >   < span class = "comment" > /*zero_evaluator*/< / span > 0, transit, dimension, slack_max, vehicle_capacity,< / div >
< div class = "line" > < a name = "l01075" > < / a > < span class = "lineno" > 1075< / span >   fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l01076" > < / a > < span class = "lineno" > 1076< / span >   }< / div >
< div class = "line" > < a name = "l01077" > < / a > < span class = "lineno" > 1077< / span >   < / div >
< div class = "line" > < a name = "l01078" > < / a > < span class = "lineno" > 1078< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::AddDimensionDependentDimensionWithVehicleCapacityInternal(< / div >
< div class = "line" > < a name = "l01079" > < / a > < span class = "lineno" > 1079< / span >   < span class = "keyword" > const< / span > std::vector< int> & pure_transits,< / div >
< div class = "line" > < a name = "l01080" > < / a > < span class = "lineno" > 1080< / span >   < span class = "keyword" > const< / span > std::vector< int> & dependent_transits,< / div >
< div class = "line" > < a name = "l01081" > < / a > < span class = "lineno" > 1081< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * base_dimension, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l01082" > < / a > < span class = "lineno" > 1082< / span >   std::vector< int64> vehicle_capacities, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l01083" > < / a > < span class = "lineno" > 1083< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l01084" > < / a > < span class = "lineno" > 1084< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, vehicle_capacities.size());< / div >
< div class = "line" > < a name = "l01085" > < / a > < span class = "lineno" > 1085< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * new_dimension = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01086" > < / a > < span class = "lineno" > 1086< / span >   < span class = "keywordflow" > if< / span > (base_dimension == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l01087" > < / a > < span class = "lineno" > 1087< / span >   new_dimension = < span class = "keyword" > new< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > (< span class = "keyword" > this< / span > , std::move(vehicle_capacities),< / div >
< div class = "line" > < a name = "l01088" > < / a > < span class = "lineno" > 1088< / span >   < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > , RoutingDimension::SelfBased());< / div >
< div class = "line" > < a name = "l01089" > < / a > < span class = "lineno" > 1089< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l01090" > < / a > < span class = "lineno" > 1090< / span >   new_dimension = < span class = "keyword" > new< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > (< span class = "keyword" > this< / span > , std::move(vehicle_capacities),< / div >
< div class = "line" > < a name = "l01091" > < / a > < span class = "lineno" > 1091< / span >   < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > , base_dimension);< / div >
< div class = "line" > < a name = "l01092" > < / a > < span class = "lineno" > 1092< / span >   }< / div >
< div class = "line" > < a name = "l01093" > < / a > < span class = "lineno" > 1093< / span >   < span class = "keywordflow" > return< / span > InitializeDimensionInternal(pure_transits, dependent_transits,< / div >
< div class = "line" > < a name = "l01094" > < / a > < span class = "lineno" > 1094< / span >   slack_max, fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l01095" > < / a > < span class = "lineno" > 1095< / span >   new_dimension);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01096" > < / a > < span class = "lineno" > 1096< / span >   }< / div >
< div class = "line" > < a name = "l01097" > < / a > < span class = "lineno" > 1097< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01098" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae374acc8df39a05017649aa0533b66fd" > 1098< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity< / a > (< / div >
< div class = "line" > < a name = "l01099" > < / a > < span class = "lineno" > 1099< / span >   < span class = "keywordtype" > int< / span > pure_transit, < span class = "keywordtype" > int< / span > dependent_transit,< / div >
< div class = "line" > < a name = "l01100" > < / a > < span class = "lineno" > 1100< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * base_dimension, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max,< / div >
< div class = "line" > < a name = "l01101" > < / a > < span class = "lineno" > 1101< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_capacity, < span class = "keywordtype" > bool< / span > fix_start_cumul_to_zero,< / div >
< div class = "line" > < a name = "l01102" > < / a > < span class = "lineno" > 1102< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ) {< / div >
< div class = "line" > < a name = "l01103" > < / a > < span class = "lineno" > 1103< / span >   std::vector< int> pure_transits(vehicles_, pure_transit);< / div >
< div class = "line" > < a name = "l01104" > < / a > < span class = "lineno" > 1104< / span >   std::vector< int> dependent_transits(vehicles_, dependent_transit);< / div >
< div class = "line" > < a name = "l01105" > < / a > < span class = "lineno" > 1105< / span >   std::vector< int64> vehicle_capacities(vehicles_, vehicle_capacity);< / div >
< div class = "line" > < a name = "l01106" > < / a > < span class = "lineno" > 1106< / span >   < span class = "keywordflow" > return< / span > AddDimensionDependentDimensionWithVehicleCapacityInternal(< / div >
< div class = "line" > < a name = "l01107" > < / a > < span class = "lineno" > 1107< / span >   pure_transits, dependent_transits, base_dimension, slack_max,< / div >
< div class = "line" > < a name = "l01108" > < / a > < span class = "lineno" > 1108< / span >   std::move(vehicle_capacities), fix_start_cumul_to_zero, < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l01109" > < / a > < span class = "lineno" > 1109< / span >   }< / div >
< div class = "line" > < a name = "l01110" > < / a > < span class = "lineno" > 1110< / span >   < / div >
< div class = "line" > < a name = "l01111" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a4aaace80d8b54b0314f29ae619c627b4" > 1111< / a > < / span >   < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html" > RoutingModel::StateDependentTransit< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4aaace80d8b54b0314f29ae619c627b4" > RoutingModel::MakeStateDependentTransit< / a > (< / div >
< div class = "line" > < a name = "l01112" > < / a > < span class = "lineno" > 1112< / span >   < span class = "keyword" > const< / span > std::function< < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > )> & f, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > domain_start,< / div >
< div class = "line" > < a name = "l01113" > < / a > < span class = "lineno" > 1113< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > domain_end) {< / div >
< div class = "line" > < a name = "l01114" > < / a > < span class = "lineno" > 1114< / span >   < span class = "keyword" > const< / span > std::function< < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > )> g = [& f](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > x) { < span class = "keywordflow" > return< / span > f(x) + x; };< / div >
< div class = "line" > < a name = "l01115" > < / a > < span class = "lineno" > 1115< / span >   < span class = "comment" > // The next line is safe, because MakeCachedIntToIntFunction does not count< / span > < / div >
< div class = "line" > < a name = "l01116" > < / a > < span class = "lineno" > 1116< / span >   < span class = "comment" > // on keeping the closure of its first argument alive.< / span > < / div >
< div class = "line" > < a name = "l01117" > < / a > < span class = "lineno" > 1117< / span >   < span class = "keywordflow" > return< / span > {< a class = "code" href = "namespaceoperations__research.html#ae150982b493d89f5fe9f7bf606978da7" > MakeCachedIntToIntFunction< / a > (f, domain_start, domain_end),< / div >
< div class = "line" > < a name = "l01118" > < / a > < span class = "lineno" > 1118< / span >   < a class = "code" href = "namespaceoperations__research.html#ac888be0894b841a25bb416358c1ae8ef" > MakeCachedRangeMinMaxIndexFunction< / a > (g, domain_start, domain_end)};< / div >
< div class = "line" > < a name = "l01119" > < / a > < span class = "lineno" > 1119< / span >   }< / div >
< div class = "line" > < a name = "l01120" > < / a > < span class = "lineno" > 1120< / span >   < / div >
< div class = "line" > < a name = "l01121" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c" > 1121< / a > < / span >   std::vector< std::string> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c" > RoutingModel::GetAllDimensionNames< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01122" > < / a > < span class = "lineno" > 1122< / span >   std::vector< std::string> dimension_names;< / div >
< div class = "line" > < a name = "l01123" > < / a > < span class = "lineno" > 1123< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & dimension_name_index : dimension_name_to_index_) {< / div >
< div class = "line" > < a name = "l01124" > < / a > < span class = "lineno" > 1124< / span >   dimension_names.push_back(dimension_name_index.first);< / div >
< div class = "line" > < a name = "l01125" > < / a > < span class = "lineno" > 1125< / span >   }< / div >
< div class = "line" > < a name = "l01126" > < / a > < span class = "lineno" > 1126< / span >   std::sort(dimension_names.begin(), dimension_names.end());< / div >
< div class = "line" > < a name = "l01127" > < / a > < span class = "lineno" > 1127< / span >   < span class = "keywordflow" > return< / span > dimension_names;< / div >
< div class = "line" > < a name = "l01128" > < / a > < span class = "lineno" > 1128< / span >   }< / div >
< div class = "line" > < a name = "l01129" > < / a > < span class = "lineno" > 1129< / span >   < / div >
< div class = "line" > < a name = "l01130" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90" > 1130< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_global_dimension_cumul_optimizer.html" > GlobalDimensionCumulOptimizer< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90" > RoutingModel::GetMutableGlobalCumulOptimizer< / a > (< / div >
< div class = "line" > < a name = "l01131" > < / a > < span class = "lineno" > 1131< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > & dimension)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01132" > < / a > < span class = "lineno" > 1132< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > dim_index = GetDimensionIndex(dimension.< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ad8227ba86a01f26e4f173cd5e219d5d1" > name< / a > ());< / div >
< div class = "line" > < a name = "l01133" > < / a > < span class = "lineno" > 1133< / span >   < span class = "keywordflow" > if< / span > (dim_index < 0 || dim_index > = global_optimizer_index_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > () ||< / div >
< div class = "line" > < a name = "l01134" > < / a > < span class = "lineno" > 1134< / span >   global_optimizer_index_[dim_index] < 0) {< / div >
< div class = "line" > < a name = "l01135" > < / a > < span class = "lineno" > 1135< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01136" > < / a > < span class = "lineno" > 1136< / span >   }< / div >
< div class = "line" > < a name = "l01137" > < / a > < span class = "lineno" > 1137< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > optimizer_index = global_optimizer_index_[dim_index];< / div >
< div class = "line" > < a name = "l01138" > < / a > < span class = "lineno" > 1138< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (optimizer_index, global_dimension_optimizers_.size());< / div >
< div class = "line" > < a name = "l01139" > < / a > < span class = "lineno" > 1139< / span >   < span class = "keywordflow" > return< / span > global_dimension_optimizers_[optimizer_index].get();< / div >
< div class = "line" > < a name = "l01140" > < / a > < span class = "lineno" > 1140< / span >   }< / div >
< div class = "line" > < a name = "l01141" > < / a > < span class = "lineno" > 1141< / span >   < / div >
< div class = "line" > < a name = "l01142" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838" > 1142< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_local_dimension_cumul_optimizer.html" > LocalDimensionCumulOptimizer< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838" > RoutingModel::GetMutableLocalCumulOptimizer< / a > (< / div >
< div class = "line" > < a name = "l01143" > < / a > < span class = "lineno" > 1143< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > & dimension)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01144" > < / a > < span class = "lineno" > 1144< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > dim_index = GetDimensionIndex(dimension.< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ad8227ba86a01f26e4f173cd5e219d5d1" > name< / a > ());< / div >
< div class = "line" > < a name = "l01145" > < / a > < span class = "lineno" > 1145< / span >   < span class = "keywordflow" > if< / span > (dim_index < 0 || dim_index > = local_optimizer_index_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > () ||< / div >
< div class = "line" > < a name = "l01146" > < / a > < span class = "lineno" > 1146< / span >   local_optimizer_index_[dim_index] < 0) {< / div >
< div class = "line" > < a name = "l01147" > < / a > < span class = "lineno" > 1147< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01148" > < / a > < span class = "lineno" > 1148< / span >   }< / div >
< div class = "line" > < a name = "l01149" > < / a > < span class = "lineno" > 1149< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > optimizer_index = local_optimizer_index_[dim_index];< / div >
< div class = "line" > < a name = "l01150" > < / a > < span class = "lineno" > 1150< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (optimizer_index, local_dimension_optimizers_.size());< / div >
< div class = "line" > < a name = "l01151" > < / a > < span class = "lineno" > 1151< / span >   < span class = "keywordflow" > return< / span > local_dimension_optimizers_[optimizer_index].get();< / div >
< div class = "line" > < a name = "l01152" > < / a > < span class = "lineno" > 1152< / span >   }< / div >
< div class = "line" > < a name = "l01153" > < / a > < span class = "lineno" > 1153< / span >   < / div >
< div class = "line" > < a name = "l01154" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497" > 1154< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_local_dimension_cumul_optimizer.html" > LocalDimensionCumulOptimizer< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497" > RoutingModel::GetMutableLocalCumulMPOptimizer< / a > (< / div >
< div class = "line" > < a name = "l01155" > < / a > < span class = "lineno" > 1155< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > & dimension)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01156" > < / a > < span class = "lineno" > 1156< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > dim_index = GetDimensionIndex(dimension.< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ad8227ba86a01f26e4f173cd5e219d5d1" > name< / a > ());< / div >
< div class = "line" > < a name = "l01157" > < / a > < span class = "lineno" > 1157< / span >   < span class = "keywordflow" > if< / span > (dim_index < 0 || dim_index > = local_optimizer_index_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > () ||< / div >
< div class = "line" > < a name = "l01158" > < / a > < span class = "lineno" > 1158< / span >   local_optimizer_index_[dim_index] < 0) {< / div >
< div class = "line" > < a name = "l01159" > < / a > < span class = "lineno" > 1159< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01160" > < / a > < span class = "lineno" > 1160< / span >   }< / div >
< div class = "line" > < a name = "l01161" > < / a > < span class = "lineno" > 1161< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > optimizer_index = local_optimizer_index_[dim_index];< / div >
< div class = "line" > < a name = "l01162" > < / a > < span class = "lineno" > 1162< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (optimizer_index, local_dimension_mp_optimizers_.size());< / div >
< div class = "line" > < a name = "l01163" > < / a > < span class = "lineno" > 1163< / span >   < span class = "keywordflow" > return< / span > local_dimension_mp_optimizers_[optimizer_index].get();< / div >
< div class = "line" > < a name = "l01164" > < / a > < span class = "lineno" > 1164< / span >   }< / div >
< div class = "line" > < a name = "l01165" > < / a > < span class = "lineno" > 1165< / span >   < / div >
< div class = "line" > < a name = "l01166" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009" > 1166< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009" > RoutingModel::HasDimension< / a > (< span class = "keyword" > const< / span > std::string& dimension_name)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01167" > < / a > < span class = "lineno" > 1167< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (dimension_name_to_index_, dimension_name);< / div >
< div class = "line" > < a name = "l01168" > < / a > < span class = "lineno" > 1168< / span >   }< / div >
< div class = "line" > < a name = "l01169" > < / a > < span class = "lineno" > 1169< / span >   < / div >
< div class = "line" > < a name = "l01170" > < / a > < span class = "lineno" > 1170< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > RoutingModel::DimensionIndex< / a > RoutingModel::GetDimensionIndex(< / div >
< div class = "line" > < a name = "l01171" > < / a > < span class = "lineno" > 1171< / span >   < span class = "keyword" > const< / span > std::string& dimension_name)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01172" > < / a > < span class = "lineno" > 1172< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespacegtl.html#abc18f60961e36340e64e428827c0e38e" > gtl::FindWithDefault< / a > (dimension_name_to_index_, dimension_name,< / div >
< div class = "line" > < a name = "l01173" > < / a > < span class = "lineno" > 1173< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1" > kNoDimension< / a > );< / div >
< div class = "line" > < a name = "l01174" > < / a > < span class = "lineno" > 1174< / span >   }< / div >
< div class = "line" > < a name = "l01175" > < / a > < span class = "lineno" > 1175< / span >   < / div >
< div class = "line" > < a name = "l01176" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76" > 1176< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > & < a class = "code" href = "classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76" > RoutingModel::GetDimensionOrDie< / a > (< / div >
< div class = "line" > < a name = "l01177" > < / a > < span class = "lineno" > 1177< / span >   < span class = "keyword" > const< / span > std::string& dimension_name)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01178" > < / a > < span class = "lineno" > 1178< / span >   < span class = "keywordflow" > return< / span > *dimensions_[< a class = "code" href = "namespacegtl.html#abce27d097bc5680207b294bdad75f59f" > gtl::FindOrDie< / a > (dimension_name_to_index_, dimension_name)];< / div >
< div class = "line" > < a name = "l01179" > < / a > < span class = "lineno" > 1179< / span >   }< / div >
< div class = "line" > < a name = "l01180" > < / a > < span class = "lineno" > 1180< / span >   < / div >
< div class = "line" > < a name = "l01181" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1" > 1181< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1" > RoutingModel::GetMutableDimension< / a > (< / div >
< div class = "line" > < a name = "l01182" > < / a > < span class = "lineno" > 1182< / span >   < span class = "keyword" > const< / span > std::string& dimension_name)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01183" > < / a > < span class = "lineno" > 1183< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = GetDimensionIndex(dimension_name);< / div >
< div class = "line" > < a name = "l01184" > < / a > < span class = "lineno" > 1184< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > != < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1" > kNoDimension< / a > ) {< / div >
< div class = "line" > < a name = "l01185" > < / a > < span class = "lineno" > 1185< / span >   < span class = "keywordflow" > return< / span > dimensions_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l01186" > < / a > < span class = "lineno" > 1186< / span >   }< / div >
< div class = "line" > < a name = "l01187" > < / a > < span class = "lineno" > 1187< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01188" > < / a > < span class = "lineno" > 1188< / span >   }< / div >
< div class = "line" > < a name = "l01189" > < / a > < span class = "lineno" > 1189< / span >   < / div >
< div class = "line" > < a name = "l01190" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf" > 1190< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf" > RoutingModel::SetArcCostEvaluatorOfAllVehicles< / a > (< span class = "keywordtype" > int< / span > evaluator_index) {< / div >
< div class = "line" > < a name = "l01191" > < / a > < span class = "lineno" > 1191< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (0, vehicles_);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01192" > < / a > < span class = "lineno" > 1192< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01193" > < / a > < span class = "lineno" > 1193< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35" > SetArcCostEvaluatorOfVehicle< / a > (evaluator_index, i);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01194" > < / a > < span class = "lineno" > 1194< / span >   }< / div >
< div class = "line" > < a name = "l01195" > < / a > < span class = "lineno" > 1195< / span >   }< / div >
< div class = "line" > < a name = "l01196" > < / a > < span class = "lineno" > 1196< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01197" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35" > 1197< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35" > RoutingModel::SetArcCostEvaluatorOfVehicle< / a > (< span class = "keywordtype" > int< / span > evaluator_index,< / div >
< div class = "line" > < a name = "l01198" > < / a > < span class = "lineno" > 1198< / span >   < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l01199" > < / a > < span class = "lineno" > 1199< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01200" > < / a > < span class = "lineno" > 1200< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (evaluator_index, transit_evaluators_.size());< / div >
< div class = "line" > < a name = "l01201" > < / a > < span class = "lineno" > 1201< / span >   vehicle_to_transit_cost_[vehicle] = evaluator_index;< / div >
< div class = "line" > < a name = "l01202" > < / a > < span class = "lineno" > 1202< / span >   }< / div >
< div class = "line" > < a name = "l01203" > < / a > < span class = "lineno" > 1203< / span >   < / div >
< div class = "line" > < a name = "l01204" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a07b796e9f91ee5b4c5e99c7f23e2f743" > 1204< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a07b796e9f91ee5b4c5e99c7f23e2f743" > RoutingModel::SetFixedCostOfAllVehicles< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ) {< / div >
< div class = "line" > < a name = "l01205" > < / a > < span class = "lineno" > 1205< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l01206" > < / a > < span class = "lineno" > 1206< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4e8f5b5f090cf084347eda6eb803813a" > SetFixedCostOfVehicle< / a > (< a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > , i);< / div >
< div class = "line" > < a name = "l01207" > < / a > < span class = "lineno" > 1207< / span >   }< / div >
< div class = "line" > < a name = "l01208" > < / a > < span class = "lineno" > 1208< / span >   }< / div >
< div class = "line" > < a name = "l01209" > < / a > < span class = "lineno" > 1209< / span >   < / div >
< div class = "line" > < a name = "l01210" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a4bab641f5b9bf8de266adad29558b4c2" > 1210< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4bab641f5b9bf8de266adad29558b4c2" > RoutingModel::GetFixedCostOfVehicle< / a > (< span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01211" > < / a > < span class = "lineno" > 1211< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01212" > < / a > < span class = "lineno" > 1212< / span >   < span class = "keywordflow" > return< / span > fixed_cost_of_vehicle_[vehicle];< / div >
< div class = "line" > < a name = "l01213" > < / a > < span class = "lineno" > 1213< / span >   }< / div >
< div class = "line" > < a name = "l01214" > < / a > < span class = "lineno" > 1214< / span >   < / div >
< div class = "line" > < a name = "l01215" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a4e8f5b5f090cf084347eda6eb803813a" > 1215< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4e8f5b5f090cf084347eda6eb803813a" > RoutingModel::SetFixedCostOfVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > , < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l01216" > < / a > < span class = "lineno" > 1216< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01217" > < / a > < span class = "lineno" > 1217< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (< a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > , 0);< / div >
< div class = "line" > < a name = "l01218" > < / a > < span class = "lineno" > 1218< / span >   fixed_cost_of_vehicle_[vehicle] = < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ;< / div >
< div class = "line" > < a name = "l01219" > < / a > < span class = "lineno" > 1219< / span >   }< / div >
< div class = "line" > < a name = "l01220" > < / a > < span class = "lineno" > 1220< / span >   < / div >
< div class = "line" > < a name = "l01221" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aba87f36c7b4e0bdd5e4e8e334b3e27fa" > 1221< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aba87f36c7b4e0bdd5e4e8e334b3e27fa" > RoutingModel::SetAmortizedCostFactorsOfAllVehicles< / a > (< / div >
< div class = "line" > < a name = "l01222" > < / a > < span class = "lineno" > 1222< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > linear_cost_factor, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > quadratic_cost_factor) {< / div >
< div class = "line" > < a name = "l01223" > < / a > < span class = "lineno" > 1223< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > v = 0; v < vehicles_; v++) {< / div >
< div class = "line" > < a name = "l01224" > < / a > < span class = "lineno" > 1224< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1acdfe3dcf892d108d2a2ecab94e936" > SetAmortizedCostFactorsOfVehicle< / a > (linear_cost_factor, quadratic_cost_factor,< / div >
< div class = "line" > < a name = "l01225" > < / a > < span class = "lineno" > 1225< / span >   v);< / div >
< div class = "line" > < a name = "l01226" > < / a > < span class = "lineno" > 1226< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01227" > < / a > < span class = "lineno" > 1227< / span >   }< / div >
< div class = "line" > < a name = "l01228" > < / a > < span class = "lineno" > 1228< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01229" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae1acdfe3dcf892d108d2a2ecab94e936" > 1229< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1acdfe3dcf892d108d2a2ecab94e936" > RoutingModel::SetAmortizedCostFactorsOfVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > linear_cost_factor,< / div >
< div class = "line" > < a name = "l01230" > < / a > < span class = "lineno" > 1230< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > quadratic_cost_factor,< / div >
< div class = "line" > < a name = "l01231" > < / a > < span class = "lineno" > 1231< / span >   < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l01232" > < / a > < span class = "lineno" > 1232< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01233" > < / a > < span class = "lineno" > 1233< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (linear_cost_factor, 0);< / div >
< div class = "line" > < a name = "l01234" > < / a > < span class = "lineno" > 1234< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (quadratic_cost_factor, 0);< / div >
< div class = "line" > < a name = "l01235" > < / a > < span class = "lineno" > 1235< / span >   < span class = "keywordflow" > if< / span > (linear_cost_factor + quadratic_cost_factor > 0) {< / div >
< div class = "line" > < a name = "l01236" > < / a > < span class = "lineno" > 1236< / span >   vehicle_amortized_cost_factors_set_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l01237" > < / a > < span class = "lineno" > 1237< / span >   }< / div >
< div class = "line" > < a name = "l01238" > < / a > < span class = "lineno" > 1238< / span >   linear_cost_factor_of_vehicle_[vehicle] = linear_cost_factor;< / div >
< div class = "line" > < a name = "l01239" > < / a > < span class = "lineno" > 1239< / span >   quadratic_cost_factor_of_vehicle_[vehicle] = quadratic_cost_factor;< / div >
< div class = "line" > < a name = "l01240" > < / a > < span class = "lineno" > 1240< / span >   }< / div >
< div class = "line" > < a name = "l01241" > < / a > < span class = "lineno" > 1241< / span >   < / div >
< div class = "line" > < a name = "l01242" > < / a > < span class = "lineno" > 1242< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l01243" > < / a > < span class = "lineno" > 1243< / span >   < span class = "comment" > // Some C++ versions used in the open-source export don' t support comparison< / span > < / div >
< div class = "line" > < a name = "l01244" > < / a > < span class = "lineno" > 1244< / span >   < span class = "comment" > // functors for STL containers; so we need a comparator class instead.< / span > < / div >
< div class = "line" > < a name = "l01245" > < / a > < span class = "lineno" > 1245< / span >   < span class = "keyword" > struct < / span > CostClassComparator {< / div >
< div class = "line" > < a name = "l01246" > < / a > < span class = "lineno" > 1246< / span >   < span class = "keywordtype" > bool< / span > operator()(< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_cost_class.html" > RoutingModel::CostClass< / a > & < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > ,< / div >
< div class = "line" > < a name = "l01247" > < / a > < span class = "lineno" > 1247< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_cost_class.html" > RoutingModel::CostClass< / a > & < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01248" > < / a > < span class = "lineno" > 1248< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_cost_class.html#aecd5ad315b3f45eef0d567ad99008eaf" > RoutingModel::CostClass::LessThan< / a > (< a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > , < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > );< / div >
< div class = "line" > < a name = "l01249" > < / a > < span class = "lineno" > 1249< / span >   }< / div >
< div class = "line" > < a name = "l01250" > < / a > < span class = "lineno" > 1250< / span >   };< / div >
< div class = "line" > < a name = "l01251" > < / a > < span class = "lineno" > 1251< / span >   < / div >
< div class = "line" > < a name = "l01252" > < / a > < span class = "lineno" > 1252< / span >   < span class = "keyword" > struct < / span > VehicleClassComparator {< / div >
< div class = "line" > < a name = "l01253" > < / a > < span class = "lineno" > 1253< / span >   < span class = "keywordtype" > bool< / span > operator()(< span class = "keyword" > const< / span > RoutingModel::VehicleClass& < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > ,< / div >
< div class = "line" > < a name = "l01254" > < / a > < span class = "lineno" > 1254< / span >   < span class = "keyword" > const< / span > RoutingModel::VehicleClass& < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01255" > < / a > < span class = "lineno" > 1255< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6" > RoutingModel::VehicleClass::LessThan< / a > (< a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > , < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > );< / div >
< div class = "line" > < a name = "l01256" > < / a > < span class = "lineno" > 1256< / span >   }< / div >
< div class = "line" > < a name = "l01257" > < / a > < span class = "lineno" > 1257< / span >   };< / div >
< div class = "line" > < a name = "l01258" > < / a > < span class = "lineno" > 1258< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l01259" > < / a > < span class = "lineno" > 1259< / span >   < / div >
< div class = "line" > < a name = "l01260" > < / a > < span class = "lineno" > 1260< / span >   < span class = "comment" > // static< / span > < / div >
< div class = "line" > < a name = "l01261" > < / a > < span class = "lineno" > 1261< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > RoutingModel::CostClassIndex< / a > RoutingModel::kCostClassIndexOfZeroCost =< / div >
< div class = "line" > < a name = "l01262" > < / a > < span class = "lineno" > 1262< / span >   CostClassIndex(0);< / div >
< div class = "line" > < a name = "l01263" > < / a > < span class = "lineno" > 1263< / span >   < / div >
< div class = "line" > < a name = "l01264" > < / a > < span class = "lineno" > 1264< / span >   < span class = "keywordtype" > void< / span > RoutingModel::ComputeCostClasses(< / div >
< div class = "line" > < a name = "l01265" > < / a > < span class = "lineno" > 1265< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l01266" > < / a > < span class = "lineno" > 1266< / span >   < span class = "comment" > // Create and reduce the cost classes.< / span > < / div >
< div class = "line" > < a name = "l01267" > < / a > < span class = "lineno" > 1267< / span >   cost_classes_.reserve(vehicles_);< / div >
< div class = "line" > < a name = "l01268" > < / a > < span class = "lineno" > 1268< / span >   cost_classes_.clear();< / div >
< div class = "line" > < a name = "l01269" > < / a > < span class = "lineno" > 1269< / span >   cost_class_index_of_vehicle_.assign(vehicles_, < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > (-1));< / div >
< div class = "line" > < a name = "l01270" > < / a > < span class = "lineno" > 1270< / span >   std::map< CostClass, CostClassIndex, CostClassComparator> cost_class_map;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01271" > < / a > < span class = "lineno" > 1271< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01272" > < / a > < span class = "lineno" > 1272< / span >   < span class = "comment" > // Pre-insert the built-in cost class ' zero cost' with index 0.< / span > < / div >
< div class = "line" > < a name = "l01273" > < / a > < span class = "lineno" > 1273< / span >   < span class = "keyword" > const< / span > CostClass zero_cost_class(0);< / div >
< div class = "line" > < a name = "l01274" > < / a > < span class = "lineno" > 1274< / span >   cost_classes_.push_back(zero_cost_class);< / div >
< div class = "line" > < a name = "l01275" > < / a > < span class = "lineno" > 1275< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (cost_classes_[kCostClassIndexOfZeroCost].evaluator_index, 0);< / div >
< div class = "line" > < a name = "l01276" > < / a > < span class = "lineno" > 1276< / span >   cost_class_map[zero_cost_class] = kCostClassIndexOfZeroCost;< / div >
< div class = "line" > < a name = "l01277" > < / a > < span class = "lineno" > 1277< / span >   < / div >
< div class = "line" > < a name = "l01278" > < / a > < span class = "lineno" > 1278< / span >   < span class = "comment" > // Determine the canonicalized cost class for each vehicle, and insert it as< / span > < / div >
< div class = "line" > < a name = "l01279" > < / a > < span class = "lineno" > 1279< / span >   < span class = "comment" > // a new cost class if it doesn' t exist already. Building cached evaluators< / span > < / div >
< div class = "line" > < a name = "l01280" > < / a > < span class = "lineno" > 1280< / span >   < span class = "comment" > // on the way.< / span > < / div >
< div class = "line" > < a name = "l01281" > < / a > < span class = "lineno" > 1281< / span >   has_vehicle_with_zero_cost_class_ = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l01282" > < / a > < span class = "lineno" > 1282< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l01283" > < / a > < span class = "lineno" > 1283< / span >   CostClass cost_class(vehicle_to_transit_cost_[vehicle]);< / div >
< div class = "line" > < a name = "l01284" > < / a > < span class = "lineno" > 1284< / span >   < / div >
< div class = "line" > < a name = "l01285" > < / a > < span class = "lineno" > 1285< / span >   < span class = "comment" > // Insert the dimension data in a canonical way.< / span > < / div >
< div class = "line" > < a name = "l01286" > < / a > < span class = "lineno" > 1286< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l01287" > < / a > < span class = "lineno" > 1287< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > coeff = dimension-> vehicle_span_cost_coefficients()[vehicle];< / div >
< div class = "line" > < a name = "l01288" > < / a > < span class = "lineno" > 1288< / span >   < span class = "keywordflow" > if< / span > (coeff == 0) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l01289" > < / a > < span class = "lineno" > 1289< / span >   cost_class.dimension_transit_evaluator_class_and_cost_coefficient< / div >
< div class = "line" > < a name = "l01290" > < / a > < span class = "lineno" > 1290< / span >   .push_back({dimension-> vehicle_to_class(vehicle), coeff, dimension});< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01291" > < / a > < span class = "lineno" > 1291< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01292" > < / a > < span class = "lineno" > 1292< / span >   std::sort(cost_class.dimension_transit_evaluator_class_and_cost_coefficient< / div >
< div class = "line" > < a name = "l01293" > < / a > < span class = "lineno" > 1293< / span >   .begin(),< / div >
< div class = "line" > < a name = "l01294" > < / a > < span class = "lineno" > 1294< / span >   cost_class.dimension_transit_evaluator_class_and_cost_coefficient< / div >
< div class = "line" > < a name = "l01295" > < / a > < span class = "lineno" > 1295< / span >   .end());< / div >
< div class = "line" > < a name = "l01296" > < / a > < span class = "lineno" > 1296< / span >   < span class = "comment" > // Try inserting the CostClass, if it' s not already present.< / span > < / div >
< div class = "line" > < a name = "l01297" > < / a > < span class = "lineno" > 1297< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > num_cost_classes(cost_classes_.size());< / div >
< div class = "line" > < a name = "l01298" > < / a > < span class = "lineno" > 1298< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > cost_class_index =< / div >
< div class = "line" > < a name = "l01299" > < / a > < span class = "lineno" > 1299< / span >   < a class = "code" href = "namespacegtl.html#a7a0f8dc4187504b814d8a8be463b517c" > gtl::LookupOrInsert< / a > (& cost_class_map, cost_class, num_cost_classes);< / div >
< div class = "line" > < a name = "l01300" > < / a > < span class = "lineno" > 1300< / span >   < span class = "keywordflow" > if< / span > (cost_class_index == kCostClassIndexOfZeroCost) {< / div >
< div class = "line" > < a name = "l01301" > < / a > < span class = "lineno" > 1301< / span >   has_vehicle_with_zero_cost_class_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l01302" > < / a > < span class = "lineno" > 1302< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (cost_class_index == num_cost_classes) { < span class = "comment" > // New cost class.< / span > < / div >
< div class = "line" > < a name = "l01303" > < / a > < span class = "lineno" > 1303< / span >   cost_classes_.push_back(cost_class);< / div >
< div class = "line" > < a name = "l01304" > < / a > < span class = "lineno" > 1304< / span >   }< / div >
< div class = "line" > < a name = "l01305" > < / a > < span class = "lineno" > 1305< / span >   cost_class_index_of_vehicle_[vehicle] = cost_class_index;< / div >
< div class = "line" > < a name = "l01306" > < / a > < span class = "lineno" > 1306< / span >   }< / div >
< div class = "line" > < a name = "l01307" > < / a > < span class = "lineno" > 1307< / span >   < / div >
< div class = "line" > < a name = "l01308" > < / a > < span class = "lineno" > 1308< / span >   < span class = "comment" > // TRICKY:< / span > < / div >
< div class = "line" > < a name = "l01309" > < / a > < span class = "lineno" > 1309< / span >   < span class = "comment" > // If some vehicle had the " zero" cost class, then we' ll have homogeneous< / span > < / div >
< div class = "line" > < a name = "l01310" > < / a > < span class = "lineno" > 1310< / span >   < span class = "comment" > // vehicles iff they all have that cost class (i.e. cost class count = 1).< / span > < / div >
< div class = "line" > < a name = "l01311" > < / a > < span class = "lineno" > 1311< / span >   < span class = "comment" > // If none of them have it, then we have homogeneous costs iff there are two< / span > < / div >
< div class = "line" > < a name = "l01312" > < / a > < span class = "lineno" > 1312< / span >   < span class = "comment" > // cost classes: the unused " zero" cost class and the one used by all< / span > < / div >
< div class = "line" > < a name = "l01313" > < / a > < span class = "lineno" > 1313< / span >   < span class = "comment" > // vehicles.< / span > < / div >
< div class = "line" > < a name = "l01314" > < / a > < span class = "lineno" > 1314< / span >   < span class = "comment" > // Note that we always need the zero cost class, even if no vehicle uses it,< / span > < / div >
< div class = "line" > < a name = "l01315" > < / a > < span class = "lineno" > 1315< / span >   < span class = "comment" > // because we use it in the vehicle_var = -1 scenario (i.e. unperformed).< / span > < / div >
< div class = "line" > < a name = "l01316" > < / a > < span class = "lineno" > 1316< / span >   < span class = "comment" > //< / span > < / div >
< div class = "line" > < a name = "l01317" > < / a > < span class = "lineno" > 1317< / span >   < span class = "comment" > // Fixed costs are simply ignored for computing these cost classes. They are< / span > < / div >
< div class = "line" > < a name = "l01318" > < / a > < span class = "lineno" > 1318< / span >   < span class = "comment" > // attached to start nodes directly.< / span > < / div >
< div class = "line" > < a name = "l01319" > < / a > < span class = "lineno" > 1319< / span >   costs_are_homogeneous_across_vehicles_ & = has_vehicle_with_zero_cost_class_< / div >
< div class = "line" > < a name = "l01320" > < / a > < span class = "lineno" > 1320< / span >   ? < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d" > GetCostClassesCount< / a > () == 1< / div >
< div class = "line" > < a name = "l01321" > < / a > < span class = "lineno" > 1321< / span >   : < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d" > GetCostClassesCount< / a > () < = 2;< / div >
< div class = "line" > < a name = "l01322" > < / a > < span class = "lineno" > 1322< / span >   }< / div >
< div class = "line" > < a name = "l01323" > < / a > < span class = "lineno" > 1323< / span >   < / div >
< div class = "line" > < a name = "l01324" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6" > 1324< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6" > RoutingModel::VehicleClass::LessThan< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html" > VehicleClass< / a > & < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > ,< / div >
< div class = "line" > < a name = "l01325" > < / a > < span class = "lineno" > 1325< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html" > VehicleClass< / a > & < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > ) {< / div >
< div class = "line" > < a name = "l01326" > < / a > < span class = "lineno" > 1326< / span >   < span class = "keywordflow" > return< / span > std::tie(< a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .cost_class_index, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .fixed_cost, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .start_equivalence_class,< / div >
< div class = "line" > < a name = "l01327" > < / a > < span class = "lineno" > 1327< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .end_equivalence_class, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .unvisitable_nodes_fprint,< / div >
< div class = "line" > < a name = "l01328" > < / a > < span class = "lineno" > 1328< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_start_cumuls_min, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_start_cumuls_max,< / div >
< div class = "line" > < a name = "l01329" > < / a > < span class = "lineno" > 1329< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_end_cumuls_min, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_end_cumuls_max,< / div >
< div class = "line" > < a name = "l01330" > < / a > < span class = "lineno" > 1330< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_capacities, < a class = "code" href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > .dimension_evaluator_classes) < < / div >
< div class = "line" > < a name = "l01331" > < / a > < span class = "lineno" > 1331< / span >   std::tie(< a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .cost_class_index, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .fixed_cost, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .start_equivalence_class,< / div >
< div class = "line" > < a name = "l01332" > < / a > < span class = "lineno" > 1332< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .end_equivalence_class, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .unvisitable_nodes_fprint,< / div >
< div class = "line" > < a name = "l01333" > < / a > < span class = "lineno" > 1333< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_start_cumuls_min, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_start_cumuls_max,< / div >
< div class = "line" > < a name = "l01334" > < / a > < span class = "lineno" > 1334< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_end_cumuls_min, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_end_cumuls_max,< / div >
< div class = "line" > < a name = "l01335" > < / a > < span class = "lineno" > 1335< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_capacities, < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > .dimension_evaluator_classes);< / div >
< div class = "line" > < a name = "l01336" > < / a > < span class = "lineno" > 1336< / span >   }< / div >
< div class = "line" > < a name = "l01337" > < / a > < span class = "lineno" > 1337< / span >   < / div >
< div class = "line" > < a name = "l01338" > < / a > < span class = "lineno" > 1338< / span >   < span class = "keywordtype" > void< / span > RoutingModel::ComputeVehicleClasses() {< / div >
< div class = "line" > < a name = "l01339" > < / a > < span class = "lineno" > 1339< / span >   vehicle_classes_.reserve(vehicles_);< / div >
< div class = "line" > < a name = "l01340" > < / a > < span class = "lineno" > 1340< / span >   vehicle_classes_.clear();< / div >
< div class = "line" > < a name = "l01341" > < / a > < span class = "lineno" > 1341< / span >   vehicle_class_index_of_vehicle_.assign(vehicles_, < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922" > VehicleClassIndex< / a > (-1));< / div >
< div class = "line" > < a name = "l01342" > < / a > < span class = "lineno" > 1342< / span >   std::map< VehicleClass, VehicleClassIndex, VehicleClassComparator> < / div >
< div class = "line" > < a name = "l01343" > < / a > < span class = "lineno" > 1343< / span >   vehicle_class_map;< / div >
< div class = "line" > < a name = "l01344" > < / a > < span class = "lineno" > 1344< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > nodes_unvisitability_num_bytes = (vehicle_vars_.size() + 7) / 8;< / div >
< div class = "line" > < a name = "l01345" > < / a > < span class = "lineno" > 1345< / span >   std::unique_ptr< char[]> nodes_unvisitability_bitmask(< / div >
< div class = "line" > < a name = "l01346" > < / a > < span class = "lineno" > 1346< / span >   < span class = "keyword" > new< / span > < span class = "keywordtype" > char< / span > [nodes_unvisitability_num_bytes]);< / div >
< div class = "line" > < a name = "l01347" > < / a > < span class = "lineno" > 1347< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l01348" > < / a > < span class = "lineno" > 1348< / span >   < a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html" > VehicleClass< / a > vehicle_class;< / div >
< div class = "line" > < a name = "l01349" > < / a > < span class = "lineno" > 1349< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#af626487fbe89510613df5f35bdf9a002" > cost_class_index< / a > = cost_class_index_of_vehicle_[vehicle];< / div >
< div class = "line" > < a name = "l01350" > < / a > < span class = "lineno" > 1350< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a0e6f382c1edda3cf2469aff3f8f5b43d" > fixed_cost< / a > = fixed_cost_of_vehicle_[vehicle];< / div >
< div class = "line" > < a name = "l01351" > < / a > < span class = "lineno" > 1351< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a9f7fbf98fe796946fe0be2ca5c8b4e50" > start_equivalence_class< / a > =< / div >
< div class = "line" > < a name = "l01352" > < / a > < span class = "lineno" > 1352< / span >   index_to_equivalence_class_[< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle)];< / div >
< div class = "line" > < a name = "l01353" > < / a > < span class = "lineno" > 1353< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ac4332ba473c0913b24289e3a71522b2c" > end_equivalence_class< / a > =< / div >
< div class = "line" > < a name = "l01354" > < / a > < span class = "lineno" > 1354< / span >   index_to_equivalence_class_[< a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle)];< / div >
< div class = "line" > < a name = "l01355" > < / a > < span class = "lineno" > 1355< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l01356" > < / a > < span class = "lineno" > 1356< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > start_cumul_var = dimension-> cumuls()[< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle)];< / div >
< div class = "line" > < a name = "l01357" > < / a > < span class = "lineno" > 1357< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#aae36a2ea4a1377bb08a7b3610868ab0b" > dimension_start_cumuls_min< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (< / div >
< div class = "line" > < a name = "l01358" > < / a > < span class = "lineno" > 1358< / span >   start_cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#ac4a4f30badcd311075302a4efcfaee0a" > Min< / a > ());< / div >
< div class = "line" > < a name = "l01359" > < / a > < span class = "lineno" > 1359< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ae9ab15c58c9e4de66d043fb151c50535" > dimension_start_cumuls_max< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (< / div >
< div class = "line" > < a name = "l01360" > < / a > < span class = "lineno" > 1360< / span >   start_cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ());< / div >
< div class = "line" > < a name = "l01361" > < / a > < span class = "lineno" > 1361< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > end_cumul_var = dimension-> cumuls()[< a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle)];< / div >
< div class = "line" > < a name = "l01362" > < / a > < span class = "lineno" > 1362< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ab9b7cbea1e22c00a42d9d053fe43dcc6" > dimension_end_cumuls_min< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (end_cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#ac4a4f30badcd311075302a4efcfaee0a" > Min< / a > ());< / div >
< div class = "line" > < a name = "l01363" > < / a > < span class = "lineno" > 1363< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#abf408711522975c20e4ce1c37033e12e" > dimension_end_cumuls_max< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (end_cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ());< / div >
< div class = "line" > < a name = "l01364" > < / a > < span class = "lineno" > 1364< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a249df6aa5bd9c90924e5e5b0012786e4" > dimension_capacities< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (< / div >
< div class = "line" > < a name = "l01365" > < / a > < span class = "lineno" > 1365< / span >   dimension-> vehicle_capacities()[vehicle]);< / div >
< div class = "line" > < a name = "l01366" > < / a > < span class = "lineno" > 1366< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a3bfe49204f799d059f70a2c016973a12" > dimension_evaluator_classes< / a > .< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > (< / div >
< div class = "line" > < a name = "l01367" > < / a > < span class = "lineno" > 1367< / span >   dimension-> vehicle_to_class(vehicle));< / div >
< div class = "line" > < a name = "l01368" > < / a > < span class = "lineno" > 1368< / span >   }< / div >
< div class = "line" > < a name = "l01369" > < / a > < span class = "lineno" > 1369< / span >   memset(nodes_unvisitability_bitmask.get(), 0,< / div >
< div class = "line" > < a name = "l01370" > < / a > < span class = "lineno" > 1370< / span >   nodes_unvisitability_num_bytes);< / div >
< div class = "line" > < a name = "l01371" > < / a > < span class = "lineno" > 1371< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < vehicle_vars_.size(); ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l01372" > < / a > < span class = "lineno" > 1372< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > vehicle_var = vehicle_vars_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l01373" > < / a > < span class = "lineno" > 1373< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) & & !< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) & & < / div >
< div class = "line" > < a name = "l01374" > < / a > < span class = "lineno" > 1374< / span >   (!vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_var.html#a7005edfb93d09a9ca1ecb989a9bc6733" > Contains< / a > (vehicle) ||< / div >
< div class = "line" > < a name = "l01375" > < / a > < span class = "lineno" > 1375< / span >   !< a class = "code" href = "classoperations__research_1_1_routing_model.html#a43c49fc1660ae71cdb30ae93bcac80d7" > IsVehicleAllowedForIndex< / a > (vehicle, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ))) {< / div >
< div class = "line" > < a name = "l01376" > < / a > < span class = "lineno" > 1376< / span >   nodes_unvisitability_bitmask[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > / CHAR_BIT] |= 1U< / div >
< div class = "line" > < a name = "l01377" > < / a > < span class = "lineno" > 1377< / span >   < < (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > % CHAR_BIT);< / div >
< div class = "line" > < a name = "l01378" > < / a > < span class = "lineno" > 1378< / span >   }< / div >
< div class = "line" > < a name = "l01379" > < / a > < span class = "lineno" > 1379< / span >   }< / div >
< div class = "line" > < a name = "l01380" > < / a > < span class = "lineno" > 1380< / span >   vehicle_class.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad0f12c443e4158fdb27375de6fe0fb95" > unvisitable_nodes_fprint< / a > = < a class = "code" href = "namespaceoperations__research.html#a8627f242a0332f34d29d85b6c57f1224" > ThoroughHash< / a > (< / div >
< div class = "line" > < a name = "l01381" > < / a > < span class = "lineno" > 1381< / span >   nodes_unvisitability_bitmask.get(), nodes_unvisitability_num_bytes);< / div >
< div class = "line" > < a name = "l01382" > < / a > < span class = "lineno" > 1382< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922" > VehicleClassIndex< / a > num_vehicle_classes(vehicle_classes_.size());< / div >
< div class = "line" > < a name = "l01383" > < / a > < span class = "lineno" > 1383< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922" > VehicleClassIndex< / a > vehicle_class_index = < a class = "code" href = "namespacegtl.html#a7a0f8dc4187504b814d8a8be463b517c" > gtl::LookupOrInsert< / a > (< / div >
< div class = "line" > < a name = "l01384" > < / a > < span class = "lineno" > 1384< / span >   & vehicle_class_map, vehicle_class, num_vehicle_classes);< / div >
< div class = "line" > < a name = "l01385" > < / a > < span class = "lineno" > 1385< / span >   < span class = "keywordflow" > if< / span > (vehicle_class_index == num_vehicle_classes) { < span class = "comment" > // New vehicle class< / span > < / div >
< div class = "line" > < a name = "l01386" > < / a > < span class = "lineno" > 1386< / span >   vehicle_classes_.push_back(vehicle_class);< / div >
< div class = "line" > < a name = "l01387" > < / a > < span class = "lineno" > 1387< / span >   }< / div >
< div class = "line" > < a name = "l01388" > < / a > < span class = "lineno" > 1388< / span >   vehicle_class_index_of_vehicle_[vehicle] = vehicle_class_index;< / div >
< div class = "line" > < a name = "l01389" > < / a > < span class = "lineno" > 1389< / span >   }< / div >
< div class = "line" > < a name = "l01390" > < / a > < span class = "lineno" > 1390< / span >   }< / div >
< div class = "line" > < a name = "l01391" > < / a > < span class = "lineno" > 1391< / span >   < / div >
< div class = "line" > < a name = "l01392" > < / a > < span class = "lineno" > 1392< / span >   < span class = "keywordtype" > void< / span > RoutingModel::ComputeVehicleTypes() {< / div >
< div class = "line" > < a name = "l01393" > < / a > < span class = "lineno" > 1393< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > nodes_squared = nodes_ * nodes_;< / div >
< div class = "line" > < a name = "l01394" > < / a > < span class = "lineno" > 1394< / span >   std::vector< int> & type_index_of_vehicle =< / div >
< div class = "line" > < a name = "l01395" > < / a > < span class = "lineno" > 1395< / span >   vehicle_type_container_.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#a9608c6da44ffbf91a3d1ca2c5d873bc7" > type_index_of_vehicle< / a > ;< / div >
< div class = "line" > < a name = "l01396" > < / a > < span class = "lineno" > 1396< / span >   std::vector< std::set< VehicleTypeContainer::VehicleClassEntry> > & < / div >
< div class = "line" > < a name = "l01397" > < / a > < span class = "lineno" > 1397< / span >   sorted_vehicle_classes_per_type =< / div >
< div class = "line" > < a name = "l01398" > < / a > < span class = "lineno" > 1398< / span >   vehicle_type_container_.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#ab04b34ed94012cf2d892d6e9347ee9f6" > sorted_vehicle_classes_per_type< / a > ;< / div >
< div class = "line" > < a name = "l01399" > < / a > < span class = "lineno" > 1399< / span >   std::vector< std::deque< int> > & vehicles_per_vehicle_class =< / div >
< div class = "line" > < a name = "l01400" > < / a > < span class = "lineno" > 1400< / span >   vehicle_type_container_.< a class = "code" href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#ad39f5508cc37e45b2d759832d343c177" > vehicles_per_vehicle_class< / a > ;< / div >
< div class = "line" > < a name = "l01401" > < / a > < span class = "lineno" > 1401< / span >   < / div >
< div class = "line" > < a name = "l01402" > < / a > < span class = "lineno" > 1402< / span >   type_index_of_vehicle.resize(vehicles_);< / div >
< div class = "line" > < a name = "l01403" > < / a > < span class = "lineno" > 1403< / span >   sorted_vehicle_classes_per_type.clear();< / div >
< div class = "line" > < a name = "l01404" > < / a > < span class = "lineno" > 1404< / span >   sorted_vehicle_classes_per_type.reserve(vehicles_);< / div >
< div class = "line" > < a name = "l01405" > < / a > < span class = "lineno" > 1405< / span >   vehicles_per_vehicle_class.clear();< / div >
< div class = "line" > < a name = "l01406" > < / a > < span class = "lineno" > 1406< / span >   vehicles_per_vehicle_class.resize(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8" > GetVehicleClassesCount< / a > ());< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01407" > < / a > < span class = "lineno" > 1407< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01408" > < / a > < span class = "lineno" > 1408< / span >   absl::flat_hash_map< int64, int> type_to_type_index;< / div >
< div class = "line" > < a name = "l01409" > < / a > < span class = "lineno" > 1409< / span >   < / div >
< div class = "line" > < a name = "l01410" > < / a > < span class = "lineno" > 1410< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > v = 0; v < vehicles_; v++) {< / div >
< div class = "line" > < a name = "l01411" > < / a > < span class = "lineno" > 1411< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start = manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (v)).value();< / div >
< div class = "line" > < a name = "l01412" > < / a > < span class = "lineno" > 1412< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > end = manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (v)).value();< / div >
< div class = "line" > < a name = "l01413" > < / a > < span class = "lineno" > 1413< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > cost_class = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a32bba655accbd7dc8e23d30bf679b880" > GetCostClassIndexOfVehicle< / a > (v).value();< / div >
< div class = "line" > < a name = "l01414" > < / a > < span class = "lineno" > 1414< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > type = cost_class * nodes_squared + start * nodes_ + end;< / div >
< div class = "line" > < a name = "l01415" > < / a > < span class = "lineno" > 1415< / span >   < / div >
< div class = "line" > < a name = "l01416" > < / a > < span class = "lineno" > 1416< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & vehicle_type_added = type_to_type_index.insert(< / div >
< div class = "line" > < a name = "l01417" > < / a > < span class = "lineno" > 1417< / span >   std::make_pair(type, type_to_type_index.size()));< / div >
< div class = "line" > < a name = "l01418" > < / a > < span class = "lineno" > 1418< / span >   < / div >
< div class = "line" > < a name = "l01419" > < / a > < span class = "lineno" > 1419< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = vehicle_type_added.first-> second;< / div >
< div class = "line" > < a name = "l01420" > < / a > < span class = "lineno" > 1420< / span >   < / div >
< div class = "line" > < a name = "l01421" > < / a > < span class = "lineno" > 1421< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle_class = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a7a8e134df97e40d1fc498f7f985c33ec" > GetVehicleClassIndexOfVehicle< / a > (v).value();< / div >
< div class = "line" > < a name = "l01422" > < / a > < span class = "lineno" > 1422< / span >   < span class = "keyword" > const< / span > VehicleTypeContainer::VehicleClassEntry class_entry = {< / div >
< div class = "line" > < a name = "l01423" > < / a > < span class = "lineno" > 1423< / span >   vehicle_class, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4bab641f5b9bf8de266adad29558b4c2" > GetFixedCostOfVehicle< / a > (v)};< / div >
< div class = "line" > < a name = "l01424" > < / a > < span class = "lineno" > 1424< / span >   < / div >
< div class = "line" > < a name = "l01425" > < / a > < span class = "lineno" > 1425< / span >   < span class = "keywordflow" > if< / span > (vehicle_type_added.second) {< / div >
< div class = "line" > < a name = "l01426" > < / a > < span class = "lineno" > 1426< / span >   < span class = "comment" > // Type was not indexed yet.< / span > < / div >
< div class = "line" > < a name = "l01427" > < / a > < span class = "lineno" > 1427< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (sorted_vehicle_classes_per_type.size(), < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01428" > < / a > < span class = "lineno" > 1428< / span >   sorted_vehicle_classes_per_type.push_back({class_entry});< / div >
< div class = "line" > < a name = "l01429" > < / a > < span class = "lineno" > 1429< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l01430" > < / a > < span class = "lineno" > 1430< / span >   < span class = "comment" > // Type already indexed.< / span > < / div >
< div class = "line" > < a name = "l01431" > < / a > < span class = "lineno" > 1431< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , sorted_vehicle_classes_per_type.size());< / div >
< div class = "line" > < a name = "l01432" > < / a > < span class = "lineno" > 1432< / span >   sorted_vehicle_classes_per_type[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].insert(class_entry);< / div >
< div class = "line" > < a name = "l01433" > < / a > < span class = "lineno" > 1433< / span >   }< / div >
< div class = "line" > < a name = "l01434" > < / a > < span class = "lineno" > 1434< / span >   vehicles_per_vehicle_class[vehicle_class].push_back(v);< / div >
< div class = "line" > < a name = "l01435" > < / a > < span class = "lineno" > 1435< / span >   type_index_of_vehicle[v] = < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ;< / div >
< div class = "line" > < a name = "l01436" > < / a > < span class = "lineno" > 1436< / span >   }< / div >
< div class = "line" > < a name = "l01437" > < / a > < span class = "lineno" > 1437< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01438" > < / a > < span class = "lineno" > 1438< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01439" > < / a > < span class = "lineno" > 1439< / span >   < span class = "keywordtype" > void< / span > RoutingModel::FinalizeVisitTypes() {< / div >
< div class = "line" > < a name = "l01440" > < / a > < span class = "lineno" > 1440< / span >   < span class = "comment" > // NOTE(user): This is necessary if CloseVisitTypes() was not called< / span > < / div >
< div class = "line" > < a name = "l01441" > < / a > < span class = "lineno" > 1441< / span >   < span class = "comment" > // explicitly before. This will be removed when the TODO regarding this logic< / span > < / div >
< div class = "line" > < a name = "l01442" > < / a > < span class = "lineno" > 1442< / span >   < span class = "comment" > // is addressed.< / span > < / div >
< div class = "line" > < a name = "l01443" > < / a > < span class = "lineno" > 1443< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89" > CloseVisitTypes< / a > ();< / div >
< div class = "line" > < a name = "l01444" > < / a > < span class = "lineno" > 1444< / span >   < / div >
< div class = "line" > < a name = "l01445" > < / a > < span class = "lineno" > 1445< / span >   single_nodes_of_type_.clear();< / div >
< div class = "line" > < a name = "l01446" > < / a > < span class = "lineno" > 1446< / span >   single_nodes_of_type_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l01447" > < / a > < span class = "lineno" > 1447< / span >   pair_indices_of_type_.clear();< / div >
< div class = "line" > < a name = "l01448" > < / a > < span class = "lineno" > 1448< / span >   pair_indices_of_type_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l01449" > < / a > < span class = "lineno" > 1449< / span >   std::vector< absl::flat_hash_set< int> > pair_indices_added_for_type(< / div >
< div class = "line" > < a name = "l01450" > < / a > < span class = "lineno" > 1450< / span >   num_visit_types_);< / div >
< div class = "line" > < a name = "l01451" > < / a > < span class = "lineno" > 1451< / span >   < / div >
< div class = "line" > < a name = "l01452" > < / a > < span class = "lineno" > 1452< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < index_to_visit_type_.size(); < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ++) {< / div >
< div class = "line" > < a name = "l01453" > < / a > < span class = "lineno" > 1453< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > visit_type = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > GetVisitType< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01454" > < / a > < span class = "lineno" > 1454< / span >   < span class = "keywordflow" > if< / span > (visit_type < 0) {< / div >
< div class = "line" > < a name = "l01455" > < / a > < span class = "lineno" > 1455< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l01456" > < / a > < span class = "lineno" > 1456< / span >   }< / div >
< div class = "line" > < a name = "l01457" > < / a > < span class = "lineno" > 1457< / span >   < span class = "keyword" > const< / span > std::vector< std::pair< int, int> > & pickup_index_pairs =< / div >
< div class = "line" > < a name = "l01458" > < / a > < span class = "lineno" > 1458< / span >   index_to_pickup_index_pairs_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l01459" > < / a > < span class = "lineno" > 1459< / span >   < span class = "keyword" > const< / span > std::vector< std::pair< int, int> > & delivery_index_pairs =< / div >
< div class = "line" > < a name = "l01460" > < / a > < span class = "lineno" > 1460< / span >   index_to_delivery_index_pairs_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l01461" > < / a > < span class = "lineno" > 1461< / span >   < span class = "keywordflow" > if< / span > (pickup_index_pairs.empty() & & delivery_index_pairs.empty()) {< / div >
< div class = "line" > < a name = "l01462" > < / a > < span class = "lineno" > 1462< / span >   single_nodes_of_type_[visit_type].push_back(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01463" > < / a > < span class = "lineno" > 1463< / span >   }< / div >
< div class = "line" > < a name = "l01464" > < / a > < span class = "lineno" > 1464< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::vector< std::pair< int, int> > * index_pairs :< / div >
< div class = "line" > < a name = "l01465" > < / a > < span class = "lineno" > 1465< / span >   {& pickup_index_pairs, & delivery_index_pairs}) {< / div >
< div class = "line" > < a name = "l01466" > < / a > < span class = "lineno" > 1466< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::pair< int, int> & index_pair : *index_pairs) {< / div >
< div class = "line" > < a name = "l01467" > < / a > < span class = "lineno" > 1467< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > pair_index = index_pair.first;< / div >
< div class = "line" > < a name = "l01468" > < / a > < span class = "lineno" > 1468< / span >   < span class = "keywordflow" > if< / span > (pair_indices_added_for_type[visit_type].insert(pair_index).second) {< / div >
< div class = "line" > < a name = "l01469" > < / a > < span class = "lineno" > 1469< / span >   pair_indices_of_type_[visit_type].push_back(pair_index);< / div >
< div class = "line" > < a name = "l01470" > < / a > < span class = "lineno" > 1470< / span >   }< / div >
< div class = "line" > < a name = "l01471" > < / a > < span class = "lineno" > 1471< / span >   }< / div >
< div class = "line" > < a name = "l01472" > < / a > < span class = "lineno" > 1472< / span >   }< / div >
< div class = "line" > < a name = "l01473" > < / a > < span class = "lineno" > 1473< / span >   }< / div >
< div class = "line" > < a name = "l01474" > < / a > < span class = "lineno" > 1474< / span >   < / div >
< div class = "line" > < a name = "l01475" > < / a > < span class = "lineno" > 1475< / span >   TopologicallySortVisitTypes();< / div >
< div class = "line" > < a name = "l01476" > < / a > < span class = "lineno" > 1476< / span >   }< / div >
< div class = "line" > < a name = "l01477" > < / a > < span class = "lineno" > 1477< / span >   < / div >
< div class = "line" > < a name = "l01478" > < / a > < span class = "lineno" > 1478< / span >   < span class = "keywordtype" > void< / span > RoutingModel::TopologicallySortVisitTypes() {< / div >
< div class = "line" > < a name = "l01479" > < / a > < span class = "lineno" > 1479< / span >   < span class = "keywordflow" > if< / span > (!has_same_vehicle_type_requirements_ & & < / div >
< div class = "line" > < a name = "l01480" > < / a > < span class = "lineno" > 1480< / span >   !has_temporal_type_requirements_) {< / div >
< div class = "line" > < a name = "l01481" > < / a > < span class = "lineno" > 1481< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l01482" > < / a > < span class = "lineno" > 1482< / span >   }< / div >
< div class = "line" > < a name = "l01483" > < / a > < span class = "lineno" > 1483< / span >   std::vector< std::pair< double, double> > type_requirement_tightness(< / div >
< div class = "line" > < a name = "l01484" > < / a > < span class = "lineno" > 1484< / span >   num_visit_types_, {0, 0});< / div >
< div class = "line" > < a name = "l01485" > < / a > < span class = "lineno" > 1485< / span >   std::vector< absl::flat_hash_set< int> > type_to_dependent_types(< / div >
< div class = "line" > < a name = "l01486" > < / a > < span class = "lineno" > 1486< / span >   num_visit_types_);< / div >
< div class = "line" > < a name = "l01487" > < / a > < span class = "lineno" > 1487< / span >   SparseBitset< > types_in_requirement_graph(num_visit_types_);< / div >
< div class = "line" > < a name = "l01488" > < / a > < span class = "lineno" > 1488< / span >   std::vector< int> in_degree(num_visit_types_, 0);< / div >
< div class = "line" > < a name = "l01489" > < / a > < span class = "lineno" > 1489< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > type = 0; type < num_visit_types_; type++) {< / div >
< div class = "line" > < a name = "l01490" > < / a > < span class = "lineno" > 1490< / span >   < span class = "keywordtype" > int< / span > num_alternative_required_types = 0;< / div >
< div class = "line" > < a name = "l01491" > < / a > < span class = "lineno" > 1491< / span >   < span class = "keywordtype" > int< / span > num_required_sets = 0;< / div >
< div class = "line" > < a name = "l01492" > < / a > < span class = "lineno" > 1492< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::vector< absl::flat_hash_set< int> > *< / div >
< div class = "line" > < a name = "l01493" > < / a > < span class = "lineno" > 1493< / span >   required_type_alternatives :< / div >
< div class = "line" > < a name = "l01494" > < / a > < span class = "lineno" > 1494< / span >   {& required_type_alternatives_when_adding_type_index_[type],< / div >
< div class = "line" > < a name = "l01495" > < / a > < span class = "lineno" > 1495< / span >   & required_type_alternatives_when_removing_type_index_[type],< / div >
< div class = "line" > < a name = "l01496" > < / a > < span class = "lineno" > 1496< / span >   & same_vehicle_required_type_alternatives_per_type_index_[type]}) {< / div >
< div class = "line" > < a name = "l01497" > < / a > < span class = "lineno" > 1497< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > absl::flat_hash_set< int> & alternatives :< / div >
< div class = "line" > < a name = "l01498" > < / a > < span class = "lineno" > 1498< / span >   *required_type_alternatives) {< / div >
< div class = "line" > < a name = "l01499" > < / a > < span class = "lineno" > 1499< / span >   types_in_requirement_graph.Set(type);< / div >
< div class = "line" > < a name = "l01500" > < / a > < span class = "lineno" > 1500< / span >   num_required_sets++;< / div >
< div class = "line" > < a name = "l01501" > < / a > < span class = "lineno" > 1501< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > required_type : alternatives) {< / div >
< div class = "line" > < a name = "l01502" > < / a > < span class = "lineno" > 1502< / span >   type_requirement_tightness[required_type].second +=< / div >
< div class = "line" > < a name = "l01503" > < / a > < span class = "lineno" > 1503< / span >   1.0 / alternatives.size();< / div >
< div class = "line" > < a name = "l01504" > < / a > < span class = "lineno" > 1504< / span >   types_in_requirement_graph.Set(required_type);< / div >
< div class = "line" > < a name = "l01505" > < / a > < span class = "lineno" > 1505< / span >   num_alternative_required_types++;< / div >
< div class = "line" > < a name = "l01506" > < / a > < span class = "lineno" > 1506< / span >   < span class = "keywordflow" > if< / span > (type_to_dependent_types[required_type].insert(type).second) {< / div >
< div class = "line" > < a name = "l01507" > < / a > < span class = "lineno" > 1507< / span >   in_degree[type]++;< / div >
< div class = "line" > < a name = "l01508" > < / a > < span class = "lineno" > 1508< / span >   }< / div >
< div class = "line" > < a name = "l01509" > < / a > < span class = "lineno" > 1509< / span >   }< / div >
< div class = "line" > < a name = "l01510" > < / a > < span class = "lineno" > 1510< / span >   }< / div >
< div class = "line" > < a name = "l01511" > < / a > < span class = "lineno" > 1511< / span >   }< / div >
< div class = "line" > < a name = "l01512" > < / a > < span class = "lineno" > 1512< / span >   < span class = "keywordflow" > if< / span > (num_alternative_required_types > 0) {< / div >
< div class = "line" > < a name = "l01513" > < / a > < span class = "lineno" > 1513< / span >   type_requirement_tightness[type].first += 1.0 * num_required_sets *< / div >
< div class = "line" > < a name = "l01514" > < / a > < span class = "lineno" > 1514< / span >   num_required_sets /< / div >
< div class = "line" > < a name = "l01515" > < / a > < span class = "lineno" > 1515< / span >   num_alternative_required_types;< / div >
< div class = "line" > < a name = "l01516" > < / a > < span class = "lineno" > 1516< / span >   }< / div >
< div class = "line" > < a name = "l01517" > < / a > < span class = "lineno" > 1517< / span >   }< / div >
< div class = "line" > < a name = "l01518" > < / a > < span class = "lineno" > 1518< / span >   < / div >
< div class = "line" > < a name = "l01519" > < / a > < span class = "lineno" > 1519< / span >   < span class = "comment" > // Compute topological order of visit types.< / span > < / div >
< div class = "line" > < a name = "l01520" > < / a > < span class = "lineno" > 1520< / span >   topologically_sorted_visit_types_.clear();< / div >
< div class = "line" > < a name = "l01521" > < / a > < span class = "lineno" > 1521< / span >   std::vector< int> current_types_with_zero_indegree;< / div >
< div class = "line" > < a name = "l01522" > < / a > < span class = "lineno" > 1522< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > type : types_in_requirement_graph.PositionsSetAtLeastOnce()) {< / div >
< div class = "line" > < a name = "l01523" > < / a > < span class = "lineno" > 1523< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (type_requirement_tightness[type].first > 0 ||< / div >
< div class = "line" > < a name = "l01524" > < / a > < span class = "lineno" > 1524< / span >   type_requirement_tightness[type].second > 0);< / div >
< div class = "line" > < a name = "l01525" > < / a > < span class = "lineno" > 1525< / span >   < span class = "keywordflow" > if< / span > (in_degree[type] == 0) {< / div >
< div class = "line" > < a name = "l01526" > < / a > < span class = "lineno" > 1526< / span >   current_types_with_zero_indegree.push_back(type);< / div >
< div class = "line" > < a name = "l01527" > < / a > < span class = "lineno" > 1527< / span >   }< / div >
< div class = "line" > < a name = "l01528" > < / a > < span class = "lineno" > 1528< / span >   }< / div >
< div class = "line" > < a name = "l01529" > < / a > < span class = "lineno" > 1529< / span >   < / div >
< div class = "line" > < a name = "l01530" > < / a > < span class = "lineno" > 1530< / span >   < span class = "keywordtype" > int< / span > num_types_added = 0;< / div >
< div class = "line" > < a name = "l01531" > < / a > < span class = "lineno" > 1531< / span >   < span class = "keywordflow" > while< / span > (!current_types_with_zero_indegree.empty()) {< / div >
< div class = "line" > < a name = "l01532" > < / a > < span class = "lineno" > 1532< / span >   < span class = "comment" > // Add all zero-degree nodes to the same topological order group, while< / span > < / div >
< div class = "line" > < a name = "l01533" > < / a > < span class = "lineno" > 1533< / span >   < span class = "comment" > // also marking their dependent types that become part of the next group.< / span > < / div >
< div class = "line" > < a name = "l01534" > < / a > < span class = "lineno" > 1534< / span >   topologically_sorted_visit_types_.push_back({});< / div >
< div class = "line" > < a name = "l01535" > < / a > < span class = "lineno" > 1535< / span >   std::vector< int> & topological_group =< / div >
< div class = "line" > < a name = "l01536" > < / a > < span class = "lineno" > 1536< / span >   topologically_sorted_visit_types_.back();< / div >
< div class = "line" > < a name = "l01537" > < / a > < span class = "lineno" > 1537< / span >   std::vector< int> next_types_with_zero_indegree;< / div >
< div class = "line" > < a name = "l01538" > < / a > < span class = "lineno" > 1538< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > type : current_types_with_zero_indegree) {< / div >
< div class = "line" > < a name = "l01539" > < / a > < span class = "lineno" > 1539< / span >   topological_group.push_back(type);< / div >
< div class = "line" > < a name = "l01540" > < / a > < span class = "lineno" > 1540< / span >   num_types_added++;< / div >
< div class = "line" > < a name = "l01541" > < / a > < span class = "lineno" > 1541< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > dependent_type : type_to_dependent_types[type]) {< / div >
< div class = "line" > < a name = "l01542" > < / a > < span class = "lineno" > 1542< / span >   < a class = "code" href = "base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a" > DCHECK_GT< / a > (in_degree[dependent_type], 0);< / div >
< div class = "line" > < a name = "l01543" > < / a > < span class = "lineno" > 1543< / span >   < span class = "keywordflow" > if< / span > (--in_degree[dependent_type] == 0) {< / div >
< div class = "line" > < a name = "l01544" > < / a > < span class = "lineno" > 1544< / span >   next_types_with_zero_indegree.push_back(dependent_type);< / div >
< div class = "line" > < a name = "l01545" > < / a > < span class = "lineno" > 1545< / span >   }< / div >
< div class = "line" > < a name = "l01546" > < / a > < span class = "lineno" > 1546< / span >   }< / div >
< div class = "line" > < a name = "l01547" > < / a > < span class = "lineno" > 1547< / span >   }< / div >
< div class = "line" > < a name = "l01548" > < / a > < span class = "lineno" > 1548< / span >   < span class = "comment" > // Sort the types in the current topological group based on their< / span > < / div >
< div class = "line" > < a name = "l01549" > < / a > < span class = "lineno" > 1549< / span >   < span class = "comment" > // requirement tightness.< / span > < / div >
< div class = "line" > < a name = "l01550" > < / a > < span class = "lineno" > 1550< / span >   < span class = "comment" > // NOTE: For a deterministic order, types with equal tightness are sorted by< / span > < / div >
< div class = "line" > < a name = "l01551" > < / a > < span class = "lineno" > 1551< / span >   < span class = "comment" > // increasing type.< / span > < / div >
< div class = "line" > < a name = "l01552" > < / a > < span class = "lineno" > 1552< / span >   < span class = "comment" > // TODO(user): Put types of the same topological order and same< / span > < / div >
< div class = "line" > < a name = "l01553" > < / a > < span class = "lineno" > 1553< / span >   < span class = "comment" > // requirement tightness in a single group (so that they all get inserted< / span > < / div >
< div class = "line" > < a name = "l01554" > < / a > < span class = "lineno" > 1554< / span >   < span class = "comment" > // simultaneously by the GlobalCheapestInsertion heuristic, for instance).< / span > < / div >
< div class = "line" > < a name = "l01555" > < / a > < span class = "lineno" > 1555< / span >   std::sort(topological_group.begin(), topological_group.end(),< / div >
< div class = "line" > < a name = "l01556" > < / a > < span class = "lineno" > 1556< / span >   [& type_requirement_tightness](< span class = "keywordtype" > int< / span > type1, < span class = "keywordtype" > int< / span > type2) {< / div >
< div class = "line" > < a name = "l01557" > < / a > < span class = "lineno" > 1557< / span >   const auto& tightness1 = type_requirement_tightness[type1];< / div >
< div class = "line" > < a name = "l01558" > < / a > < span class = "lineno" > 1558< / span >   const auto& tightness2 = type_requirement_tightness[type2];< / div >
< div class = "line" > < a name = "l01559" > < / a > < span class = "lineno" > 1559< / span >   return tightness1 > tightness2 ||< / div >
< div class = "line" > < a name = "l01560" > < / a > < span class = "lineno" > 1560< / span >   (tightness1 == tightness2 & & type1 < type2);< / div >
< div class = "line" > < a name = "l01561" > < / a > < span class = "lineno" > 1561< / span >   });< / div >
< div class = "line" > < a name = "l01562" > < / a > < span class = "lineno" > 1562< / span >   < span class = "comment" > // Swap the current types with zero in-degree with the next ones.< / span > < / div >
< div class = "line" > < a name = "l01563" > < / a > < span class = "lineno" > 1563< / span >   current_types_with_zero_indegree.swap(next_types_with_zero_indegree);< / div >
< div class = "line" > < a name = "l01564" > < / a > < span class = "lineno" > 1564< / span >   }< / div >
< div class = "line" > < a name = "l01565" > < / a > < span class = "lineno" > 1565< / span >   < / div >
< div class = "line" > < a name = "l01566" > < / a > < span class = "lineno" > 1566< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_types_in_requirement_graph =< / div >
< div class = "line" > < a name = "l01567" > < / a > < span class = "lineno" > 1567< / span >   types_in_requirement_graph.NumberOfSetCallsWithDifferentArguments();< / div >
< div class = "line" > < a name = "l01568" > < / a > < span class = "lineno" > 1568< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (num_types_added, num_types_in_requirement_graph);< / div >
< div class = "line" > < a name = "l01569" > < / a > < span class = "lineno" > 1569< / span >   < span class = "keywordflow" > if< / span > (num_types_added < num_types_in_requirement_graph) {< / div >
< div class = "line" > < a name = "l01570" > < / a > < span class = "lineno" > 1570< / span >   < span class = "comment" > // Requirement graph is cyclic, no topological order.< / span > < / div >
< div class = "line" > < a name = "l01571" > < / a > < span class = "lineno" > 1571< / span >   topologically_sorted_visit_types_.clear();< / div >
< div class = "line" > < a name = "l01572" > < / a > < span class = "lineno" > 1572< / span >   }< / div >
< div class = "line" > < a name = "l01573" > < / a > < span class = "lineno" > 1573< / span >   }< / div >
< div class = "line" > < a name = "l01574" > < / a > < span class = "lineno" > 1574< / span >   < / div >
< div class = "line" > < a name = "l01575" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a99abd877fd9b2325d408f30ec8b38e48" > 1575< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > RoutingModel::DisjunctionIndex< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a99abd877fd9b2325d408f30ec8b38e48" > RoutingModel::AddDisjunction< / a > (< / div >
< div class = "line" > < a name = "l01576" > < / a > < span class = "lineno" > 1576< / span >   < span class = "keyword" > const< / span > std::vector< int64> & indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > penalty, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > max_cardinality) {< / div >
< div class = "line" > < a name = "l01577" > < / a > < span class = "lineno" > 1577< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (max_cardinality, 1);< / div >
< div class = "line" > < a name = "l01578" > < / a > < span class = "lineno" > 1578< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < indices.size(); ++i) {< / div >
< div class = "line" > < a name = "l01579" > < / a > < span class = "lineno" > 1579< / span >   < a class = "code" href = "base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb" > CHECK_NE< / a > (< a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > , indices[i]);< / div >
< div class = "line" > < a name = "l01580" > < / a > < span class = "lineno" > 1580< / span >   }< / div >
< div class = "line" > < a name = "l01581" > < / a > < span class = "lineno" > 1581< / span >   < / div >
< div class = "line" > < a name = "l01582" > < / a > < span class = "lineno" > 1582< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > disjunction_index(disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > ());< / div >
< div class = "line" > < a name = "l01583" > < / a > < span class = "lineno" > 1583< / span >   disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > push_back< / a > ({indices, {penalty, max_cardinality}});< / div >
< div class = "line" > < a name = "l01584" > < / a > < span class = "lineno" > 1584< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > : indices) {< / div >
< div class = "line" > < a name = "l01585" > < / a > < span class = "lineno" > 1585< / span >   index_to_disjunctions_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].push_back(disjunction_index);< / div >
< div class = "line" > < a name = "l01586" > < / a > < span class = "lineno" > 1586< / span >   }< / div >
< div class = "line" > < a name = "l01587" > < / a > < span class = "lineno" > 1587< / span >   < span class = "keywordflow" > return< / span > disjunction_index;< / div >
< div class = "line" > < a name = "l01588" > < / a > < span class = "lineno" > 1588< / span >   }< / div >
< div class = "line" > < a name = "l01589" > < / a > < span class = "lineno" > 1589< / span >   < / div >
< div class = "line" > < a name = "l01590" > < / a > < span class = "lineno" > 1590< / span >   std::vector< std::pair< int64, int64> > < / div >
< div class = "line" > < a name = "l01591" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a70ae4458698c8e4089af40c5d15cfdf3" > 1591< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a70ae4458698c8e4089af40c5d15cfdf3" > RoutingModel::GetPerfectBinaryDisjunctions< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01592" > < / a > < span class = "lineno" > 1592< / span >   std::vector< std::pair< int64, int64> > var_index_pairs;< / div >
< div class = "line" > < a name = "l01593" > < / a > < span class = "lineno" > 1593< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > Disjunction& disjunction : disjunctions_) {< / div >
< div class = "line" > < a name = "l01594" > < / a > < span class = "lineno" > 1594< / span >   < span class = "keyword" > const< / span > std::vector< int64> & < a class = "code" href = "sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d" > var_indices< / a > = disjunction.indices;< / div >
< div class = "line" > < a name = "l01595" > < / a > < span class = "lineno" > 1595< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d" > var_indices< / a > .size() != 2) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l01596" > < / a > < span class = "lineno" > 1596< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > v0 = < a class = "code" href = "sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d" > var_indices< / a > [0];< / div >
< div class = "line" > < a name = "l01597" > < / a > < span class = "lineno" > 1597< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > v1 = < a class = "code" href = "sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d" > var_indices< / a > [1];< / div >
< div class = "line" > < a name = "l01598" > < / a > < span class = "lineno" > 1598< / span >   < span class = "keywordflow" > if< / span > (index_to_disjunctions_[v0].size() == 1 & & < / div >
< div class = "line" > < a name = "l01599" > < / a > < span class = "lineno" > 1599< / span >   index_to_disjunctions_[v1].size() == 1) {< / div >
< div class = "line" > < a name = "l01600" > < / a > < span class = "lineno" > 1600< / span >   < span class = "comment" > // We output sorted pairs.< / span > < / div >
< div class = "line" > < a name = "l01601" > < / a > < span class = "lineno" > 1601< / span >   var_index_pairs.push_back({< a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (v0, v1), < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (v0, v1)});< / div >
< div class = "line" > < a name = "l01602" > < / a > < span class = "lineno" > 1602< / span >   }< / div >
< div class = "line" > < a name = "l01603" > < / a > < span class = "lineno" > 1603< / span >   }< / div >
< div class = "line" > < a name = "l01604" > < / a > < span class = "lineno" > 1604< / span >   std::sort(var_index_pairs.begin(), var_index_pairs.end());< / div >
< div class = "line" > < a name = "l01605" > < / a > < span class = "lineno" > 1605< / span >   < span class = "keywordflow" > return< / span > var_index_pairs;< / div >
< div class = "line" > < a name = "l01606" > < / a > < span class = "lineno" > 1606< / span >   }< / div >
< div class = "line" > < a name = "l01607" > < / a > < span class = "lineno" > 1607< / span >   < / div >
< div class = "line" > < a name = "l01608" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a" > 1608< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a" > RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero< / a > () {< / div >
< div class = "line" > < a name = "l01609" > < / a > < span class = "lineno" > 1609< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (!closed_);< / div >
< div class = "line" > < a name = "l01610" > < / a > < span class = "lineno" > 1610< / span >   < span class = "keywordflow" > for< / span > (Disjunction& disjunction : disjunctions_) {< / div >
< div class = "line" > < a name = "l01611" > < / a > < span class = "lineno" > 1611< / span >   < span class = "keywordtype" > bool< / span > has_one_potentially_active_var = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l01612" > < / a > < span class = "lineno" > 1612< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > var_index : disjunction.indices) {< / div >
< div class = "line" > < a name = "l01613" > < / a > < span class = "lineno" > 1613< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (var_index)-> Max() > 0) {< / div >
< div class = "line" > < a name = "l01614" > < / a > < span class = "lineno" > 1614< / span >   has_one_potentially_active_var = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l01615" > < / a > < span class = "lineno" > 1615< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l01616" > < / a > < span class = "lineno" > 1616< / span >   }< / div >
< div class = "line" > < a name = "l01617" > < / a > < span class = "lineno" > 1617< / span >   }< / div >
< div class = "line" > < a name = "l01618" > < / a > < span class = "lineno" > 1618< / span >   < span class = "keywordflow" > if< / span > (!has_one_potentially_active_var) {< / div >
< div class = "line" > < a name = "l01619" > < / a > < span class = "lineno" > 1619< / span >   disjunction.value.max_cardinality = 0;< / div >
< div class = "line" > < a name = "l01620" > < / a > < span class = "lineno" > 1620< / span >   }< / div >
< div class = "line" > < a name = "l01621" > < / a > < span class = "lineno" > 1621< / span >   }< / div >
< div class = "line" > < a name = "l01622" > < / a > < span class = "lineno" > 1622< / span >   }< / div >
< div class = "line" > < a name = "l01623" > < / a > < span class = "lineno" > 1623< / span >   < / div >
< div class = "line" > < a name = "l01624" > < / a > < span class = "lineno" > 1624< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * RoutingModel::CreateDisjunction(< a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > disjunction) {< / div >
< div class = "line" > < a name = "l01625" > < / a > < span class = "lineno" > 1625< / span >   < span class = "keyword" > const< / span > std::vector< int64> & indices = disjunctions_[disjunction].indices;< / div >
< div class = "line" > < a name = "l01626" > < / a > < span class = "lineno" > 1626< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > indices_size = indices.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > ();< / div >
< div class = "line" > < a name = "l01627" > < / a > < span class = "lineno" > 1627< / span >   std::vector< IntVar*> disjunction_vars(indices_size);< / div >
< div class = "line" > < a name = "l01628" > < / a > < span class = "lineno" > 1628< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < indices_size; ++i) {< / div >
< div class = "line" > < a name = "l01629" > < / a > < span class = "lineno" > 1629< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = indices[i];< / div >
< div class = "line" > < a name = "l01630" > < / a > < span class = "lineno" > 1630< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ());< / div >
< div class = "line" > < a name = "l01631" > < / a > < span class = "lineno" > 1631< / span >   disjunction_vars[i] = < a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01632" > < / a > < span class = "lineno" > 1632< / span >   }< / div >
< div class = "line" > < a name = "l01633" > < / a > < span class = "lineno" > 1633< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > max_cardinality =< / div >
< div class = "line" > < a name = "l01634" > < / a > < span class = "lineno" > 1634< / span >   disjunctions_[disjunction].value.max_cardinality;< / div >
< div class = "line" > < a name = "l01635" > < / a > < span class = "lineno" > 1635< / span >   IntVar* no_active_var = solver_-> MakeBoolVar();< / div >
< div class = "line" > < a name = "l01636" > < / a > < span class = "lineno" > 1636< / span >   IntVar* number_active_vars = solver_-> MakeIntVar(0, max_cardinality);< / div >
< div class = "line" > < a name = "l01637" > < / a > < span class = "lineno" > 1637< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l01638" > < / a > < span class = "lineno" > 1638< / span >   solver_-> MakeSumEquality(disjunction_vars, number_active_vars));< / div >
< div class = "line" > < a name = "l01639" > < / a > < span class = "lineno" > 1639< / span >   solver_-> AddConstraint(solver_-> MakeIsDifferentCstCt(< / div >
< div class = "line" > < a name = "l01640" > < / a > < span class = "lineno" > 1640< / span >   number_active_vars, max_cardinality, no_active_var));< / div >
< div class = "line" > < a name = "l01641" > < / a > < span class = "lineno" > 1641< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > penalty = disjunctions_[disjunction].value.penalty;< / div >
< div class = "line" > < a name = "l01642" > < / a > < span class = "lineno" > 1642< / span >   < span class = "keywordflow" > if< / span > (penalty < 0) {< / div >
< div class = "line" > < a name = "l01643" > < / a > < span class = "lineno" > 1643< / span >   no_active_var-> SetMax(0);< / div >
< div class = "line" > < a name = "l01644" > < / a > < span class = "lineno" > 1644< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01645" > < / a > < span class = "lineno" > 1645< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l01646" > < / a > < span class = "lineno" > 1646< / span >   < span class = "keywordflow" > return< / span > solver_-> MakeProd(no_active_var, penalty)-> Var();< / div >
< div class = "line" > < a name = "l01647" > < / a > < span class = "lineno" > 1647< / span >   }< / div >
< div class = "line" > < a name = "l01648" > < / a > < span class = "lineno" > 1648< / span >   }< / div >
< div class = "line" > < a name = "l01649" > < / a > < span class = "lineno" > 1649< / span >   < / div >
< div class = "line" > < a name = "l01650" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a9b09ef1fec581652f66de933154b78e4" > 1650< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a9b09ef1fec581652f66de933154b78e4" > RoutingModel::AddSoftSameVehicleConstraint< / a > (< / div >
< div class = "line" > < a name = "l01651" > < / a > < span class = "lineno" > 1651< / span >   < span class = "keyword" > const< / span > std::vector< int64> & indices, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ) {< / div >
< div class = "line" > < a name = "l01652" > < / a > < span class = "lineno" > 1652< / span >   < span class = "keywordflow" > if< / span > (!indices.empty()) {< / div >
< div class = "line" > < a name = "l01653" > < / a > < span class = "lineno" > 1653< / span >   ValuedNodes< int64> same_vehicle_cost;< / div >
< div class = "line" > < a name = "l01654" > < / a > < span class = "lineno" > 1654< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > : indices) {< / div >
< div class = "line" > < a name = "l01655" > < / a > < span class = "lineno" > 1655< / span >   same_vehicle_cost.indices.push_back(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01656" > < / a > < span class = "lineno" > 1656< / span >   }< / div >
< div class = "line" > < a name = "l01657" > < / a > < span class = "lineno" > 1657< / span >   same_vehicle_cost.value = < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ;< / div >
< div class = "line" > < a name = "l01658" > < / a > < span class = "lineno" > 1658< / span >   same_vehicle_costs_.push_back(same_vehicle_cost);< / div >
< div class = "line" > < a name = "l01659" > < / a > < span class = "lineno" > 1659< / span >   }< / div >
< div class = "line" > < a name = "l01660" > < / a > < span class = "lineno" > 1660< / span >   }< / div >
< div class = "line" > < a name = "l01661" > < / a > < span class = "lineno" > 1661< / span >   < / div >
< div class = "line" > < a name = "l01662" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#afdd0e9e72af498399358bd22c591ae5c" > 1662< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#afdd0e9e72af498399358bd22c591ae5c" > RoutingModel::SetAllowedVehiclesForIndex< / a > (< span class = "keyword" > const< / span > std::vector< int> & < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ,< / div >
< div class = "line" > < a name = "l01663" > < / a > < span class = "lineno" > 1663< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l01664" > < / a > < span class = "lineno" > 1664< / span >   < span class = "keyword" > auto< / span > & allowed_vehicles = allowed_vehicles_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l01665" > < / a > < span class = "lineno" > 1665< / span >   allowed_vehicles.clear();< / div >
< div class = "line" > < a name = "l01666" > < / a > < span class = "lineno" > 1666< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle : < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ) {< / div >
< div class = "line" > < a name = "l01667" > < / a > < span class = "lineno" > 1667< / span >   allowed_vehicles.insert(vehicle);< / div >
< div class = "line" > < a name = "l01668" > < / a > < span class = "lineno" > 1668< / span >   }< / div >
< div class = "line" > < a name = "l01669" > < / a > < span class = "lineno" > 1669< / span >   }< / div >
< div class = "line" > < a name = "l01670" > < / a > < span class = "lineno" > 1670< / span >   < / div >
< div class = "line" > < a name = "l01671" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a23c20278f29df4b683b589958ab3a187" > 1671< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a23c20278f29df4b683b589958ab3a187" > RoutingModel::AddPickupAndDelivery< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > pickup, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > delivery) {< / div >
< div class = "line" > < a name = "l01672" > < / a > < span class = "lineno" > 1672< / span >   AddPickupAndDeliverySetsInternal({pickup}, {delivery});< / div >
< div class = "line" > < a name = "l01673" > < / a > < span class = "lineno" > 1673< / span >   pickup_delivery_disjunctions_.push_back({< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f" > kNoDisjunction< / a > , < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f" > kNoDisjunction< / a > });< / div >
< div class = "line" > < a name = "l01674" > < / a > < span class = "lineno" > 1674< / span >   }< / div >
< div class = "line" > < a name = "l01675" > < / a > < span class = "lineno" > 1675< / span >   < / div >
< div class = "line" > < a name = "l01676" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1" > 1676< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1" > RoutingModel::AddPickupAndDeliverySets< / a > (< / div >
< div class = "line" > < a name = "l01677" > < / a > < span class = "lineno" > 1677< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > pickup_disjunction,< / div >
< div class = "line" > < a name = "l01678" > < / a > < span class = "lineno" > 1678< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > delivery_disjunction) {< / div >
< div class = "line" > < a name = "l01679" > < / a > < span class = "lineno" > 1679< / span >   AddPickupAndDeliverySetsInternal(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a89b2c610c22a3223f1cac10233d7992d" > GetDisjunctionIndices< / a > (pickup_disjunction),< / div >
< div class = "line" > < a name = "l01680" > < / a > < span class = "lineno" > 1680< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a89b2c610c22a3223f1cac10233d7992d" > GetDisjunctionIndices< / a > (delivery_disjunction));< / div >
< div class = "line" > < a name = "l01681" > < / a > < span class = "lineno" > 1681< / span >   pickup_delivery_disjunctions_.push_back(< / div >
< div class = "line" > < a name = "l01682" > < / a > < span class = "lineno" > 1682< / span >   {pickup_disjunction, delivery_disjunction});< / div >
< div class = "line" > < a name = "l01683" > < / a > < span class = "lineno" > 1683< / span >   }< / div >
< div class = "line" > < a name = "l01684" > < / a > < span class = "lineno" > 1684< / span >   < / div >
< div class = "line" > < a name = "l01685" > < / a > < span class = "lineno" > 1685< / span >   < span class = "keywordtype" > void< / span > RoutingModel::AddPickupAndDeliverySetsInternal(< / div >
< div class = "line" > < a name = "l01686" > < / a > < span class = "lineno" > 1686< / span >   < span class = "keyword" > const< / span > std::vector< int64> & pickups, < span class = "keyword" > const< / span > std::vector< int64> & deliveries) {< / div >
< div class = "line" > < a name = "l01687" > < / a > < span class = "lineno" > 1687< / span >   < span class = "keywordflow" > if< / span > (pickups.empty() || deliveries.empty()) {< / div >
< div class = "line" > < a name = "l01688" > < / a > < span class = "lineno" > 1688< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l01689" > < / a > < span class = "lineno" > 1689< / span >   }< / div >
< div class = "line" > < a name = "l01690" > < / a > < span class = "lineno" > 1690< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l01691" > < / a > < span class = "lineno" > 1691< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > pair_index = pickup_delivery_pairs_.size();< / div >
< div class = "line" > < a name = "l01692" > < / a > < span class = "lineno" > 1692< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > pickup_index = 0; pickup_index < pickups.size(); pickup_index++) {< / div >
< div class = "line" > < a name = "l01693" > < / a > < span class = "lineno" > 1693< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > pickup = pickups[pickup_index];< / div >
< div class = "line" > < a name = "l01694" > < / a > < span class = "lineno" > 1694< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (pickup, size);< / div >
< div class = "line" > < a name = "l01695" > < / a > < span class = "lineno" > 1695< / span >   index_to_pickup_index_pairs_[pickup].emplace_back(pair_index, pickup_index);< / div >
< div class = "line" > < a name = "l01696" > < / a > < span class = "lineno" > 1696< / span >   }< / div >
< div class = "line" > < a name = "l01697" > < / a > < span class = "lineno" > 1697< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > delivery_index = 0; delivery_index < deliveries.size();< / div >
< div class = "line" > < a name = "l01698" > < / a > < span class = "lineno" > 1698< / span >   delivery_index++) {< / div >
< div class = "line" > < a name = "l01699" > < / a > < span class = "lineno" > 1699< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > delivery = deliveries[delivery_index];< / div >
< div class = "line" > < a name = "l01700" > < / a > < span class = "lineno" > 1700< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (delivery, size);< / div >
< div class = "line" > < a name = "l01701" > < / a > < span class = "lineno" > 1701< / span >   index_to_delivery_index_pairs_[delivery].emplace_back(pair_index,< / div >
< div class = "line" > < a name = "l01702" > < / a > < span class = "lineno" > 1702< / span >   delivery_index);< / div >
< div class = "line" > < a name = "l01703" > < / a > < span class = "lineno" > 1703< / span >   }< / div >
< div class = "line" > < a name = "l01704" > < / a > < span class = "lineno" > 1704< / span >   pickup_delivery_pairs_.push_back({pickups, deliveries});< / div >
< div class = "line" > < a name = "l01705" > < / a > < span class = "lineno" > 1705< / span >   }< / div >
< div class = "line" > < a name = "l01706" > < / a > < span class = "lineno" > 1706< / span >   < / div >
< div class = "line" > < a name = "l01707" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae82492179600550970bd0b0dccf0b3f1" > 1707< / a > < / span >   < span class = "keyword" > const< / span > std::vector< std::pair< int, int> > & < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae82492179600550970bd0b0dccf0b3f1" > RoutingModel::GetPickupIndexPairs< / a > (< / div >
< div class = "line" > < a name = "l01708" > < / a > < span class = "lineno" > 1708< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > node_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01709" > < / a > < span class = "lineno" > 1709< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (node_index, index_to_pickup_index_pairs_.size());< / div >
< div class = "line" > < a name = "l01710" > < / a > < span class = "lineno" > 1710< / span >   < span class = "keywordflow" > return< / span > index_to_pickup_index_pairs_[node_index];< / div >
< div class = "line" > < a name = "l01711" > < / a > < span class = "lineno" > 1711< / span >   }< / div >
< div class = "line" > < a name = "l01712" > < / a > < span class = "lineno" > 1712< / span >   < / div >
< div class = "line" > < a name = "l01713" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#afad671d4876daa753d520bf2adceafbd" > 1713< / a > < / span >   < span class = "keyword" > const< / span > std::vector< std::pair< int, int> > & < a class = "code" href = "classoperations__research_1_1_routing_model.html#afad671d4876daa753d520bf2adceafbd" > RoutingModel::GetDeliveryIndexPairs< / a > (< / div >
< div class = "line" > < a name = "l01714" > < / a > < span class = "lineno" > 1714< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > node_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01715" > < / a > < span class = "lineno" > 1715< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (node_index, index_to_delivery_index_pairs_.size());< / div >
< div class = "line" > < a name = "l01716" > < / a > < span class = "lineno" > 1716< / span >   < span class = "keywordflow" > return< / span > index_to_delivery_index_pairs_[node_index];< / div >
< div class = "line" > < a name = "l01717" > < / a > < span class = "lineno" > 1717< / span >   }< / div >
< div class = "line" > < a name = "l01718" > < / a > < span class = "lineno" > 1718< / span >   < / div >
< div class = "line" > < a name = "l01719" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62" > 1719< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62" > RoutingModel::SetPickupAndDeliveryPolicyOfVehicle< / a > (< / div >
< div class = "line" > < a name = "l01720" > < / a > < span class = "lineno" > 1720< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83" > PickupAndDeliveryPolicy< / a > policy, < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l01721" > < / a > < span class = "lineno" > 1721< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01722" > < / a > < span class = "lineno" > 1722< / span >   vehicle_pickup_delivery_policy_[vehicle] = policy;< / div >
< div class = "line" > < a name = "l01723" > < / a > < span class = "lineno" > 1723< / span >   }< / div >
< div class = "line" > < a name = "l01724" > < / a > < span class = "lineno" > 1724< / span >   < / div >
< div class = "line" > < a name = "l01725" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624" > 1725< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624" > RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles< / a > (< / div >
< div class = "line" > < a name = "l01726" > < / a > < span class = "lineno" > 1726< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83" > PickupAndDeliveryPolicy< / a > policy) {< / div >
< div class = "line" > < a name = "l01727" > < / a > < span class = "lineno" > 1727< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (0, vehicles_);< / div >
< div class = "line" > < a name = "l01728" > < / a > < span class = "lineno" > 1728< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l01729" > < / a > < span class = "lineno" > 1729< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62" > SetPickupAndDeliveryPolicyOfVehicle< / a > (policy, i);< / div >
< div class = "line" > < a name = "l01730" > < / a > < span class = "lineno" > 1730< / span >   }< / div >
< div class = "line" > < a name = "l01731" > < / a > < span class = "lineno" > 1731< / span >   }< / div >
< div class = "line" > < a name = "l01732" > < / a > < span class = "lineno" > 1732< / span >   < / div >
< div class = "line" > < a name = "l01733" > < / a > < span class = "lineno" > 1733< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83" > RoutingModel::PickupAndDeliveryPolicy< / a > < / div >
< div class = "line" > < a name = "l01734" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112" > 1734< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112" > RoutingModel::GetPickupAndDeliveryPolicyOfVehicle< / a > (< span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01735" > < / a > < span class = "lineno" > 1735< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l01736" > < / a > < span class = "lineno" > 1736< / span >   < span class = "keywordflow" > return< / span > vehicle_pickup_delivery_policy_[vehicle];< / div >
< div class = "line" > < a name = "l01737" > < / a > < span class = "lineno" > 1737< / span >   }< / div >
< div class = "line" > < a name = "l01738" > < / a > < span class = "lineno" > 1738< / span >   < / div >
< div class = "line" > < a name = "l01739" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2" > 1739< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2" > RoutingModel::GetNumOfSingletonNodes< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01740" > < / a > < span class = "lineno" > 1740< / span >   < span class = "keywordtype" > int< / span > count = 0;< / div >
< div class = "line" > < a name = "l01741" > < / a > < span class = "lineno" > 1741< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > ().size(); ++i) {< / div >
< div class = "line" > < a name = "l01742" > < / a > < span class = "lineno" > 1742< / span >   < span class = "comment" > // End nodes have no next variables.< / span > < / div >
< div class = "line" > < a name = "l01743" > < / a > < span class = "lineno" > 1743< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (i) & & < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae82492179600550970bd0b0dccf0b3f1" > GetPickupIndexPairs< / a > (i).empty() & & < / div >
< div class = "line" > < a name = "l01744" > < / a > < span class = "lineno" > 1744< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#afad671d4876daa753d520bf2adceafbd" > GetDeliveryIndexPairs< / a > (i).empty()) {< / div >
< div class = "line" > < a name = "l01745" > < / a > < span class = "lineno" > 1745< / span >   ++count;< / div >
< div class = "line" > < a name = "l01746" > < / a > < span class = "lineno" > 1746< / span >   }< / div >
< div class = "line" > < a name = "l01747" > < / a > < span class = "lineno" > 1747< / span >   }< / div >
< div class = "line" > < a name = "l01748" > < / a > < span class = "lineno" > 1748< / span >   < span class = "keywordflow" > return< / span > count;< / div >
< div class = "line" > < a name = "l01749" > < / a > < span class = "lineno" > 1749< / span >   }< / div >
< div class = "line" > < a name = "l01750" > < / a > < span class = "lineno" > 1750< / span >   < / div >
< div class = "line" > < a name = "l01751" > < / a > < span class = "lineno" > 1751< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * RoutingModel::CreateSameVehicleCost(< span class = "keywordtype" > int< / span > vehicle_index) {< / div >
< div class = "line" > < a name = "l01752" > < / a > < span class = "lineno" > 1752< / span >   < span class = "keyword" > const< / span > std::vector< int64> & indices =< / div >
< div class = "line" > < a name = "l01753" > < / a > < span class = "lineno" > 1753< / span >   same_vehicle_costs_[vehicle_index].indices;< / div >
< div class = "line" > < a name = "l01754" > < / a > < span class = "lineno" > 1754< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (!indices.empty());< / div >
< div class = "line" > < a name = "l01755" > < / a > < span class = "lineno" > 1755< / span >   std::vector< IntVar*> vehicle_counts;< / div >
< div class = "line" > < a name = "l01756" > < / a > < span class = "lineno" > 1756< / span >   solver_-> MakeIntVarArray(vehicle_vars_.size() + 1, 0, indices.size() + 1,< / div >
< div class = "line" > < a name = "l01757" > < / a > < span class = "lineno" > 1757< / span >   & vehicle_counts);< / div >
< div class = "line" > < a name = "l01758" > < / a > < span class = "lineno" > 1758< / span >   std::vector< int64> vehicle_values(vehicle_vars_.size() + 1);< / div >
< div class = "line" > < a name = "l01759" > < / a > < span class = "lineno" > 1759< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicle_vars_.size(); ++i) {< / div >
< div class = "line" > < a name = "l01760" > < / a > < span class = "lineno" > 1760< / span >   vehicle_values[i] = i;< / div >
< div class = "line" > < a name = "l01761" > < / a > < span class = "lineno" > 1761< / span >   }< / div >
< div class = "line" > < a name = "l01762" > < / a > < span class = "lineno" > 1762< / span >   vehicle_values[vehicle_vars_.size()] = -1;< / div >
< div class = "line" > < a name = "l01763" > < / a > < span class = "lineno" > 1763< / span >   std::vector< IntVar*> vehicle_vars;< / div >
< div class = "line" > < a name = "l01764" > < / a > < span class = "lineno" > 1764< / span >   vehicle_vars.reserve(indices.size());< / div >
< div class = "line" > < a name = "l01765" > < / a > < span class = "lineno" > 1765< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > : indices) {< / div >
< div class = "line" > < a name = "l01766" > < / a > < span class = "lineno" > 1766< / span >   vehicle_vars.push_back(vehicle_vars_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]);< / div >
< div class = "line" > < a name = "l01767" > < / a > < span class = "lineno" > 1767< / span >   }< / div >
< div class = "line" > < a name = "l01768" > < / a > < span class = "lineno" > 1768< / span >   solver_-> AddConstraint(solver_-> MakeDistribute(vehicle_vars, vehicle_counts));< / div >
< div class = "line" > < a name = "l01769" > < / a > < span class = "lineno" > 1769< / span >   std::vector< IntVar*> vehicle_used;< / div >
< div class = "line" > < a name = "l01770" > < / a > < span class = "lineno" > 1770< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicle_vars_.size() + 1; ++i) {< / div >
< div class = "line" > < a name = "l01771" > < / a > < span class = "lineno" > 1771< / span >   vehicle_used.push_back(< / div >
< div class = "line" > < a name = "l01772" > < / a > < span class = "lineno" > 1772< / span >   solver_-> MakeIsGreaterOrEqualCstVar(vehicle_counts[i], 1));< / div >
< div class = "line" > < a name = "l01773" > < / a > < span class = "lineno" > 1773< / span >   }< / div >
< div class = "line" > < a name = "l01774" > < / a > < span class = "lineno" > 1774< / span >   vehicle_used.push_back(solver_-> MakeIntConst(-1));< / div >
< div class = "line" > < a name = "l01775" > < / a > < span class = "lineno" > 1775< / span >   < span class = "keywordflow" > return< / span > solver_< / div >
< div class = "line" > < a name = "l01776" > < / a > < span class = "lineno" > 1776< / span >   -> MakeProd(solver_-> MakeMax(solver_-> MakeSum(vehicle_used), 0),< / div >
< div class = "line" > < a name = "l01777" > < / a > < span class = "lineno" > 1777< / span >   same_vehicle_costs_[vehicle_index].value)< / div >
< div class = "line" > < a name = "l01778" > < / a > < span class = "lineno" > 1778< / span >   -> Var();< / div >
< div class = "line" > < a name = "l01779" > < / a > < span class = "lineno" > 1779< / span >   }< / div >
< div class = "line" > < a name = "l01780" > < / a > < span class = "lineno" > 1780< / span >   < / div >
< div class = "line" > < a name = "l01781" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f" > 1781< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f" > RoutingModel::AddLocalSearchOperator< / a > (< a class = "code" href = "classoperations__research_1_1_local_search_operator.html" > LocalSearchOperator< / a > * ls_operator) {< / div >
< div class = "line" > < a name = "l01782" > < / a > < span class = "lineno" > 1782< / span >   extra_operators_.push_back(ls_operator);< / div >
< div class = "line" > < a name = "l01783" > < / a > < span class = "lineno" > 1783< / span >   }< / div >
< div class = "line" > < a name = "l01784" > < / a > < span class = "lineno" > 1784< / span >   < / div >
< div class = "line" > < a name = "l01785" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#acca75b5d3bfe2433c5805b049815f533" > 1785< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#acca75b5d3bfe2433c5805b049815f533" > RoutingModel::GetDepot< / a > ()< span class = "keyword" > const < / span > { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () > 0 ? < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (0) : -1; }< / div >
< div class = "line" > < a name = "l01786" > < / a > < span class = "lineno" > 1786< / span >   < / div >
< div class = "line" > < a name = "l01787" > < / a > < span class = "lineno" > 1787< / span >   < span class = "comment" > // TODO(user): Remove the need for the homogeneous version once the< / span > < / div >
< div class = "line" > < a name = "l01788" > < / a > < span class = "lineno" > 1788< / span >   < span class = "comment" > // vehicle var to cost class element constraint is fast enough.< / span > < / div >
< div class = "line" > < a name = "l01789" > < / a > < span class = "lineno" > 1789< / span >   < span class = "keywordtype" > void< / span > RoutingModel::AppendHomogeneousArcCosts(< / div >
< div class = "line" > < a name = "l01790" > < / a > < span class = "lineno" > 1790< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "keywordtype" > int< / span > node_index,< / div >
< div class = "line" > < a name = "l01791" > < / a > < span class = "lineno" > 1791< / span >   std::vector< IntVar*> * cost_elements) {< / div >
< div class = "line" > < a name = "l01792" > < / a > < span class = "lineno" > 1792< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l01793" > < / a > < span class = "lineno" > 1793< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > arc_cost_evaluator = [< span class = "keyword" > this< / span > , node_index](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > next_index) {< / div >
< div class = "line" > < a name = "l01794" > < / a > < span class = "lineno" > 1794< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > GetHomogeneousCost< / a > (node_index, next_index);< / div >
< div class = "line" > < a name = "l01795" > < / a > < span class = "lineno" > 1795< / span >   };< / div >
< div class = "line" > < a name = "l01796" > < / a > < span class = "lineno" > 1796< / span >   < span class = "keywordflow" > if< / span > (UsesLightPropagation(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )) {< / div >
< div class = "line" > < a name = "l01797" > < / a > < span class = "lineno" > 1797< / span >   < span class = "comment" > // Only supporting positive costs.< / span > < / div >
< div class = "line" > < a name = "l01798" > < / a > < span class = "lineno" > 1798< / span >   < span class = "comment" > // TODO(user): Detect why changing lower bound to kint64min stalls< / span > < / div >
< div class = "line" > < a name = "l01799" > < / a > < span class = "lineno" > 1799< / span >   < span class = "comment" > // the search in GLS in some cases (Solomon instances for instance).< / span > < / div >
< div class = "line" > < a name = "l01800" > < / a > < span class = "lineno" > 1800< / span >   IntVar* < span class = "keyword" > const< / span > base_cost_var = solver_-> MakeIntVar(0, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l01801" > < / a > < span class = "lineno" > 1801< / span >   solver_-> AddConstraint(MakeLightElement(< / div >
< div class = "line" > < a name = "l01802" > < / a > < span class = "lineno" > 1802< / span >   solver_.get(), base_cost_var, nexts_[node_index], arc_cost_evaluator,< / div >
< div class = "line" > < a name = "l01803" > < / a > < span class = "lineno" > 1803< / span >   [< span class = "keyword" > this< / span > ]() { return enable_deep_serialization_; }));< / div >
< div class = "line" > < a name = "l01804" > < / a > < span class = "lineno" > 1804< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > =< / div >
< div class = "line" > < a name = "l01805" > < / a > < span class = "lineno" > 1805< / span >   solver_-> MakeProd(base_cost_var, active_[node_index])-> Var();< / div >
< div class = "line" > < a name = "l01806" > < / a > < span class = "lineno" > 1806< / span >   cost_elements-> push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l01807" > < / a > < span class = "lineno" > 1807< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l01808" > < / a > < span class = "lineno" > 1808< / span >   IntExpr* < span class = "keyword" > const< / span > expr =< / div >
< div class = "line" > < a name = "l01809" > < / a > < span class = "lineno" > 1809< / span >   solver_-> MakeElement(arc_cost_evaluator, nexts_[node_index]);< / div >
< div class = "line" > < a name = "l01810" > < / a > < span class = "lineno" > 1810< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > = solver_-> MakeProd(expr, active_[node_index])-> Var();< / div >
< div class = "line" > < a name = "l01811" > < / a > < span class = "lineno" > 1811< / span >   cost_elements-> push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l01812" > < / a > < span class = "lineno" > 1812< / span >   }< / div >
< div class = "line" > < a name = "l01813" > < / a > < span class = "lineno" > 1813< / span >   }< / div >
< div class = "line" > < a name = "l01814" > < / a > < span class = "lineno" > 1814< / span >   < / div >
< div class = "line" > < a name = "l01815" > < / a > < span class = "lineno" > 1815< / span >   < span class = "keywordtype" > void< / span > RoutingModel::AppendArcCosts(< span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ,< / div >
< div class = "line" > < a name = "l01816" > < / a > < span class = "lineno" > 1816< / span >   < span class = "keywordtype" > int< / span > node_index,< / div >
< div class = "line" > < a name = "l01817" > < / a > < span class = "lineno" > 1817< / span >   std::vector< IntVar*> * cost_elements) {< / div >
< div class = "line" > < a name = "l01818" > < / a > < span class = "lineno" > 1818< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l01819" > < / a > < span class = "lineno" > 1819< / span >   < a class = "code" href = "base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a" > DCHECK_GT< / a > (vehicles_, 0);< / div >
< div class = "line" > < a name = "l01820" > < / a > < span class = "lineno" > 1820< / span >   < span class = "keywordflow" > if< / span > (UsesLightPropagation(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )) {< / div >
< div class = "line" > < a name = "l01821" > < / a > < span class = "lineno" > 1821< / span >   < span class = "comment" > // Only supporting positive costs.< / span > < / div >
< div class = "line" > < a name = "l01822" > < / a > < span class = "lineno" > 1822< / span >   < span class = "comment" > // TODO(user): Detect why changing lower bound to kint64min stalls< / span > < / div >
< div class = "line" > < a name = "l01823" > < / a > < span class = "lineno" > 1823< / span >   < span class = "comment" > // the search in GLS in some cases (Solomon instances for instance).< / span > < / div >
< div class = "line" > < a name = "l01824" > < / a > < span class = "lineno" > 1824< / span >   IntVar* < span class = "keyword" > const< / span > base_cost_var = solver_-> MakeIntVar(0, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l01825" > < / a > < span class = "lineno" > 1825< / span >   solver_-> AddConstraint(MakeLightElement2(< / div >
< div class = "line" > < a name = "l01826" > < / a > < span class = "lineno" > 1826< / span >   solver_.get(), base_cost_var, nexts_[node_index],< / div >
< div class = "line" > < a name = "l01827" > < / a > < span class = "lineno" > 1827< / span >   vehicle_vars_[node_index],< / div >
< div class = "line" > < a name = "l01828" > < / a > < span class = "lineno" > 1828< / span >   [< span class = "keyword" > this< / span > , node_index](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l01829" > < / a > < span class = "lineno" > 1829< / span >   return GetArcCostForVehicle(node_index, to, vehicle);< / div >
< div class = "line" > < a name = "l01830" > < / a > < span class = "lineno" > 1830< / span >   },< / div >
< div class = "line" > < a name = "l01831" > < / a > < span class = "lineno" > 1831< / span >   [< span class = "keyword" > this< / span > ]() { return enable_deep_serialization_; }));< / div >
< div class = "line" > < a name = "l01832" > < / a > < span class = "lineno" > 1832< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > =< / div >
< div class = "line" > < a name = "l01833" > < / a > < span class = "lineno" > 1833< / span >   solver_-> MakeProd(base_cost_var, active_[node_index])-> Var();< / div >
< div class = "line" > < a name = "l01834" > < / a > < span class = "lineno" > 1834< / span >   cost_elements-> push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l01835" > < / a > < span class = "lineno" > 1835< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l01836" > < / a > < span class = "lineno" > 1836< / span >   IntVar* < span class = "keyword" > const< / span > vehicle_class_var =< / div >
< div class = "line" > < a name = "l01837" > < / a > < span class = "lineno" > 1837< / span >   solver_< / div >
< div class = "line" > < a name = "l01838" > < / a > < span class = "lineno" > 1838< / span >   -> MakeElement(< / div >
< div class = "line" > < a name = "l01839" > < / a > < span class = "lineno" > 1839< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l01840" > < / a > < span class = "lineno" > 1840< / span >   < span class = "keywordflow" > return< / span > SafeGetCostClassInt64OfVehicle(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l01841" > < / a > < span class = "lineno" > 1841< / span >   },< / div >
< div class = "line" > < a name = "l01842" > < / a > < span class = "lineno" > 1842< / span >   vehicle_vars_[node_index])< / div >
< div class = "line" > < a name = "l01843" > < / a > < span class = "lineno" > 1843< / span >   -> Var();< / div >
< div class = "line" > < a name = "l01844" > < / a > < span class = "lineno" > 1844< / span >   IntExpr* < span class = "keyword" > const< / span > expr = solver_-> MakeElement(< / div >
< div class = "line" > < a name = "l01845" > < / a > < span class = "lineno" > 1845< / span >   [< span class = "keyword" > this< / span > , node_index](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_class) {< / div >
< div class = "line" > < a name = "l01846" > < / a > < span class = "lineno" > 1846< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > GetArcCostForClass< / a > (node_index, < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , vehicle_class);< / div >
< div class = "line" > < a name = "l01847" > < / a > < span class = "lineno" > 1847< / span >   },< / div >
< div class = "line" > < a name = "l01848" > < / a > < span class = "lineno" > 1848< / span >   nexts_[node_index], vehicle_class_var);< / div >
< div class = "line" > < a name = "l01849" > < / a > < span class = "lineno" > 1849< / span >   IntVar* < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > = solver_-> MakeProd(expr, active_[node_index])-> Var();< / div >
< div class = "line" > < a name = "l01850" > < / a > < span class = "lineno" > 1850< / span >   cost_elements-> push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l01851" > < / a > < span class = "lineno" > 1851< / span >   }< / div >
< div class = "line" > < a name = "l01852" > < / a > < span class = "lineno" > 1852< / span >   }< / div >
< div class = "line" > < a name = "l01853" > < / a > < span class = "lineno" > 1853< / span >   < / div >
< div class = "line" > < a name = "l01854" > < / a > < span class = "lineno" > 1854< / span >   < span class = "keywordtype" > int< / span > RoutingModel::GetVehicleStartClass(< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01855" > < / a > < span class = "lineno" > 1855< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle = index_to_vehicle_[start_index];< / div >
< div class = "line" > < a name = "l01856" > < / a > < span class = "lineno" > 1856< / span >   < span class = "keywordflow" > if< / span > (vehicle != < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > ) {< / div >
< div class = "line" > < a name = "l01857" > < / a > < span class = "lineno" > 1857< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a7a8e134df97e40d1fc498f7f985c33ec" > GetVehicleClassIndexOfVehicle< / a > (vehicle).value();< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01858" > < / a > < span class = "lineno" > 1858< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01859" > < / a > < span class = "lineno" > 1859< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > ;< / div >
< div class = "line" > < a name = "l01860" > < / a > < span class = "lineno" > 1860< / span >   }< / div >
< div class = "line" > < a name = "l01861" > < / a > < span class = "lineno" > 1861< / span >   < / div >
< div class = "line" > < a name = "l01862" > < / a > < span class = "lineno" > 1862< / span >   std::string RoutingModel::FindErrorInSearchParametersForModel(< / div >
< div class = "line" > < a name = "l01863" > < / a > < span class = "lineno" > 1863< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l01864" > < / a > < span class = "lineno" > 1864< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > FirstSolutionStrategy::Value< / a > first_solution_strategy =< / div >
< div class = "line" > < a name = "l01865" > < / a > < span class = "lineno" > 1865< / span >   search_parameters.first_solution_strategy();< / div >
< div class = "line" > < a name = "l01866" > < / a > < span class = "lineno" > 1866< / span >   < span class = "keywordflow" > if< / span > (GetFirstSolutionDecisionBuilder(search_parameters) == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l01867" > < / a > < span class = "lineno" > 1867< / span >   < span class = "keywordflow" > return< / span > absl::StrCat(< / div >
< div class = "line" > < a name = "l01868" > < / a > < span class = "lineno" > 1868< / span >   < span class = "stringliteral" > " Undefined first solution strategy: " < / span > ,< / div >
< div class = "line" > < a name = "l01869" > < / a > < span class = "lineno" > 1869< / span >   FirstSolutionStrategy::Value_Name(first_solution_strategy),< / div >
< div class = "line" > < a name = "l01870" > < / a > < span class = "lineno" > 1870< / span >   < span class = "stringliteral" > " (int value: " < / span > , first_solution_strategy, < span class = "stringliteral" > " )" < / span > );< / div >
< div class = "line" > < a name = "l01871" > < / a > < span class = "lineno" > 1871< / span >   }< / div >
< div class = "line" > < a name = "l01872" > < / a > < span class = "lineno" > 1872< / span >   < span class = "keywordflow" > if< / span > (search_parameters.first_solution_strategy() ==< / div >
< div class = "line" > < a name = "l01873" > < / a > < span class = "lineno" > 1873< / span >   FirstSolutionStrategy::SWEEP & & < / div >
< div class = "line" > < a name = "l01874" > < / a > < span class = "lineno" > 1874< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a71815ec83f6605bddb11578ebb835aae" > sweep_arranger< / a > () == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l01875" > < / a > < span class = "lineno" > 1875< / span >   < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " Undefined sweep arranger for ROUTING_SWEEP strategy." < / span > ;< / div >
< div class = "line" > < a name = "l01876" > < / a > < span class = "lineno" > 1876< / span >   }< / div >
< div class = "line" > < a name = "l01877" > < / a > < span class = "lineno" > 1877< / span >   < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " " < / span > ;< / div >
< div class = "line" > < a name = "l01878" > < / a > < span class = "lineno" > 1878< / span >   }< / div >
< div class = "line" > < a name = "l01879" > < / a > < span class = "lineno" > 1879< / span >   < / div >
< div class = "line" > < a name = "l01880" > < / a > < span class = "lineno" > 1880< / span >   < span class = "keywordtype" > void< / span > RoutingModel::QuietCloseModel() {< / div >
< div class = "line" > < a name = "l01881" > < / a > < span class = "lineno" > 1881< / span >   QuietCloseModelWithParameters(< a class = "code" href = "namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187" > DefaultRoutingSearchParameters< / a > ());< / div >
< div class = "line" > < a name = "l01882" > < / a > < span class = "lineno" > 1882< / span >   }< / div >
< div class = "line" > < a name = "l01883" > < / a > < span class = "lineno" > 1883< / span >   < / div >
< div class = "line" > < a name = "l01884" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988" > 1884< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988" > RoutingModel::CloseModel< / a > () {< / div >
< div class = "line" > < a name = "l01885" > < / a > < span class = "lineno" > 1885< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af" > CloseModelWithParameters< / a > (< a class = "code" href = "namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187" > DefaultRoutingSearchParameters< / a > ());< / div >
< div class = "line" > < a name = "l01886" > < / a > < span class = "lineno" > 1886< / span >   }< / div >
< div class = "line" > < a name = "l01887" > < / a > < span class = "lineno" > 1887< / span >   < / div >
< div class = "line" > < a name = "l01888" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html" > 1888< / a > < / span >   < span class = "keyword" > class < / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html" > RoutingModelInspector< / a > : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_model_visitor.html" > ModelVisitor< / a > {< / div >
< div class = "line" > < a name = "l01889" > < / a > < span class = "lineno" > 1889< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l01890" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1" > 1890< / a > < / span >   < span class = "keyword" > explicit< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1" > RoutingModelInspector< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) : model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) {< / div >
< div class = "line" > < a name = "l01891" > < / a > < span class = "lineno" > 1891< / span >   same_vehicle_components_.SetNumberOfNodes(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> Size());< / div >
< div class = "line" > < a name = "l01892" > < / a > < span class = "lineno" > 1892< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > : < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> GetAllDimensionNames()) {< / div >
< div class = "line" > < a name = "l01893" > < / a > < span class = "lineno" > 1893< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> GetMutableDimension(< a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > );< / div >
< div class = "line" > < a name = "l01894" > < / a > < span class = "lineno" > 1894< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> & cumuls = dimension-> < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a1b6f521fdc9dff38b7e065c838fa54a3" > cumuls< / a > ();< / div >
< div class = "line" > < a name = "l01895" > < / a > < span class = "lineno" > 1895< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cumuls.size(); ++i) {< / div >
< div class = "line" > < a name = "l01896" > < / a > < span class = "lineno" > 1896< / span >   cumul_to_dim_indices_[cumuls[i]] = {dimension, i};< / div >
< div class = "line" > < a name = "l01897" > < / a > < span class = "lineno" > 1897< / span >   }< / div >
< div class = "line" > < a name = "l01898" > < / a > < span class = "lineno" > 1898< / span >   }< / div >
< div class = "line" > < a name = "l01899" > < / a > < span class = "lineno" > 1899< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> & vehicle_vars = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> VehicleVars();< / div >
< div class = "line" > < a name = "l01900" > < / a > < span class = "lineno" > 1900< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicle_vars.size(); ++i) {< / div >
< div class = "line" > < a name = "l01901" > < / a > < span class = "lineno" > 1901< / span >   vehicle_var_to_indices_[vehicle_vars[i]] = i;< / div >
< div class = "line" > < a name = "l01902" > < / a > < span class = "lineno" > 1902< / span >   }< / div >
< div class = "line" > < a name = "l01903" > < / a > < span class = "lineno" > 1903< / span >   RegisterInspectors();< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01904" > < / a > < span class = "lineno" > 1904< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01905" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5" > 1905< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5" > ~RoutingModelInspector< / a > ()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l01906" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901" > 1906< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901" > EndVisitModel< / a > (< span class = "keyword" > const< / span > std::string& solver_name)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l01907" > < / a > < span class = "lineno" > 1907< / span >   < span class = "keyword" > const< / span > std::vector< int> node_to_same_vehicle_component_id =< / div >
< div class = "line" > < a name = "l01908" > < / a > < span class = "lineno" > 1908< / span >   same_vehicle_components_.GetComponentIds();< / div >
< div class = "line" > < a name = "l01909" > < / a > < span class = "lineno" > 1909< / span >   model_-> InitSameVehicleGroups(< / div >
< div class = "line" > < a name = "l01910" > < / a > < span class = "lineno" > 1910< / span >   same_vehicle_components_.GetNumberOfComponents());< / div >
< div class = "line" > < a name = "l01911" > < / a > < span class = "lineno" > 1911< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node = 0; node < model_-> Size(); ++node) {< / div >
< div class = "line" > < a name = "l01912" > < / a > < span class = "lineno" > 1912< / span >   model_-> SetSameVehicleGroup(node,< / div >
< div class = "line" > < a name = "l01913" > < / a > < span class = "lineno" > 1913< / span >   node_to_same_vehicle_component_id[node]);< / div >
< div class = "line" > < a name = "l01914" > < / a > < span class = "lineno" > 1914< / span >   }< / div >
< div class = "line" > < a name = "l01915" > < / a > < span class = "lineno" > 1915< / span >   < span class = "comment" > // TODO(user): Perform transitive closure of dimension precedence graphs.< / span > < / div >
< div class = "line" > < a name = "l01916" > < / a > < span class = "lineno" > 1916< / span >   < span class = "comment" > // TODO(user): Have a single annotated precedence graph.< / span > < / div >
< div class = "line" > < a name = "l01917" > < / a > < span class = "lineno" > 1917< / span >   }< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l01918" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f" > 1918< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f" > EndVisitConstraint< / a > (< span class = "keyword" > const< / span > std::string& type_name,< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01919" > < / a > < span class = "lineno" > 1919< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > * < span class = "keyword" > const< / span > constraint)< span class = "keyword" > override < / span > {< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l01920" > < / a > < span class = "lineno" > 1920< / span >   < a class = "code" href = "namespacegtl.html#abc18f60961e36340e64e428827c0e38e" > gtl::FindWithDefault< / a > (constraint_inspectors_, type_name, []() {})();< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01921" > < / a > < span class = "lineno" > 1921< / span >   }< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l01922" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa" > 1922< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa" > VisitIntegerExpressionArgument< / a > (< span class = "keyword" > const< / span > std::string& type_name,< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01923" > < / a > < span class = "lineno" > 1923< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * < span class = "keyword" > const< / span > expr)< span class = "keyword" > override < / span > {< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l01924" > < / a > < span class = "lineno" > 1924< / span >   < a class = "code" href = "namespacegtl.html#abc18f60961e36340e64e428827c0e38e" > gtl::FindWithDefault< / a > (expr_inspectors_, type_name,< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01925" > < / a > < span class = "lineno" > 1925< / span >   [](< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * expr) {})(expr);< / div >
< div class = "line" > < a name = "l01926" > < / a > < span class = "lineno" > 1926< / span >   }< / div >
< div class = "line" > < a name = "l01927" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model_inspector.html#aa1998d48caaa0f39dd647267356ffcb9" > 1927< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_inspector.html#aa1998d48caaa0f39dd647267356ffcb9" > VisitIntegerArrayArgument< / a > (< span class = "keyword" > const< / span > std::string& arg_name,< / div >
< div class = "line" > < a name = "l01928" > < / a > < span class = "lineno" > 1928< / span >   < span class = "keyword" > const< / span > std::vector< int64> & values)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l01929" > < / a > < span class = "lineno" > 1929< / span >   < a class = "code" href = "namespacegtl.html#abc18f60961e36340e64e428827c0e38e" > gtl::FindWithDefault< / a > (array_inspectors_, arg_name,< / div >
< div class = "line" > < a name = "l01930" > < / a > < span class = "lineno" > 1930< / span >   [](< span class = "keyword" > const< / span > std::vector< int64> & int_array) {})(values);< / div >
< div class = "line" > < a name = "l01931" > < / a > < span class = "lineno" > 1931< / span >   }< / div >
< div class = "line" > < a name = "l01932" > < / a > < span class = "lineno" > 1932< / span >   < / div >
< div class = "line" > < a name = "l01933" > < / a > < span class = "lineno" > 1933< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l01934" > < / a > < span class = "lineno" > 1934< / span >   < span class = "keyword" > using< / span > ExprInspector = std::function< void(< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > *)> ;< / div >
< div class = "line" > < a name = "l01935" > < / a > < span class = "lineno" > 1935< / span >   < span class = "keyword" > using< / span > ArrayInspector = std::function< void(< span class = "keyword" > const< / span > std::vector< int64> & )> ;< / div >
< div class = "line" > < a name = "l01936" > < / a > < span class = "lineno" > 1936< / span >   < span class = "keyword" > using< / span > ConstraintInspector = std::function< void()> ;< / div >
< div class = "line" > < a name = "l01937" > < / a > < span class = "lineno" > 1937< / span >   < / div >
< div class = "line" > < a name = "l01938" > < / a > < span class = "lineno" > 1938< / span >   < span class = "keywordtype" > void< / span > RegisterInspectors() {< / div >
< div class = "line" > < a name = "l01939" > < / a > < span class = "lineno" > 1939< / span >   expr_inspectors_[kExpressionArgument] = [< span class = "keyword" > this< / span > ](< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * expr) {< / div >
< div class = "line" > < a name = "l01940" > < / a > < span class = "lineno" > 1940< / span >   < a class = "code" href = "element_8cc.html#a2dac2393bef148b7c15723ef0770d558" > expr_< / a > = expr;< / div >
< div class = "line" > < a name = "l01941" > < / a > < span class = "lineno" > 1941< / span >   };< / div >
< div class = "line" > < a name = "l01942" > < / a > < span class = "lineno" > 1942< / span >   expr_inspectors_[kLeftArgument] = [< span class = "keyword" > this< / span > ](< span class = "keyword" > const< / span > IntExpr* expr) {< / div >
< div class = "line" > < a name = "l01943" > < / a > < span class = "lineno" > 1943< / span >   left_ = expr;< / div >
< div class = "line" > < a name = "l01944" > < / a > < span class = "lineno" > 1944< / span >   };< / div >
< div class = "line" > < a name = "l01945" > < / a > < span class = "lineno" > 1945< / span >   expr_inspectors_[kRightArgument] = [< span class = "keyword" > this< / span > ](< span class = "keyword" > const< / span > IntExpr* expr) {< / div >
< div class = "line" > < a name = "l01946" > < / a > < span class = "lineno" > 1946< / span >   right_ = expr;< / div >
< div class = "line" > < a name = "l01947" > < / a > < span class = "lineno" > 1947< / span >   };< / div >
< div class = "line" > < a name = "l01948" > < / a > < span class = "lineno" > 1948< / span >   array_inspectors_[kStartsArgument] =< / div >
< div class = "line" > < a name = "l01949" > < / a > < span class = "lineno" > 1949< / span >   [< span class = "keyword" > this< / span > ](< span class = "keyword" > const< / span > std::vector< int64> & int_array) {< / div >
< div class = "line" > < a name = "l01950" > < / a > < span class = "lineno" > 1950< / span >   starts_argument_ = int_array;< / div >
< div class = "line" > < a name = "l01951" > < / a > < span class = "lineno" > 1951< / span >   };< / div >
< div class = "line" > < a name = "l01952" > < / a > < span class = "lineno" > 1952< / span >   array_inspectors_[kEndsArgument] =< / div >
< div class = "line" > < a name = "l01953" > < / a > < span class = "lineno" > 1953< / span >   [< span class = "keyword" > this< / span > ](< span class = "keyword" > const< / span > std::vector< int64> & int_array) {< / div >
< div class = "line" > < a name = "l01954" > < / a > < span class = "lineno" > 1954< / span >   ends_argument_ = int_array;< / div >
< div class = "line" > < a name = "l01955" > < / a > < span class = "lineno" > 1955< / span >   };< / div >
< div class = "line" > < a name = "l01956" > < / a > < span class = "lineno" > 1956< / span >   constraint_inspectors_[kNotMember] = [< span class = "keyword" > this< / span > ]() {< / div >
< div class = "line" > < a name = "l01957" > < / a > < span class = "lineno" > 1957< / span >   std::pair< RoutingDimension*, int> dim_index;< / div >
< div class = "line" > < a name = "l01958" > < / a > < span class = "lineno" > 1958< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (cumul_to_dim_indices_, < a class = "code" href = "element_8cc.html#a2dac2393bef148b7c15723ef0770d558" > expr_< / a > , & dim_index)) {< / div >
< div class = "line" > < a name = "l01959" > < / a > < span class = "lineno" > 1959< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension = dim_index.first;< / div >
< div class = "line" > < a name = "l01960" > < / a > < span class = "lineno" > 1960< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = dim_index.second;< / div >
< div class = "line" > < a name = "l01961" > < / a > < span class = "lineno" > 1961< / span >   dimension-> forbidden_intervals_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].InsertIntervals(starts_argument_,< / div >
< div class = "line" > < a name = "l01962" > < / a > < span class = "lineno" > 1962< / span >   ends_argument_);< / div >
< div class = "line" > < a name = "l01963" > < / a > < span class = "lineno" > 1963< / span >   < a class = "code" href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > (2) < < dimension-> name() < < < span class = "stringliteral" > " " < / span > < < < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < < < span class = "stringliteral" > " : " < / span > < / div >
< div class = "line" > < a name = "l01964" > < / a > < span class = "lineno" > 1964< / span >   < < dimension-> forbidden_intervals_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].DebugString();< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l01965" > < / a > < span class = "lineno" > 1965< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l01966" > < / a > < span class = "lineno" > 1966< / span >   < a class = "code" href = "element_8cc.html#a2dac2393bef148b7c15723ef0770d558" > expr_< / a > = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01967" > < / a > < span class = "lineno" > 1967< / span >   starts_argument_.clear();< / div >
< div class = "line" > < a name = "l01968" > < / a > < span class = "lineno" > 1968< / span >   ends_argument_.clear();< / div >
< div class = "line" > < a name = "l01969" > < / a > < span class = "lineno" > 1969< / span >   };< / div >
< div class = "line" > < a name = "l01970" > < / a > < span class = "lineno" > 1970< / span >   constraint_inspectors_[kEquality] = [< span class = "keyword" > this< / span > ]() {< / div >
< div class = "line" > < a name = "l01971" > < / a > < span class = "lineno" > 1971< / span >   < span class = "keywordtype" > int< / span > left_index = 0;< / div >
< div class = "line" > < a name = "l01972" > < / a > < span class = "lineno" > 1972< / span >   < span class = "keywordtype" > int< / span > right_index = 0;< / div >
< div class = "line" > < a name = "l01973" > < / a > < span class = "lineno" > 1973< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (vehicle_var_to_indices_, left_, & left_index) & & < / div >
< div class = "line" > < a name = "l01974" > < / a > < span class = "lineno" > 1974< / span >   < a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (vehicle_var_to_indices_, right_, & right_index)) {< / div >
< div class = "line" > < a name = "l01975" > < / a > < span class = "lineno" > 1975< / span >   < a class = "code" href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > (2) < < < span class = "stringliteral" > " Vehicle variables for " < / span > < < left_index < < < span class = "stringliteral" > " and " < / span > < / div >
< div class = "line" > < a name = "l01976" > < / a > < span class = "lineno" > 1976< / span >   < < right_index < < < span class = "stringliteral" > " are equal." < / span > ;< / div >
< div class = "line" > < a name = "l01977" > < / a > < span class = "lineno" > 1977< / span >   same_vehicle_components_.AddEdge(left_index, right_index);< / div >
< div class = "line" > < a name = "l01978" > < / a > < span class = "lineno" > 1978< / span >   }< / div >
< div class = "line" > < a name = "l01979" > < / a > < span class = "lineno" > 1979< / span >   left_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01980" > < / a > < span class = "lineno" > 1980< / span >   right_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01981" > < / a > < span class = "lineno" > 1981< / span >   };< / div >
< div class = "line" > < a name = "l01982" > < / a > < span class = "lineno" > 1982< / span >   constraint_inspectors_[kLessOrEqual] = [< span class = "keyword" > this< / span > ]() {< / div >
< div class = "line" > < a name = "l01983" > < / a > < span class = "lineno" > 1983< / span >   std::pair< RoutingDimension*, int> left_index;< / div >
< div class = "line" > < a name = "l01984" > < / a > < span class = "lineno" > 1984< / span >   std::pair< RoutingDimension*, int> right_index;< / div >
< div class = "line" > < a name = "l01985" > < / a > < span class = "lineno" > 1985< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (cumul_to_dim_indices_, left_, & left_index) & & < / div >
< div class = "line" > < a name = "l01986" > < / a > < span class = "lineno" > 1986< / span >   < a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (cumul_to_dim_indices_, right_, & right_index)) {< / div >
< div class = "line" > < a name = "l01987" > < / a > < span class = "lineno" > 1987< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension = left_index.first;< / div >
< div class = "line" > < a name = "l01988" > < / a > < span class = "lineno" > 1988< / span >   < span class = "keywordflow" > if< / span > (dimension == right_index.first) {< / div >
< div class = "line" > < a name = "l01989" > < / a > < span class = "lineno" > 1989< / span >   < a class = "code" href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > (2) < < < span class = "stringliteral" > " For dimension " < / span > < < dimension-> name() < < < span class = "stringliteral" > " , cumul for " < / span > < / div >
< div class = "line" > < a name = "l01990" > < / a > < span class = "lineno" > 1990< / span >   < < left_index.second < < < span class = "stringliteral" > " is less than " < / span > < < right_index.second< / div >
< div class = "line" > < a name = "l01991" > < / a > < span class = "lineno" > 1991< / span >   < < < span class = "stringliteral" > " ." < / span > ;< / div >
< div class = "line" > < a name = "l01992" > < / a > < span class = "lineno" > 1992< / span >   dimension-> path_precedence_graph_.AddArc(left_index.second,< / div >
< div class = "line" > < a name = "l01993" > < / a > < span class = "lineno" > 1993< / span >   right_index.second);< / div >
< div class = "line" > < a name = "l01994" > < / a > < span class = "lineno" > 1994< / span >   }< / div >
< div class = "line" > < a name = "l01995" > < / a > < span class = "lineno" > 1995< / span >   }< / div >
< div class = "line" > < a name = "l01996" > < / a > < span class = "lineno" > 1996< / span >   left_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01997" > < / a > < span class = "lineno" > 1997< / span >   right_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l01998" > < / a > < span class = "lineno" > 1998< / span >   };< / div >
< div class = "line" > < a name = "l01999" > < / a > < span class = "lineno" > 1999< / span >   }< / div >
< div class = "line" > < a name = "l02000" > < / a > < span class = "lineno" > 2000< / span >   < / div >
< div class = "line" > < a name = "l02001" > < / a > < span class = "lineno" > 2001< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > RoutingModel< / a > * < span class = "keyword" > const< / span > model_;< / div >
< div class = "line" > < a name = "l02002" > < / a > < span class = "lineno" > 2002< / span >   < a class = "code" href = "class_dense_connected_components_finder.html" > DenseConnectedComponentsFinder< / a > same_vehicle_components_;< / div >
< div class = "line" > < a name = "l02003" > < / a > < span class = "lineno" > 2003< / span >   absl::flat_hash_map< const IntExpr*, std::pair< RoutingDimension*, int> > < / div >
< div class = "line" > < a name = "l02004" > < / a > < span class = "lineno" > 2004< / span >   cumul_to_dim_indices_;< / div >
< div class = "line" > < a name = "l02005" > < / a > < span class = "lineno" > 2005< / span >   absl::flat_hash_map< const IntExpr*, int> vehicle_var_to_indices_;< / div >
< div class = "line" > < a name = "l02006" > < / a > < span class = "lineno" > 2006< / span >   absl::flat_hash_map< std::string, ExprInspector> expr_inspectors_;< / div >
< div class = "line" > < a name = "l02007" > < / a > < span class = "lineno" > 2007< / span >   absl::flat_hash_map< std::string, ArrayInspector> array_inspectors_;< / div >
< div class = "line" > < a name = "l02008" > < / a > < span class = "lineno" > 2008< / span >   absl::flat_hash_map< std::string, ConstraintInspector> constraint_inspectors_;< / div >
< div class = "line" > < a name = "l02009" > < / a > < span class = "lineno" > 2009< / span >   < span class = "keyword" > const< / span > IntExpr* < a class = "code" href = "element_8cc.html#a2dac2393bef148b7c15723ef0770d558" > expr_< / a > = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l02010" > < / a > < span class = "lineno" > 2010< / span >   < span class = "keyword" > const< / span > IntExpr* left_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l02011" > < / a > < span class = "lineno" > 2011< / span >   < span class = "keyword" > const< / span > IntExpr* right_ = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l02012" > < / a > < span class = "lineno" > 2012< / span >   std::vector< int64> starts_argument_;< / div >
< div class = "line" > < a name = "l02013" > < / a > < span class = "lineno" > 2013< / span >   std::vector< int64> ends_argument_;< / div >
< div class = "line" > < a name = "l02014" > < / a > < span class = "lineno" > 2014< / span >   };< / div >
< div class = "line" > < a name = "l02015" > < / a > < span class = "lineno" > 2015< / span >   < / div >
< div class = "line" > < a name = "l02016" > < / a > < span class = "lineno" > 2016< / span >   < span class = "keywordtype" > void< / span > RoutingModel::DetectImplicitPickupAndDeliveries() {< / div >
< div class = "line" > < a name = "l02017" > < / a > < span class = "lineno" > 2017< / span >   std::vector< int> non_pickup_delivery_nodes;< / div >
< div class = "line" > < a name = "l02018" > < / a > < span class = "lineno" > 2018< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node = 0; node < < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++node) {< / div >
< div class = "line" > < a name = "l02019" > < / a > < span class = "lineno" > 2019< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (node) & & < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae82492179600550970bd0b0dccf0b3f1" > GetPickupIndexPairs< / a > (node).empty() & & < / div >
< div class = "line" > < a name = "l02020" > < / a > < span class = "lineno" > 2020< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#afad671d4876daa753d520bf2adceafbd" > GetDeliveryIndexPairs< / a > (node).empty()) {< / div >
< div class = "line" > < a name = "l02021" > < / a > < span class = "lineno" > 2021< / span >   non_pickup_delivery_nodes.push_back(node);< / div >
< div class = "line" > < a name = "l02022" > < / a > < span class = "lineno" > 2022< / span >   }< / div >
< div class = "line" > < a name = "l02023" > < / a > < span class = "lineno" > 2023< / span >   }< / div >
< div class = "line" > < a name = "l02024" > < / a > < span class = "lineno" > 2024< / span >   < span class = "comment" > // Needs to be sorted for stability.< / span > < / div >
< div class = "line" > < a name = "l02025" > < / a > < span class = "lineno" > 2025< / span >   std::set< std::pair< int64, int64> > implicit_pickup_deliveries;< / div >
< div class = "line" > < a name = "l02026" > < / a > < span class = "lineno" > 2026< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l02027" > < / a > < span class = "lineno" > 2027< / span >   < span class = "keywordflow" > if< / span > (dimension-> class_evaluators_.size() != 1) {< / div >
< div class = "line" > < a name = "l02028" > < / a > < span class = "lineno" > 2028< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02029" > < / a > < span class = "lineno" > 2029< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02030" > < / a > < span class = "lineno" > 2030< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3" > TransitCallback1< / a > & transit =< / div >
< div class = "line" > < a name = "l02031" > < / a > < span class = "lineno" > 2031< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a44afcc03d5cb68c01acefa253de9edcf" > UnaryTransitCallbackOrNull< / a > (dimension-> class_evaluators_[0]);< / div >
< div class = "line" > < a name = "l02032" > < / a > < span class = "lineno" > 2032< / span >   < span class = "keywordflow" > if< / span > (transit == < span class = "keyword" > nullptr< / span > ) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02033" > < / a > < span class = "lineno" > 2033< / span >   absl::flat_hash_map< int64, std::vector< int64> > nodes_by_positive_demand;< / div >
< div class = "line" > < a name = "l02034" > < / a > < span class = "lineno" > 2034< / span >   absl::flat_hash_map< int64, std::vector< int64> > nodes_by_negative_demand;< / div >
< div class = "line" > < a name = "l02035" > < / a > < span class = "lineno" > 2035< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node : non_pickup_delivery_nodes) {< / div >
< div class = "line" > < a name = "l02036" > < / a > < span class = "lineno" > 2036< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > = transit(node);< / div >
< div class = "line" > < a name = "l02037" > < / a > < span class = "lineno" > 2037< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > > 0) {< / div >
< div class = "line" > < a name = "l02038" > < / a > < span class = "lineno" > 2038< / span >   nodes_by_positive_demand[< a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > ].push_back(node);< / div >
< div class = "line" > < a name = "l02039" > < / a > < span class = "lineno" > 2039< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (< a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > < 0) {< / div >
< div class = "line" > < a name = "l02040" > < / a > < span class = "lineno" > 2040< / span >   nodes_by_negative_demand[-< a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > ].push_back(node);< / div >
< div class = "line" > < a name = "l02041" > < / a > < span class = "lineno" > 2041< / span >   }< / div >
< div class = "line" > < a name = "l02042" > < / a > < span class = "lineno" > 2042< / span >   }< / div >
< div class = "line" > < a name = "l02043" > < / a > < span class = "lineno" > 2043< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & [< a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > , positive_nodes] : nodes_by_positive_demand) {< / div >
< div class = "line" > < a name = "l02044" > < / a > < span class = "lineno" > 2044< / span >   < span class = "keyword" > const< / span > std::vector< int64> * < span class = "keyword" > const< / span > negative_nodes =< / div >
< div class = "line" > < a name = "l02045" > < / a > < span class = "lineno" > 2045< / span >   < a class = "code" href = "namespacegtl.html#ab9e05694d7776f2eef357feca8b9d647" > gtl::FindOrNull< / a > (nodes_by_negative_demand, < a class = "code" href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > );< / div >
< div class = "line" > < a name = "l02046" > < / a > < span class = "lineno" > 2046< / span >   < span class = "keywordflow" > if< / span > (negative_nodes != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l02047" > < / a > < span class = "lineno" > 2047< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > positive_node : positive_nodes) {< / div >
< div class = "line" > < a name = "l02048" > < / a > < span class = "lineno" > 2048< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > negative_node : *negative_nodes) {< / div >
< div class = "line" > < a name = "l02049" > < / a > < span class = "lineno" > 2049< / span >   implicit_pickup_deliveries.insert({positive_node, negative_node});< / div >
< div class = "line" > < a name = "l02050" > < / a > < span class = "lineno" > 2050< / span >   }< / div >
< div class = "line" > < a name = "l02051" > < / a > < span class = "lineno" > 2051< / span >   }< / div >
< div class = "line" > < a name = "l02052" > < / a > < span class = "lineno" > 2052< / span >   }< / div >
< div class = "line" > < a name = "l02053" > < / a > < span class = "lineno" > 2053< / span >   }< / div >
< div class = "line" > < a name = "l02054" > < / a > < span class = "lineno" > 2054< / span >   }< / div >
< div class = "line" > < a name = "l02055" > < / a > < span class = "lineno" > 2055< / span >   implicit_pickup_delivery_pairs_without_alternatives_.clear();< / div >
< div class = "line" > < a name = "l02056" > < / a > < span class = "lineno" > 2056< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > auto< / span > [pickup, delivery] : implicit_pickup_deliveries) {< / div >
< div class = "line" > < a name = "l02057" > < / a > < span class = "lineno" > 2057< / span >   implicit_pickup_delivery_pairs_without_alternatives_.emplace_back(< / div >
< div class = "line" > < a name = "l02058" > < / a > < span class = "lineno" > 2058< / span >   std::vector< int64> ({pickup}), std::vector< int64> ({delivery}));< / div >
< div class = "line" > < a name = "l02059" > < / a > < span class = "lineno" > 2059< / span >   }< / div >
< div class = "line" > < a name = "l02060" > < / a > < span class = "lineno" > 2060< / span >   }< / div >
< div class = "line" > < a name = "l02061" > < / a > < span class = "lineno" > 2061< / span >   < / div >
< div class = "line" > < a name = "l02062" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af" > 2062< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af" > RoutingModel::CloseModelWithParameters< / a > (< / div >
< div class = "line" > < a name = "l02063" > < / a > < span class = "lineno" > 2063< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l02064" > < / a > < span class = "lineno" > 2064< / span >   std::string error = < a class = "code" href = "namespaceoperations__research.html#a4955428bea2f2202769a58fdd47a126d" > FindErrorInRoutingSearchParameters< / a > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02065" > < / a > < span class = "lineno" > 2065< / span >   < span class = "keywordflow" > if< / span > (!error.empty()) {< / div >
< div class = "line" > < a name = "l02066" > < / a > < span class = "lineno" > 2066< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > ROUTING_INVALID< / a > ;< / div >
< div class = "line" > < a name = "l02067" > < / a > < span class = "lineno" > 2067< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Invalid RoutingSearchParameters: " < / span > < < error;< / div >
< div class = "line" > < a name = "l02068" > < / a > < span class = "lineno" > 2068< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l02069" > < / a > < span class = "lineno" > 2069< / span >   }< / div >
< div class = "line" > < a name = "l02070" > < / a > < span class = "lineno" > 2070< / span >   < span class = "keywordflow" > if< / span > (closed_) {< / div >
< div class = "line" > < a name = "l02071" > < / a > < span class = "lineno" > 2071< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " Model already closed" < / span > ;< / div >
< div class = "line" > < a name = "l02072" > < / a > < span class = "lineno" > 2072< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l02073" > < / a > < span class = "lineno" > 2073< / span >   }< / div >
< div class = "line" > < a name = "l02074" > < / a > < span class = "lineno" > 2074< / span >   closed_ = < span class = "keyword" > true< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02075" > < / a > < span class = "lineno" > 2075< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02076" > < / a > < span class = "lineno" > 2076< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l02077" > < / a > < span class = "lineno" > 2077< / span >   dimension-> CloseModel(UsesLightPropagation(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ));< / div >
< div class = "line" > < a name = "l02078" > < / a > < span class = "lineno" > 2078< / span >   }< / div >
< div class = "line" > < a name = "l02079" > < / a > < span class = "lineno" > 2079< / span >   ComputeCostClasses(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02080" > < / a > < span class = "lineno" > 2080< / span >   ComputeVehicleClasses();< / div >
< div class = "line" > < a name = "l02081" > < / a > < span class = "lineno" > 2081< / span >   ComputeVehicleTypes();< / div >
< div class = "line" > < a name = "l02082" > < / a > < span class = "lineno" > 2082< / span >   FinalizeVisitTypes();< / div >
< div class = "line" > < a name = "l02083" > < / a > < span class = "lineno" > 2083< / span >   vehicle_start_class_callback_ = [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start) {< / div >
< div class = "line" > < a name = "l02084" > < / a > < span class = "lineno" > 2084< / span >   < span class = "keywordflow" > return< / span > GetVehicleStartClass(start);< / div >
< div class = "line" > < a name = "l02085" > < / a > < span class = "lineno" > 2085< / span >   };< / div >
< div class = "line" > < a name = "l02086" > < / a > < span class = "lineno" > 2086< / span >   < / div >
< div class = "line" > < a name = "l02087" > < / a > < span class = "lineno" > 2087< / span >   AddNoCycleConstraintInternal();< / div >
< div class = "line" > < a name = "l02088" > < / a > < span class = "lineno" > 2088< / span >   < / div >
< div class = "line" > < a name = "l02089" > < / a > < span class = "lineno" > 2089< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l02090" > < / a > < span class = "lineno" > 2090< / span >   < / div >
< div class = "line" > < a name = "l02091" > < / a > < span class = "lineno" > 2091< / span >   < span class = "comment" > // Vehicle variable constraints< / span > < / div >
< div class = "line" > < a name = "l02092" > < / a > < span class = "lineno" > 2092< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l02093" > < / a > < span class = "lineno" > 2093< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start = starts_[i];< / div >
< div class = "line" > < a name = "l02094" > < / a > < span class = "lineno" > 2094< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end = ends_[i];< / div >
< div class = "line" > < a name = "l02095" > < / a > < span class = "lineno" > 2095< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02096" > < / a > < span class = "lineno" > 2096< / span >   solver_-> MakeEquality(vehicle_vars_[start], solver_-> MakeIntConst(i)));< / div >
< div class = "line" > < a name = "l02097" > < / a > < span class = "lineno" > 2097< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02098" > < / a > < span class = "lineno" > 2098< / span >   solver_-> MakeEquality(vehicle_vars_[end], solver_-> MakeIntConst(i)));< / div >
< div class = "line" > < a name = "l02099" > < / a > < span class = "lineno" > 2099< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02100" > < / a > < span class = "lineno" > 2100< / span >   solver_-> MakeIsDifferentCstCt(nexts_[start], end, vehicle_active_[i]));< / div >
< div class = "line" > < a name = "l02101" > < / a > < span class = "lineno" > 2101< / span >   < span class = "keywordflow" > if< / span > (consider_empty_route_costs_[i]) {< / div >
< div class = "line" > < a name = "l02102" > < / a > < span class = "lineno" > 2102< / span >   vehicle_costs_considered_[i]-> SetMin(1);< / div >
< div class = "line" > < a name = "l02103" > < / a > < span class = "lineno" > 2103< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l02104" > < / a > < span class = "lineno" > 2104< / span >   solver_-> AddConstraint(solver_-> MakeEquality(< / div >
< div class = "line" > < a name = "l02105" > < / a > < span class = "lineno" > 2105< / span >   vehicle_active_[i], vehicle_costs_considered_[i]));< / div >
< div class = "line" > < a name = "l02106" > < / a > < span class = "lineno" > 2106< / span >   }< / div >
< div class = "line" > < a name = "l02107" > < / a > < span class = "lineno" > 2107< / span >   }< / div >
< div class = "line" > < a name = "l02108" > < / a > < span class = "lineno" > 2108< / span >   < / div >
< div class = "line" > < a name = "l02109" > < / a > < span class = "lineno" > 2109< / span >   < span class = "comment" > // Limit the number of vehicles with non-empty routes.< / span > < / div >
< div class = "line" > < a name = "l02110" > < / a > < span class = "lineno" > 2110< / span >   < span class = "keywordflow" > if< / span > (vehicles_ > max_active_vehicles_) {< / div >
< div class = "line" > < a name = "l02111" > < / a > < span class = "lineno" > 2111< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02112" > < / a > < span class = "lineno" > 2112< / span >   solver_-> MakeSumLessOrEqual(vehicle_active_, max_active_vehicles_));< / div >
< div class = "line" > < a name = "l02113" > < / a > < span class = "lineno" > 2113< / span >   }< / div >
< div class = "line" > < a name = "l02114" > < / a > < span class = "lineno" > 2114< / span >   < / div >
< div class = "line" > < a name = "l02115" > < / a > < span class = "lineno" > 2115< / span >   < span class = "comment" > // If there is only one vehicle in the model the vehicle variables will have< / span > < / div >
< div class = "line" > < a name = "l02116" > < / a > < span class = "lineno" > 2116< / span >   < span class = "comment" > // a maximum domain of [-1, 0]. If a node is performed/active then its vehicle< / span > < / div >
< div class = "line" > < a name = "l02117" > < / a > < span class = "lineno" > 2117< / span >   < span class = "comment" > // variable will be reduced to [0] making the path-cumul constraint below< / span > < / div >
< div class = "line" > < a name = "l02118" > < / a > < span class = "lineno" > 2118< / span >   < span class = "comment" > // useless. If the node is unperformed/unactive then its vehicle variable will< / span > < / div >
< div class = "line" > < a name = "l02119" > < / a > < span class = "lineno" > 2119< / span >   < span class = "comment" > // be reduced to [-1] in any case.< / span > < / div >
< div class = "line" > < a name = "l02120" > < / a > < span class = "lineno" > 2120< / span >   < span class = "keywordflow" > if< / span > (vehicles_ > 1) {< / div >
< div class = "line" > < a name = "l02121" > < / a > < span class = "lineno" > 2121< / span >   std::vector< IntVar*> zero_transit(size, solver_-> MakeIntConst(0));< / div >
< div class = "line" > < a name = "l02122" > < / a > < span class = "lineno" > 2122< / span >   solver_-> AddConstraint(solver_-> MakeDelayedPathCumul(< / div >
< div class = "line" > < a name = "l02123" > < / a > < span class = "lineno" > 2123< / span >   nexts_, active_, vehicle_vars_, zero_transit));< / div >
< div class = "line" > < a name = "l02124" > < / a > < span class = "lineno" > 2124< / span >   }< / div >
< div class = "line" > < a name = "l02125" > < / a > < span class = "lineno" > 2125< / span >   < / div >
< div class = "line" > < a name = "l02126" > < / a > < span class = "lineno" > 2126< / span >   < span class = "comment" > // Nodes which are not in a disjunction are mandatory, and those with a< / span > < / div >
< div class = "line" > < a name = "l02127" > < / a > < span class = "lineno" > 2127< / span >   < span class = "comment" > // trivially infeasible type are necessarily unperformed< / span > < / div >
< div class = "line" > < a name = "l02128" > < / a > < span class = "lineno" > 2128< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l02129" > < / a > < span class = "lineno" > 2129< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a89b2c610c22a3223f1cac10233d7992d" > GetDisjunctionIndices< / a > (i).empty() & & active_[i]-> Max() != 0) {< / div >
< div class = "line" > < a name = "l02130" > < / a > < span class = "lineno" > 2130< / span >   active_[i]-> SetValue(1);< / div >
< div class = "line" > < a name = "l02131" > < / a > < span class = "lineno" > 2131< / span >   }< / div >
< div class = "line" > < a name = "l02132" > < / a > < span class = "lineno" > 2132< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > type = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > GetVisitType< / a > (i);< / div >
< div class = "line" > < a name = "l02133" > < / a > < span class = "lineno" > 2133< / span >   < span class = "keywordflow" > if< / span > (type == < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > ) {< / div >
< div class = "line" > < a name = "l02134" > < / a > < span class = "lineno" > 2134< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02135" > < / a > < span class = "lineno" > 2135< / span >   }< / div >
< div class = "line" > < a name = "l02136" > < / a > < span class = "lineno" > 2136< / span >   < span class = "keyword" > const< / span > absl::flat_hash_set< VisitTypePolicy> * < span class = "keyword" > const< / span > infeasible_policies =< / div >
< div class = "line" > < a name = "l02137" > < / a > < span class = "lineno" > 2137< / span >   < a class = "code" href = "namespacegtl.html#ab9e05694d7776f2eef357feca8b9d647" > gtl::FindOrNull< / a > (trivially_infeasible_visit_types_to_policies_, type);< / div >
< div class = "line" > < a name = "l02138" > < / a > < span class = "lineno" > 2138< / span >   < span class = "keywordflow" > if< / span > (infeasible_policies != < span class = "keyword" > nullptr< / span > & & < / div >
< div class = "line" > < a name = "l02139" > < / a > < span class = "lineno" > 2139< / span >   < a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (*infeasible_policies, index_to_type_policy_[i])) {< / div >
< div class = "line" > < a name = "l02140" > < / a > < span class = "lineno" > 2140< / span >   active_[i]-> SetValue(0);< / div >
< div class = "line" > < a name = "l02141" > < / a > < span class = "lineno" > 2141< / span >   }< / div >
< div class = "line" > < a name = "l02142" > < / a > < span class = "lineno" > 2142< / span >   }< / div >
< div class = "line" > < a name = "l02143" > < / a > < span class = "lineno" > 2143< / span >   < / div >
< div class = "line" > < a name = "l02144" > < / a > < span class = "lineno" > 2144< / span >   < span class = "comment" > // Reduce domains of vehicle variables< / span > < / div >
< div class = "line" > < a name = "l02145" > < / a > < span class = "lineno" > 2145< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < allowed_vehicles_.size(); ++i) {< / div >
< div class = "line" > < a name = "l02146" > < / a > < span class = "lineno" > 2146< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & allowed_vehicles = allowed_vehicles_[i];< / div >
< div class = "line" > < a name = "l02147" > < / a > < span class = "lineno" > 2147< / span >   < span class = "keywordflow" > if< / span > (!allowed_vehicles.empty()) {< / div >
< div class = "line" > < a name = "l02148" > < / a > < span class = "lineno" > 2148< / span >   std::vector< int64> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ;< / div >
< div class = "line" > < a name = "l02149" > < / a > < span class = "lineno" > 2149< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > .reserve(allowed_vehicles.size() + 1);< / div >
< div class = "line" > < a name = "l02150" > < / a > < span class = "lineno" > 2150< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > .push_back(-1);< / div >
< div class = "line" > < a name = "l02151" > < / a > < span class = "lineno" > 2151< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle : allowed_vehicles) {< / div >
< div class = "line" > < a name = "l02152" > < / a > < span class = "lineno" > 2152< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > .push_back(vehicle);< / div >
< div class = "line" > < a name = "l02153" > < / a > < span class = "lineno" > 2153< / span >   }< / div >
< div class = "line" > < a name = "l02154" > < / a > < span class = "lineno" > 2154< / span >   solver_-> AddConstraint(solver_-> MakeMemberCt(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (i), < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ));< / div >
< div class = "line" > < a name = "l02155" > < / a > < span class = "lineno" > 2155< / span >   }< / div >
< div class = "line" > < a name = "l02156" > < / a > < span class = "lineno" > 2156< / span >   }< / div >
< div class = "line" > < a name = "l02157" > < / a > < span class = "lineno" > 2157< / span >   < / div >
< div class = "line" > < a name = "l02158" > < / a > < span class = "lineno" > 2158< / span >   < span class = "comment" > // Reduce domain of next variables.< / span > < / div >
< div class = "line" > < a name = "l02159" > < / a > < span class = "lineno" > 2159< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l02160" > < / a > < span class = "lineno" > 2160< / span >   < span class = "comment" > // No variable can point back to a start.< / span > < / div >
< div class = "line" > < a name = "l02161" > < / a > < span class = "lineno" > 2161< / span >   solver_-> AddConstraint(solver_-> RevAlloc(< / div >
< div class = "line" > < a name = "l02162" > < / a > < span class = "lineno" > 2162< / span >   < span class = "keyword" > new< / span > DifferentFromValues(solver_.get(), nexts_[i], starts_)));< / div >
< div class = "line" > < a name = "l02163" > < / a > < span class = "lineno" > 2163< / span >   < span class = "comment" > // Extra constraint to state an active node can' t point to itself.< / span > < / div >
< div class = "line" > < a name = "l02164" > < / a > < span class = "lineno" > 2164< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02165" > < / a > < span class = "lineno" > 2165< / span >   solver_-> MakeIsDifferentCstCt(nexts_[i], i, active_[i]));< / div >
< div class = "line" > < a name = "l02166" > < / a > < span class = "lineno" > 2166< / span >   }< / div >
< div class = "line" > < a name = "l02167" > < / a > < span class = "lineno" > 2167< / span >   < / div >
< div class = "line" > < a name = "l02168" > < / a > < span class = "lineno" > 2168< / span >   < span class = "comment" > // Add constraints to bind vehicle_vars_[i] to -1 in case that node i is not< / span > < / div >
< div class = "line" > < a name = "l02169" > < / a > < span class = "lineno" > 2169< / span >   < span class = "comment" > // active.< / span > < / div >
< div class = "line" > < a name = "l02170" > < / a > < span class = "lineno" > 2170< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l02171" > < / a > < span class = "lineno" > 2171< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02172" > < / a > < span class = "lineno" > 2172< / span >   solver_-> MakeIsDifferentCstCt(vehicle_vars_[i], -1, active_[i]));< / div >
< div class = "line" > < a name = "l02173" > < / a > < span class = "lineno" > 2173< / span >   }< / div >
< div class = "line" > < a name = "l02174" > < / a > < span class = "lineno" > 2174< / span >   < / div >
< div class = "line" > < a name = "l02175" > < / a > < span class = "lineno" > 2175< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045" > HasTypeRegulations< / a > ()) {< / div >
< div class = "line" > < a name = "l02176" > < / a > < span class = "lineno" > 2176< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02177" > < / a > < span class = "lineno" > 2177< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_constraint.html" > TypeRegulationsConstraint< / a > (*< span class = "keyword" > this< / span > )));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02178" > < / a > < span class = "lineno" > 2178< / span >   }< / div >
< div class = "line" > < a name = "l02179" > < / a > < span class = "lineno" > 2179< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02180" > < / a > < span class = "lineno" > 2180< / span >   < span class = "comment" > // Associate first and " logical" last nodes< / span > < / div >
< div class = "line" > < a name = "l02181" > < / a > < span class = "lineno" > 2181< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l02182" > < / a > < span class = "lineno" > 2182< / span >   std::vector< int64> forbidden_ends;< / div >
< div class = "line" > < a name = "l02183" > < / a > < span class = "lineno" > 2183< / span >   forbidden_ends.reserve(vehicles_ - 1);< / div >
< div class = "line" > < a name = "l02184" > < / a > < span class = "lineno" > 2184< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > j = 0; j < vehicles_; ++j) {< / div >
< div class = "line" > < a name = "l02185" > < / a > < span class = "lineno" > 2185< / span >   < span class = "keywordflow" > if< / span > (i != j) {< / div >
< div class = "line" > < a name = "l02186" > < / a > < span class = "lineno" > 2186< / span >   forbidden_ends.push_back(ends_[j]);< / div >
< div class = "line" > < a name = "l02187" > < / a > < span class = "lineno" > 2187< / span >   }< / div >
< div class = "line" > < a name = "l02188" > < / a > < span class = "lineno" > 2188< / span >   }< / div >
< div class = "line" > < a name = "l02189" > < / a > < span class = "lineno" > 2189< / span >   solver_-> AddConstraint(solver_-> RevAlloc(< span class = "keyword" > new< / span > DifferentFromValues(< / div >
< div class = "line" > < a name = "l02190" > < / a > < span class = "lineno" > 2190< / span >   solver_.get(), nexts_[starts_[i]], std::move(forbidden_ends))));< / div >
< div class = "line" > < a name = "l02191" > < / a > < span class = "lineno" > 2191< / span >   }< / div >
< div class = "line" > < a name = "l02192" > < / a > < span class = "lineno" > 2192< / span >   < / div >
< div class = "line" > < a name = "l02193" > < / a > < span class = "lineno" > 2193< / span >   < span class = "comment" > // Constraining is_bound_to_end_ variables.< / span > < / div >
< div class = "line" > < a name = "l02194" > < / a > < span class = "lineno" > 2194< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end : ends_) {< / div >
< div class = "line" > < a name = "l02195" > < / a > < span class = "lineno" > 2195< / span >   is_bound_to_end_[end]-> SetValue(1);< / div >
< div class = "line" > < a name = "l02196" > < / a > < span class = "lineno" > 2196< / span >   }< / div >
< div class = "line" > < a name = "l02197" > < / a > < span class = "lineno" > 2197< / span >   < / div >
< div class = "line" > < a name = "l02198" > < / a > < span class = "lineno" > 2198< / span >   std::vector< IntVar*> cost_elements;< / div >
< div class = "line" > < a name = "l02199" > < / a > < span class = "lineno" > 2199< / span >   < span class = "comment" > // Arc and dimension costs.< / span > < / div >
< div class = "line" > < a name = "l02200" > < / a > < span class = "lineno" > 2200< / span >   < span class = "keywordflow" > if< / span > (vehicles_ > 0) {< / div >
< div class = "line" > < a name = "l02201" > < / a > < span class = "lineno" > 2201< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node_index = 0; node_index < size; ++node_index) {< / div >
< div class = "line" > < a name = "l02202" > < / a > < span class = "lineno" > 2202< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l02203" > < / a > < span class = "lineno" > 2203< / span >   AppendHomogeneousArcCosts(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , node_index, & cost_elements);< / div >
< div class = "line" > < a name = "l02204" > < / a > < span class = "lineno" > 2204< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l02205" > < / a > < span class = "lineno" > 2205< / span >   AppendArcCosts(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , node_index, & cost_elements);< / div >
< div class = "line" > < a name = "l02206" > < / a > < span class = "lineno" > 2206< / span >   }< / div >
< div class = "line" > < a name = "l02207" > < / a > < span class = "lineno" > 2207< / span >   }< / div >
< div class = "line" > < a name = "l02208" > < / a > < span class = "lineno" > 2208< / span >   < span class = "keywordflow" > if< / span > (vehicle_amortized_cost_factors_set_) {< / div >
< div class = "line" > < a name = "l02209" > < / a > < span class = "lineno" > 2209< / span >   std::vector< IntVar*> route_lengths;< / div >
< div class = "line" > < a name = "l02210" > < / a > < span class = "lineno" > 2210< / span >   solver_-> MakeIntVarArray(vehicles_, 0, size, & route_lengths);< / div >
< div class = "line" > < a name = "l02211" > < / a > < span class = "lineno" > 2211< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02212" > < / a > < span class = "lineno" > 2212< / span >   solver_-> MakeDistribute(vehicle_vars_, route_lengths));< / div >
< div class = "line" > < a name = "l02213" > < / a > < span class = "lineno" > 2213< / span >   std::vector< IntVar*> vehicle_used;< / div >
< div class = "line" > < a name = "l02214" > < / a > < span class = "lineno" > 2214< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; i++) {< / div >
< div class = "line" > < a name = "l02215" > < / a > < span class = "lineno" > 2215< / span >   < span class = "comment" > // The start/end of the vehicle are always on the route.< / span > < / div >
< div class = "line" > < a name = "l02216" > < / a > < span class = "lineno" > 2216< / span >   vehicle_used.push_back(< / div >
< div class = "line" > < a name = "l02217" > < / a > < span class = "lineno" > 2217< / span >   solver_-> MakeIsGreaterCstVar(route_lengths[i], 2));< / div >
< div class = "line" > < a name = "l02218" > < / a > < span class = "lineno" > 2218< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > =< / div >
< div class = "line" > < a name = "l02219" > < / a > < span class = "lineno" > 2219< / span >   solver_< / div >
< div class = "line" > < a name = "l02220" > < / a > < span class = "lineno" > 2220< / span >   -> MakeProd(solver_-> MakeOpposite(solver_-> MakeSquare(< / div >
< div class = "line" > < a name = "l02221" > < / a > < span class = "lineno" > 2221< / span >   solver_-> MakeSum(route_lengths[i], -2))),< / div >
< div class = "line" > < a name = "l02222" > < / a > < span class = "lineno" > 2222< / span >   quadratic_cost_factor_of_vehicle_[i])< / div >
< div class = "line" > < a name = "l02223" > < / a > < span class = "lineno" > 2223< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02224" > < / a > < span class = "lineno" > 2224< / span >   cost_elements.push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l02225" > < / a > < span class = "lineno" > 2225< / span >   }< / div >
< div class = "line" > < a name = "l02226" > < / a > < span class = "lineno" > 2226< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > vehicle_usage_cost =< / div >
< div class = "line" > < a name = "l02227" > < / a > < span class = "lineno" > 2227< / span >   solver_-> MakeScalProd(vehicle_used, linear_cost_factor_of_vehicle_)< / div >
< div class = "line" > < a name = "l02228" > < / a > < span class = "lineno" > 2228< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02229" > < / a > < span class = "lineno" > 2229< / span >   cost_elements.push_back(vehicle_usage_cost);< / div >
< div class = "line" > < a name = "l02230" > < / a > < span class = "lineno" > 2230< / span >   }< / div >
< div class = "line" > < a name = "l02231" > < / a > < span class = "lineno" > 2231< / span >   }< / div >
< div class = "line" > < a name = "l02232" > < / a > < span class = "lineno" > 2232< / span >   < span class = "comment" > // Dimension span constraints: cost and limits.< / span > < / div >
< div class = "line" > < a name = "l02233" > < / a > < span class = "lineno" > 2233< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l02234" > < / a > < span class = "lineno" > 2234< / span >   dimension-> SetupGlobalSpanCost(& cost_elements);< / div >
< div class = "line" > < a name = "l02235" > < / a > < span class = "lineno" > 2235< / span >   dimension-> SetupSlackAndDependentTransitCosts();< / div >
< div class = "line" > < a name = "l02236" > < / a > < span class = "lineno" > 2236< / span >   < span class = "keyword" > const< / span > std::vector< int64> & span_costs =< / div >
< div class = "line" > < a name = "l02237" > < / a > < span class = "lineno" > 2237< / span >   dimension-> vehicle_span_cost_coefficients();< / div >
< div class = "line" > < a name = "l02238" > < / a > < span class = "lineno" > 2238< / span >   < span class = "keyword" > const< / span > std::vector< int64> & span_ubs = dimension-> vehicle_span_upper_bounds();< / div >
< div class = "line" > < a name = "l02239" > < / a > < span class = "lineno" > 2239< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > has_span_constraint =< / div >
< div class = "line" > < a name = "l02240" > < / a > < span class = "lineno" > 2240< / span >   std::any_of(span_costs.begin(), span_costs.end(),< / div >
< div class = "line" > < a name = "l02241" > < / a > < span class = "lineno" > 2241< / span >   [](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > coeff) { return coeff != 0; }) ||< / div >
< div class = "line" > < a name = "l02242" > < / a > < span class = "lineno" > 2242< / span >   std::any_of(span_ubs.begin(), span_ubs.end(),< / div >
< div class = "line" > < a name = "l02243" > < / a > < span class = "lineno" > 2243< / span >   [](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ) { return value < kint64max; }) ||< / div >
< div class = "line" > < a name = "l02244" > < / a > < span class = "lineno" > 2244< / span >   dimension-> HasSoftSpanUpperBounds() ||< / div >
< div class = "line" > < a name = "l02245" > < / a > < span class = "lineno" > 2245< / span >   dimension-> HasQuadraticCostSoftSpanUpperBounds();< / div >
< div class = "line" > < a name = "l02246" > < / a > < span class = "lineno" > 2246< / span >   < span class = "keywordflow" > if< / span > (has_span_constraint) {< / div >
< div class = "line" > < a name = "l02247" > < / a > < span class = "lineno" > 2247< / span >   std::vector< IntVar*> spans(< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02248" > < / a > < span class = "lineno" > 2248< / span >   std::vector< IntVar*> total_slacks(< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02249" > < / a > < span class = "lineno" > 2249< / span >   < span class = "comment" > // Generate variables only where needed.< / span > < / div >
< div class = "line" > < a name = "l02250" > < / a > < span class = "lineno" > 2250< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02251" > < / a > < span class = "lineno" > 2251< / span >   < span class = "keywordflow" > if< / span > (span_ubs[vehicle] < < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ) {< / div >
< div class = "line" > < a name = "l02252" > < / a > < span class = "lineno" > 2252< / span >   spans[vehicle] = solver_-> MakeIntVar(0, span_ubs[vehicle], < span class = "stringliteral" > " " < / span > );< / div >
< div class = "line" > < a name = "l02253" > < / a > < span class = "lineno" > 2253< / span >   }< / div >
< div class = "line" > < a name = "l02254" > < / a > < span class = "lineno" > 2254< / span >   < span class = "keywordflow" > if< / span > (span_costs[vehicle] != 0) {< / div >
< div class = "line" > < a name = "l02255" > < / a > < span class = "lineno" > 2255< / span >   total_slacks[vehicle] = solver_-> MakeIntVar(0, span_ubs[vehicle], < span class = "stringliteral" > " " < / span > );< / div >
< div class = "line" > < a name = "l02256" > < / a > < span class = "lineno" > 2256< / span >   }< / div >
< div class = "line" > < a name = "l02257" > < / a > < span class = "lineno" > 2257< / span >   }< / div >
< div class = "line" > < a name = "l02258" > < / a > < span class = "lineno" > 2258< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasSoftSpanUpperBounds()) {< / div >
< div class = "line" > < a name = "l02259" > < / a > < span class = "lineno" > 2259< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02260" > < / a > < span class = "lineno" > 2260< / span >   < span class = "keywordflow" > if< / span > (spans[vehicle]) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02261" > < / a > < span class = "lineno" > 2261< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html" > SimpleBoundCosts::BoundCost< / a > bound_cost =< / div >
< div class = "line" > < a name = "l02262" > < / a > < span class = "lineno" > 2262< / span >   dimension-> GetSoftSpanUpperBoundForVehicle(vehicle);< / div >
< div class = "line" > < a name = "l02263" > < / a > < span class = "lineno" > 2263< / span >   < span class = "keywordflow" > if< / span > (bound_cost.< a class = "code" href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > == 0) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02264" > < / a > < span class = "lineno" > 2264< / span >   spans[vehicle] = solver_-> MakeIntVar(0, span_ubs[vehicle]);< / div >
< div class = "line" > < a name = "l02265" > < / a > < span class = "lineno" > 2265< / span >   }< / div >
< div class = "line" > < a name = "l02266" > < / a > < span class = "lineno" > 2266< / span >   }< / div >
< div class = "line" > < a name = "l02267" > < / a > < span class = "lineno" > 2267< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasQuadraticCostSoftSpanUpperBounds()) {< / div >
< div class = "line" > < a name = "l02268" > < / a > < span class = "lineno" > 2268< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02269" > < / a > < span class = "lineno" > 2269< / span >   < span class = "keywordflow" > if< / span > (spans[vehicle]) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02270" > < / a > < span class = "lineno" > 2270< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html" > SimpleBoundCosts::BoundCost< / a > bound_cost =< / div >
< div class = "line" > < a name = "l02271" > < / a > < span class = "lineno" > 2271< / span >   dimension-> GetQuadraticCostSoftSpanUpperBoundForVehicle(vehicle);< / div >
< div class = "line" > < a name = "l02272" > < / a > < span class = "lineno" > 2272< / span >   < span class = "keywordflow" > if< / span > (bound_cost.< a class = "code" href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > == 0) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02273" > < / a > < span class = "lineno" > 2273< / span >   spans[vehicle] = solver_-> MakeIntVar(0, span_ubs[vehicle]);< / div >
< div class = "line" > < a name = "l02274" > < / a > < span class = "lineno" > 2274< / span >   }< / div >
< div class = "line" > < a name = "l02275" > < / a > < span class = "lineno" > 2275< / span >   }< / div >
< div class = "line" > < a name = "l02276" > < / a > < span class = "lineno" > 2276< / span >   solver_-> AddConstraint(< / div >
< div class = "line" > < a name = "l02277" > < / a > < span class = "lineno" > 2277< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c" > MakePathSpansAndTotalSlacks< / a > (dimension, spans, total_slacks));< / div >
< div class = "line" > < a name = "l02278" > < / a > < span class = "lineno" > 2278< / span >   < span class = "comment" > // If a vehicle' s span is constrained, its start/end cumuls must be< / span > < / div >
< div class = "line" > < a name = "l02279" > < / a > < span class = "lineno" > 2279< / span >   < span class = "comment" > // instantiated.< / span > < / div >
< div class = "line" > < a name = "l02280" > < / a > < span class = "lineno" > 2280< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02281" > < / a > < span class = "lineno" > 2281< / span >   < span class = "keywordflow" > if< / span > (!spans[vehicle] & & !total_slacks[vehicle]) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02282" > < / a > < span class = "lineno" > 2282< / span >   < span class = "keywordflow" > if< / span > (spans[vehicle]) {< / div >
< div class = "line" > < a name = "l02283" > < / a > < span class = "lineno" > 2283< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (spans[vehicle], < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l02284" > < / a > < span class = "lineno" > 2284< / span >   }< / div >
< div class = "line" > < a name = "l02285" > < / a > < span class = "lineno" > 2285< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l02286" > < / a > < span class = "lineno" > 2286< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l02287" > < / a > < span class = "lineno" > 2287< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l02288" > < / a > < span class = "lineno" > 2288< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l02289" > < / a > < span class = "lineno" > 2289< / span >   }< / div >
< div class = "line" > < a name = "l02290" > < / a > < span class = "lineno" > 2290< / span >   < span class = "comment" > // Add costs of variables.< / span > < / div >
< div class = "line" > < a name = "l02291" > < / a > < span class = "lineno" > 2291< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02292" > < / a > < span class = "lineno" > 2292< / span >   < span class = "keywordflow" > if< / span > (span_costs[vehicle] == 0) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02293" > < / a > < span class = "lineno" > 2293< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (total_slacks[vehicle] != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02294" > < / a > < span class = "lineno" > 2294< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > slack_amount =< / div >
< div class = "line" > < a name = "l02295" > < / a > < span class = "lineno" > 2295< / span >   solver_< / div >
< div class = "line" > < a name = "l02296" > < / a > < span class = "lineno" > 2296< / span >   -> MakeProd(vehicle_costs_considered_[vehicle],< / div >
< div class = "line" > < a name = "l02297" > < / a > < span class = "lineno" > 2297< / span >   total_slacks[vehicle])< / div >
< div class = "line" > < a name = "l02298" > < / a > < span class = "lineno" > 2298< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02299" > < / a > < span class = "lineno" > 2299< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > slack_cost =< / div >
< div class = "line" > < a name = "l02300" > < / a > < span class = "lineno" > 2300< / span >   solver_-> MakeProd(slack_amount, span_costs[vehicle])-> Var();< / div >
< div class = "line" > < a name = "l02301" > < / a > < span class = "lineno" > 2301< / span >   cost_elements.push_back(slack_cost);< / div >
< div class = "line" > < a name = "l02302" > < / a > < span class = "lineno" > 2302< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (slack_amount,< / div >
< div class = "line" > < a name = "l02303" > < / a > < span class = "lineno" > 2303< / span >   span_costs[vehicle]);< / div >
< div class = "line" > < a name = "l02304" > < / a > < span class = "lineno" > 2304< / span >   }< / div >
< div class = "line" > < a name = "l02305" > < / a > < span class = "lineno" > 2305< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasSoftSpanUpperBounds()) {< / div >
< div class = "line" > < a name = "l02306" > < / a > < span class = "lineno" > 2306< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02307" > < / a > < span class = "lineno" > 2307< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > bound_cost =< / div >
< div class = "line" > < a name = "l02308" > < / a > < span class = "lineno" > 2308< / span >   dimension-> GetSoftSpanUpperBoundForVehicle(vehicle);< / div >
< div class = "line" > < a name = "l02309" > < / a > < span class = "lineno" > 2309< / span >   < span class = "keywordflow" > if< / span > (bound_cost.cost == 0 || bound_cost.bound == < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02310" > < / a > < span class = "lineno" > 2310< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (spans[vehicle] != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02311" > < / a > < span class = "lineno" > 2311< / span >   < span class = "comment" > // Additional cost is vehicle_cost_considered_[vehicle] *< / span > < / div >
< div class = "line" > < a name = "l02312" > < / a > < span class = "lineno" > 2312< / span >   < span class = "comment" > // max(0, spans[vehicle] - bound_cost.bound) * bound_cost.cost.< / span > < / div >
< div class = "line" > < a name = "l02313" > < / a > < span class = "lineno" > 2313< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > span_violation_amount =< / div >
< div class = "line" > < a name = "l02314" > < / a > < span class = "lineno" > 2314< / span >   solver_< / div >
< div class = "line" > < a name = "l02315" > < / a > < span class = "lineno" > 2315< / span >   -> MakeProd(< / div >
< div class = "line" > < a name = "l02316" > < / a > < span class = "lineno" > 2316< / span >   vehicle_costs_considered_[vehicle],< / div >
< div class = "line" > < a name = "l02317" > < / a > < span class = "lineno" > 2317< / span >   solver_-> MakeMax(< / div >
< div class = "line" > < a name = "l02318" > < / a > < span class = "lineno" > 2318< / span >   solver_-> MakeSum(spans[vehicle], -bound_cost.bound),< / div >
< div class = "line" > < a name = "l02319" > < / a > < span class = "lineno" > 2319< / span >   0))< / div >
< div class = "line" > < a name = "l02320" > < / a > < span class = "lineno" > 2320< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02321" > < / a > < span class = "lineno" > 2321< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > span_violation_cost =< / div >
< div class = "line" > < a name = "l02322" > < / a > < span class = "lineno" > 2322< / span >   solver_-> MakeProd(span_violation_amount, bound_cost.cost)-> Var();< / div >
< div class = "line" > < a name = "l02323" > < / a > < span class = "lineno" > 2323< / span >   cost_elements.push_back(span_violation_cost);< / div >
< div class = "line" > < a name = "l02324" > < / a > < span class = "lineno" > 2324< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (span_violation_amount,< / div >
< div class = "line" > < a name = "l02325" > < / a > < span class = "lineno" > 2325< / span >   bound_cost.cost);< / div >
< div class = "line" > < a name = "l02326" > < / a > < span class = "lineno" > 2326< / span >   }< / div >
< div class = "line" > < a name = "l02327" > < / a > < span class = "lineno" > 2327< / span >   }< / div >
< div class = "line" > < a name = "l02328" > < / a > < span class = "lineno" > 2328< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasQuadraticCostSoftSpanUpperBounds()) {< / div >
< div class = "line" > < a name = "l02329" > < / a > < span class = "lineno" > 2329< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l02330" > < / a > < span class = "lineno" > 2330< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > bound_cost =< / div >
< div class = "line" > < a name = "l02331" > < / a > < span class = "lineno" > 2331< / span >   dimension-> GetQuadraticCostSoftSpanUpperBoundForVehicle(vehicle);< / div >
< div class = "line" > < a name = "l02332" > < / a > < span class = "lineno" > 2332< / span >   < span class = "keywordflow" > if< / span > (bound_cost.cost == 0 || bound_cost.bound == < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l02333" > < / a > < span class = "lineno" > 2333< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (spans[vehicle] != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02334" > < / a > < span class = "lineno" > 2334< / span >   < span class = "comment" > // Additional cost is vehicle_cost_considered_[vehicle] *< / span > < / div >
< div class = "line" > < a name = "l02335" > < / a > < span class = "lineno" > 2335< / span >   < span class = "comment" > // max(0, spans[vehicle] - bound_cost.bound)^2 * bound_cost.cost.< / span > < / div >
< div class = "line" > < a name = "l02336" > < / a > < span class = "lineno" > 2336< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * max0 = solver_-> MakeMax(< / div >
< div class = "line" > < a name = "l02337" > < / a > < span class = "lineno" > 2337< / span >   solver_-> MakeSum(spans[vehicle], -bound_cost.bound), 0);< / div >
< div class = "line" > < a name = "l02338" > < / a > < span class = "lineno" > 2338< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > squared_span_violation_amount =< / div >
< div class = "line" > < a name = "l02339" > < / a > < span class = "lineno" > 2339< / span >   solver_< / div >
< div class = "line" > < a name = "l02340" > < / a > < span class = "lineno" > 2340< / span >   -> MakeProd(vehicle_costs_considered_[vehicle],< / div >
< div class = "line" > < a name = "l02341" > < / a > < span class = "lineno" > 2341< / span >   solver_-> MakeSquare(max0))< / div >
< div class = "line" > < a name = "l02342" > < / a > < span class = "lineno" > 2342< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02343" > < / a > < span class = "lineno" > 2343< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > span_violation_cost =< / div >
< div class = "line" > < a name = "l02344" > < / a > < span class = "lineno" > 2344< / span >   solver_-> MakeProd(squared_span_violation_amount, bound_cost.cost)< / div >
< div class = "line" > < a name = "l02345" > < / a > < span class = "lineno" > 2345< / span >   -> Var();< / div >
< div class = "line" > < a name = "l02346" > < / a > < span class = "lineno" > 2346< / span >   cost_elements.push_back(span_violation_cost);< / div >
< div class = "line" > < a name = "l02347" > < / a > < span class = "lineno" > 2347< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (squared_span_violation_amount,< / div >
< div class = "line" > < a name = "l02348" > < / a > < span class = "lineno" > 2348< / span >   bound_cost.cost);< / div >
< div class = "line" > < a name = "l02349" > < / a > < span class = "lineno" > 2349< / span >   }< / div >
< div class = "line" > < a name = "l02350" > < / a > < span class = "lineno" > 2350< / span >   }< / div >
< div class = "line" > < a name = "l02351" > < / a > < span class = "lineno" > 2351< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02352" > < / a > < span class = "lineno" > 2352< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02353" > < / a > < span class = "lineno" > 2353< / span >   < span class = "comment" > // Penalty costs< / span > < / div >
< div class = "line" > < a name = "l02354" > < / a > < span class = "lineno" > 2354< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > i(0); i < disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a60304b65bf89363bcc3165d3cde67f86" > size< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l02355" > < / a > < span class = "lineno" > 2355< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * penalty_var = CreateDisjunction(i);< / div >
< div class = "line" > < a name = "l02356" > < / a > < span class = "lineno" > 2356< / span >   < span class = "keywordflow" > if< / span > (penalty_var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l02357" > < / a > < span class = "lineno" > 2357< / span >   cost_elements.push_back(penalty_var);< / div >
< div class = "line" > < a name = "l02358" > < / a > < span class = "lineno" > 2358< / span >   }< / div >
< div class = "line" > < a name = "l02359" > < / a > < span class = "lineno" > 2359< / span >   }< / div >
< div class = "line" > < a name = "l02360" > < / a > < span class = "lineno" > 2360< / span >   < span class = "comment" > // Soft cumul lower/upper bound costs< / span > < / div >
< div class = "line" > < a name = "l02361" > < / a > < span class = "lineno" > 2361< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l02362" > < / a > < span class = "lineno" > 2362< / span >   dimension-> SetupCumulVarSoftLowerBoundCosts(& cost_elements);< / div >
< div class = "line" > < a name = "l02363" > < / a > < span class = "lineno" > 2363< / span >   dimension-> SetupCumulVarSoftUpperBoundCosts(& cost_elements);< / div >
< div class = "line" > < a name = "l02364" > < / a > < span class = "lineno" > 2364< / span >   dimension-> SetupCumulVarPiecewiseLinearCosts(& cost_elements);< / div >
< div class = "line" > < a name = "l02365" > < / a > < span class = "lineno" > 2365< / span >   }< / div >
< div class = "line" > < a name = "l02366" > < / a > < span class = "lineno" > 2366< / span >   < span class = "comment" > // Same vehicle costs< / span > < / div >
< div class = "line" > < a name = "l02367" > < / a > < span class = "lineno" > 2367< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < same_vehicle_costs_.size(); ++i) {< / div >
< div class = "line" > < a name = "l02368" > < / a > < span class = "lineno" > 2368< / span >   cost_elements.push_back(CreateSameVehicleCost(i));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02369" > < / a > < span class = "lineno" > 2369< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02370" > < / a > < span class = "lineno" > 2370< / span >   cost_ = solver_-> MakeSum(cost_elements)-> Var();< / div >
< div class = "line" > < a name = "l02371" > < / a > < span class = "lineno" > 2371< / span >   cost_-> < a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#ad5260b9627048b854b45d05ed34adc22" > set_name< / a > (< span class = "stringliteral" > " Cost" < / span > );< / div >
< div class = "line" > < a name = "l02372" > < / a > < span class = "lineno" > 2372< / span >   < / div >
< div class = "line" > < a name = "l02373" > < / a > < span class = "lineno" > 2373< / span >   < span class = "comment" > // Pickup-delivery precedences< / span > < / div >
< div class = "line" > < a name = "l02374" > < / a > < span class = "lineno" > 2374< / span >   std::vector< std::pair< int, int> > pickup_delivery_precedences;< / div >
< div class = "line" > < a name = "l02375" > < / a > < span class = "lineno" > 2375< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & pair : pickup_delivery_pairs_) {< / div >
< div class = "line" > < a name = "l02376" > < / a > < span class = "lineno" > 2376< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (!pair.first.empty() & & !pair.second.empty());< / div >
< div class = "line" > < a name = "l02377" > < / a > < span class = "lineno" > 2377< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > pickup : pair.first) {< / div >
< div class = "line" > < a name = "l02378" > < / a > < span class = "lineno" > 2378< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > delivery : pair.second) {< / div >
< div class = "line" > < a name = "l02379" > < / a > < span class = "lineno" > 2379< / span >   pickup_delivery_precedences.emplace_back(pickup, delivery);< / div >
< div class = "line" > < a name = "l02380" > < / a > < span class = "lineno" > 2380< / span >   }< / div >
< div class = "line" > < a name = "l02381" > < / a > < span class = "lineno" > 2381< / span >   }< / div >
< div class = "line" > < a name = "l02382" > < / a > < span class = "lineno" > 2382< / span >   }< / div >
< div class = "line" > < a name = "l02383" > < / a > < span class = "lineno" > 2383< / span >   std::vector< int> lifo_vehicles;< / div >
< div class = "line" > < a name = "l02384" > < / a > < span class = "lineno" > 2384< / span >   std::vector< int> fifo_vehicles;< / div >
< div class = "line" > < a name = "l02385" > < / a > < span class = "lineno" > 2385< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < vehicles_; ++i) {< / div >
< div class = "line" > < a name = "l02386" > < / a > < span class = "lineno" > 2386< / span >   < span class = "keywordflow" > switch< / span > (vehicle_pickup_delivery_policy_[i]) {< / div >
< div class = "line" > < a name = "l02387" > < / a > < span class = "lineno" > 2387< / span >   < span class = "keywordflow" > case< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955" > PICKUP_AND_DELIVERY_NO_ORDER< / a > :< / div >
< div class = "line" > < a name = "l02388" > < / a > < span class = "lineno" > 2388< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l02389" > < / a > < span class = "lineno" > 2389< / span >   < span class = "keywordflow" > case< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8" > PICKUP_AND_DELIVERY_LIFO< / a > :< / div >
< div class = "line" > < a name = "l02390" > < / a > < span class = "lineno" > 2390< / span >   lifo_vehicles.push_back(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (i));< / div >
< div class = "line" > < a name = "l02391" > < / a > < span class = "lineno" > 2391< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l02392" > < / a > < span class = "lineno" > 2392< / span >   < span class = "keywordflow" > case< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a" > PICKUP_AND_DELIVERY_FIFO< / a > :< / div >
< div class = "line" > < a name = "l02393" > < / a > < span class = "lineno" > 2393< / span >   fifo_vehicles.push_back(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (i));< / div >
< div class = "line" > < a name = "l02394" > < / a > < span class = "lineno" > 2394< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l02395" > < / a > < span class = "lineno" > 2395< / span >   }< / div >
< div class = "line" > < a name = "l02396" > < / a > < span class = "lineno" > 2396< / span >   }< / div >
< div class = "line" > < a name = "l02397" > < / a > < span class = "lineno" > 2397< / span >   solver_-> AddConstraint(solver_-> MakePathPrecedenceConstraint(< / div >
< div class = "line" > < a name = "l02398" > < / a > < span class = "lineno" > 2398< / span >   nexts_, pickup_delivery_precedences, lifo_vehicles, fifo_vehicles));< / div >
< div class = "line" > < a name = "l02399" > < / a > < span class = "lineno" > 2399< / span >   < / div >
< div class = "line" > < a name = "l02400" > < / a > < span class = "lineno" > 2400< / span >   < span class = "comment" > // Detect constraints< / span > < / div >
< div class = "line" > < a name = "l02401" > < / a > < span class = "lineno" > 2401< / span >   enable_deep_serialization_ = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02402" > < / a > < span class = "lineno" > 2402< / span >   std::unique_ptr< RoutingModelInspector> inspector(< / div >
< div class = "line" > < a name = "l02403" > < / a > < span class = "lineno" > 2403< / span >   < span class = "keyword" > new< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a00141bd90e555aea59a9e98cfbcda6eb" > RoutingModelInspector< / a > (< span class = "keyword" > this< / span > ));< / div >
< div class = "line" > < a name = "l02404" > < / a > < span class = "lineno" > 2404< / span >   solver_-> Accept(inspector.get());< / div >
< div class = "line" > < a name = "l02405" > < / a > < span class = "lineno" > 2405< / span >   enable_deep_serialization_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02406" > < / a > < span class = "lineno" > 2406< / span >   < / div >
< div class = "line" > < a name = "l02407" > < / a > < span class = "lineno" > 2407< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l02408" > < / a > < span class = "lineno" > 2408< / span >   < span class = "comment" > // Dimension path precedences, discovered by model inspection (which must be< / span > < / div >
< div class = "line" > < a name = "l02409" > < / a > < span class = "lineno" > 2409< / span >   < span class = "comment" > // performed before adding path transit precedences).< / span > < / div >
< div class = "line" > < a name = "l02410" > < / a > < span class = "lineno" > 2410< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classutil_1_1_reverse_arc_list_graph.html" > ReverseArcListGraph< int, int> < / a > & graph =< / div >
< div class = "line" > < a name = "l02411" > < / a > < span class = "lineno" > 2411< / span >   dimension-> GetPathPrecedenceGraph();< / div >
< div class = "line" > < a name = "l02412" > < / a > < span class = "lineno" > 2412< / span >   std::vector< std::pair< int, int> > path_precedences;< / div >
< div class = "line" > < a name = "l02413" > < / a > < span class = "lineno" > 2413< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > : graph.< a class = "code" href = "classutil_1_1_base_graph.html#a8a40f2c75615a26ba71e94dd7d42f481" > AllNodes< / a > ()) {< / div >
< div class = "line" > < a name = "l02414" > < / a > < span class = "lineno" > 2414< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > : graph[< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ]) {< / div >
< div class = "line" > < a name = "l02415" > < / a > < span class = "lineno" > 2415< / span >   path_precedences.emplace_back(< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > , < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > );< / div >
< div class = "line" > < a name = "l02416" > < / a > < span class = "lineno" > 2416< / span >   }< / div >
< div class = "line" > < a name = "l02417" > < / a > < span class = "lineno" > 2417< / span >   }< / div >
< div class = "line" > < a name = "l02418" > < / a > < span class = "lineno" > 2418< / span >   < span class = "keywordflow" > if< / span > (!path_precedences.empty()) {< / div >
< div class = "line" > < a name = "l02419" > < / a > < span class = "lineno" > 2419< / span >   solver_-> AddConstraint(solver_-> MakePathTransitPrecedenceConstraint(< / div >
< div class = "line" > < a name = "l02420" > < / a > < span class = "lineno" > 2420< / span >   nexts_, dimension-> transits(), path_precedences));< / div >
< div class = "line" > < a name = "l02421" > < / a > < span class = "lineno" > 2421< / span >   }< / div >
< div class = "line" > < a name = "l02422" > < / a > < span class = "lineno" > 2422< / span >   < / div >
< div class = "line" > < a name = "l02423" > < / a > < span class = "lineno" > 2423< / span >   < span class = "comment" > // Dimension node precedences.< / span > < / div >
< div class = "line" > < a name = "l02424" > < / a > < span class = "lineno" > 2424< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_routing_dimension_1_1_node_precedence.html" > RoutingDimension::NodePrecedence< / a > & node_precedence :< / div >
< div class = "line" > < a name = "l02425" > < / a > < span class = "lineno" > 2425< / span >   dimension-> GetNodePrecedences()) {< / div >
< div class = "line" > < a name = "l02426" > < / a > < span class = "lineno" > 2426< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > first_node = node_precedence.first_node;< / div >
< div class = "line" > < a name = "l02427" > < / a > < span class = "lineno" > 2427< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > second_node = node_precedence.second_node;< / div >
< div class = "line" > < a name = "l02428" > < / a > < span class = "lineno" > 2428< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * < span class = "keyword" > const< / span > nodes_are_selected =< / div >
< div class = "line" > < a name = "l02429" > < / a > < span class = "lineno" > 2429< / span >   solver_-> MakeMin(active_[first_node], active_[second_node]);< / div >
< div class = "line" > < a name = "l02430" > < / a > < span class = "lineno" > 2430< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * < span class = "keyword" > const< / span > cumul_difference = solver_-> MakeDifference(< / div >
< div class = "line" > < a name = "l02431" > < / a > < span class = "lineno" > 2431< / span >   dimension-> CumulVar(second_node), dimension-> CumulVar(first_node));< / div >
< div class = "line" > < a name = "l02432" > < / a > < span class = "lineno" > 2432< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > cumul_difference_is_ge_offset =< / div >
< div class = "line" > < a name = "l02433" > < / a > < span class = "lineno" > 2433< / span >   solver_-> MakeIsGreaterOrEqualCstVar(cumul_difference,< / div >
< div class = "line" > < a name = "l02434" > < / a > < span class = "lineno" > 2434< / span >   node_precedence.offset);< / div >
< div class = "line" > < a name = "l02435" > < / a > < span class = "lineno" > 2435< / span >   < span class = "comment" > // Forces the implication: both nodes are active => cumul difference< / span > < / div >
< div class = "line" > < a name = "l02436" > < / a > < span class = "lineno" > 2436< / span >   < span class = "comment" > // constraint is active.< / span > < / div >
< div class = "line" > < a name = "l02437" > < / a > < span class = "lineno" > 2437< / span >   solver_-> AddConstraint(solver_-> MakeLessOrEqual(< / div >
< div class = "line" > < a name = "l02438" > < / a > < span class = "lineno" > 2438< / span >   nodes_are_selected-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > (), cumul_difference_is_ge_offset));< / div >
< div class = "line" > < a name = "l02439" > < / a > < span class = "lineno" > 2439< / span >   }< / div >
< div class = "line" > < a name = "l02440" > < / a > < span class = "lineno" > 2440< / span >   }< / div >
< div class = "line" > < a name = "l02441" > < / a > < span class = "lineno" > 2441< / span >   < / div >
< div class = "line" > < a name = "l02442" > < / a > < span class = "lineno" > 2442< / span >   DetectImplicitPickupAndDeliveries();< / div >
< div class = "line" > < a name = "l02443" > < / a > < span class = "lineno" > 2443< / span >   < / div >
< div class = "line" > < a name = "l02444" > < / a > < span class = "lineno" > 2444< / span >   < span class = "comment" > // Store the local/global cumul optimizers, along with their offsets.< / span > < / div >
< div class = "line" > < a name = "l02445" > < / a > < span class = "lineno" > 2445< / span >   StoreDimensionCumulOptimizers(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02446" > < / a > < span class = "lineno" > 2446< / span >   < / div >
< div class = "line" > < a name = "l02447" > < / a > < span class = "lineno" > 2447< / span >   < span class = "comment" > // Keep this out of SetupSearch as this contains static search objects.< / span > < / div >
< div class = "line" > < a name = "l02448" > < / a > < span class = "lineno" > 2448< / span >   < span class = "comment" > // This will allow calling SetupSearch multiple times with different search< / span > < / div >
< div class = "line" > < a name = "l02449" > < / a > < span class = "lineno" > 2449< / span >   < span class = "comment" > // parameters.< / span > < / div >
< div class = "line" > < a name = "l02450" > < / a > < span class = "lineno" > 2450< / span >   CreateNeighborhoodOperators(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02451" > < / a > < span class = "lineno" > 2451< / span >   CreateFirstSolutionDecisionBuilders(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02452" > < / a > < span class = "lineno" > 2452< / span >   error = FindErrorInSearchParametersForModel(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02453" > < / a > < span class = "lineno" > 2453< / span >   < span class = "keywordflow" > if< / span > (!error.empty()) {< / div >
< div class = "line" > < a name = "l02454" > < / a > < span class = "lineno" > 2454< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > ROUTING_INVALID< / a > ;< / div >
< div class = "line" > < a name = "l02455" > < / a > < span class = "lineno" > 2455< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Invalid RoutingSearchParameters for this model: " < / span > < < error;< / div >
< div class = "line" > < a name = "l02456" > < / a > < span class = "lineno" > 2456< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l02457" > < / a > < span class = "lineno" > 2457< / span >   }< / div >
< div class = "line" > < a name = "l02458" > < / a > < span class = "lineno" > 2458< / span >   SetupSearch(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l02459" > < / a > < span class = "lineno" > 2459< / span >   }< / div >
< div class = "line" > < a name = "l02460" > < / a > < span class = "lineno" > 2460< / span >   < / div >
< div class = "line" > < a name = "l02461" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html" > 2461< / a > < / span >   < span class = "keyword" > struct < / span > < a class = "code" href = "structoperations__research_1_1_link.html" > Link< / a > {< / div >
< div class = "line" > < a name = "l02462" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a67568687431f7a4dde8d07a0d67e35c7" > 2462< / a > < / span >   < a class = "code" href = "structoperations__research_1_1_link.html#a67568687431f7a4dde8d07a0d67e35c7" > Link< / a > (std::pair< int, int> link, < span class = "keywordtype" > double< / span > < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > , < span class = "keywordtype" > int< / span > vehicle_class,< / div >
< div class = "line" > < a name = "l02463" > < / a > < span class = "lineno" > 2463< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_depot, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end_depot)< / div >
< div class = "line" > < a name = "l02464" > < / a > < span class = "lineno" > 2464< / span >   : link(link),< / div >
< div class = "line" > < a name = "l02465" > < / a > < span class = "lineno" > 2465< / span >   < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > (< a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ),< / div >
< div class = "line" > < a name = "l02466" > < / a > < span class = "lineno" > 2466< / span >   vehicle_class(vehicle_class),< / div >
< div class = "line" > < a name = "l02467" > < / a > < span class = "lineno" > 2467< / span >   start_depot(start_depot),< / div >
< div class = "line" > < a name = "l02468" > < / a > < span class = "lineno" > 2468< / span >   end_depot(end_depot) {}< / div >
< div class = "line" > < a name = "l02469" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a2b6c85429ae38a687fbffb017cc773b9" > 2469< / a > < / span >   < a class = "code" href = "structoperations__research_1_1_link.html#a2b6c85429ae38a687fbffb017cc773b9" > ~Link< / a > () {}< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02470" > < / a > < span class = "lineno" > 2470< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02471" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a6824c3bafe148ed277f7c1f8013ab022" > 2471< / a > < / span >   std::pair< int, int> < a class = "code" href = "structoperations__research_1_1_link.html#a6824c3bafe148ed277f7c1f8013ab022" > link< / a > ;< / div >
< div class = "line" > < a name = "l02472" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a21edc7ca4cc5802c8779d68556bc09cf" > 2472< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "structoperations__research_1_1_link.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ;< / div >
< div class = "line" > < a name = "l02473" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a1a01a2753d74fedd87264d8bd34a12df" > 2473< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "structoperations__research_1_1_link.html#a1a01a2753d74fedd87264d8bd34a12df" > vehicle_class< / a > ;< / div >
< div class = "line" > < a name = "l02474" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#ae99c447e10fd9e8a300603575183cd64" > 2474< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "structoperations__research_1_1_link.html#ae99c447e10fd9e8a300603575183cd64" > start_depot< / a > ;< / div >
< div class = "line" > < a name = "l02475" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link.html#a985654c31a0a3433b27d0bd14cebb602" > 2475< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "structoperations__research_1_1_link.html#a985654c31a0a3433b27d0bd14cebb602" > end_depot< / a > ;< / div >
< div class = "line" > < a name = "l02476" > < / a > < span class = "lineno" > 2476< / span >   };< / div >
< div class = "line" > < a name = "l02477" > < / a > < span class = "lineno" > 2477< / span >   < / div >
< div class = "line" > < a name = "l02478" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link_sort.html" > 2478< / a > < / span >   < span class = "keyword" > struct < / span > < a class = "code" href = "structoperations__research_1_1_link_sort.html" > LinkSort< / a > {< / div >
< div class = "line" > < a name = "l02479" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_link_sort.html#a3eb6a1704c248c52096ee8f21c911d3a" > 2479< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "structoperations__research_1_1_link_sort.html#a3eb6a1704c248c52096ee8f21c911d3a" > operator()< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_link.html" > Link< / a > & link1, < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_link.html" > Link< / a > & link2)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02480" > < / a > < span class = "lineno" > 2480< / span >   < span class = "keywordflow" > return< / span > (link1.< a class = "code" href = "structoperations__research_1_1_link.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > > link2.< a class = "code" href = "structoperations__research_1_1_link.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > );< / div >
< div class = "line" > < a name = "l02481" > < / a > < span class = "lineno" > 2481< / span >   }< / div >
< div class = "line" > < a name = "l02482" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#aad0164bf7f3d748207f45a47495def06" > 2482< / a > < / span >   } < a class = "code" href = "namespaceoperations__research.html#aad0164bf7f3d748207f45a47495def06" > LinkComparator< / a > ;< / div >
< div class = "line" > < a name = "l02483" > < / a > < span class = "lineno" > 2483< / span >   < / div >
< div class = "line" > < a name = "l02484" > < / a > < span class = "lineno" > 2484< / span >   < span class = "comment" > // The RouteConstructor creates the routes of a VRP instance subject to its< / span > < / div >
< div class = "line" > < a name = "l02485" > < / a > < span class = "lineno" > 2485< / span >   < span class = "comment" > // constraints by iterating on a list of arcs appearing in descending order< / span > < / div >
< div class = "line" > < a name = "l02486" > < / a > < span class = "lineno" > 2486< / span >   < span class = "comment" > // of priority.< / span > < / div >
< div class = "line" > < a name = "l02487" > < / a > < span class = "lineno" > 2487< / span >   < span class = "comment" > // TODO(user): Use the dimension class in this class.< / span > < / div >
< div class = "line" > < a name = "l02488" > < / a > < span class = "lineno" > 2488< / span >   < span class = "comment" > // TODO(user): Add support for vehicle-dependent dimension transits.< / span > < / div >
< div class = "line" > < a name = "l02489" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_route_constructor.html" > 2489< / a > < / span >   < span class = "keyword" > class < / span > < a class = "code" href = "classoperations__research_1_1_route_constructor.html" > RouteConstructor< / a > {< / div >
< div class = "line" > < a name = "l02490" > < / a > < span class = "lineno" > 2490< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l02491" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_route_constructor.html#a47bfb11c6bb18ede9c4d3b92f58d23f3" > 2491< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_route_constructor.html#a47bfb11c6bb18ede9c4d3b92f58d23f3" > RouteConstructor< / a > (< a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < span class = "keyword" > const< / span > assignment, < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ,< / div >
< div class = "line" > < a name = "l02492" > < / a > < span class = "lineno" > 2492< / span >   < span class = "keywordtype" > bool< / span > check_assignment, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > num_indices,< / div >
< div class = "line" > < a name = "l02493" > < / a > < span class = "lineno" > 2493< / span >   < span class = "keyword" > const< / span > std::vector< Link> & links_list)< / div >
< div class = "line" > < a name = "l02494" > < / a > < span class = "lineno" > 2494< / span >   : assignment_(assignment),< / div >
< div class = "line" > < a name = "l02495" > < / a > < span class = "lineno" > 2495< / span >   model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l02496" > < / a > < span class = "lineno" > 2496< / span >   check_assignment_(check_assignment),< / div >
< div class = "line" > < a name = "l02497" > < / a > < span class = "lineno" > 2497< / span >   solver_(model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ()),< / div >
< div class = "line" > < a name = "l02498" > < / a > < span class = "lineno" > 2498< / span >   num_indices_(num_indices),< / div >
< div class = "line" > < a name = "l02499" > < / a > < span class = "lineno" > 2499< / span >   links_list_(links_list),< / div >
< div class = "line" > < a name = "l02500" > < / a > < span class = "lineno" > 2500< / span >   nexts_(model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > ()),< / div >
< div class = "line" > < a name = "l02501" > < / a > < span class = "lineno" > 2501< / span >   in_route_(num_indices_, -1),< / div >
< div class = "line" > < a name = "l02502" > < / a > < span class = "lineno" > 2502< / span >   final_routes_(),< / div >
< div class = "line" > < a name = "l02503" > < / a > < span class = "lineno" > 2503< / span >   index_to_chain_index_(num_indices, -1),< / div >
< div class = "line" > < a name = "l02504" > < / a > < span class = "lineno" > 2504< / span >   index_to_vehicle_class_index_(num_indices, -1) {< / div >
< div class = "line" > < a name = "l02505" > < / a > < span class = "lineno" > 2505< / span >   {< / div >
< div class = "line" > < a name = "l02506" > < / a > < span class = "lineno" > 2506< / span >   < span class = "keyword" > const< / span > std::vector< std::string> dimension_names =< / div >
< div class = "line" > < a name = "l02507" > < / a > < span class = "lineno" > 2507< / span >   model_-> GetAllDimensionNames();< / div >
< div class = "line" > < a name = "l02508" > < / a > < span class = "lineno" > 2508< / span >   dimensions_.assign(dimension_names.size(), < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l02509" > < / a > < span class = "lineno" > 2509< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < dimension_names.size(); ++i) {< / div >
< div class = "line" > < a name = "l02510" > < / a > < span class = "lineno" > 2510< / span >   dimensions_[i] = & model_-> GetDimensionOrDie(dimension_names[i]);< / div >
< div class = "line" > < a name = "l02511" > < / a > < span class = "lineno" > 2511< / span >   }< / div >
< div class = "line" > < a name = "l02512" > < / a > < span class = "lineno" > 2512< / span >   }< / div >
< div class = "line" > < a name = "l02513" > < / a > < span class = "lineno" > 2513< / span >   < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > .resize(dimensions_.size());< / div >
< div class = "line" > < a name = "l02514" > < / a > < span class = "lineno" > 2514< / span >   < span class = "keywordflow" > for< / span > (std::vector< int64> & cumuls : < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > ) {< / div >
< div class = "line" > < a name = "l02515" > < / a > < span class = "lineno" > 2515< / span >   cumuls.resize(num_indices_);< / div >
< div class = "line" > < a name = "l02516" > < / a > < span class = "lineno" > 2516< / span >   }< / div >
< div class = "line" > < a name = "l02517" > < / a > < span class = "lineno" > 2517< / span >   new_possible_cumuls_.resize(dimensions_.size());< / div >
< div class = "line" > < a name = "l02518" > < / a > < span class = "lineno" > 2518< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02519" > < / a > < span class = "lineno" > 2519< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02520" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_route_constructor.html#a0a7e51a3bae37dc4882a6661f78bf91d" > 2520< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_route_constructor.html#a0a7e51a3bae37dc4882a6661f78bf91d" > ~RouteConstructor< / a > () {}< / div >
< div class = "line" > < a name = "l02521" > < / a > < span class = "lineno" > 2521< / span >   < / div >
< div class = "line" > < a name = "l02522" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_route_constructor.html#a9af72b216eb95e320f0f261d9497c5c1" > 2522< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_route_constructor.html#a9af72b216eb95e320f0f261d9497c5c1" > Construct< / a > () {< / div >
< div class = "line" > < a name = "l02523" > < / a > < span class = "lineno" > 2523< / span >   model_-> solver()-> TopPeriodicCheck();< / div >
< div class = "line" > < a name = "l02524" > < / a > < span class = "lineno" > 2524< / span >   < span class = "comment" > // Initial State: Each order is served by its own vehicle.< / span > < / div >
< div class = "line" > < a name = "l02525" > < / a > < span class = "lineno" > 2525< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < num_indices_; ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l02526" > < / a > < span class = "lineno" > 2526< / span >   < span class = "keywordflow" > if< / span > (!model_-> IsStart(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) & & !model_-> IsEnd(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l02527" > < / a > < span class = "lineno" > 2527< / span >   std::vector< int> route(1, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l02528" > < / a > < span class = "lineno" > 2528< / span >   routes_.push_back(route);< / div >
< div class = "line" > < a name = "l02529" > < / a > < span class = "lineno" > 2529< / span >   in_route_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = routes_.size() - 1;< / div >
< div class = "line" > < a name = "l02530" > < / a > < span class = "lineno" > 2530< / span >   }< / div >
< div class = "line" > < a name = "l02531" > < / a > < span class = "lineno" > 2531< / span >   }< / div >
< div class = "line" > < a name = "l02532" > < / a > < span class = "lineno" > 2532< / span >   < / div >
< div class = "line" > < a name = "l02533" > < / a > < span class = "lineno" > 2533< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_link.html" > Link< / a > & link : links_list_) {< / div >
< div class = "line" > < a name = "l02534" > < / a > < span class = "lineno" > 2534< / span >   model_-> solver()-> TopPeriodicCheck();< / div >
< div class = "line" > < a name = "l02535" > < / a > < span class = "lineno" > 2535< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > index1 = link.link.first;< / div >
< div class = "line" > < a name = "l02536" > < / a > < span class = "lineno" > 2536< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > index2 = link.link.second;< / div >
< div class = "line" > < a name = "l02537" > < / a > < span class = "lineno" > 2537< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle_class = link.vehicle_class;< / div >
< div class = "line" > < a name = "l02538" > < / a > < span class = "lineno" > 2538< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_depot = link.start_depot;< / div >
< div class = "line" > < a name = "l02539" > < / a > < span class = "lineno" > 2539< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end_depot = link.end_depot;< / div >
< div class = "line" > < a name = "l02540" > < / a > < span class = "lineno" > 2540< / span >   < / div >
< div class = "line" > < a name = "l02541" > < / a > < span class = "lineno" > 2541< / span >   < span class = "comment" > // Initialisation of cumuls_ if the indices are encountered for first time< / span > < / div >
< div class = "line" > < a name = "l02542" > < / a > < span class = "lineno" > 2542< / span >   < span class = "keywordflow" > if< / span > (index_to_vehicle_class_index_[index1] < 0) {< / div >
< div class = "line" > < a name = "l02543" > < / a > < span class = "lineno" > 2543< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > dimension_index = 0; dimension_index < dimensions_.size();< / div >
< div class = "line" > < a name = "l02544" > < / a > < span class = "lineno" > 2544< / span >   ++dimension_index) {< / div >
< div class = "line" > < a name = "l02545" > < / a > < span class = "lineno" > 2545< / span >   < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][index1] =< / div >
< div class = "line" > < a name = "l02546" > < / a > < span class = "lineno" > 2546< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (dimensions_[dimension_index]-> GetTransitValue(< / div >
< div class = "line" > < a name = "l02547" > < / a > < span class = "lineno" > 2547< / span >   start_depot, index1, 0),< / div >
< div class = "line" > < a name = "l02548" > < / a > < span class = "lineno" > 2548< / span >   dimensions_[dimension_index]-> CumulVar(index1)-> Min());< / div >
< div class = "line" > < a name = "l02549" > < / a > < span class = "lineno" > 2549< / span >   }< / div >
< div class = "line" > < a name = "l02550" > < / a > < span class = "lineno" > 2550< / span >   }< / div >
< div class = "line" > < a name = "l02551" > < / a > < span class = "lineno" > 2551< / span >   < span class = "keywordflow" > if< / span > (index_to_vehicle_class_index_[index2] < 0) {< / div >
< div class = "line" > < a name = "l02552" > < / a > < span class = "lineno" > 2552< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > dimension_index = 0; dimension_index < dimensions_.size();< / div >
< div class = "line" > < a name = "l02553" > < / a > < span class = "lineno" > 2553< / span >   ++dimension_index) {< / div >
< div class = "line" > < a name = "l02554" > < / a > < span class = "lineno" > 2554< / span >   < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][index2] =< / div >
< div class = "line" > < a name = "l02555" > < / a > < span class = "lineno" > 2555< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (dimensions_[dimension_index]-> GetTransitValue(< / div >
< div class = "line" > < a name = "l02556" > < / a > < span class = "lineno" > 2556< / span >   start_depot, index2, 0),< / div >
< div class = "line" > < a name = "l02557" > < / a > < span class = "lineno" > 2557< / span >   dimensions_[dimension_index]-> CumulVar(index2)-> Min());< / div >
< div class = "line" > < a name = "l02558" > < / a > < span class = "lineno" > 2558< / span >   }< / div >
< div class = "line" > < a name = "l02559" > < / a > < span class = "lineno" > 2559< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02560" > < / a > < span class = "lineno" > 2560< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02561" > < / a > < span class = "lineno" > 2561< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > route_index1 = in_route_[index1];< / div >
< div class = "line" > < a name = "l02562" > < / a > < span class = "lineno" > 2562< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > route_index2 = in_route_[index2];< / div >
< div class = "line" > < a name = "l02563" > < / a > < span class = "lineno" > 2563< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > merge =< / div >
< div class = "line" > < a name = "l02564" > < / a > < span class = "lineno" > 2564< / span >   route_index1 > = 0 & & route_index2 > = 0 & & < / div >
< div class = "line" > < a name = "l02565" > < / a > < span class = "lineno" > 2565< / span >   FeasibleMerge(routes_[route_index1], routes_[route_index2], index1,< / div >
< div class = "line" > < a name = "l02566" > < / a > < span class = "lineno" > 2566< / span >   index2, route_index1, route_index2, vehicle_class,< / div >
< div class = "line" > < a name = "l02567" > < / a > < span class = "lineno" > 2567< / span >   start_depot, end_depot);< / div >
< div class = "line" > < a name = "l02568" > < / a > < span class = "lineno" > 2568< / span >   < span class = "keywordflow" > if< / span > (Merge(merge, route_index1, route_index2)) {< / div >
< div class = "line" > < a name = "l02569" > < / a > < span class = "lineno" > 2569< / span >   index_to_vehicle_class_index_[index1] = vehicle_class;< / div >
< div class = "line" > < a name = "l02570" > < / a > < span class = "lineno" > 2570< / span >   index_to_vehicle_class_index_[index2] = vehicle_class;< / div >
< div class = "line" > < a name = "l02571" > < / a > < span class = "lineno" > 2571< / span >   }< / div >
< div class = "line" > < a name = "l02572" > < / a > < span class = "lineno" > 2572< / span >   }< / div >
< div class = "line" > < a name = "l02573" > < / a > < span class = "lineno" > 2573< / span >   < / div >
< div class = "line" > < a name = "l02574" > < / a > < span class = "lineno" > 2574< / span >   model_-> solver()-> TopPeriodicCheck();< / div >
< div class = "line" > < a name = "l02575" > < / a > < span class = "lineno" > 2575< / span >   < span class = "comment" > // Beyond this point not checking limits anymore as the rest of the code is< / span > < / div >
< div class = "line" > < a name = "l02576" > < / a > < span class = "lineno" > 2576< / span >   < span class = "comment" > // linear and that given we managed to build a solution would be stupid to< / span > < / div >
< div class = "line" > < a name = "l02577" > < / a > < span class = "lineno" > 2577< / span >   < span class = "comment" > // drop it now.< / span > < / div >
< div class = "line" > < a name = "l02578" > < / a > < span class = "lineno" > 2578< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > chain_index = 0; chain_index < chains_.size(); ++chain_index) {< / div >
< div class = "line" > < a name = "l02579" > < / a > < span class = "lineno" > 2579< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (deleted_chains_, chain_index)) {< / div >
< div class = "line" > < a name = "l02580" > < / a > < span class = "lineno" > 2580< / span >   final_chains_.push_back(chains_[chain_index]);< / div >
< div class = "line" > < a name = "l02581" > < / a > < span class = "lineno" > 2581< / span >   }< / div >
< div class = "line" > < a name = "l02582" > < / a > < span class = "lineno" > 2582< / span >   }< / div >
< div class = "line" > < a name = "l02583" > < / a > < span class = "lineno" > 2583< / span >   std::sort(final_chains_.begin(), final_chains_.end(), ChainComparator);< / div >
< div class = "line" > < a name = "l02584" > < / a > < span class = "lineno" > 2584< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > route_index = 0; route_index < routes_.size(); ++route_index) {< / div >
< div class = "line" > < a name = "l02585" > < / a > < span class = "lineno" > 2585< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (deleted_routes_, route_index)) {< / div >
< div class = "line" > < a name = "l02586" > < / a > < span class = "lineno" > 2586< / span >   final_routes_.push_back(routes_[route_index]);< / div >
< div class = "line" > < a name = "l02587" > < / a > < span class = "lineno" > 2587< / span >   }< / div >
< div class = "line" > < a name = "l02588" > < / a > < span class = "lineno" > 2588< / span >   }< / div >
< div class = "line" > < a name = "l02589" > < / a > < span class = "lineno" > 2589< / span >   std::sort(final_routes_.begin(), final_routes_.end(), RouteComparator);< / div >
< div class = "line" > < a name = "l02590" > < / a > < span class = "lineno" > 2590< / span >   < / div >
< div class = "line" > < a name = "l02591" > < / a > < span class = "lineno" > 2591< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > extra_vehicles = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< / div >
< div class = "line" > < a name = "l02592" > < / a > < span class = "lineno" > 2592< / span >   0, < span class = "keyword" > static_cast< < / span > < span class = "keywordtype" > int< / span > < span class = "keyword" > > < / span > (final_chains_.size()) - model_-> vehicles());< / div >
< div class = "line" > < a name = "l02593" > < / a > < span class = "lineno" > 2593< / span >   < span class = "comment" > // Bind the Start and End of each chain< / span > < / div >
< div class = "line" > < a name = "l02594" > < / a > < span class = "lineno" > 2594< / span >   < span class = "keywordtype" > int< / span > chain_index = 0;< / div >
< div class = "line" > < a name = "l02595" > < / a > < span class = "lineno" > 2595< / span >   < span class = "keywordflow" > for< / span > (chain_index = extra_vehicles; chain_index < final_chains_.size();< / div >
< div class = "line" > < a name = "l02596" > < / a > < span class = "lineno" > 2596< / span >   ++chain_index) {< / div >
< div class = "line" > < a name = "l02597" > < / a > < span class = "lineno" > 2597< / span >   < span class = "keywordflow" > if< / span > (chain_index - extra_vehicles > = model_-> vehicles()) {< / div >
< div class = "line" > < a name = "l02598" > < / a > < span class = "lineno" > 2598< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l02599" > < / a > < span class = "lineno" > 2599< / span >   }< / div >
< div class = "line" > < a name = "l02600" > < / a > < span class = "lineno" > 2600< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start = final_chains_[chain_index].head;< / div >
< div class = "line" > < a name = "l02601" > < / a > < span class = "lineno" > 2601< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > end = final_chains_[chain_index].tail;< / div >
< div class = "line" > < a name = "l02602" > < / a > < span class = "lineno" > 2602< / span >   assignment_-> Add(< / div >
< div class = "line" > < a name = "l02603" > < / a > < span class = "lineno" > 2603< / span >   model_-> NextVar(model_-> Start(chain_index - extra_vehicles)));< / div >
< div class = "line" > < a name = "l02604" > < / a > < span class = "lineno" > 2604< / span >   assignment_-> SetValue(< / div >
< div class = "line" > < a name = "l02605" > < / a > < span class = "lineno" > 2605< / span >   model_-> NextVar(model_-> Start(chain_index - extra_vehicles)), start);< / div >
< div class = "line" > < a name = "l02606" > < / a > < span class = "lineno" > 2606< / span >   assignment_-> Add(nexts_[end]);< / div >
< div class = "line" > < a name = "l02607" > < / a > < span class = "lineno" > 2607< / span >   assignment_-> SetValue(nexts_[end],< / div >
< div class = "line" > < a name = "l02608" > < / a > < span class = "lineno" > 2608< / span >   model_-> End(chain_index - extra_vehicles));< / div >
< div class = "line" > < a name = "l02609" > < / a > < span class = "lineno" > 2609< / span >   }< / div >
< div class = "line" > < a name = "l02610" > < / a > < span class = "lineno" > 2610< / span >   < / div >
< div class = "line" > < a name = "l02611" > < / a > < span class = "lineno" > 2611< / span >   < span class = "comment" > // Create the single order routes< / span > < / div >
< div class = "line" > < a name = "l02612" > < / a > < span class = "lineno" > 2612< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > route_index = 0; route_index < final_routes_.size();< / div >
< div class = "line" > < a name = "l02613" > < / a > < span class = "lineno" > 2613< / span >   ++route_index) {< / div >
< div class = "line" > < a name = "l02614" > < / a > < span class = "lineno" > 2614< / span >   < span class = "keywordflow" > if< / span > (chain_index - extra_vehicles > = model_-> vehicles()) {< / div >
< div class = "line" > < a name = "l02615" > < / a > < span class = "lineno" > 2615< / span >   < span class = "keywordflow" > break< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02616" > < / a > < span class = "lineno" > 2616< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02617" > < / a > < span class = "lineno" > 2617< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (route_index, final_routes_.size());< / div >
< div class = "line" > < a name = "l02618" > < / a > < span class = "lineno" > 2618< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > = final_routes_[route_index].front();< / div >
< div class = "line" > < a name = "l02619" > < / a > < span class = "lineno" > 2619< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > = final_routes_[route_index].back();< / div >
< div class = "line" > < a name = "l02620" > < / a > < span class = "lineno" > 2620< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > == < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > & & head < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ()) {< / div >
< div class = "line" > < a name = "l02621" > < / a > < span class = "lineno" > 2621< / span >   assignment_-> Add(< / div >
< div class = "line" > < a name = "l02622" > < / a > < span class = "lineno" > 2622< / span >   model_-> NextVar(model_-> Start(chain_index - extra_vehicles)));< / div >
< div class = "line" > < a name = "l02623" > < / a > < span class = "lineno" > 2623< / span >   assignment_-> SetValue(< / div >
< div class = "line" > < a name = "l02624" > < / a > < span class = "lineno" > 2624< / span >   model_-> NextVar(model_-> Start(chain_index - extra_vehicles)), < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > );< / div >
< div class = "line" > < a name = "l02625" > < / a > < span class = "lineno" > 2625< / span >   assignment_-> Add(nexts_[< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ]);< / div >
< div class = "line" > < a name = "l02626" > < / a > < span class = "lineno" > 2626< / span >   assignment_-> SetValue(nexts_[< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ],< / div >
< div class = "line" > < a name = "l02627" > < / a > < span class = "lineno" > 2627< / span >   model_-> End(chain_index - extra_vehicles));< / div >
< div class = "line" > < a name = "l02628" > < / a > < span class = "lineno" > 2628< / span >   ++chain_index;< / div >
< div class = "line" > < a name = "l02629" > < / a > < span class = "lineno" > 2629< / span >   }< / div >
< div class = "line" > < a name = "l02630" > < / a > < span class = "lineno" > 2630< / span >   }< / div >
< div class = "line" > < a name = "l02631" > < / a > < span class = "lineno" > 2631< / span >   < / div >
< div class = "line" > < a name = "l02632" > < / a > < span class = "lineno" > 2632< / span >   < span class = "comment" > // Unperformed< / span > < / div >
< div class = "line" > < a name = "l02633" > < / a > < span class = "lineno" > 2633< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < model_-> Size(); ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l02634" > < / a > < span class = "lineno" > 2634< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > = nexts_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l02635" > < / a > < span class = "lineno" > 2635< / span >   < span class = "keywordflow" > if< / span > (!assignment_-> Contains(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > )) {< / div >
< div class = "line" > < a name = "l02636" > < / a > < span class = "lineno" > 2636< / span >   assignment_-> Add(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > );< / div >
< div class = "line" > < a name = "l02637" > < / a > < span class = "lineno" > 2637< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > -> Contains(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l02638" > < / a > < span class = "lineno" > 2638< / span >   assignment_-> SetValue(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l02639" > < / a > < span class = "lineno" > 2639< / span >   }< / div >
< div class = "line" > < a name = "l02640" > < / a > < span class = "lineno" > 2640< / span >   }< / div >
< div class = "line" > < a name = "l02641" > < / a > < span class = "lineno" > 2641< / span >   }< / div >
< div class = "line" > < a name = "l02642" > < / a > < span class = "lineno" > 2642< / span >   }< / div >
< div class = "line" > < a name = "l02643" > < / a > < span class = "lineno" > 2643< / span >   < / div >
< div class = "line" > < a name = "l02644" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_route_constructor.html#acffbbc021acff5d6f60c3985dfe716b0" > 2644< / a > < / span >   < span class = "keyword" > const< / span > std::vector< std::vector< int> > & < a class = "code" href = "classoperations__research_1_1_route_constructor.html#acffbbc021acff5d6f60c3985dfe716b0" > final_routes< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02645" > < / a > < span class = "lineno" > 2645< / span >   < span class = "keywordflow" > return< / span > final_routes_;< / div >
< div class = "line" > < a name = "l02646" > < / a > < span class = "lineno" > 2646< / span >   }< / div >
< div class = "line" > < a name = "l02647" > < / a > < span class = "lineno" > 2647< / span >   < / div >
< div class = "line" > < a name = "l02648" > < / a > < span class = "lineno" > 2648< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l02649" > < / a > < span class = "lineno" > 2649< / span >   < span class = "keyword" > enum< / span > MergeStatus { FIRST_SECOND, SECOND_FIRST, NO_MERGE };< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02650" > < / a > < span class = "lineno" > 2650< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02651" > < / a > < span class = "lineno" > 2651< / span >   < span class = "keyword" > struct < / span > RouteSort {< / div >
< div class = "line" > < a name = "l02652" > < / a > < span class = "lineno" > 2652< / span >   < span class = "keywordtype" > bool< / span > operator()(< span class = "keyword" > const< / span > std::vector< int> & route1,< / div >
< div class = "line" > < a name = "l02653" > < / a > < span class = "lineno" > 2653< / span >   < span class = "keyword" > const< / span > std::vector< int> & route2)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02654" > < / a > < span class = "lineno" > 2654< / span >   < span class = "keywordflow" > return< / span > (route1.size() < route2.size());< / div >
< div class = "line" > < a name = "l02655" > < / a > < span class = "lineno" > 2655< / span >   }< / div >
< div class = "line" > < a name = "l02656" > < / a > < span class = "lineno" > 2656< / span >   } RouteComparator;< / div >
< div class = "line" > < a name = "l02657" > < / a > < span class = "lineno" > 2657< / span >   < / div >
< div class = "line" > < a name = "l02658" > < / a > < span class = "lineno" > 2658< / span >   < span class = "keyword" > struct < / span > Chain {< / div >
< div class = "line" > < a name = "l02659" > < / a > < span class = "lineno" > 2659< / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > ;< / div >
< div class = "line" > < a name = "l02660" > < / a > < span class = "lineno" > 2660< / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ;< / div >
< div class = "line" > < a name = "l02661" > < / a > < span class = "lineno" > 2661< / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0f38add802397fef1f57b7d90ccd5aef" > nodes< / a > ;< / div >
< div class = "line" > < a name = "l02662" > < / a > < span class = "lineno" > 2662< / span >   };< / div >
< div class = "line" > < a name = "l02663" > < / a > < span class = "lineno" > 2663< / span >   < / div >
< div class = "line" > < a name = "l02664" > < / a > < span class = "lineno" > 2664< / span >   < span class = "keyword" > struct < / span > ChainSort {< / div >
< div class = "line" > < a name = "l02665" > < / a > < span class = "lineno" > 2665< / span >   < span class = "keywordtype" > bool< / span > operator()(< span class = "keyword" > const< / span > Chain& chain1, < span class = "keyword" > const< / span > Chain& chain2)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02666" > < / a > < span class = "lineno" > 2666< / span >   < span class = "keywordflow" > return< / span > (chain1.nodes < chain2.nodes);< / div >
< div class = "line" > < a name = "l02667" > < / a > < span class = "lineno" > 2667< / span >   }< / div >
< div class = "line" > < a name = "l02668" > < / a > < span class = "lineno" > 2668< / span >   } ChainComparator;< / div >
< div class = "line" > < a name = "l02669" > < / a > < span class = "lineno" > 2669< / span >   < / div >
< div class = "line" > < a name = "l02670" > < / a > < span class = "lineno" > 2670< / span >   < span class = "keywordtype" > bool< / span > Head(< span class = "keywordtype" > int< / span > node)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02671" > < / a > < span class = "lineno" > 2671< / span >   < span class = "keywordflow" > return< / span > (node == routes_[in_route_[node]].front());< / div >
< div class = "line" > < a name = "l02672" > < / a > < span class = "lineno" > 2672< / span >   }< / div >
< div class = "line" > < a name = "l02673" > < / a > < span class = "lineno" > 2673< / span >   < / div >
< div class = "line" > < a name = "l02674" > < / a > < span class = "lineno" > 2674< / span >   < span class = "keywordtype" > bool< / span > Tail(< span class = "keywordtype" > int< / span > node)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02675" > < / a > < span class = "lineno" > 2675< / span >   < span class = "keywordflow" > return< / span > (node == routes_[in_route_[node]].back());< / div >
< div class = "line" > < a name = "l02676" > < / a > < span class = "lineno" > 2676< / span >   }< / div >
< div class = "line" > < a name = "l02677" > < / a > < span class = "lineno" > 2677< / span >   < / div >
< div class = "line" > < a name = "l02678" > < / a > < span class = "lineno" > 2678< / span >   < span class = "keywordtype" > bool< / span > FeasibleRoute(< span class = "keyword" > const< / span > std::vector< int> & route, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > route_cumul,< / div >
< div class = "line" > < a name = "l02679" > < / a > < span class = "lineno" > 2679< / span >   < span class = "keywordtype" > int< / span > dimension_index) {< / div >
< div class = "line" > < a name = "l02680" > < / a > < span class = "lineno" > 2680< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > & dimension = *dimensions_[dimension_index];< / div >
< div class = "line" > < a name = "l02681" > < / a > < span class = "lineno" > 2681< / span >   std::vector< int> ::const_iterator it = route.begin();< / div >
< div class = "line" > < a name = "l02682" > < / a > < span class = "lineno" > 2682< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > cumul = route_cumul;< / div >
< div class = "line" > < a name = "l02683" > < / a > < span class = "lineno" > 2683< / span >   < span class = "keywordflow" > while< / span > (it != route.end()) {< / div >
< div class = "line" > < a name = "l02684" > < / a > < span class = "lineno" > 2684< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > previous = *it;< / div >
< div class = "line" > < a name = "l02685" > < / a > < span class = "lineno" > 2685< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > cumul_previous = cumul;< / div >
< div class = "line" > < a name = "l02686" > < / a > < span class = "lineno" > 2686< / span >   < a class = "code" href = "namespacegtl.html#a5c0d4dea208db4deaa285c06b78d8181" > gtl::InsertOrDie< / a > (& (new_possible_cumuls_[dimension_index]), previous,< / div >
< div class = "line" > < a name = "l02687" > < / a > < span class = "lineno" > 2687< / span >   cumul_previous);< / div >
< div class = "line" > < a name = "l02688" > < / a > < span class = "lineno" > 2688< / span >   ++it;< / div >
< div class = "line" > < a name = "l02689" > < / a > < span class = "lineno" > 2689< / span >   < span class = "keywordflow" > if< / span > (it == route.end()) {< / div >
< div class = "line" > < a name = "l02690" > < / a > < span class = "lineno" > 2690< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02691" > < / a > < span class = "lineno" > 2691< / span >   }< / div >
< div class = "line" > < a name = "l02692" > < / a > < span class = "lineno" > 2692< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > = *it;< / div >
< div class = "line" > < a name = "l02693" > < / a > < span class = "lineno" > 2693< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > available_from_previous =< / div >
< div class = "line" > < a name = "l02694" > < / a > < span class = "lineno" > 2694< / span >   cumul_previous + dimension.GetTransitValue(previous, < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > , 0);< / div >
< div class = "line" > < a name = "l02695" > < / a > < span class = "lineno" > 2695< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > available_cumul_next =< / div >
< div class = "line" > < a name = "l02696" > < / a > < span class = "lineno" > 2696< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > ], available_from_previous);< / div >
< div class = "line" > < a name = "l02697" > < / a > < span class = "lineno" > 2697< / span >   < / div >
< div class = "line" > < a name = "l02698" > < / a > < span class = "lineno" > 2698< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack = available_cumul_next - available_from_previous;< / div >
< div class = "line" > < a name = "l02699" > < / a > < span class = "lineno" > 2699< / span >   < span class = "keywordflow" > if< / span > (slack > dimension.SlackVar(previous)-> Max()) {< / div >
< div class = "line" > < a name = "l02700" > < / a > < span class = "lineno" > 2700< / span >   available_cumul_next =< / div >
< div class = "line" > < a name = "l02701" > < / a > < span class = "lineno" > 2701< / span >   available_from_previous + dimension.SlackVar(previous)-> Max();< / div >
< div class = "line" > < a name = "l02702" > < / a > < span class = "lineno" > 2702< / span >   }< / div >
< div class = "line" > < a name = "l02703" > < / a > < span class = "lineno" > 2703< / span >   < / div >
< div class = "line" > < a name = "l02704" > < / a > < span class = "lineno" > 2704< / span >   < span class = "keywordflow" > if< / span > (available_cumul_next > dimension.CumulVar(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > )-> Max()) {< / div >
< div class = "line" > < a name = "l02705" > < / a > < span class = "lineno" > 2705< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02706" > < / a > < span class = "lineno" > 2706< / span >   }< / div >
< div class = "line" > < a name = "l02707" > < / a > < span class = "lineno" > 2707< / span >   < span class = "keywordflow" > if< / span > (available_cumul_next < = < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > ]) {< / div >
< div class = "line" > < a name = "l02708" > < / a > < span class = "lineno" > 2708< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02709" > < / a > < span class = "lineno" > 2709< / span >   }< / div >
< div class = "line" > < a name = "l02710" > < / a > < span class = "lineno" > 2710< / span >   cumul = available_cumul_next;< / div >
< div class = "line" > < a name = "l02711" > < / a > < span class = "lineno" > 2711< / span >   }< / div >
< div class = "line" > < a name = "l02712" > < / a > < span class = "lineno" > 2712< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02713" > < / a > < span class = "lineno" > 2713< / span >   }< / div >
< div class = "line" > < a name = "l02714" > < / a > < span class = "lineno" > 2714< / span >   < / div >
< div class = "line" > < a name = "l02715" > < / a > < span class = "lineno" > 2715< / span >   < span class = "keywordtype" > bool< / span > CheckRouteConnection(< span class = "keyword" > const< / span > std::vector< int> & route1,< / div >
< div class = "line" > < a name = "l02716" > < / a > < span class = "lineno" > 2716< / span >   < span class = "keyword" > const< / span > std::vector< int> & route2, < span class = "keywordtype" > int< / span > dimension_index,< / div >
< div class = "line" > < a name = "l02717" > < / a > < span class = "lineno" > 2717< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_depot, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end_depot) {< / div >
< div class = "line" > < a name = "l02718" > < / a > < span class = "lineno" > 2718< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > tail1 = route1.back();< / div >
< div class = "line" > < a name = "l02719" > < / a > < span class = "lineno" > 2719< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > head2 = route2.front();< / div >
< div class = "line" > < a name = "l02720" > < / a > < span class = "lineno" > 2720< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > tail2 = route2.back();< / div >
< div class = "line" > < a name = "l02721" > < / a > < span class = "lineno" > 2721< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > & dimension = *dimensions_[dimension_index];< / div >
< div class = "line" > < a name = "l02722" > < / a > < span class = "lineno" > 2722< / span >   < span class = "keywordtype" > int< / span > non_depot_node = -1;< / div >
< div class = "line" > < a name = "l02723" > < / a > < span class = "lineno" > 2723< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node = 0; node < num_indices_; ++node) {< / div >
< div class = "line" > < a name = "l02724" > < / a > < span class = "lineno" > 2724< / span >   < span class = "keywordflow" > if< / span > (!model_-> IsStart(node) & & !model_-> IsEnd(node)) {< / div >
< div class = "line" > < a name = "l02725" > < / a > < span class = "lineno" > 2725< / span >   non_depot_node = node;< / div >
< div class = "line" > < a name = "l02726" > < / a > < span class = "lineno" > 2726< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l02727" > < / a > < span class = "lineno" > 2727< / span >   }< / div >
< div class = "line" > < a name = "l02728" > < / a > < span class = "lineno" > 2728< / span >   }< / div >
< div class = "line" > < a name = "l02729" > < / a > < span class = "lineno" > 2729< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (non_depot_node, 0);< / div >
< div class = "line" > < a name = "l02730" > < / a > < span class = "lineno" > 2730< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > depot_threshold =< / div >
< div class = "line" > < a name = "l02731" > < / a > < span class = "lineno" > 2731< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (dimension.SlackVar(non_depot_node)-> Max(),< / div >
< div class = "line" > < a name = "l02732" > < / a > < span class = "lineno" > 2732< / span >   dimension.CumulVar(non_depot_node)-> Max());< / div >
< div class = "line" > < a name = "l02733" > < / a > < span class = "lineno" > 2733< / span >   < / div >
< div class = "line" > < a name = "l02734" > < / a > < span class = "lineno" > 2734< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > available_from_tail1 = < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][tail1] +< / div >
< div class = "line" > < a name = "l02735" > < / a > < span class = "lineno" > 2735< / span >   dimension.GetTransitValue(tail1, head2, 0);< / div >
< div class = "line" > < a name = "l02736" > < / a > < span class = "lineno" > 2736< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_available_cumul_head2 =< / div >
< div class = "line" > < a name = "l02737" > < / a > < span class = "lineno" > 2737< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][head2], available_from_tail1);< / div >
< div class = "line" > < a name = "l02738" > < / a > < span class = "lineno" > 2738< / span >   < / div >
< div class = "line" > < a name = "l02739" > < / a > < span class = "lineno" > 2739< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack = new_available_cumul_head2 - available_from_tail1;< / div >
< div class = "line" > < a name = "l02740" > < / a > < span class = "lineno" > 2740< / span >   < span class = "keywordflow" > if< / span > (slack > dimension.SlackVar(tail1)-> Max()) {< / div >
< div class = "line" > < a name = "l02741" > < / a > < span class = "lineno" > 2741< / span >   new_available_cumul_head2 =< / div >
< div class = "line" > < a name = "l02742" > < / a > < span class = "lineno" > 2742< / span >   available_from_tail1 + dimension.SlackVar(tail1)-> Max();< / div >
< div class = "line" > < a name = "l02743" > < / a > < span class = "lineno" > 2743< / span >   }< / div >
< div class = "line" > < a name = "l02744" > < / a > < span class = "lineno" > 2744< / span >   < / div >
< div class = "line" > < a name = "l02745" > < / a > < span class = "lineno" > 2745< / span >   < span class = "keywordtype" > bool< / span > feasible_route = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02746" > < / a > < span class = "lineno" > 2746< / span >   < span class = "keywordflow" > if< / span > (new_available_cumul_head2 > dimension.CumulVar(head2)-> Max()) {< / div >
< div class = "line" > < a name = "l02747" > < / a > < span class = "lineno" > 2747< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02748" > < / a > < span class = "lineno" > 2748< / span >   }< / div >
< div class = "line" > < a name = "l02749" > < / a > < span class = "lineno" > 2749< / span >   < span class = "keywordflow" > if< / span > (new_available_cumul_head2 < = < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][head2]) {< / div >
< div class = "line" > < a name = "l02750" > < / a > < span class = "lineno" > 2750< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l02751" > < / a > < span class = "lineno" > 2751< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l02752" > < / a > < span class = "lineno" > 2752< / span >   < / div >
< div class = "line" > < a name = "l02753" > < / a > < span class = "lineno" > 2753< / span >   feasible_route =< / div >
< div class = "line" > < a name = "l02754" > < / a > < span class = "lineno" > 2754< / span >   FeasibleRoute(route2, new_available_cumul_head2, dimension_index);< / div >
< div class = "line" > < a name = "l02755" > < / a > < span class = "lineno" > 2755< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > new_possible_cumul_tail2 =< / div >
< div class = "line" > < a name = "l02756" > < / a > < span class = "lineno" > 2756< / span >   < a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (new_possible_cumuls_[dimension_index], tail2)< / div >
< div class = "line" > < a name = "l02757" > < / a > < span class = "lineno" > 2757< / span >   ? new_possible_cumuls_[dimension_index][tail2]< / div >
< div class = "line" > < a name = "l02758" > < / a > < span class = "lineno" > 2758< / span >   : < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][tail2];< / div >
< div class = "line" > < a name = "l02759" > < / a > < span class = "lineno" > 2759< / span >   < / div >
< div class = "line" > < a name = "l02760" > < / a > < span class = "lineno" > 2760< / span >   < span class = "keywordflow" > if< / span > (!feasible_route || (new_possible_cumul_tail2 +< / div >
< div class = "line" > < a name = "l02761" > < / a > < span class = "lineno" > 2761< / span >   dimension.GetTransitValue(tail2, end_depot, 0) > < / div >
< div class = "line" > < a name = "l02762" > < / a > < span class = "lineno" > 2762< / span >   depot_threshold)) {< / div >
< div class = "line" > < a name = "l02763" > < / a > < span class = "lineno" > 2763< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02764" > < / a > < span class = "lineno" > 2764< / span >   }< / div >
< div class = "line" > < a name = "l02765" > < / a > < span class = "lineno" > 2765< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02766" > < / a > < span class = "lineno" > 2766< / span >   }< / div >
< div class = "line" > < a name = "l02767" > < / a > < span class = "lineno" > 2767< / span >   < / div >
< div class = "line" > < a name = "l02768" > < / a > < span class = "lineno" > 2768< / span >   < span class = "keywordtype" > bool< / span > FeasibleMerge(< span class = "keyword" > const< / span > std::vector< int> & route1,< / div >
< div class = "line" > < a name = "l02769" > < / a > < span class = "lineno" > 2769< / span >   < span class = "keyword" > const< / span > std::vector< int> & route2, < span class = "keywordtype" > int< / span > node1, < span class = "keywordtype" > int< / span > node2,< / div >
< div class = "line" > < a name = "l02770" > < / a > < span class = "lineno" > 2770< / span >   < span class = "keywordtype" > int< / span > route_index1, < span class = "keywordtype" > int< / span > route_index2, < span class = "keywordtype" > int< / span > vehicle_class,< / div >
< div class = "line" > < a name = "l02771" > < / a > < span class = "lineno" > 2771< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_depot, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > end_depot) {< / div >
< div class = "line" > < a name = "l02772" > < / a > < span class = "lineno" > 2772< / span >   < span class = "keywordflow" > if< / span > ((route_index1 == route_index2) || !(Tail(node1) & & Head(node2))) {< / div >
< div class = "line" > < a name = "l02773" > < / a > < span class = "lineno" > 2773< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02774" > < / a > < span class = "lineno" > 2774< / span >   }< / div >
< div class = "line" > < a name = "l02775" > < / a > < span class = "lineno" > 2775< / span >   < / div >
< div class = "line" > < a name = "l02776" > < / a > < span class = "lineno" > 2776< / span >   < span class = "comment" > // Vehicle Class Check< / span > < / div >
< div class = "line" > < a name = "l02777" > < / a > < span class = "lineno" > 2777< / span >   < span class = "keywordflow" > if< / span > (!((index_to_vehicle_class_index_[node1] == -1 & & < / div >
< div class = "line" > < a name = "l02778" > < / a > < span class = "lineno" > 2778< / span >   index_to_vehicle_class_index_[node2] == -1) ||< / div >
< div class = "line" > < a name = "l02779" > < / a > < span class = "lineno" > 2779< / span >   (index_to_vehicle_class_index_[node1] == vehicle_class & & < / div >
< div class = "line" > < a name = "l02780" > < / a > < span class = "lineno" > 2780< / span >   index_to_vehicle_class_index_[node2] == -1) ||< / div >
< div class = "line" > < a name = "l02781" > < / a > < span class = "lineno" > 2781< / span >   (index_to_vehicle_class_index_[node1] == -1 & & < / div >
< div class = "line" > < a name = "l02782" > < / a > < span class = "lineno" > 2782< / span >   index_to_vehicle_class_index_[node2] == vehicle_class) ||< / div >
< div class = "line" > < a name = "l02783" > < / a > < span class = "lineno" > 2783< / span >   (index_to_vehicle_class_index_[node1] == vehicle_class & & < / div >
< div class = "line" > < a name = "l02784" > < / a > < span class = "lineno" > 2784< / span >   index_to_vehicle_class_index_[node2] == vehicle_class))) {< / div >
< div class = "line" > < a name = "l02785" > < / a > < span class = "lineno" > 2785< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02786" > < / a > < span class = "lineno" > 2786< / span >   }< / div >
< div class = "line" > < a name = "l02787" > < / a > < span class = "lineno" > 2787< / span >   < / div >
< div class = "line" > < a name = "l02788" > < / a > < span class = "lineno" > 2788< / span >   < span class = "comment" > // Check Route1 -> Route2 connection for every dimension< / span > < / div >
< div class = "line" > < a name = "l02789" > < / a > < span class = "lineno" > 2789< / span >   < span class = "keywordtype" > bool< / span > merge = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02790" > < / a > < span class = "lineno" > 2790< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > dimension_index = 0; dimension_index < dimensions_.size();< / div >
< div class = "line" > < a name = "l02791" > < / a > < span class = "lineno" > 2791< / span >   ++dimension_index) {< / div >
< div class = "line" > < a name = "l02792" > < / a > < span class = "lineno" > 2792< / span >   new_possible_cumuls_[dimension_index].clear();< / div >
< div class = "line" > < a name = "l02793" > < / a > < span class = "lineno" > 2793< / span >   merge = merge & & CheckRouteConnection(route1, route2, dimension_index,< / div >
< div class = "line" > < a name = "l02794" > < / a > < span class = "lineno" > 2794< / span >   start_depot, end_depot);< / div >
< div class = "line" > < a name = "l02795" > < / a > < span class = "lineno" > 2795< / span >   < span class = "keywordflow" > if< / span > (!merge) {< / div >
< div class = "line" > < a name = "l02796" > < / a > < span class = "lineno" > 2796< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02797" > < / a > < span class = "lineno" > 2797< / span >   }< / div >
< div class = "line" > < a name = "l02798" > < / a > < span class = "lineno" > 2798< / span >   }< / div >
< div class = "line" > < a name = "l02799" > < / a > < span class = "lineno" > 2799< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02800" > < / a > < span class = "lineno" > 2800< / span >   }< / div >
< div class = "line" > < a name = "l02801" > < / a > < span class = "lineno" > 2801< / span >   < / div >
< div class = "line" > < a name = "l02802" > < / a > < span class = "lineno" > 2802< / span >   < span class = "keywordtype" > bool< / span > CheckTempAssignment(Assignment* < span class = "keyword" > const< / span > temp_assignment,< / div >
< div class = "line" > < a name = "l02803" > < / a > < span class = "lineno" > 2803< / span >   < span class = "keywordtype" > int< / span > new_chain_index, < span class = "keywordtype" > int< / span > old_chain_index, < span class = "keywordtype" > int< / span > head1,< / div >
< div class = "line" > < a name = "l02804" > < / a > < span class = "lineno" > 2804< / span >   < span class = "keywordtype" > int< / span > tail1, < span class = "keywordtype" > int< / span > head2, < span class = "keywordtype" > int< / span > tail2) {< / div >
< div class = "line" > < a name = "l02805" > < / a > < span class = "lineno" > 2805< / span >   < span class = "comment" > // TODO(user): If the chain index is greater than the number of vehicles,< / span > < / div >
< div class = "line" > < a name = "l02806" > < / a > < span class = "lineno" > 2806< / span >   < span class = "comment" > // use another vehicle instead.< / span > < / div >
< div class = "line" > < a name = "l02807" > < / a > < span class = "lineno" > 2807< / span >   < span class = "keywordflow" > if< / span > (new_chain_index > = model_-> vehicles()) < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02808" > < / a > < span class = "lineno" > 2808< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start = head1;< / div >
< div class = "line" > < a name = "l02809" > < / a > < span class = "lineno" > 2809< / span >   temp_assignment-> Add(model_-> NextVar(model_-> Start(new_chain_index)));< / div >
< div class = "line" > < a name = "l02810" > < / a > < span class = "lineno" > 2810< / span >   temp_assignment-> SetValue(model_-> NextVar(model_-> Start(new_chain_index)),< / div >
< div class = "line" > < a name = "l02811" > < / a > < span class = "lineno" > 2811< / span >   start);< / div >
< div class = "line" > < a name = "l02812" > < / a > < span class = "lineno" > 2812< / span >   temp_assignment-> Add(nexts_[tail1]);< / div >
< div class = "line" > < a name = "l02813" > < / a > < span class = "lineno" > 2813< / span >   temp_assignment-> SetValue(nexts_[tail1], head2);< / div >
< div class = "line" > < a name = "l02814" > < / a > < span class = "lineno" > 2814< / span >   temp_assignment-> Add(nexts_[tail2]);< / div >
< div class = "line" > < a name = "l02815" > < / a > < span class = "lineno" > 2815< / span >   temp_assignment-> SetValue(nexts_[tail2], model_-> End(new_chain_index));< / div >
< div class = "line" > < a name = "l02816" > < / a > < span class = "lineno" > 2816< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > chain_index = 0; chain_index < chains_.size(); ++chain_index) {< / div >
< div class = "line" > < a name = "l02817" > < / a > < span class = "lineno" > 2817< / span >   < span class = "keywordflow" > if< / span > ((chain_index != new_chain_index) & & < / div >
< div class = "line" > < a name = "l02818" > < / a > < span class = "lineno" > 2818< / span >   (chain_index != old_chain_index) & & < / div >
< div class = "line" > < a name = "l02819" > < / a > < span class = "lineno" > 2819< / span >   (!< a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (deleted_chains_, chain_index))) {< / div >
< div class = "line" > < a name = "l02820" > < / a > < span class = "lineno" > 2820< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start = chains_[chain_index].head;< / div >
< div class = "line" > < a name = "l02821" > < / a > < span class = "lineno" > 2821< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > end = chains_[chain_index].tail;< / div >
< div class = "line" > < a name = "l02822" > < / a > < span class = "lineno" > 2822< / span >   temp_assignment-> Add(model_-> NextVar(model_-> Start(chain_index)));< / div >
< div class = "line" > < a name = "l02823" > < / a > < span class = "lineno" > 2823< / span >   temp_assignment-> SetValue(model_-> NextVar(model_-> Start(chain_index)),< / div >
< div class = "line" > < a name = "l02824" > < / a > < span class = "lineno" > 2824< / span >   start);< / div >
< div class = "line" > < a name = "l02825" > < / a > < span class = "lineno" > 2825< / span >   temp_assignment-> Add(nexts_[end]);< / div >
< div class = "line" > < a name = "l02826" > < / a > < span class = "lineno" > 2826< / span >   temp_assignment-> SetValue(nexts_[end], model_-> End(chain_index));< / div >
< div class = "line" > < a name = "l02827" > < / a > < span class = "lineno" > 2827< / span >   }< / div >
< div class = "line" > < a name = "l02828" > < / a > < span class = "lineno" > 2828< / span >   }< / div >
< div class = "line" > < a name = "l02829" > < / a > < span class = "lineno" > 2829< / span >   < span class = "keywordflow" > return< / span > solver_-> Solve(solver_-> MakeRestoreAssignment(temp_assignment));< / div >
< div class = "line" > < a name = "l02830" > < / a > < span class = "lineno" > 2830< / span >   }< / div >
< div class = "line" > < a name = "l02831" > < / a > < span class = "lineno" > 2831< / span >   < / div >
< div class = "line" > < a name = "l02832" > < / a > < span class = "lineno" > 2832< / span >   < span class = "keywordtype" > bool< / span > UpdateAssignment(< span class = "keyword" > const< / span > std::vector< int> & route1,< / div >
< div class = "line" > < a name = "l02833" > < / a > < span class = "lineno" > 2833< / span >   < span class = "keyword" > const< / span > std::vector< int> & route2) {< / div >
< div class = "line" > < a name = "l02834" > < / a > < span class = "lineno" > 2834< / span >   < span class = "keywordtype" > bool< / span > feasible = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02835" > < / a > < span class = "lineno" > 2835< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > head1 = route1.front();< / div >
< div class = "line" > < a name = "l02836" > < / a > < span class = "lineno" > 2836< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > tail1 = route1.back();< / div >
< div class = "line" > < a name = "l02837" > < / a > < span class = "lineno" > 2837< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > head2 = route2.front();< / div >
< div class = "line" > < a name = "l02838" > < / a > < span class = "lineno" > 2838< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > tail2 = route2.back();< / div >
< div class = "line" > < a name = "l02839" > < / a > < span class = "lineno" > 2839< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > chain_index1 = index_to_chain_index_[head1];< / div >
< div class = "line" > < a name = "l02840" > < / a > < span class = "lineno" > 2840< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > chain_index2 = index_to_chain_index_[head2];< / div >
< div class = "line" > < a name = "l02841" > < / a > < span class = "lineno" > 2841< / span >   < span class = "keywordflow" > if< / span > (chain_index1 < 0 & & chain_index2 < 0) {< / div >
< div class = "line" > < a name = "l02842" > < / a > < span class = "lineno" > 2842< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > chain_index = chains_.size();< / div >
< div class = "line" > < a name = "l02843" > < / a > < span class = "lineno" > 2843< / span >   < span class = "keywordflow" > if< / span > (check_assignment_) {< / div >
< div class = "line" > < a name = "l02844" > < / a > < span class = "lineno" > 2844< / span >   Assignment* < span class = "keyword" > const< / span > temp_assignment =< / div >
< div class = "line" > < a name = "l02845" > < / a > < span class = "lineno" > 2845< / span >   solver_-> MakeAssignment(assignment_);< / div >
< div class = "line" > < a name = "l02846" > < / a > < span class = "lineno" > 2846< / span >   feasible = CheckTempAssignment(temp_assignment, chain_index, -1, head1,< / div >
< div class = "line" > < a name = "l02847" > < / a > < span class = "lineno" > 2847< / span >   tail1, head2, tail2);< / div >
< div class = "line" > < a name = "l02848" > < / a > < span class = "lineno" > 2848< / span >   }< / div >
< div class = "line" > < a name = "l02849" > < / a > < span class = "lineno" > 2849< / span >   < span class = "keywordflow" > if< / span > (feasible) {< / div >
< div class = "line" > < a name = "l02850" > < / a > < span class = "lineno" > 2850< / span >   Chain chain;< / div >
< div class = "line" > < a name = "l02851" > < / a > < span class = "lineno" > 2851< / span >   chain.head = head1;< / div >
< div class = "line" > < a name = "l02852" > < / a > < span class = "lineno" > 2852< / span >   chain.tail = tail2;< / div >
< div class = "line" > < a name = "l02853" > < / a > < span class = "lineno" > 2853< / span >   chain.nodes = 2;< / div >
< div class = "line" > < a name = "l02854" > < / a > < span class = "lineno" > 2854< / span >   index_to_chain_index_[head1] = chain_index;< / div >
< div class = "line" > < a name = "l02855" > < / a > < span class = "lineno" > 2855< / span >   index_to_chain_index_[tail2] = chain_index;< / div >
< div class = "line" > < a name = "l02856" > < / a > < span class = "lineno" > 2856< / span >   chains_.push_back(chain);< / div >
< div class = "line" > < a name = "l02857" > < / a > < span class = "lineno" > 2857< / span >   }< / div >
< div class = "line" > < a name = "l02858" > < / a > < span class = "lineno" > 2858< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (chain_index1 > = 0 & & chain_index2 < 0) {< / div >
< div class = "line" > < a name = "l02859" > < / a > < span class = "lineno" > 2859< / span >   < span class = "keywordflow" > if< / span > (check_assignment_) {< / div >
< div class = "line" > < a name = "l02860" > < / a > < span class = "lineno" > 2860< / span >   Assignment* < span class = "keyword" > const< / span > temp_assignment =< / div >
< div class = "line" > < a name = "l02861" > < / a > < span class = "lineno" > 2861< / span >   solver_-> MakeAssignment(assignment_);< / div >
< div class = "line" > < a name = "l02862" > < / a > < span class = "lineno" > 2862< / span >   feasible =< / div >
< div class = "line" > < a name = "l02863" > < / a > < span class = "lineno" > 2863< / span >   CheckTempAssignment(temp_assignment, chain_index1, chain_index2,< / div >
< div class = "line" > < a name = "l02864" > < / a > < span class = "lineno" > 2864< / span >   head1, tail1, head2, tail2);< / div >
< div class = "line" > < a name = "l02865" > < / a > < span class = "lineno" > 2865< / span >   }< / div >
< div class = "line" > < a name = "l02866" > < / a > < span class = "lineno" > 2866< / span >   < span class = "keywordflow" > if< / span > (feasible) {< / div >
< div class = "line" > < a name = "l02867" > < / a > < span class = "lineno" > 2867< / span >   index_to_chain_index_[tail2] = chain_index1;< / div >
< div class = "line" > < a name = "l02868" > < / a > < span class = "lineno" > 2868< / span >   chains_[chain_index1].head = head1;< / div >
< div class = "line" > < a name = "l02869" > < / a > < span class = "lineno" > 2869< / span >   chains_[chain_index1].tail = tail2;< / div >
< div class = "line" > < a name = "l02870" > < / a > < span class = "lineno" > 2870< / span >   ++chains_[chain_index1].nodes;< / div >
< div class = "line" > < a name = "l02871" > < / a > < span class = "lineno" > 2871< / span >   }< / div >
< div class = "line" > < a name = "l02872" > < / a > < span class = "lineno" > 2872< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (chain_index1 < 0 & & chain_index2 > = 0) {< / div >
< div class = "line" > < a name = "l02873" > < / a > < span class = "lineno" > 2873< / span >   < span class = "keywordflow" > if< / span > (check_assignment_) {< / div >
< div class = "line" > < a name = "l02874" > < / a > < span class = "lineno" > 2874< / span >   Assignment* < span class = "keyword" > const< / span > temp_assignment =< / div >
< div class = "line" > < a name = "l02875" > < / a > < span class = "lineno" > 2875< / span >   solver_-> MakeAssignment(assignment_);< / div >
< div class = "line" > < a name = "l02876" > < / a > < span class = "lineno" > 2876< / span >   feasible =< / div >
< div class = "line" > < a name = "l02877" > < / a > < span class = "lineno" > 2877< / span >   CheckTempAssignment(temp_assignment, chain_index2, chain_index1,< / div >
< div class = "line" > < a name = "l02878" > < / a > < span class = "lineno" > 2878< / span >   head1, tail1, head2, tail2);< / div >
< div class = "line" > < a name = "l02879" > < / a > < span class = "lineno" > 2879< / span >   }< / div >
< div class = "line" > < a name = "l02880" > < / a > < span class = "lineno" > 2880< / span >   < span class = "keywordflow" > if< / span > (feasible) {< / div >
< div class = "line" > < a name = "l02881" > < / a > < span class = "lineno" > 2881< / span >   index_to_chain_index_[head1] = chain_index2;< / div >
< div class = "line" > < a name = "l02882" > < / a > < span class = "lineno" > 2882< / span >   chains_[chain_index2].head = head1;< / div >
< div class = "line" > < a name = "l02883" > < / a > < span class = "lineno" > 2883< / span >   chains_[chain_index2].tail = tail2;< / div >
< div class = "line" > < a name = "l02884" > < / a > < span class = "lineno" > 2884< / span >   ++chains_[chain_index2].nodes;< / div >
< div class = "line" > < a name = "l02885" > < / a > < span class = "lineno" > 2885< / span >   }< / div >
< div class = "line" > < a name = "l02886" > < / a > < span class = "lineno" > 2886< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l02887" > < / a > < span class = "lineno" > 2887< / span >   < span class = "keywordflow" > if< / span > (check_assignment_) {< / div >
< div class = "line" > < a name = "l02888" > < / a > < span class = "lineno" > 2888< / span >   Assignment* < span class = "keyword" > const< / span > temp_assignment =< / div >
< div class = "line" > < a name = "l02889" > < / a > < span class = "lineno" > 2889< / span >   solver_-> MakeAssignment(assignment_);< / div >
< div class = "line" > < a name = "l02890" > < / a > < span class = "lineno" > 2890< / span >   feasible =< / div >
< div class = "line" > < a name = "l02891" > < / a > < span class = "lineno" > 2891< / span >   CheckTempAssignment(temp_assignment, chain_index1, chain_index2,< / div >
< div class = "line" > < a name = "l02892" > < / a > < span class = "lineno" > 2892< / span >   head1, tail1, head2, tail2);< / div >
< div class = "line" > < a name = "l02893" > < / a > < span class = "lineno" > 2893< / span >   }< / div >
< div class = "line" > < a name = "l02894" > < / a > < span class = "lineno" > 2894< / span >   < span class = "keywordflow" > if< / span > (feasible) {< / div >
< div class = "line" > < a name = "l02895" > < / a > < span class = "lineno" > 2895< / span >   index_to_chain_index_[tail2] = chain_index1;< / div >
< div class = "line" > < a name = "l02896" > < / a > < span class = "lineno" > 2896< / span >   chains_[chain_index1].head = head1;< / div >
< div class = "line" > < a name = "l02897" > < / a > < span class = "lineno" > 2897< / span >   chains_[chain_index1].tail = tail2;< / div >
< div class = "line" > < a name = "l02898" > < / a > < span class = "lineno" > 2898< / span >   chains_[chain_index1].nodes += chains_[chain_index2].nodes;< / div >
< div class = "line" > < a name = "l02899" > < / a > < span class = "lineno" > 2899< / span >   deleted_chains_.insert(chain_index2);< / div >
< div class = "line" > < a name = "l02900" > < / a > < span class = "lineno" > 2900< / span >   }< / div >
< div class = "line" > < a name = "l02901" > < / a > < span class = "lineno" > 2901< / span >   }< / div >
< div class = "line" > < a name = "l02902" > < / a > < span class = "lineno" > 2902< / span >   < span class = "keywordflow" > if< / span > (feasible) {< / div >
< div class = "line" > < a name = "l02903" > < / a > < span class = "lineno" > 2903< / span >   assignment_-> Add(nexts_[tail1]);< / div >
< div class = "line" > < a name = "l02904" > < / a > < span class = "lineno" > 2904< / span >   assignment_-> SetValue(nexts_[tail1], head2);< / div >
< div class = "line" > < a name = "l02905" > < / a > < span class = "lineno" > 2905< / span >   }< / div >
< div class = "line" > < a name = "l02906" > < / a > < span class = "lineno" > 2906< / span >   < span class = "keywordflow" > return< / span > feasible;< / div >
< div class = "line" > < a name = "l02907" > < / a > < span class = "lineno" > 2907< / span >   }< / div >
< div class = "line" > < a name = "l02908" > < / a > < span class = "lineno" > 2908< / span >   < / div >
< div class = "line" > < a name = "l02909" > < / a > < span class = "lineno" > 2909< / span >   < span class = "keywordtype" > bool< / span > Merge(< span class = "keywordtype" > bool< / span > merge, < span class = "keywordtype" > int< / span > index1, < span class = "keywordtype" > int< / span > index2) {< / div >
< div class = "line" > < a name = "l02910" > < / a > < span class = "lineno" > 2910< / span >   < span class = "keywordflow" > if< / span > (merge) {< / div >
< div class = "line" > < a name = "l02911" > < / a > < span class = "lineno" > 2911< / span >   < span class = "keywordflow" > if< / span > (UpdateAssignment(routes_[index1], routes_[index2])) {< / div >
< div class = "line" > < a name = "l02912" > < / a > < span class = "lineno" > 2912< / span >   < span class = "comment" > // Connection Route1 -> Route2< / span > < / div >
< div class = "line" > < a name = "l02913" > < / a > < span class = "lineno" > 2913< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > node : routes_[index2]) {< / div >
< div class = "line" > < a name = "l02914" > < / a > < span class = "lineno" > 2914< / span >   in_route_[node] = index1;< / div >
< div class = "line" > < a name = "l02915" > < / a > < span class = "lineno" > 2915< / span >   routes_[index1].push_back(node);< / div >
< div class = "line" > < a name = "l02916" > < / a > < span class = "lineno" > 2916< / span >   }< / div >
< div class = "line" > < a name = "l02917" > < / a > < span class = "lineno" > 2917< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > dimension_index = 0; dimension_index < dimensions_.size();< / div >
< div class = "line" > < a name = "l02918" > < / a > < span class = "lineno" > 2918< / span >   ++dimension_index) {< / div >
< div class = "line" > < a name = "l02919" > < / a > < span class = "lineno" > 2919< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > std::pair< int, int64> new_possible_cumul :< / div >
< div class = "line" > < a name = "l02920" > < / a > < span class = "lineno" > 2920< / span >   new_possible_cumuls_[dimension_index]) {< / div >
< div class = "line" > < a name = "l02921" > < / a > < span class = "lineno" > 2921< / span >   < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > [dimension_index][new_possible_cumul.first] =< / div >
< div class = "line" > < a name = "l02922" > < / a > < span class = "lineno" > 2922< / span >   new_possible_cumul.second;< / div >
< div class = "line" > < a name = "l02923" > < / a > < span class = "lineno" > 2923< / span >   }< / div >
< div class = "line" > < a name = "l02924" > < / a > < span class = "lineno" > 2924< / span >   }< / div >
< div class = "line" > < a name = "l02925" > < / a > < span class = "lineno" > 2925< / span >   deleted_routes_.insert(index2);< / div >
< div class = "line" > < a name = "l02926" > < / a > < span class = "lineno" > 2926< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l02927" > < / a > < span class = "lineno" > 2927< / span >   }< / div >
< div class = "line" > < a name = "l02928" > < / a > < span class = "lineno" > 2928< / span >   }< / div >
< div class = "line" > < a name = "l02929" > < / a > < span class = "lineno" > 2929< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l02930" > < / a > < span class = "lineno" > 2930< / span >   }< / div >
< div class = "line" > < a name = "l02931" > < / a > < span class = "lineno" > 2931< / span >   < / div >
< div class = "line" > < a name = "l02932" > < / a > < span class = "lineno" > 2932< / span >   Assignment* < span class = "keyword" > const< / span > assignment_;< / div >
< div class = "line" > < a name = "l02933" > < / a > < span class = "lineno" > 2933< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > RoutingModel< / a > * < span class = "keyword" > const< / span > model_;< / div >
< div class = "line" > < a name = "l02934" > < / a > < span class = "lineno" > 2934< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > check_assignment_;< / div >
< div class = "line" > < a name = "l02935" > < / a > < span class = "lineno" > 2935< / span >   Solver* < span class = "keyword" > const< / span > solver_;< / div >
< div class = "line" > < a name = "l02936" > < / a > < span class = "lineno" > 2936< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > num_indices_;< / div >
< div class = "line" > < a name = "l02937" > < / a > < span class = "lineno" > 2937< / span >   < span class = "keyword" > const< / span > std::vector< Link> links_list_;< / div >
< div class = "line" > < a name = "l02938" > < / a > < span class = "lineno" > 2938< / span >   std::vector< IntVar*> nexts_;< / div >
< div class = "line" > < a name = "l02939" > < / a > < span class = "lineno" > 2939< / span >   std::vector< const RoutingDimension*> dimensions_; < span class = "comment" > // Not owned.< / span > < / div >
< div class = "line" > < a name = "l02940" > < / a > < span class = "lineno" > 2940< / span >   std::vector< std::vector< int64> > < a class = "code" href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > ;< / div >
< div class = "line" > < a name = "l02941" > < / a > < span class = "lineno" > 2941< / span >   std::vector< absl::flat_hash_map< int, int64> > new_possible_cumuls_;< / div >
< div class = "line" > < a name = "l02942" > < / a > < span class = "lineno" > 2942< / span >   std::vector< std::vector< int> > routes_;< / div >
< div class = "line" > < a name = "l02943" > < / a > < span class = "lineno" > 2943< / span >   std::vector< int> in_route_;< / div >
< div class = "line" > < a name = "l02944" > < / a > < span class = "lineno" > 2944< / span >   absl::flat_hash_set< int> deleted_routes_;< / div >
< div class = "line" > < a name = "l02945" > < / a > < span class = "lineno" > 2945< / span >   std::vector< std::vector< int> > final_routes_;< / div >
< div class = "line" > < a name = "l02946" > < / a > < span class = "lineno" > 2946< / span >   std::vector< Chain> chains_;< / div >
< div class = "line" > < a name = "l02947" > < / a > < span class = "lineno" > 2947< / span >   absl::flat_hash_set< int> deleted_chains_;< / div >
< div class = "line" > < a name = "l02948" > < / a > < span class = "lineno" > 2948< / span >   std::vector< Chain> final_chains_;< / div >
< div class = "line" > < a name = "l02949" > < / a > < span class = "lineno" > 2949< / span >   std::vector< int> index_to_chain_index_;< / div >
< div class = "line" > < a name = "l02950" > < / a > < span class = "lineno" > 2950< / span >   std::vector< int> index_to_vehicle_class_index_;< / div >
< div class = "line" > < a name = "l02951" > < / a > < span class = "lineno" > 2951< / span >   };< / div >
< div class = "line" > < a name = "l02952" > < / a > < span class = "lineno" > 2952< / span >   < / div >
< div class = "line" > < a name = "l02953" > < / a > < span class = "lineno" > 2953< / span >   < span class = "preprocessor" > #ifndef SWIG< / span > < / div >
< div class = "line" > < a name = "l02954" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html" > 2954< / a > < / span >   < span class = "keyword" > struct < / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > {< / div >
< div class = "line" > < a name = "l02955" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html#a8d29e8bfd15b4d40384e988a725755a3" > 2955< / a > < / span >   < a class = "code" href = "structoperations__research_1_1_sweep_index.html#a8d29e8bfd15b4d40384e988a725755a3" > SweepIndex< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > angle, < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > distance)< / div >
< div class = "line" > < a name = "l02956" > < / a > < span class = "lineno" > 2956< / span >   : < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ), angle(angle), distance(distance) {}< / div >
< div class = "line" > < a name = "l02957" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html#aa743d92bc830367191a21b56d6095ef6" > 2957< / a > < / span >   < a class = "code" href = "structoperations__research_1_1_sweep_index.html#aa743d92bc830367191a21b56d6095ef6" > ~SweepIndex< / a > () {}< / div >
< div class = "line" > < a name = "l02958" > < / a > < span class = "lineno" > 2958< / span >   < / div >
< div class = "line" > < a name = "l02959" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html#a6b5aa39d7a1754c7efcb8528177a8e41" > 2959< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "structoperations__research_1_1_sweep_index.html#a6b5aa39d7a1754c7efcb8528177a8e41" > index< / a > ;< / div >
< div class = "line" > < a name = "l02960" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html#a79dea7ed146af26ff4a0ba4bf5c83eee" > 2960< / a > < / span >   < span class = "keywordtype" > double< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79dea7ed146af26ff4a0ba4bf5c83eee" > angle< / a > ;< / div >
< div class = "line" > < a name = "l02961" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index.html#a79b8e036dca6911e3295a47d99f21f43" > 2961< / a > < / span >   < span class = "keywordtype" > double< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79b8e036dca6911e3295a47d99f21f43" > distance< / a > ;< / div >
< div class = "line" > < a name = "l02962" > < / a > < span class = "lineno" > 2962< / span >   };< / div >
< div class = "line" > < a name = "l02963" > < / a > < span class = "lineno" > 2963< / span >   < / div >
< div class = "line" > < a name = "l02964" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index_sort_angle.html" > 2964< / a > < / span >   < span class = "keyword" > struct < / span > < a class = "code" href = "structoperations__research_1_1_sweep_index_sort_angle.html" > SweepIndexSortAngle< / a > {< / div >
< div class = "line" > < a name = "l02965" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index_sort_angle.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > 2965< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index_sort_angle.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > operator()< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > & node1, < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > & node2)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02966" > < / a > < span class = "lineno" > 2966< / span >   < span class = "keywordflow" > return< / span > (node1.< a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79dea7ed146af26ff4a0ba4bf5c83eee" > angle< / a > < node2.< a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79dea7ed146af26ff4a0ba4bf5c83eee" > angle< / a > );< / div >
< div class = "line" > < a name = "l02967" > < / a > < span class = "lineno" > 2967< / span >   }< / div >
< div class = "line" > < a name = "l02968" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#a531a38e3526ca5036724e679f720dfb0" > 2968< / a > < / span >   } < a class = "code" href = "namespaceoperations__research.html#a531a38e3526ca5036724e679f720dfb0" > SweepIndexAngleComparator< / a > ;< / div >
< div class = "line" > < a name = "l02969" > < / a > < span class = "lineno" > 2969< / span >   < / div >
< div class = "line" > < a name = "l02970" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index_sort_distance.html" > 2970< / a > < / span >   < span class = "keyword" > struct < / span > < a class = "code" href = "structoperations__research_1_1_sweep_index_sort_distance.html" > SweepIndexSortDistance< / a > {< / div >
< div class = "line" > < a name = "l02971" > < / a > < span class = "lineno" > < a class = "line" href = "structoperations__research_1_1_sweep_index_sort_distance.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > 2971< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index_sort_distance.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > operator()< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > & node1, < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > & node2)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l02972" > < / a > < span class = "lineno" > 2972< / span >   < span class = "keywordflow" > return< / span > (node1.< a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79b8e036dca6911e3295a47d99f21f43" > distance< / a > < node2.< a class = "code" href = "structoperations__research_1_1_sweep_index.html#a79b8e036dca6911e3295a47d99f21f43" > distance< / a > );< / div >
< div class = "line" > < a name = "l02973" > < / a > < span class = "lineno" > 2973< / span >   }< / div >
< div class = "line" > < a name = "l02974" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#aa2347e154737220869f298587dfb3dc0" > 2974< / a > < / span >   } < a class = "code" href = "namespaceoperations__research.html#aa2347e154737220869f298587dfb3dc0" > SweepIndexDistanceComparator< / a > ;< / div >
< div class = "line" > < a name = "l02975" > < / a > < span class = "lineno" > 2975< / span >   < / div >
< div class = "line" > < a name = "l02976" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_arranger.html#a3dfcea8a02b5d4ec8576e41859e92b28" > 2976< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_sweep_arranger.html#a3dfcea8a02b5d4ec8576e41859e92b28" > SweepArranger::SweepArranger< / a > (< span class = "keyword" > const< / span > std::vector< std::pair< int64, int64> > & points)< / div >
< div class = "line" > < a name = "l02977" > < / a > < span class = "lineno" > 2977< / span >   : coordinates_(2 * points.size(), 0), sectors_(1) {< / div >
< div class = "line" > < a name = "l02978" > < / a > < span class = "lineno" > 2978< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i = 0; i < points.size(); ++i) {< / div >
< div class = "line" > < a name = "l02979" > < / a > < span class = "lineno" > 2979< / span >   coordinates_[2 * i] = points[i].first;< / div >
< div class = "line" > < a name = "l02980" > < / a > < span class = "lineno" > 2980< / span >   coordinates_[2 * i + 1] = points[i].second;< / div >
< div class = "line" > < a name = "l02981" > < / a > < span class = "lineno" > 2981< / span >   }< / div >
< div class = "line" > < a name = "l02982" > < / a > < span class = "lineno" > 2982< / span >   }< / div >
< div class = "line" > < a name = "l02983" > < / a > < span class = "lineno" > 2983< / span >   < / div >
< div class = "line" > < a name = "l02984" > < / a > < span class = "lineno" > 2984< / span >   < span class = "comment" > // Splits the space of the indices into sectors and sorts the indices of each< / span > < / div >
< div class = "line" > < a name = "l02985" > < / a > < span class = "lineno" > 2985< / span >   < span class = "comment" > // sector with ascending angle from the depot.< / span > < / div >
< div class = "line" > < a name = "l02986" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_arranger.html#a133670b40a6a45c547654d9107a4a603" > 2986< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_sweep_arranger.html#a133670b40a6a45c547654d9107a4a603" > SweepArranger::ArrangeIndices< / a > (std::vector< int64> * indices) {< / div >
< div class = "line" > < a name = "l02987" > < / a > < span class = "lineno" > 2987< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > pi_rad = 3.14159265;< / div >
< div class = "line" > < a name = "l02988" > < / a > < span class = "lineno" > 2988< / span >   < span class = "comment" > // Suppose that the center is at x0, y0.< / span > < / div >
< div class = "line" > < a name = "l02989" > < / a > < span class = "lineno" > 2989< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > x0 = coordinates_[0];< / div >
< div class = "line" > < a name = "l02990" > < / a > < span class = "lineno" > 2990< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > y0 = coordinates_[1];< / div >
< div class = "line" > < a name = "l02991" > < / a > < span class = "lineno" > 2991< / span >   < / div >
< div class = "line" > < a name = "l02992" > < / a > < span class = "lineno" > 2992< / span >   std::vector< SweepIndex> sweep_indices;< / div >
< div class = "line" > < a name = "l02993" > < / a > < span class = "lineno" > 2993< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; index < static_cast< int> (coordinates_.size()) / 2;< / div >
< div class = "line" > < a name = "l02994" > < / a > < span class = "lineno" > 2994< / span >   ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l02995" > < / a > < span class = "lineno" > 2995< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > x = coordinates_[2 * < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l02996" > < / a > < span class = "lineno" > 2996< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > y = coordinates_[2 * < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > + 1];< / div >
< div class = "line" > < a name = "l02997" > < / a > < span class = "lineno" > 2997< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > x_delta = x - x0;< / div >
< div class = "line" > < a name = "l02998" > < / a > < span class = "lineno" > 2998< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > y_delta = y - y0;< / div >
< div class = "line" > < a name = "l02999" > < / a > < span class = "lineno" > 2999< / span >   < span class = "keywordtype" > double< / span > square_distance = x_delta * x_delta + y_delta * y_delta;< / div >
< div class = "line" > < a name = "l03000" > < / a > < span class = "lineno" > 3000< / span >   < span class = "keywordtype" > double< / span > angle = square_distance == 0 ? 0 : std::atan2(y_delta, x_delta);< / div >
< div class = "line" > < a name = "l03001" > < / a > < span class = "lineno" > 3001< / span >   angle = angle > = 0 ? angle : 2 * pi_rad + angle;< / div >
< div class = "line" > < a name = "l03002" > < / a > < span class = "lineno" > 3002< / span >   < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > sweep_index(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , angle, square_distance);< / div >
< div class = "line" > < a name = "l03003" > < / a > < span class = "lineno" > 3003< / span >   sweep_indices.push_back(sweep_index);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03004" > < / a > < span class = "lineno" > 3004< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03005" > < / a > < span class = "lineno" > 3005< / span >   std::sort(sweep_indices.begin(), sweep_indices.end(),< / div >
< div class = "line" > < a name = "l03006" > < / a > < span class = "lineno" > 3006< / span >   < a class = "code" href = "namespaceoperations__research.html#aa2347e154737220869f298587dfb3dc0" > SweepIndexDistanceComparator< / a > );< / div >
< div class = "line" > < a name = "l03007" > < / a > < span class = "lineno" > 3007< / span >   < / div >
< div class = "line" > < a name = "l03008" > < / a > < span class = "lineno" > 3008< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < span class = "keyword" > static_cast< < / span > < span class = "keywordtype" > int< / span > < span class = "keyword" > > < / span > (sweep_indices.size()) / sectors_;< / div >
< div class = "line" > < a name = "l03009" > < / a > < span class = "lineno" > 3009< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > sector = 0; sector < sectors_; ++sector) {< / div >
< div class = "line" > < a name = "l03010" > < / a > < span class = "lineno" > 3010< / span >   std::vector< SweepIndex> cluster;< / div >
< div class = "line" > < a name = "l03011" > < / a > < span class = "lineno" > 3011< / span >   std::vector< SweepIndex> ::iterator begin =< / div >
< div class = "line" > < a name = "l03012" > < / a > < span class = "lineno" > 3012< / span >   sweep_indices.begin() + sector * size;< / div >
< div class = "line" > < a name = "l03013" > < / a > < span class = "lineno" > 3013< / span >   std::vector< SweepIndex> ::iterator end =< / div >
< div class = "line" > < a name = "l03014" > < / a > < span class = "lineno" > 3014< / span >   sector == sectors_ - 1 ? sweep_indices.end()< / div >
< div class = "line" > < a name = "l03015" > < / a > < span class = "lineno" > 3015< / span >   : sweep_indices.begin() + (sector + 1) * size;< / div >
< div class = "line" > < a name = "l03016" > < / a > < span class = "lineno" > 3016< / span >   std::sort(begin, end, < a class = "code" href = "namespaceoperations__research.html#a531a38e3526ca5036724e679f720dfb0" > SweepIndexAngleComparator< / a > );< / div >
< div class = "line" > < a name = "l03017" > < / a > < span class = "lineno" > 3017< / span >   }< / div >
< div class = "line" > < a name = "l03018" > < / a > < span class = "lineno" > 3018< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_sweep_index.html" > SweepIndex< / a > & sweep_index : sweep_indices) {< / div >
< div class = "line" > < a name = "l03019" > < / a > < span class = "lineno" > 3019< / span >   indices-> push_back(sweep_index.index);< / div >
< div class = "line" > < a name = "l03020" > < / a > < span class = "lineno" > 3020< / span >   }< / div >
< div class = "line" > < a name = "l03021" > < / a > < span class = "lineno" > 3021< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03022" > < / a > < span class = "lineno" > 3022< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03023" > < / a > < span class = "lineno" > 3023< / span >   < span class = "comment" > // Decision Builder building a first solution based on Sweep heuristic for< / span > < / div >
< div class = "line" > < a name = "l03024" > < / a > < span class = "lineno" > 3024< / span >   < span class = "comment" > // Vehicle Routing Problem.< / span > < / div >
< div class = "line" > < a name = "l03025" > < / a > < span class = "lineno" > 3025< / span >   < span class = "comment" > // Suitable only when distance is considered as the cost.< / span > < / div >
< div class = "line" > < a name = "l03026" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_builder.html" > 3026< / a > < / span >   < span class = "keyword" > class < / span > < a class = "code" href = "classoperations__research_1_1_sweep_builder.html" > SweepBuilder< / a > : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_decision_builder.html" > DecisionBuilder< / a > {< / div >
< div class = "line" > < a name = "l03027" > < / a > < span class = "lineno" > 3027< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l03028" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_builder.html#a8a7ce510e251b4fa2533fec825773e97" > 3028< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_sweep_builder.html#a8a7ce510e251b4fa2533fec825773e97" > SweepBuilder< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > , < span class = "keywordtype" > bool< / span > check_assignment)< / div >
< div class = "line" > < a name = "l03029" > < / a > < span class = "lineno" > 3029< / span >   : model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ), check_assignment_(check_assignment) {}< / div >
< div class = "line" > < a name = "l03030" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_builder.html#a0353fa7a09f5b17b37b1e9bf933fc48b" > 3030< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_sweep_builder.html#a0353fa7a09f5b17b37b1e9bf933fc48b" > ~SweepBuilder< / a > ()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l03031" > < / a > < span class = "lineno" > 3031< / span >   < / div >
< div class = "line" > < a name = "l03032" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_sweep_builder.html#a5251132b6ab1df4f1ccd864f239f1d9b" > 3032< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_decision.html" > Decision< / a > * < a class = "code" href = "classoperations__research_1_1_sweep_builder.html#a5251132b6ab1df4f1ccd864f239f1d9b" > Next< / a > (< a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * < span class = "keyword" > const< / span > solver)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l03033" > < / a > < span class = "lineno" > 3033< / span >   < span class = "comment" > // Setup the model of the instance for the Sweep Algorithm< / span > < / div >
< div class = "line" > < a name = "l03034" > < / a > < span class = "lineno" > 3034< / span >   ModelSetup();< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03035" > < / a > < span class = "lineno" > 3035< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03036" > < / a > < span class = "lineno" > 3036< / span >   < span class = "comment" > // Build the assignment routes for the model< / span > < / div >
< div class = "line" > < a name = "l03037" > < / a > < span class = "lineno" > 3037< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < span class = "keyword" > const< / span > assignment = solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ad45ddc54149c5954c2bbd4e2657f9148" > MakeAssignment< / a > ();< / div >
< div class = "line" > < a name = "l03038" > < / a > < span class = "lineno" > 3038< / span >   route_constructor_ = absl::make_unique< RouteConstructor> (< / div >
< div class = "line" > < a name = "l03039" > < / a > < span class = "lineno" > 3039< / span >   assignment, model_, check_assignment_, num_indices_, links_);< / div >
< div class = "line" > < a name = "l03040" > < / a > < span class = "lineno" > 3040< / span >   < span class = "comment" > // This call might cause backtracking if the search limit is reached.< / span > < / div >
< div class = "line" > < a name = "l03041" > < / a > < span class = "lineno" > 3041< / span >   route_constructor_-> Construct();< / div >
< div class = "line" > < a name = "l03042" > < / a > < span class = "lineno" > 3042< / span >   route_constructor_.reset(< span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03043" > < / a > < span class = "lineno" > 3043< / span >   < span class = "comment" > // This call might cause backtracking if the solution is not feasible.< / span > < / div >
< div class = "line" > < a name = "l03044" > < / a > < span class = "lineno" > 3044< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a1896fe755b612dbebd2c46638f8977a2" > Restore< / a > ();< / div >
< div class = "line" > < a name = "l03045" > < / a > < span class = "lineno" > 3045< / span >   < / div >
< div class = "line" > < a name = "l03046" > < / a > < span class = "lineno" > 3046< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03047" > < / a > < span class = "lineno" > 3047< / span >   }< / div >
< div class = "line" > < a name = "l03048" > < / a > < span class = "lineno" > 3048< / span >   < / div >
< div class = "line" > < a name = "l03049" > < / a > < span class = "lineno" > 3049< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l03050" > < / a > < span class = "lineno" > 3050< / span >   < span class = "keywordtype" > void< / span > ModelSetup() {< / div >
< div class = "line" > < a name = "l03051" > < / a > < span class = "lineno" > 3051< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > depot = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acca75b5d3bfe2433c5805b049815f533" > GetDepot< / a > ();< / div >
< div class = "line" > < a name = "l03052" > < / a > < span class = "lineno" > 3052< / span >   num_indices_ = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ();< / div >
< div class = "line" > < a name = "l03053" > < / a > < span class = "lineno" > 3053< / span >   < span class = "keywordflow" > if< / span > (absl::GetFlag(FLAGS_sweep_sectors) > 0 & & < / div >
< div class = "line" > < a name = "l03054" > < / a > < span class = "lineno" > 3054< / span >   absl::GetFlag(FLAGS_sweep_sectors) < num_indices_) {< / div >
< div class = "line" > < a name = "l03055" > < / a > < span class = "lineno" > 3055< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a71815ec83f6605bddb11578ebb835aae" > sweep_arranger< / a > ()-> < a class = "code" href = "classoperations__research_1_1_sweep_arranger.html#abdec0f71a4b3263e9ed49e1d2b4726f2" > SetSectors< / a > (absl::GetFlag(FLAGS_sweep_sectors));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03056" > < / a > < span class = "lineno" > 3056< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03057" > < / a > < span class = "lineno" > 3057< / span >   std::vector< int64> indices;< / div >
< div class = "line" > < a name = "l03058" > < / a > < span class = "lineno" > 3058< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a71815ec83f6605bddb11578ebb835aae" > sweep_arranger< / a > ()-> < a class = "code" href = "classoperations__research_1_1_sweep_arranger.html#a133670b40a6a45c547654d9107a4a603" > ArrangeIndices< / a > (& indices);< / div >
< div class = "line" > < a name = "l03059" > < / a > < span class = "lineno" > 3059< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < indices.size() - 1; ++i) {< / div >
< div class = "line" > < a name = "l03060" > < / a > < span class = "lineno" > 3060< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > first = indices[i];< / div >
< div class = "line" > < a name = "l03061" > < / a > < span class = "lineno" > 3061< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > second = indices[i + 1];< / div >
< div class = "line" > < a name = "l03062" > < / a > < span class = "lineno" > 3062< / span >   < span class = "keywordflow" > if< / span > ((model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (first) || !model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (first)) & & < / div >
< div class = "line" > < a name = "l03063" > < / a > < span class = "lineno" > 3063< / span >   (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (second) || !model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (second))) {< / div >
< div class = "line" > < a name = "l03064" > < / a > < span class = "lineno" > 3064< / span >   < span class = "keywordflow" > if< / span > (first != depot & & second != depot) {< / div >
< div class = "line" > < a name = "l03065" > < / a > < span class = "lineno" > 3065< / span >   Link link(std::make_pair(first, second), 0, 0, depot, depot);< / div >
< div class = "line" > < a name = "l03066" > < / a > < span class = "lineno" > 3066< / span >   links_.push_back(link);< / div >
< div class = "line" > < a name = "l03067" > < / a > < span class = "lineno" > 3067< / span >   }< / div >
< div class = "line" > < a name = "l03068" > < / a > < span class = "lineno" > 3068< / span >   }< / div >
< div class = "line" > < a name = "l03069" > < / a > < span class = "lineno" > 3069< / span >   }< / div >
< div class = "line" > < a name = "l03070" > < / a > < span class = "lineno" > 3070< / span >   }< / div >
< div class = "line" > < a name = "l03071" > < / a > < span class = "lineno" > 3071< / span >   < / div >
< div class = "line" > < a name = "l03072" > < / a > < span class = "lineno" > 3072< / span >   RoutingModel* < span class = "keyword" > const< / span > model_;< / div >
< div class = "line" > < a name = "l03073" > < / a > < span class = "lineno" > 3073< / span >   std::unique_ptr< RouteConstructor> route_constructor_;< / div >
< div class = "line" > < a name = "l03074" > < / a > < span class = "lineno" > 3074< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > check_assignment_;< / div >
< div class = "line" > < a name = "l03075" > < / a > < span class = "lineno" > 3075< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > num_indices_;< / div >
< div class = "line" > < a name = "l03076" > < / a > < span class = "lineno" > 3076< / span >   std::vector< Link> links_;< / div >
< div class = "line" > < a name = "l03077" > < / a > < span class = "lineno" > 3077< / span >   };< / div >
< div class = "line" > < a name = "l03078" > < / a > < span class = "lineno" > 3078< / span >   < span class = "preprocessor" > #endif< / span > < / div >
< div class = "line" > < a name = "l03079" > < / a > < span class = "lineno" > 3079< / span >   < / div >
< div class = "line" > < a name = "l03080" > < / a > < span class = "lineno" > 3080< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l03081" > < / a > < span class = "lineno" > 3081< / span >   < span class = "comment" > // Decision builder to build a solution with all nodes inactive. It does no< / span > < / div >
< div class = "line" > < a name = "l03082" > < / a > < span class = "lineno" > 3082< / span >   < span class = "comment" > // branching and may fail if some nodes cannot be made inactive.< / span > < / div >
< div class = "line" > < a name = "l03083" > < / a > < span class = "lineno" > 3083< / span >   < / div >
< div class = "line" > < a name = "l03084" > < / a > < span class = "lineno" > 3084< / span >   < span class = "keyword" > class < / span > AllUnperformed : < span class = "keyword" > public< / span > DecisionBuilder {< / div >
< div class = "line" > < a name = "l03085" > < / a > < span class = "lineno" > 3085< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l03086" > < / a > < span class = "lineno" > 3086< / span >   < span class = "comment" > // Does not take ownership of model.< / span > < / div >
< div class = "line" > < a name = "l03087" > < / a > < span class = "lineno" > 3087< / span >   < span class = "keyword" > explicit< / span > AllUnperformed(RoutingModel* < span class = "keyword" > const< / span > < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) : model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ) {}< / div >
< div class = "line" > < a name = "l03088" > < / a > < span class = "lineno" > 3088< / span >   ~AllUnperformed()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l03089" > < / a > < span class = "lineno" > 3089< / span >   Decision* Next(Solver* < span class = "keyword" > const< / span > solver)< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l03090" > < / a > < span class = "lineno" > 3090< / span >   < span class = "comment" > // Solver::(Un)FreezeQueue is private, passing through the public API< / span > < / div >
< div class = "line" > < a name = "l03091" > < / a > < span class = "lineno" > 3091< / span >   < span class = "comment" > // on PropagationBaseObject.< / span > < / div >
< div class = "line" > < a name = "l03092" > < / a > < span class = "lineno" > 3092< / span >   model_-> CostVar()-> FreezeQueue();< / div >
< div class = "line" > < a name = "l03093" > < / a > < span class = "lineno" > 3093< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < model_-> Size(); ++i) {< / div >
< div class = "line" > < a name = "l03094" > < / a > < span class = "lineno" > 3094< / span >   < span class = "keywordflow" > if< / span > (!model_-> IsStart(i)) {< / div >
< div class = "line" > < a name = "l03095" > < / a > < span class = "lineno" > 3095< / span >   model_-> ActiveVar(i)-> SetValue(0);< / div >
< div class = "line" > < a name = "l03096" > < / a > < span class = "lineno" > 3096< / span >   }< / div >
< div class = "line" > < a name = "l03097" > < / a > < span class = "lineno" > 3097< / span >   }< / div >
< div class = "line" > < a name = "l03098" > < / a > < span class = "lineno" > 3098< / span >   model_-> CostVar()-> UnfreezeQueue();< / div >
< div class = "line" > < a name = "l03099" > < / a > < span class = "lineno" > 3099< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03100" > < / a > < span class = "lineno" > 3100< / span >   }< / div >
< div class = "line" > < a name = "l03101" > < / a > < span class = "lineno" > 3101< / span >   < / div >
< div class = "line" > < a name = "l03102" > < / a > < span class = "lineno" > 3102< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l03103" > < / a > < span class = "lineno" > 3103< / span >   RoutingModel* < span class = "keyword" > const< / span > model_;< / div >
< div class = "line" > < a name = "l03104" > < / a > < span class = "lineno" > 3104< / span >   };< / div >
< div class = "line" > < a name = "l03105" > < / a > < span class = "lineno" > 3105< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l03106" > < / a > < span class = "lineno" > 3106< / span >   < / div >
< div class = "line" > < a name = "l03107" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d" > 3107< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d" > RoutingModel::AddSearchMonitor< / a > (< a class = "code" href = "classoperations__research_1_1_search_monitor.html" > SearchMonitor< / a > * < span class = "keyword" > const< / span > monitor) {< / div >
< div class = "line" > < a name = "l03108" > < / a > < span class = "lineno" > 3108< / span >   monitors_.push_back(monitor);< / div >
< div class = "line" > < a name = "l03109" > < / a > < span class = "lineno" > 3109< / span >   }< / div >
< div class = "line" > < a name = "l03110" > < / a > < span class = "lineno" > 3110< / span >   < / div >
< div class = "line" > < a name = "l03111" > < / a > < span class = "lineno" > 3111< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l03112" > < / a > < span class = "lineno" > 3112< / span >   < span class = "keyword" > class < / span > AtSolutionCallbackMonitor : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_search_monitor.html" > SearchMonitor< / a > {< / div >
< div class = "line" > < a name = "l03113" > < / a > < span class = "lineno" > 3113< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l03114" > < / a > < span class = "lineno" > 3114< / span >   AtSolutionCallbackMonitor(< a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * solver, std::function< < span class = "keywordtype" > void< / span > ()> < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > )< / div >
< div class = "line" > < a name = "l03115" > < / a > < span class = "lineno" > 3115< / span >   : < a class = "code" href = "classoperations__research_1_1_search_monitor.html" > SearchMonitor< / a > (solver), callback_(std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > )) {}< / div >
< div class = "line" > < a name = "l03116" > < / a > < span class = "lineno" > 3116< / span >   < span class = "keywordtype" > bool< / span > AtSolution()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l03117" > < / a > < span class = "lineno" > 3117< / span >   callback_();< / div >
< div class = "line" > < a name = "l03118" > < / a > < span class = "lineno" > 3118< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03119" > < / a > < span class = "lineno" > 3119< / span >   }< / div >
< div class = "line" > < a name = "l03120" > < / a > < span class = "lineno" > 3120< / span >   < / div >
< div class = "line" > < a name = "l03121" > < / a > < span class = "lineno" > 3121< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l03122" > < / a > < span class = "lineno" > 3122< / span >   std::function< void()> callback_;< / div >
< div class = "line" > < a name = "l03123" > < / a > < span class = "lineno" > 3123< / span >   };< / div >
< div class = "line" > < a name = "l03124" > < / a > < span class = "lineno" > 3124< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l03125" > < / a > < span class = "lineno" > 3125< / span >   < / div >
< div class = "line" > < a name = "l03126" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc" > 3126< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc" > RoutingModel::AddAtSolutionCallback< / a > (std::function< < span class = "keywordtype" > void< / span > ()> < a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ) {< / div >
< div class = "line" > < a name = "l03127" > < / a > < span class = "lineno" > 3127< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d" > AddSearchMonitor< / a > (solver_-> RevAlloc(< / div >
< div class = "line" > < a name = "l03128" > < / a > < span class = "lineno" > 3128< / span >   < span class = "keyword" > new< / span > AtSolutionCallbackMonitor(solver_.get(), std::move(< a class = "code" href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > ))));< / div >
< div class = "line" > < a name = "l03129" > < / a > < span class = "lineno" > 3129< / span >   }< / div >
< div class = "line" > < a name = "l03130" > < / a > < span class = "lineno" > 3130< / span >   < / div >
< div class = "line" > < a name = "l03131" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a" > 3131< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a" > RoutingModel::Solve< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * assignment) {< / div >
< div class = "line" > < a name = "l03132" > < / a > < span class = "lineno" > 3132< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38" > SolveFromAssignmentWithParameters< / a > (assignment,< / div >
< div class = "line" > < a name = "l03133" > < / a > < span class = "lineno" > 3133< / span >   < a class = "code" href = "namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187" > DefaultRoutingSearchParameters< / a > ());< / div >
< div class = "line" > < a name = "l03134" > < / a > < span class = "lineno" > 3134< / span >   }< / div >
< div class = "line" > < a name = "l03135" > < / a > < span class = "lineno" > 3135< / span >   < / div >
< div class = "line" > < a name = "l03136" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b" > 3136< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b" > RoutingModel::SolveWithParameters< / a > (< / div >
< div class = "line" > < a name = "l03137" > < / a > < span class = "lineno" > 3137< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ,< / div >
< div class = "line" > < a name = "l03138" > < / a > < span class = "lineno" > 3138< / span >   std::vector< const Assignment*> * solutions) {< / div >
< div class = "line" > < a name = "l03139" > < / a > < span class = "lineno" > 3139< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38" > SolveFromAssignmentWithParameters< / a > (< span class = "keyword" > nullptr< / span > , < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , solutions);< / div >
< div class = "line" > < a name = "l03140" > < / a > < span class = "lineno" > 3140< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03141" > < / a > < span class = "lineno" > 3141< / span >   < / div >
< div class = "line" > < a name = "l03142" > < / a > < span class = "lineno" > 3142< / span >   < span class = "keyword" > namespace < / span > {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03143" > < / a > < span class = "lineno" > 3143< / span >   absl::Duration GetTimeLimit(< span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l03144" > < / a > < span class = "lineno" > 3144< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .has_time_limit()) < span class = "keywordflow" > return< / span > absl::InfiniteDuration();< / div >
< div class = "line" > < a name = "l03145" > < / a > < span class = "lineno" > 3145< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespaceutil__time.html#a7c8c9c3cc5c68f173f38b0237da3abc9" > util_time::DecodeGoogleApiProto< / a > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .time_limit()).value();< / div >
< div class = "line" > < a name = "l03146" > < / a > < span class = "lineno" > 3146< / span >   }< / div >
< div class = "line" > < a name = "l03147" > < / a > < span class = "lineno" > 3147< / span >   < / div >
< div class = "line" > < a name = "l03148" > < / a > < span class = "lineno" > 3148< / span >   absl::Duration GetLnsTimeLimit(< span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l03149" > < / a > < span class = "lineno" > 3149< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .has_lns_time_limit()) < span class = "keywordflow" > return< / span > absl::InfiniteDuration();< / div >
< div class = "line" > < a name = "l03150" > < / a > < span class = "lineno" > 3150< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespaceutil__time.html#a7c8c9c3cc5c68f173f38b0237da3abc9" > util_time::DecodeGoogleApiProto< / a > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .lns_time_limit()).value();< / div >
< div class = "line" > < a name = "l03151" > < / a > < span class = "lineno" > 3151< / span >   }< / div >
< div class = "line" > < a name = "l03152" > < / a > < span class = "lineno" > 3152< / span >   < / div >
< div class = "line" > < a name = "l03153" > < / a > < span class = "lineno" > 3153< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l03154" > < / a > < span class = "lineno" > 3154< / span >   < / div >
< div class = "line" > < a name = "l03155" > < / a > < span class = "lineno" > 3155< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l03156" > < / a > < span class = "lineno" > 3156< / span >   < span class = "keywordtype" > void< / span > MakeAllUnperformed(< span class = "keyword" > const< / span > RoutingModel* < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > , Assignment* assignment) {< / div >
< div class = "line" > < a name = "l03157" > < / a > < span class = "lineno" > 3157< / span >   assignment-> Clear();< / div >
< div class = "line" > < a name = "l03158" > < / a > < span class = "lineno" > 3158< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> Nexts().size(); ++i) {< / div >
< div class = "line" > < a name = "l03159" > < / a > < span class = "lineno" > 3159< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> IsStart(i)) {< / div >
< div class = "line" > < a name = "l03160" > < / a > < span class = "lineno" > 3160< / span >   assignment-> Add(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(i))-> SetValue(i);< / div >
< div class = "line" > < a name = "l03161" > < / a > < span class = "lineno" > 3161< / span >   }< / div >
< div class = "line" > < a name = "l03162" > < / a > < span class = "lineno" > 3162< / span >   }< / div >
< div class = "line" > < a name = "l03163" > < / a > < span class = "lineno" > 3163< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> vehicles(); ++vehicle) {< / div >
< div class = "line" > < a name = "l03164" > < / a > < span class = "lineno" > 3164< / span >   assignment-> Add(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> NextVar(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> Start(vehicle)))< / div >
< div class = "line" > < a name = "l03165" > < / a > < span class = "lineno" > 3165< / span >   -> SetValue(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> End(vehicle));< / div >
< div class = "line" > < a name = "l03166" > < / a > < span class = "lineno" > 3166< / span >   }< / div >
< div class = "line" > < a name = "l03167" > < / a > < span class = "lineno" > 3167< / span >   }< / div >
< div class = "line" > < a name = "l03168" > < / a > < span class = "lineno" > 3168< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l03169" > < / a > < span class = "lineno" > 3169< / span >   < / div >
< div class = "line" > < a name = "l03170" > < / a > < span class = "lineno" > 3170< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::AppendAssignmentIfFeasible(< / div >
< div class = "line" > < a name = "l03171" > < / a > < span class = "lineno" > 3171< / span >   < span class = "keyword" > const< / span > Assignment& assignment,< / div >
< div class = "line" > < a name = "l03172" > < / a > < span class = "lineno" > 3172< / span >   std::vector< std::unique_ptr< Assignment> > * assignments) {< / div >
< div class = "line" > < a name = "l03173" > < / a > < span class = "lineno" > 3173< / span >   tmp_assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (& assignment);< / div >
< div class = "line" > < a name = "l03174" > < / a > < span class = "lineno" > 3174< / span >   solver_-> Solve(restore_tmp_assignment_, collect_one_assignment_,< / div >
< div class = "line" > < a name = "l03175" > < / a > < span class = "lineno" > 3175< / span >   GetOrCreateLimit());< / div >
< div class = "line" > < a name = "l03176" > < / a > < span class = "lineno" > 3176< / span >   < span class = "keywordflow" > if< / span > (collect_one_assignment_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > () == 1) {< / div >
< div class = "line" > < a name = "l03177" > < / a > < span class = "lineno" > 3177< / span >   assignments-> push_back(absl::make_unique< Assignment> (solver_.get()));< / div >
< div class = "line" > < a name = "l03178" > < / a > < span class = "lineno" > 3178< / span >   assignments-> back()-> Copy(collect_one_assignment_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (0));< / div >
< div class = "line" > < a name = "l03179" > < / a > < span class = "lineno" > 3179< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l03180" > < / a > < span class = "lineno" > 3180< / span >   }< / div >
< div class = "line" > < a name = "l03181" > < / a > < span class = "lineno" > 3181< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03182" > < / a > < span class = "lineno" > 3182< / span >   }< / div >
< div class = "line" > < a name = "l03183" > < / a > < span class = "lineno" > 3183< / span >   < / div >
< div class = "line" > < a name = "l03184" > < / a > < span class = "lineno" > 3184< / span >   < span class = "keywordtype" > void< / span > RoutingModel::LogSolution(< span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ,< / div >
< div class = "line" > < a name = "l03185" > < / a > < span class = "lineno" > 3185< / span >   < span class = "keyword" > const< / span > std::string& description,< / div >
< div class = "line" > < a name = "l03186" > < / a > < span class = "lineno" > 3186< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > solution_cost, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_time_ms) {< / div >
< div class = "line" > < a name = "l03187" > < / a > < span class = "lineno" > 3187< / span >   < span class = "keyword" > const< / span > std::string memory_str = < a class = "code" href = "namespaceoperations__research.html#acb92bdbce12d475f965f6db3c5f5b7b5" > MemoryUsage< / a > ();< / div >
< div class = "line" > < a name = "l03188" > < / a > < span class = "lineno" > 3188< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > cost_scaling_factor = < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .log_cost_scaling_factor();< / div >
< div class = "line" > < a name = "l03189" > < / a > < span class = "lineno" > 3189< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > double< / span > cost_offset = < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .log_cost_offset();< / div >
< div class = "line" > < a name = "l03190" > < / a > < span class = "lineno" > 3190< / span >   < span class = "keyword" > const< / span > std::string cost_string =< / div >
< div class = "line" > < a name = "l03191" > < / a > < span class = "lineno" > 3191< / span >   cost_scaling_factor == 1.0 & & cost_offset == 0.0< / div >
< div class = "line" > < a name = "l03192" > < / a > < span class = "lineno" > 3192< / span >   ? absl::StrCat(solution_cost)< / div >
< div class = "line" > < a name = "l03193" > < / a > < span class = "lineno" > 3193< / span >   : < a class = "code" href = "namespaceabsl.html" > absl< / a > ::StrFormat(< / div >
< div class = "line" > < a name = "l03194" > < / a > < span class = "lineno" > 3194< / span >   < span class = "stringliteral" > " %d (%.8lf)" < / span > , solution_cost,< / div >
< div class = "line" > < a name = "l03195" > < / a > < span class = "lineno" > 3195< / span >   cost_scaling_factor * (solution_cost + cost_offset));< / div >
< div class = "line" > < a name = "l03196" > < / a > < span class = "lineno" > 3196< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9" > INFO< / a > ) < < absl::StrFormat(< / div >
< div class = "line" > < a name = "l03197" > < / a > < span class = "lineno" > 3197< / span >   < span class = "stringliteral" > " %s (%s, time = %d ms, memory used = %s)" < / span > , description, cost_string,< / div >
< div class = "line" > < a name = "l03198" > < / a > < span class = "lineno" > 3198< / span >   solver_-> wall_time() - start_time_ms, memory_str);< / div >
< div class = "line" > < a name = "l03199" > < / a > < span class = "lineno" > 3199< / span >   }< / div >
< div class = "line" > < a name = "l03200" > < / a > < span class = "lineno" > 3200< / span >   < / div >
< div class = "line" > < a name = "l03201" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38" > 3201< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38" > RoutingModel::SolveFromAssignmentWithParameters< / a > (< / div >
< div class = "line" > < a name = "l03202" > < / a > < span class = "lineno" > 3202< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * assignment, < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ,< / div >
< div class = "line" > < a name = "l03203" > < / a > < span class = "lineno" > 3203< / span >   std::vector< const Assignment*> * solutions) {< / div >
< div class = "line" > < a name = "l03204" > < / a > < span class = "lineno" > 3204< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_time_ms = solver_-> wall_time();< / div >
< div class = "line" > < a name = "l03205" > < / a > < span class = "lineno" > 3205< / span >   QuietCloseModelWithParameters(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l03206" > < / a > < span class = "lineno" > 3206< / span >   < a class = "code" href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > (1) < < < span class = "stringliteral" > " Search parameters:\n" < / span > < < < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .DebugString();< / div >
< div class = "line" > < a name = "l03207" > < / a > < span class = "lineno" > 3207< / span >   < span class = "keywordflow" > if< / span > (solutions != < span class = "keyword" > nullptr< / span > ) solutions-> clear();< / div >
< div class = "line" > < a name = "l03208" > < / a > < span class = "lineno" > 3208< / span >   < span class = "keywordflow" > if< / span > (status_ == < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > ROUTING_INVALID< / a > ) {< / div >
< div class = "line" > < a name = "l03209" > < / a > < span class = "lineno" > 3209< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03210" > < / a > < span class = "lineno" > 3210< / span >   }< / div >
< div class = "line" > < a name = "l03211" > < / a > < span class = "lineno" > 3211< / span >   limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (GetTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l03212" > < / a > < span class = "lineno" > 3212< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .solution_limit());< / div >
< div class = "line" > < a name = "l03213" > < / a > < span class = "lineno" > 3213< / span >   ls_limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (GetTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , 1);< / div >
< div class = "line" > < a name = "l03214" > < / a > < span class = "lineno" > 3214< / span >   lns_limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (GetLnsTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l03215" > < / a > < span class = "lineno" > 3215< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l03216" > < / a > < span class = "lineno" > 3216< / span >   < span class = "comment" > // NOTE: Allow more time for the first solution' s scheduling, since if it< / span > < / div >
< div class = "line" > < a name = "l03217" > < / a > < span class = "lineno" > 3217< / span >   < span class = "comment" > // fails, we won' t have anything to build upon.< / span > < / div >
< div class = "line" > < a name = "l03218" > < / a > < span class = "lineno" > 3218< / span >   < span class = "comment" > // We set this time limit based on whether local/global dimension optimizers< / span > < / div >
< div class = "line" > < a name = "l03219" > < / a > < span class = "lineno" > 3219< / span >   < span class = "comment" > // are used in the finalizer to avoid going over the general time limit.< / span > < / div >
< div class = "line" > < a name = "l03220" > < / a > < span class = "lineno" > 3220< / span >   < span class = "comment" > // TODO(user): Adapt this when absolute timeouts are given to the model.< / span > < / div >
< div class = "line" > < a name = "l03221" > < / a > < span class = "lineno" > 3221< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > time_limit_shares = 1 + !global_dimension_optimizers_.empty() +< / div >
< div class = "line" > < a name = "l03222" > < / a > < span class = "lineno" > 3222< / span >   !local_dimension_optimizers_.empty();< / div >
< div class = "line" > < a name = "l03223" > < / a > < span class = "lineno" > 3223< / span >   < span class = "keyword" > const< / span > absl::Duration first_solution_lns_time_limit =< / div >
< div class = "line" > < a name = "l03224" > < / a > < span class = "lineno" > 3224< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (GetTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) / time_limit_shares,< / div >
< div class = "line" > < a name = "l03225" > < / a > < span class = "lineno" > 3225< / span >   GetLnsTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ));< / div >
< div class = "line" > < a name = "l03226" > < / a > < span class = "lineno" > 3226< / span >   first_solution_lns_limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (first_solution_lns_time_limit,< / div >
< div class = "line" > < a name = "l03227" > < / a > < span class = "lineno" > 3227< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l03228" > < / a > < span class = "lineno" > 3228< / span >   < / div >
< div class = "line" > < a name = "l03229" > < / a > < span class = "lineno" > 3229< / span >   std::vector< std::unique_ptr< Assignment> > solution_pool;< / div >
< div class = "line" > < a name = "l03230" > < / a > < span class = "lineno" > 3230< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .use_cp() == < a class = "code" href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0" > BOOL_TRUE< / a > ) {< / div >
< div class = "line" > < a name = "l03231" > < / a > < span class = "lineno" > 3231< / span >   < span class = "keywordflow" > if< / span > (< span class = "keyword" > nullptr< / span > == assignment) {< / div >
< div class = "line" > < a name = "l03232" > < / a > < span class = "lineno" > 3232< / span >   < span class = "keywordtype" > bool< / span > solution_found = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03233" > < / a > < span class = "lineno" > 3233< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > matching(solver_.get());< / div >
< div class = "line" > < a name = "l03234" > < / a > < span class = "lineno" > 3234< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ac8347e84488d1b5eb7b5e6972fb32be3" > IsMatchingModel< / a > () & & SolveMatchingModel(& matching, < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) & & < / div >
< div class = "line" > < a name = "l03235" > < / a > < span class = "lineno" > 3235< / span >   AppendAssignmentIfFeasible(matching, & solution_pool)) {< / div >
< div class = "line" > < a name = "l03236" > < / a > < span class = "lineno" > 3236< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .log_search()) {< / div >
< div class = "line" > < a name = "l03237" > < / a > < span class = "lineno" > 3237< / span >   LogSolution(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "stringliteral" > " Min-Cost Flow Solution" < / span > ,< / div >
< div class = "line" > < a name = "l03238" > < / a > < span class = "lineno" > 3238< / span >   solution_pool.back()-> ObjectiveValue(), start_time_ms);< / div >
< div class = "line" > < a name = "l03239" > < / a > < span class = "lineno" > 3239< / span >   }< / div >
< div class = "line" > < a name = "l03240" > < / a > < span class = "lineno" > 3240< / span >   solution_found = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l03241" > < / a > < span class = "lineno" > 3241< / span >   }< / div >
< div class = "line" > < a name = "l03242" > < / a > < span class = "lineno" > 3242< / span >   < span class = "keywordflow" > if< / span > (!solution_found) {< / div >
< div class = "line" > < a name = "l03243" > < / a > < span class = "lineno" > 3243< / span >   < span class = "comment" > // Build trivial solutions to which we can come back too in case the< / span > < / div >
< div class = "line" > < a name = "l03244" > < / a > < span class = "lineno" > 3244< / span >   < span class = "comment" > // solver does not manage to build something better.< / span > < / div >
< div class = "line" > < a name = "l03245" > < / a > < span class = "lineno" > 3245< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > unperformed(solver_.get());< / div >
< div class = "line" > < a name = "l03246" > < / a > < span class = "lineno" > 3246< / span >   MakeAllUnperformed(< span class = "keyword" > this< / span > , & unperformed);< / div >
< div class = "line" > < a name = "l03247" > < / a > < span class = "lineno" > 3247< / span >   < span class = "keywordflow" > if< / span > (AppendAssignmentIfFeasible(unperformed, & solution_pool) & & < / div >
< div class = "line" > < a name = "l03248" > < / a > < span class = "lineno" > 3248< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .log_search()) {< / div >
< div class = "line" > < a name = "l03249" > < / a > < span class = "lineno" > 3249< / span >   LogSolution(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "stringliteral" > " All Unperformed Solution" < / span > ,< / div >
< div class = "line" > < a name = "l03250" > < / a > < span class = "lineno" > 3250< / span >   solution_pool.back()-> ObjectiveValue(), start_time_ms);< / div >
< div class = "line" > < a name = "l03251" > < / a > < span class = "lineno" > 3251< / span >   }< / div >
< div class = "line" > < a name = "l03252" > < / a > < span class = "lineno" > 3252< / span >   < span class = "keyword" > const< / span > absl::Duration elapsed_time =< / div >
< div class = "line" > < a name = "l03253" > < / a > < span class = "lineno" > 3253< / span >   absl::Milliseconds(solver_-> wall_time() - start_time_ms);< / div >
< div class = "line" > < a name = "l03254" > < / a > < span class = "lineno" > 3254< / span >   < span class = "keyword" > const< / span > absl::Duration time_left =< / div >
< div class = "line" > < a name = "l03255" > < / a > < span class = "lineno" > 3255< / span >   GetTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) - elapsed_time;< / div >
< div class = "line" > < a name = "l03256" > < / a > < span class = "lineno" > 3256< / span >   < span class = "keywordflow" > if< / span > (time_left > = absl::ZeroDuration()) {< / div >
< div class = "line" > < a name = "l03257" > < / a > < span class = "lineno" > 3257< / span >   limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (time_left, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l03258" > < / a > < span class = "lineno" > 3258< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .solution_limit());< / div >
< div class = "line" > < a name = "l03259" > < / a > < span class = "lineno" > 3259< / span >   ls_limit_-> < a class = "code" href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > UpdateLimits< / a > (time_left, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , 1);< / div >
< div class = "line" > < a name = "l03260" > < / a > < span class = "lineno" > 3260< / span >   solver_-> Solve(solve_db_, monitors_);< / div >
< div class = "line" > < a name = "l03261" > < / a > < span class = "lineno" > 3261< / span >   }< / div >
< div class = "line" > < a name = "l03262" > < / a > < span class = "lineno" > 3262< / span >   }< / div >
< div class = "line" > < a name = "l03263" > < / a > < span class = "lineno" > 3263< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03264" > < / a > < span class = "lineno" > 3264< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (assignment);< / div >
< div class = "line" > < a name = "l03265" > < / a > < span class = "lineno" > 3265< / span >   solver_-> Solve(improve_db_, monitors_);< / div >
< div class = "line" > < a name = "l03266" > < / a > < span class = "lineno" > 3266< / span >   }< / div >
< div class = "line" > < a name = "l03267" > < / a > < span class = "lineno" > 3267< / span >   }< / div >
< div class = "line" > < a name = "l03268" > < / a > < span class = "lineno" > 3268< / span >   < / div >
< div class = "line" > < a name = "l03269" > < / a > < span class = "lineno" > 3269< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .use_cp_sat() == < a class = "code" href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0" > BOOL_TRUE< / a > ) {< / div >
< div class = "line" > < a name = "l03270" > < / a > < span class = "lineno" > 3270< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > solution_count = collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > ();< / div >
< div class = "line" > < a name = "l03271" > < / a > < span class = "lineno" > 3271< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < span class = "keyword" > const< / span > cp_solution =< / div >
< div class = "line" > < a name = "l03272" > < / a > < span class = "lineno" > 3272< / span >   solution_count > = 1 ? collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (solution_count - 1)< / div >
< div class = "line" > < a name = "l03273" > < / a > < span class = "lineno" > 3273< / span >   : < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03274" > < / a > < span class = "lineno" > 3274< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > sat_solution(solver_.get());< / div >
< div class = "line" > < a name = "l03275" > < / a > < span class = "lineno" > 3275< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespaceoperations__research.html#a082573f2b119f85031afcc6b9096b102" > SolveModelWithSat< / a > (*< span class = "keyword" > this< / span > , < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , cp_solution, & sat_solution) & & < / div >
< div class = "line" > < a name = "l03276" > < / a > < span class = "lineno" > 3276< / span >   AppendAssignmentIfFeasible(sat_solution, & solution_pool) & & < / div >
< div class = "line" > < a name = "l03277" > < / a > < span class = "lineno" > 3277< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .log_search()) {< / div >
< div class = "line" > < a name = "l03278" > < / a > < span class = "lineno" > 3278< / span >   LogSolution(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "stringliteral" > " SAT" < / span > , solution_pool.back()-> ObjectiveValue(),< / div >
< div class = "line" > < a name = "l03279" > < / a > < span class = "lineno" > 3279< / span >   start_time_ms);< / div >
< div class = "line" > < a name = "l03280" > < / a > < span class = "lineno" > 3280< / span >   }< / div >
< div class = "line" > < a name = "l03281" > < / a > < span class = "lineno" > 3281< / span >   }< / div >
< div class = "line" > < a name = "l03282" > < / a > < span class = "lineno" > 3282< / span >   < / div >
< div class = "line" > < a name = "l03283" > < / a > < span class = "lineno" > 3283< / span >   < span class = "keyword" > const< / span > absl::Duration elapsed_time =< / div >
< div class = "line" > < a name = "l03284" > < / a > < span class = "lineno" > 3284< / span >   absl::Milliseconds(solver_-> wall_time() - start_time_ms);< / div >
< div class = "line" > < a name = "l03285" > < / a > < span class = "lineno" > 3285< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > solution_count = collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > ();< / div >
< div class = "line" > < a name = "l03286" > < / a > < span class = "lineno" > 3286< / span >   < span class = "keywordflow" > if< / span > (solution_count > = 1 || !solution_pool.empty()) {< / div >
< div class = "line" > < a name = "l03287" > < / a > < span class = "lineno" > 3287< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e" > ROUTING_SUCCESS< / a > ;< / div >
< div class = "line" > < a name = "l03288" > < / a > < span class = "lineno" > 3288< / span >   < span class = "keywordflow" > if< / span > (solutions != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l03289" > < / a > < span class = "lineno" > 3289< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < solution_count; ++i) {< / div >
< div class = "line" > < a name = "l03290" > < / a > < span class = "lineno" > 3290< / span >   solutions-> push_back(< / div >
< div class = "line" > < a name = "l03291" > < / a > < span class = "lineno" > 3291< / span >   solver_-> MakeAssignment(collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (i)));< / div >
< div class = "line" > < a name = "l03292" > < / a > < span class = "lineno" > 3292< / span >   }< / div >
< div class = "line" > < a name = "l03293" > < / a > < span class = "lineno" > 3293< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & solution : solution_pool) {< / div >
< div class = "line" > < a name = "l03294" > < / a > < span class = "lineno" > 3294< / span >   < span class = "keywordflow" > if< / span > (solutions-> empty() ||< / div >
< div class = "line" > < a name = "l03295" > < / a > < span class = "lineno" > 3295< / span >   solution-> ObjectiveValue() < solutions-> back()-> ObjectiveValue()) {< / div >
< div class = "line" > < a name = "l03296" > < / a > < span class = "lineno" > 3296< / span >   solutions-> push_back(solver_-> MakeAssignment(solution.get()));< / div >
< div class = "line" > < a name = "l03297" > < / a > < span class = "lineno" > 3297< / span >   }< / div >
< div class = "line" > < a name = "l03298" > < / a > < span class = "lineno" > 3298< / span >   }< / div >
< div class = "line" > < a name = "l03299" > < / a > < span class = "lineno" > 3299< / span >   < span class = "keywordflow" > return< / span > solutions-> back();< / div >
< div class = "line" > < a name = "l03300" > < / a > < span class = "lineno" > 3300< / span >   }< / div >
< div class = "line" > < a name = "l03301" > < / a > < span class = "lineno" > 3301< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * best_assignment =< / div >
< div class = "line" > < a name = "l03302" > < / a > < span class = "lineno" > 3302< / span >   solution_count > = 1 ? collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (solution_count - 1)< / div >
< div class = "line" > < a name = "l03303" > < / a > < span class = "lineno" > 3303< / span >   : < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03304" > < / a > < span class = "lineno" > 3304< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & solution : solution_pool) {< / div >
< div class = "line" > < a name = "l03305" > < / a > < span class = "lineno" > 3305< / span >   < span class = "keywordflow" > if< / span > (best_assignment == < span class = "keyword" > nullptr< / span > ||< / div >
< div class = "line" > < a name = "l03306" > < / a > < span class = "lineno" > 3306< / span >   solution-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a872ff9f9b519eb2dc7a519739b51985d" > ObjectiveValue< / a > () < best_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a872ff9f9b519eb2dc7a519739b51985d" > ObjectiveValue< / a > ()) {< / div >
< div class = "line" > < a name = "l03307" > < / a > < span class = "lineno" > 3307< / span >   best_assignment = solution.get();< / div >
< div class = "line" > < a name = "l03308" > < / a > < span class = "lineno" > 3308< / span >   }< / div >
< div class = "line" > < a name = "l03309" > < / a > < span class = "lineno" > 3309< / span >   }< / div >
< div class = "line" > < a name = "l03310" > < / a > < span class = "lineno" > 3310< / span >   < span class = "keywordflow" > return< / span > solver_-> MakeAssignment(best_assignment);< / div >
< div class = "line" > < a name = "l03311" > < / a > < span class = "lineno" > 3311< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03312" > < / a > < span class = "lineno" > 3312< / span >   < span class = "keywordflow" > if< / span > (elapsed_time > = GetTimeLimit(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )) {< / div >
< div class = "line" > < a name = "l03313" > < / a > < span class = "lineno" > 3313< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3" > ROUTING_FAIL_TIMEOUT< / a > ;< / div >
< div class = "line" > < a name = "l03314" > < / a > < span class = "lineno" > 3314< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03315" > < / a > < span class = "lineno" > 3315< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd" > ROUTING_FAIL< / a > ;< / div >
< div class = "line" > < a name = "l03316" > < / a > < span class = "lineno" > 3316< / span >   }< / div >
< div class = "line" > < a name = "l03317" > < / a > < span class = "lineno" > 3317< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03318" > < / a > < span class = "lineno" > 3318< / span >   }< / div >
< div class = "line" > < a name = "l03319" > < / a > < span class = "lineno" > 3319< / span >   }< / div >
< div class = "line" > < a name = "l03320" > < / a > < span class = "lineno" > 3320< / span >   < / div >
< div class = "line" > < a name = "l03321" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413" > 3321< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413" > RoutingModel::SetAssignmentFromOtherModelAssignment< / a > (< / div >
< div class = "line" > < a name = "l03322" > < / a > < span class = "lineno" > 3322< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * target_assignment, < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * source_model,< / div >
< div class = "line" > < a name = "l03323" > < / a > < span class = "lineno" > 3323< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * source_assignment) {< / div >
< div class = "line" > < a name = "l03324" > < / a > < span class = "lineno" > 3324< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l03325" > < / a > < span class = "lineno" > 3325< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (size, source_model-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ());< / div >
< div class = "line" > < a name = "l03326" > < / a > < span class = "lineno" > 3326< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (target_assignment-> < a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > (), solver_.get());< / div >
< div class = "line" > < a name = "l03327" > < / a > < span class = "lineno" > 3327< / span >   < / div >
< div class = "line" > < a name = "l03328" > < / a > < span class = "lineno" > 3328< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l03329" > < / a > < span class = "lineno" > 3329< / span >   < a class = "code" href = "namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136" > SetAssignmentFromAssignment< / a > (target_assignment, < a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > (), source_assignment,< / div >
< div class = "line" > < a name = "l03330" > < / a > < span class = "lineno" > 3330< / span >   source_model-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > ());< / div >
< div class = "line" > < a name = "l03331" > < / a > < span class = "lineno" > 3331< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03332" > < / a > < span class = "lineno" > 3332< / span >   std::vector< IntVar*> source_vars(size + size + vehicles_);< / div >
< div class = "line" > < a name = "l03333" > < / a > < span class = "lineno" > 3333< / span >   std::vector< IntVar*> target_vars(size + size + vehicles_);< / div >
< div class = "line" > < a name = "l03334" > < / a > < span class = "lineno" > 3334< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < size; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ++) {< / div >
< div class = "line" > < a name = "l03335" > < / a > < span class = "lineno" > 3335< / span >   source_vars[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = source_model-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03336" > < / a > < span class = "lineno" > 3336< / span >   target_vars[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03337" > < / a > < span class = "lineno" > 3337< / span >   }< / div >
< div class = "line" > < a name = "l03338" > < / a > < span class = "lineno" > 3338< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < size + vehicles_; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ++) {< / div >
< div class = "line" > < a name = "l03339" > < / a > < span class = "lineno" > 3339< / span >   source_vars[size + < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = source_model-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03340" > < / a > < span class = "lineno" > 3340< / span >   target_vars[size + < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03341" > < / a > < span class = "lineno" > 3341< / span >   }< / div >
< div class = "line" > < a name = "l03342" > < / a > < span class = "lineno" > 3342< / span >   < a class = "code" href = "namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136" > SetAssignmentFromAssignment< / a > (target_assignment, target_vars,< / div >
< div class = "line" > < a name = "l03343" > < / a > < span class = "lineno" > 3343< / span >   source_assignment, source_vars);< / div >
< div class = "line" > < a name = "l03344" > < / a > < span class = "lineno" > 3344< / span >   }< / div >
< div class = "line" > < a name = "l03345" > < / a > < span class = "lineno" > 3345< / span >   < / div >
< div class = "line" > < a name = "l03346" > < / a > < span class = "lineno" > 3346< / span >   target_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff" > AddObjective< / a > (cost_);< / div >
< div class = "line" > < a name = "l03347" > < / a > < span class = "lineno" > 3347< / span >   }< / div >
< div class = "line" > < a name = "l03348" > < / a > < span class = "lineno" > 3348< / span >   < / div >
< div class = "line" > < a name = "l03349" > < / a > < span class = "lineno" > 3349< / span >   < span class = "comment" > // Computing a lower bound to the cost of a vehicle routing problem solving a< / span > < / div >
< div class = "line" > < a name = "l03350" > < / a > < span class = "lineno" > 3350< / span >   < span class = "comment" > // a linear assignment problem (minimum-cost perfect bipartite matching).< / span > < / div >
< div class = "line" > < a name = "l03351" > < / a > < span class = "lineno" > 3351< / span >   < span class = "comment" > // A bipartite graph is created with left nodes representing the nodes of the< / span > < / div >
< div class = "line" > < a name = "l03352" > < / a > < span class = "lineno" > 3352< / span >   < span class = "comment" > // routing problem and right nodes representing possible node successors; an< / span > < / div >
< div class = "line" > < a name = "l03353" > < / a > < span class = "lineno" > 3353< / span >   < span class = "comment" > // arc between a left node l and a right node r is created if r can be the< / span > < / div >
< div class = "line" > < a name = "l03354" > < / a > < span class = "lineno" > 3354< / span >   < span class = "comment" > // node folowing l in a route (Next(l) = r); the cost of the arc is the transit< / span > < / div >
< div class = "line" > < a name = "l03355" > < / a > < span class = "lineno" > 3355< / span >   < span class = "comment" > // cost between l and r in the routing problem.< / span > < / div >
< div class = "line" > < a name = "l03356" > < / a > < span class = "lineno" > 3356< / span >   < span class = "comment" > // This is a lower bound given the solution to assignment problem does not< / span > < / div >
< div class = "line" > < a name = "l03357" > < / a > < span class = "lineno" > 3357< / span >   < span class = "comment" > // necessarily produce a (set of) closed route(s) from a starting node to an< / span > < / div >
< div class = "line" > < a name = "l03358" > < / a > < span class = "lineno" > 3358< / span >   < span class = "comment" > // ending node.< / span > < / div >
< div class = "line" > < a name = "l03359" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae9b2404a26ab1e6acf562b8261eeba38" > 3359< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae9b2404a26ab1e6acf562b8261eeba38" > RoutingModel::ComputeLowerBound< / a > () {< / div >
< div class = "line" > < a name = "l03360" > < / a > < span class = "lineno" > 3360< / span >   < span class = "keywordflow" > if< / span > (!closed_) {< / div >
< div class = "line" > < a name = "l03361" > < / a > < span class = "lineno" > 3361< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " Non-closed model not supported." < / span > ;< / div >
< div class = "line" > < a name = "l03362" > < / a > < span class = "lineno" > 3362< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03363" > < / a > < span class = "lineno" > 3363< / span >   }< / div >
< div class = "line" > < a name = "l03364" > < / a > < span class = "lineno" > 3364< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l03365" > < / a > < span class = "lineno" > 3365< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " Non-homogeneous vehicle costs not supported" < / span > ;< / div >
< div class = "line" > < a name = "l03366" > < / a > < span class = "lineno" > 3366< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03367" > < / a > < span class = "lineno" > 3367< / span >   }< / div >
< div class = "line" > < a name = "l03368" > < / a > < span class = "lineno" > 3368< / span >   < span class = "keywordflow" > if< / span > (!disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc" > empty< / a > ()) {< / div >
< div class = "line" > < a name = "l03369" > < / a > < span class = "lineno" > 3369< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > )< / div >
< div class = "line" > < a name = "l03370" > < / a > < span class = "lineno" > 3370< / span >   < < < span class = "stringliteral" > " Node disjunction constraints or optional nodes not supported." < / span > ;< / div >
< div class = "line" > < a name = "l03371" > < / a > < span class = "lineno" > 3371< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03372" > < / a > < span class = "lineno" > 3372< / span >   }< / div >
< div class = "line" > < a name = "l03373" > < / a > < span class = "lineno" > 3373< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_nodes = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + vehicles_;< / div >
< div class = "line" > < a name = "l03374" > < / a > < span class = "lineno" > 3374< / span >   < a class = "code" href = "classoperations__research_1_1_forward_ebert_graph.html" > ForwardStarGraph< / a > graph(2 * num_nodes, num_nodes * num_nodes);< / div >
< div class = "line" > < a name = "l03375" > < / a > < span class = "lineno" > 3375< / span >   < a class = "code" href = "classoperations__research_1_1_linear_sum_assignment.html" > LinearSumAssignment< ForwardStarGraph> < / a > linear_sum_assignment(graph, num_nodes);< / div >
< div class = "line" > < a name = "l03376" > < / a > < span class = "lineno" > 3376< / span >   < span class = "comment" > // Adding arcs for non-end nodes, based on possible values of next variables.< / span > < / div >
< div class = "line" > < a name = "l03377" > < / a > < span class = "lineno" > 3377< / span >   < span class = "comment" > // Left nodes in the bipartite are indexed from 0 to num_nodes - 1; right< / span > < / div >
< div class = "line" > < a name = "l03378" > < / a > < span class = "lineno" > 3378< / span >   < span class = "comment" > // nodes are indexed from num_nodes to 2 * num_nodes - 1.< / span > < / div >
< div class = "line" > < a name = "l03379" > < / a > < span class = "lineno" > 3379< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > = 0; < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > < < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ) {< / div >
< div class = "line" > < a name = "l03380" > < / a > < span class = "lineno" > 3380< / span >   std::unique_ptr< IntVarIterator> iterator(< / div >
< div class = "line" > < a name = "l03381" > < / a > < span class = "lineno" > 3381< / span >   nexts_[< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ]-> MakeDomainIterator(< span class = "keyword" > false< / span > ));< / div >
< div class = "line" > < a name = "l03382" > < / a > < span class = "lineno" > 3382< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > : < a class = "code" href = "classoperations__research_1_1_init_and_get_values.html" > InitAndGetValues< / a > (iterator.get())) {< / div >
< div class = "line" > < a name = "l03383" > < / a > < span class = "lineno" > 3383< / span >   < span class = "comment" > // Given there are no disjunction constraints, a node cannot point to< / span > < / div >
< div class = "line" > < a name = "l03384" > < / a > < span class = "lineno" > 3384< / span >   < span class = "comment" > // itself. Doing this explicitly given that outside the search,< / span > < / div >
< div class = "line" > < a name = "l03385" > < / a > < span class = "lineno" > 3385< / span >   < span class = "comment" > // propagation hasn' t removed this value from next variables yet.< / span > < / div >
< div class = "line" > < a name = "l03386" > < / a > < span class = "lineno" > 3386< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > == < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ) {< / div >
< div class = "line" > < a name = "l03387" > < / a > < span class = "lineno" > 3387< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l03388" > < / a > < span class = "lineno" > 3388< / span >   }< / div >
< div class = "line" > < a name = "l03389" > < / a > < span class = "lineno" > 3389< / span >   < span class = "comment" > // The index of a right node in the bipartite graph is the index< / span > < / div >
< div class = "line" > < a name = "l03390" > < / a > < span class = "lineno" > 3390< / span >   < span class = "comment" > // of the successor offset by the number of nodes.< / span > < / div >
< div class = "line" > < a name = "l03391" > < / a > < span class = "lineno" > 3391< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d" > ArcIndex< / a > arc = graph.< a class = "code" href = "classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72" > AddArc< / a > (< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > , num_nodes + < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > );< / div >
< div class = "line" > < a name = "l03392" > < / a > < span class = "lineno" > 3392< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research.html#aee97ac67f280d35acdef2c5d461a85c3" > CostValue< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > GetHomogeneousCost< / a > (< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > , < a class = "code" href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > );< / div >
< div class = "line" > < a name = "l03393" > < / a > < span class = "lineno" > 3393< / span >   linear_sum_assignment.< a class = "code" href = "classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c" > SetArcCost< / a > (arc, < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > );< / div >
< div class = "line" > < a name = "l03394" > < / a > < span class = "lineno" > 3394< / span >   }< / div >
< div class = "line" > < a name = "l03395" > < / a > < span class = "lineno" > 3395< / span >   }< / div >
< div class = "line" > < a name = "l03396" > < / a > < span class = "lineno" > 3396< / span >   < span class = "comment" > // The linear assignment library requires having as many left and right nodes.< / span > < / div >
< div class = "line" > < a name = "l03397" > < / a > < span class = "lineno" > 3397< / span >   < span class = "comment" > // Therefore we are creating fake assignments for end nodes, forced to point< / span > < / div >
< div class = "line" > < a name = "l03398" > < / a > < span class = "lineno" > 3398< / span >   < span class = "comment" > // to the equivalent start node with a cost of 0.< / span > < / div >
< div class = "line" > < a name = "l03399" > < / a > < span class = "lineno" > 3399< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); < a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > < num_nodes; ++< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > ) {< / div >
< div class = "line" > < a name = "l03400" > < / a > < span class = "lineno" > 3400< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d" > ArcIndex< / a > arc = graph.< a class = "code" href = "classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72" > AddArc< / a > (< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > , num_nodes + starts_[< a class = "code" href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > - < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ()]);< / div >
< div class = "line" > < a name = "l03401" > < / a > < span class = "lineno" > 3401< / span >   linear_sum_assignment.< a class = "code" href = "classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c" > SetArcCost< / a > (arc, 0);< / div >
< div class = "line" > < a name = "l03402" > < / a > < span class = "lineno" > 3402< / span >   }< / div >
< div class = "line" > < a name = "l03403" > < / a > < span class = "lineno" > 3403< / span >   < span class = "keywordflow" > if< / span > (linear_sum_assignment.< a class = "code" href = "classoperations__research_1_1_linear_sum_assignment.html#a63b3d12e721188086870cc42cc46a258" > ComputeAssignment< / a > ()) {< / div >
< div class = "line" > < a name = "l03404" > < / a > < span class = "lineno" > 3404< / span >   < span class = "keywordflow" > return< / span > linear_sum_assignment.< a class = "code" href = "classoperations__research_1_1_linear_sum_assignment.html#a5afb9dde1c31f5f053cc83bf6e594db0" > GetCost< / a > ();< / div >
< div class = "line" > < a name = "l03405" > < / a > < span class = "lineno" > 3405< / span >   }< / div >
< div class = "line" > < a name = "l03406" > < / a > < span class = "lineno" > 3406< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03407" > < / a > < span class = "lineno" > 3407< / span >   }< / div >
< div class = "line" > < a name = "l03408" > < / a > < span class = "lineno" > 3408< / span >   < / div >
< div class = "line" > < a name = "l03409" > < / a > < span class = "lineno" > 3409< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::RouteCanBeUsedByVehicle(< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment,< / div >
< div class = "line" > < a name = "l03410" > < / a > < span class = "lineno" > 3410< / span >   < span class = "keywordtype" > int< / span > start_index, < span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03411" > < / a > < span class = "lineno" > 3411< / span >   < span class = "keywordtype" > int< / span > current_index =< / div >
< div class = "line" > < a name = "l03412" > < / a > < span class = "lineno" > 3412< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (start_index) ? < a class = "code" href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > Next< / a > (assignment, start_index) : start_index;< / div >
< div class = "line" > < a name = "l03413" > < / a > < span class = "lineno" > 3413< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (current_index)) {< / div >
< div class = "line" > < a name = "l03414" > < / a > < span class = "lineno" > 3414< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (current_index);< / div >
< div class = "line" > < a name = "l03415" > < / a > < span class = "lineno" > 3415< / span >   < span class = "keywordflow" > if< / span > (!vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_var.html#a7005edfb93d09a9ca1ecb989a9bc6733" > Contains< / a > (vehicle)) {< / div >
< div class = "line" > < a name = "l03416" > < / a > < span class = "lineno" > 3416< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03417" > < / a > < span class = "lineno" > 3417< / span >   }< / div >
< div class = "line" > < a name = "l03418" > < / a > < span class = "lineno" > 3418< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > next_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > Next< / a > (assignment, current_index);< / div >
< div class = "line" > < a name = "l03419" > < / a > < span class = "lineno" > 3419< / span >   < a class = "code" href = "base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb" > CHECK_NE< / a > (next_index, current_index) < < < span class = "stringliteral" > " Inactive node inside a route" < / span > ;< / div >
< div class = "line" > < a name = "l03420" > < / a > < span class = "lineno" > 3420< / span >   current_index = next_index;< / div >
< div class = "line" > < a name = "l03421" > < / a > < span class = "lineno" > 3421< / span >   }< / div >
< div class = "line" > < a name = "l03422" > < / a > < span class = "lineno" > 3422< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l03423" > < / a > < span class = "lineno" > 3423< / span >   }< / div >
< div class = "line" > < a name = "l03424" > < / a > < span class = "lineno" > 3424< / span >   < / div >
< div class = "line" > < a name = "l03425" > < / a > < span class = "lineno" > 3425< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::ReplaceUnusedVehicle(< / div >
< div class = "line" > < a name = "l03426" > < / a > < span class = "lineno" > 3426< / span >   < span class = "keywordtype" > int< / span > unused_vehicle, < span class = "keywordtype" > int< / span > active_vehicle,< / div >
< div class = "line" > < a name = "l03427" > < / a > < span class = "lineno" > 3427< / span >   Assignment* < span class = "keyword" > const< / span > compact_assignment)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03428" > < / a > < span class = "lineno" > 3428< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (compact_assignment != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03429" > < / a > < span class = "lineno" > 3429< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > IsVehicleUsed< / a > (*compact_assignment, unused_vehicle));< / div >
< div class = "line" > < a name = "l03430" > < / a > < span class = "lineno" > 3430< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > IsVehicleUsed< / a > (*compact_assignment, active_vehicle));< / div >
< div class = "line" > < a name = "l03431" > < / a > < span class = "lineno" > 3431< / span >   < span class = "comment" > // Swap NextVars at start nodes.< / span > < / div >
< div class = "line" > < a name = "l03432" > < / a > < span class = "lineno" > 3432< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > unused_vehicle_start = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (unused_vehicle);< / div >
< div class = "line" > < a name = "l03433" > < / a > < span class = "lineno" > 3433< / span >   IntVar* < span class = "keyword" > const< / span > unused_vehicle_start_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (unused_vehicle_start);< / div >
< div class = "line" > < a name = "l03434" > < / a > < span class = "lineno" > 3434< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > unused_vehicle_end = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (unused_vehicle);< / div >
< div class = "line" > < a name = "l03435" > < / a > < span class = "lineno" > 3435< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > active_vehicle_start = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (active_vehicle);< / div >
< div class = "line" > < a name = "l03436" > < / a > < span class = "lineno" > 3436< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > active_vehicle_end = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (active_vehicle);< / div >
< div class = "line" > < a name = "l03437" > < / a > < span class = "lineno" > 3437< / span >   IntVar* < span class = "keyword" > const< / span > active_vehicle_start_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (active_vehicle_start);< / div >
< div class = "line" > < a name = "l03438" > < / a > < span class = "lineno" > 3438< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > active_vehicle_next =< / div >
< div class = "line" > < a name = "l03439" > < / a > < span class = "lineno" > 3439< / span >   compact_assignment-> Value(active_vehicle_start_var);< / div >
< div class = "line" > < a name = "l03440" > < / a > < span class = "lineno" > 3440< / span >   compact_assignment-> SetValue(unused_vehicle_start_var, active_vehicle_next);< / div >
< div class = "line" > < a name = "l03441" > < / a > < span class = "lineno" > 3441< / span >   compact_assignment-> SetValue(active_vehicle_start_var, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (active_vehicle));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03442" > < / a > < span class = "lineno" > 3442< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03443" > < / a > < span class = "lineno" > 3443< / span >   < span class = "comment" > // Update VehicleVars along the route, update the last NextVar.< / span > < / div >
< div class = "line" > < a name = "l03444" > < / a > < span class = "lineno" > 3444< / span >   < span class = "keywordtype" > int< / span > current_index = active_vehicle_next;< / div >
< div class = "line" > < a name = "l03445" > < / a > < span class = "lineno" > 3445< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (current_index)) {< / div >
< div class = "line" > < a name = "l03446" > < / a > < span class = "lineno" > 3446< / span >   IntVar* < span class = "keyword" > const< / span > vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (current_index);< / div >
< div class = "line" > < a name = "l03447" > < / a > < span class = "lineno" > 3447< / span >   compact_assignment-> SetValue(vehicle_var, unused_vehicle);< / div >
< div class = "line" > < a name = "l03448" > < / a > < span class = "lineno" > 3448< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > next_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > Next< / a > (*compact_assignment, current_index);< / div >
< div class = "line" > < a name = "l03449" > < / a > < span class = "lineno" > 3449< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (next_index)) {< / div >
< div class = "line" > < a name = "l03450" > < / a > < span class = "lineno" > 3450< / span >   IntVar* < span class = "keyword" > const< / span > last_next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (current_index);< / div >
< div class = "line" > < a name = "l03451" > < / a > < span class = "lineno" > 3451< / span >   compact_assignment-> SetValue(last_next_var, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (unused_vehicle));< / div >
< div class = "line" > < a name = "l03452" > < / a > < span class = "lineno" > 3452< / span >   }< / div >
< div class = "line" > < a name = "l03453" > < / a > < span class = "lineno" > 3453< / span >   current_index = next_index;< / div >
< div class = "line" > < a name = "l03454" > < / a > < span class = "lineno" > 3454< / span >   }< / div >
< div class = "line" > < a name = "l03455" > < / a > < span class = "lineno" > 3455< / span >   < / div >
< div class = "line" > < a name = "l03456" > < / a > < span class = "lineno" > 3456< / span >   < span class = "comment" > // Update dimensions: update transits at the start.< / span > < / div >
< div class = "line" > < a name = "l03457" > < / a > < span class = "lineno" > 3457< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l03458" > < / a > < span class = "lineno" > 3458< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> & transit_variables = dimension-> transits();< / div >
< div class = "line" > < a name = "l03459" > < / a > < span class = "lineno" > 3459< / span >   IntVar* < span class = "keyword" > const< / span > unused_vehicle_transit_var =< / div >
< div class = "line" > < a name = "l03460" > < / a > < span class = "lineno" > 3460< / span >   transit_variables[unused_vehicle_start];< / div >
< div class = "line" > < a name = "l03461" > < / a > < span class = "lineno" > 3461< / span >   IntVar* < span class = "keyword" > const< / span > active_vehicle_transit_var =< / div >
< div class = "line" > < a name = "l03462" > < / a > < span class = "lineno" > 3462< / span >   transit_variables[active_vehicle_start];< / div >
< div class = "line" > < a name = "l03463" > < / a > < span class = "lineno" > 3463< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > contains_unused_vehicle_transit_var =< / div >
< div class = "line" > < a name = "l03464" > < / a > < span class = "lineno" > 3464< / span >   compact_assignment-> Contains(unused_vehicle_transit_var);< / div >
< div class = "line" > < a name = "l03465" > < / a > < span class = "lineno" > 3465< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > contains_active_vehicle_transit_var =< / div >
< div class = "line" > < a name = "l03466" > < / a > < span class = "lineno" > 3466< / span >   compact_assignment-> Contains(active_vehicle_transit_var);< / div >
< div class = "line" > < a name = "l03467" > < / a > < span class = "lineno" > 3467< / span >   < span class = "keywordflow" > if< / span > (contains_unused_vehicle_transit_var !=< / div >
< div class = "line" > < a name = "l03468" > < / a > < span class = "lineno" > 3468< / span >   contains_active_vehicle_transit_var) {< / div >
< div class = "line" > < a name = "l03469" > < / a > < span class = "lineno" > 3469< / span >   < span class = "comment" > // TODO(user): clarify the expected trigger rate of this LOG.< / span > < / div >
< div class = "line" > < a name = "l03470" > < / a > < span class = "lineno" > 3470< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9" > INFO< / a > ) < < < span class = "stringliteral" > " The assignment contains transit variable for dimension ' " < / span > < / div >
< div class = "line" > < a name = "l03471" > < / a > < span class = "lineno" > 3471< / span >   < < dimension-> name() < < < span class = "stringliteral" > " ' for some vehicles, but not for all" < / span > ;< / div >
< div class = "line" > < a name = "l03472" > < / a > < span class = "lineno" > 3472< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03473" > < / a > < span class = "lineno" > 3473< / span >   }< / div >
< div class = "line" > < a name = "l03474" > < / a > < span class = "lineno" > 3474< / span >   < span class = "keywordflow" > if< / span > (contains_unused_vehicle_transit_var) {< / div >
< div class = "line" > < a name = "l03475" > < / a > < span class = "lineno" > 3475< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_unused_vehicle_transit =< / div >
< div class = "line" > < a name = "l03476" > < / a > < span class = "lineno" > 3476< / span >   compact_assignment-> Value(unused_vehicle_transit_var);< / div >
< div class = "line" > < a name = "l03477" > < / a > < span class = "lineno" > 3477< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_active_vehicle_transit =< / div >
< div class = "line" > < a name = "l03478" > < / a > < span class = "lineno" > 3478< / span >   compact_assignment-> Value(active_vehicle_transit_var);< / div >
< div class = "line" > < a name = "l03479" > < / a > < span class = "lineno" > 3479< / span >   compact_assignment-> SetValue(unused_vehicle_transit_var,< / div >
< div class = "line" > < a name = "l03480" > < / a > < span class = "lineno" > 3480< / span >   old_active_vehicle_transit);< / div >
< div class = "line" > < a name = "l03481" > < / a > < span class = "lineno" > 3481< / span >   compact_assignment-> SetValue(active_vehicle_transit_var,< / div >
< div class = "line" > < a name = "l03482" > < / a > < span class = "lineno" > 3482< / span >   old_unused_vehicle_transit);< / div >
< div class = "line" > < a name = "l03483" > < / a > < span class = "lineno" > 3483< / span >   }< / div >
< div class = "line" > < a name = "l03484" > < / a > < span class = "lineno" > 3484< / span >   < / div >
< div class = "line" > < a name = "l03485" > < / a > < span class = "lineno" > 3485< / span >   < span class = "comment" > // Update dimensions: update cumuls at the end.< / span > < / div >
< div class = "line" > < a name = "l03486" > < / a > < span class = "lineno" > 3486< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> & cumul_variables = dimension-> cumuls();< / div >
< div class = "line" > < a name = "l03487" > < / a > < span class = "lineno" > 3487< / span >   IntVar* < span class = "keyword" > const< / span > unused_vehicle_cumul_var =< / div >
< div class = "line" > < a name = "l03488" > < / a > < span class = "lineno" > 3488< / span >   cumul_variables[unused_vehicle_end];< / div >
< div class = "line" > < a name = "l03489" > < / a > < span class = "lineno" > 3489< / span >   IntVar* < span class = "keyword" > const< / span > active_vehicle_cumul_var =< / div >
< div class = "line" > < a name = "l03490" > < / a > < span class = "lineno" > 3490< / span >   cumul_variables[active_vehicle_end];< / div >
< div class = "line" > < a name = "l03491" > < / a > < span class = "lineno" > 3491< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_unused_vehicle_cumul =< / div >
< div class = "line" > < a name = "l03492" > < / a > < span class = "lineno" > 3492< / span >   compact_assignment-> Value(unused_vehicle_cumul_var);< / div >
< div class = "line" > < a name = "l03493" > < / a > < span class = "lineno" > 3493< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_active_vehicle_cumul =< / div >
< div class = "line" > < a name = "l03494" > < / a > < span class = "lineno" > 3494< / span >   compact_assignment-> Value(active_vehicle_cumul_var);< / div >
< div class = "line" > < a name = "l03495" > < / a > < span class = "lineno" > 3495< / span >   compact_assignment-> SetValue(unused_vehicle_cumul_var,< / div >
< div class = "line" > < a name = "l03496" > < / a > < span class = "lineno" > 3496< / span >   old_active_vehicle_cumul);< / div >
< div class = "line" > < a name = "l03497" > < / a > < span class = "lineno" > 3497< / span >   compact_assignment-> SetValue(active_vehicle_cumul_var,< / div >
< div class = "line" > < a name = "l03498" > < / a > < span class = "lineno" > 3498< / span >   old_unused_vehicle_cumul);< / div >
< div class = "line" > < a name = "l03499" > < / a > < span class = "lineno" > 3499< / span >   }< / div >
< div class = "line" > < a name = "l03500" > < / a > < span class = "lineno" > 3500< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l03501" > < / a > < span class = "lineno" > 3501< / span >   }< / div >
< div class = "line" > < a name = "l03502" > < / a > < span class = "lineno" > 3502< / span >   < / div >
< div class = "line" > < a name = "l03503" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b" > 3503< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b" > RoutingModel::CompactAssignment< / a > (< / div >
< div class = "line" > < a name = "l03504" > < / a > < span class = "lineno" > 3504< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03505" > < / a > < span class = "lineno" > 3505< / span >   < span class = "keywordflow" > return< / span > CompactAssignmentInternal(assignment, < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l03506" > < / a > < span class = "lineno" > 3506< / span >   }< / div >
< div class = "line" > < a name = "l03507" > < / a > < span class = "lineno" > 3507< / span >   < / div >
< div class = "line" > < a name = "l03508" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353" > 3508< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353" > RoutingModel::CompactAndCheckAssignment< / a > (< / div >
< div class = "line" > < a name = "l03509" > < / a > < span class = "lineno" > 3509< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03510" > < / a > < span class = "lineno" > 3510< / span >   < span class = "keywordflow" > return< / span > CompactAssignmentInternal(assignment, < span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l03511" > < / a > < span class = "lineno" > 3511< / span >   }< / div >
< div class = "line" > < a name = "l03512" > < / a > < span class = "lineno" > 3512< / span >   < / div >
< div class = "line" > < a name = "l03513" > < / a > < span class = "lineno" > 3513< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * RoutingModel::CompactAssignmentInternal(< / div >
< div class = "line" > < a name = "l03514" > < / a > < span class = "lineno" > 3514< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment, < span class = "keywordtype" > bool< / span > check_compact_assignment)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03515" > < / a > < span class = "lineno" > 3515< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > (), solver_.get());< / div >
< div class = "line" > < a name = "l03516" > < / a > < span class = "lineno" > 3516< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l03517" > < / a > < span class = "lineno" > 3517< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > )< / div >
< div class = "line" > < a name = "l03518" > < / a > < span class = "lineno" > 3518< / span >   < < < span class = "stringliteral" > " The costs are not homogeneous, routes cannot be rearranged" < / span > ;< / div >
< div class = "line" > < a name = "l03519" > < / a > < span class = "lineno" > 3519< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03520" > < / a > < span class = "lineno" > 3520< / span >   }< / div >
< div class = "line" > < a name = "l03521" > < / a > < span class = "lineno" > 3521< / span >   < / div >
< div class = "line" > < a name = "l03522" > < / a > < span class = "lineno" > 3522< / span >   std::unique_ptr< Assignment> compact_assignment(< span class = "keyword" > new< / span > Assignment(& assignment));< / div >
< div class = "line" > < a name = "l03523" > < / a > < span class = "lineno" > 3523< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < vehicles_ - 1; ++vehicle) {< / div >
< div class = "line" > < a name = "l03524" > < / a > < span class = "lineno" > 3524< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > IsVehicleUsed< / a > (*compact_assignment, vehicle)) {< / div >
< div class = "line" > < a name = "l03525" > < / a > < span class = "lineno" > 3525< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l03526" > < / a > < span class = "lineno" > 3526< / span >   }< / div >
< div class = "line" > < a name = "l03527" > < / a > < span class = "lineno" > 3527< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle_start = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03528" > < / a > < span class = "lineno" > 3528< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle_end = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03529" > < / a > < span class = "lineno" > 3529< / span >   < span class = "comment" > // Find the last vehicle, that can swap routes with this one.< / span > < / div >
< div class = "line" > < a name = "l03530" > < / a > < span class = "lineno" > 3530< / span >   < span class = "keywordtype" > int< / span > swap_vehicle = vehicles_ - 1;< / div >
< div class = "line" > < a name = "l03531" > < / a > < span class = "lineno" > 3531< / span >   < span class = "keywordtype" > bool< / span > has_more_vehicles_with_route = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03532" > < / a > < span class = "lineno" > 3532< / span >   < span class = "keywordflow" > for< / span > (; swap_vehicle > vehicle; --swap_vehicle) {< / div >
< div class = "line" > < a name = "l03533" > < / a > < span class = "lineno" > 3533< / span >   < span class = "comment" > // If a vehicle was already swapped, it will appear in compact_assignment< / span > < / div >
< div class = "line" > < a name = "l03534" > < / a > < span class = "lineno" > 3534< / span >   < span class = "comment" > // as unused.< / span > < / div >
< div class = "line" > < a name = "l03535" > < / a > < span class = "lineno" > 3535< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > IsVehicleUsed< / a > (*compact_assignment, swap_vehicle) ||< / div >
< div class = "line" > < a name = "l03536" > < / a > < span class = "lineno" > 3536< / span >   !< a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > IsVehicleUsed< / a > (*compact_assignment, swap_vehicle)) {< / div >
< div class = "line" > < a name = "l03537" > < / a > < span class = "lineno" > 3537< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l03538" > < / a > < span class = "lineno" > 3538< / span >   }< / div >
< div class = "line" > < a name = "l03539" > < / a > < span class = "lineno" > 3539< / span >   has_more_vehicles_with_route = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l03540" > < / a > < span class = "lineno" > 3540< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > swap_vehicle_start = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (swap_vehicle);< / div >
< div class = "line" > < a name = "l03541" > < / a > < span class = "lineno" > 3541< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > swap_vehicle_end = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (swap_vehicle);< / div >
< div class = "line" > < a name = "l03542" > < / a > < span class = "lineno" > 3542< / span >   < span class = "keywordflow" > if< / span > (manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (vehicle_start) !=< / div >
< div class = "line" > < a name = "l03543" > < / a > < span class = "lineno" > 3543< / span >   manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (swap_vehicle_start) ||< / div >
< div class = "line" > < a name = "l03544" > < / a > < span class = "lineno" > 3544< / span >   manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (vehicle_end) !=< / div >
< div class = "line" > < a name = "l03545" > < / a > < span class = "lineno" > 3545< / span >   manager_.< a class = "code" href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > IndexToNode< / a > (swap_vehicle_end)) {< / div >
< div class = "line" > < a name = "l03546" > < / a > < span class = "lineno" > 3546< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l03547" > < / a > < span class = "lineno" > 3547< / span >   }< / div >
< div class = "line" > < a name = "l03548" > < / a > < span class = "lineno" > 3548< / span >   < / div >
< div class = "line" > < a name = "l03549" > < / a > < span class = "lineno" > 3549< / span >   < span class = "comment" > // Check that updating VehicleVars is OK.< / span > < / div >
< div class = "line" > < a name = "l03550" > < / a > < span class = "lineno" > 3550< / span >   < span class = "keywordflow" > if< / span > (RouteCanBeUsedByVehicle(*compact_assignment, swap_vehicle_start,< / div >
< div class = "line" > < a name = "l03551" > < / a > < span class = "lineno" > 3551< / span >   vehicle)) {< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03552" > < / a > < span class = "lineno" > 3552< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l03553" > < / a > < span class = "lineno" > 3553< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03554" > < / a > < span class = "lineno" > 3554< / span >   }< / div >
< div class = "line" > < a name = "l03555" > < / a > < span class = "lineno" > 3555< / span >   < / div >
< div class = "line" > < a name = "l03556" > < / a > < span class = "lineno" > 3556< / span >   < span class = "keywordflow" > if< / span > (swap_vehicle == vehicle) {< / div >
< div class = "line" > < a name = "l03557" > < / a > < span class = "lineno" > 3557< / span >   < span class = "keywordflow" > if< / span > (has_more_vehicles_with_route) {< / div >
< div class = "line" > < a name = "l03558" > < / a > < span class = "lineno" > 3558< / span >   < span class = "comment" > // No route can be assigned to this vehicle, but there are more vehicles< / span > < / div >
< div class = "line" > < a name = "l03559" > < / a > < span class = "lineno" > 3559< / span >   < span class = "comment" > // with a route left. This would leave a gap in the indices.< / span > < / div >
< div class = "line" > < a name = "l03560" > < / a > < span class = "lineno" > 3560< / span >   < span class = "comment" > // TODO(user): clarify the expected trigger rate of this LOG.< / span > < / div >
< div class = "line" > < a name = "l03561" > < / a > < span class = "lineno" > 3561< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9" > INFO< / a > ) < < < span class = "stringliteral" > " No vehicle that can be swapped with " < / span > < < vehicle< / div >
< div class = "line" > < a name = "l03562" > < / a > < span class = "lineno" > 3562< / span >   < < < span class = "stringliteral" > " was found" < / span > ;< / div >
< div class = "line" > < a name = "l03563" > < / a > < span class = "lineno" > 3563< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03564" > < / a > < span class = "lineno" > 3564< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03565" > < / a > < span class = "lineno" > 3565< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l03566" > < / a > < span class = "lineno" > 3566< / span >   }< / div >
< div class = "line" > < a name = "l03567" > < / a > < span class = "lineno" > 3567< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03568" > < / a > < span class = "lineno" > 3568< / span >   < span class = "keywordflow" > if< / span > (!ReplaceUnusedVehicle(vehicle, swap_vehicle,< / div >
< div class = "line" > < a name = "l03569" > < / a > < span class = "lineno" > 3569< / span >   compact_assignment.get())) {< / div >
< div class = "line" > < a name = "l03570" > < / a > < span class = "lineno" > 3570< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03571" > < / a > < span class = "lineno" > 3571< / span >   }< / div >
< div class = "line" > < a name = "l03572" > < / a > < span class = "lineno" > 3572< / span >   }< / div >
< div class = "line" > < a name = "l03573" > < / a > < span class = "lineno" > 3573< / span >   }< / div >
< div class = "line" > < a name = "l03574" > < / a > < span class = "lineno" > 3574< / span >   < span class = "keywordflow" > if< / span > (check_compact_assignment & & < / div >
< div class = "line" > < a name = "l03575" > < / a > < span class = "lineno" > 3575< / span >   !solver_-> CheckAssignment(compact_assignment.get())) {< / div >
< div class = "line" > < a name = "l03576" > < / a > < span class = "lineno" > 3576< / span >   < span class = "comment" > // TODO(user): clarify the expected trigger rate of this LOG.< / span > < / div >
< div class = "line" > < a name = "l03577" > < / a > < span class = "lineno" > 3577< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " The compacted assignment is not a valid solution" < / span > ;< / div >
< div class = "line" > < a name = "l03578" > < / a > < span class = "lineno" > 3578< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03579" > < / a > < span class = "lineno" > 3579< / span >   }< / div >
< div class = "line" > < a name = "l03580" > < / a > < span class = "lineno" > 3580< / span >   < span class = "keywordflow" > return< / span > compact_assignment.release();< / div >
< div class = "line" > < a name = "l03581" > < / a > < span class = "lineno" > 3581< / span >   }< / div >
< div class = "line" > < a name = "l03582" > < / a > < span class = "lineno" > 3582< / span >   < / div >
< div class = "line" > < a name = "l03583" > < / a > < span class = "lineno" > 3583< / span >   < span class = "keywordtype" > int< / span > RoutingModel::FindNextActive(< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ,< / div >
< div class = "line" > < a name = "l03584" > < / a > < span class = "lineno" > 3584< / span >   < span class = "keyword" > const< / span > std::vector< int64> & indices)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03585" > < / a > < span class = "lineno" > 3585< / span >   ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ;< / div >
< div class = "line" > < a name = "l03586" > < / a > < span class = "lineno" > 3586< / span >   < a class = "code" href = "base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c" > CHECK_LE< / a > (0, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03587" > < / a > < span class = "lineno" > 3587< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = indices.size();< / div >
< div class = "line" > < a name = "l03588" > < / a > < span class = "lineno" > 3588< / span >   < span class = "keywordflow" > while< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < size & & < a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (indices[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ])-> Max() == 0) {< / div >
< div class = "line" > < a name = "l03589" > < / a > < span class = "lineno" > 3589< / span >   ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ;< / div >
< div class = "line" > < a name = "l03590" > < / a > < span class = "lineno" > 3590< / span >   }< / div >
< div class = "line" > < a name = "l03591" > < / a > < span class = "lineno" > 3591< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ;< / div >
< div class = "line" > < a name = "l03592" > < / a > < span class = "lineno" > 3592< / span >   }< / div >
< div class = "line" > < a name = "l03593" > < / a > < span class = "lineno" > 3593< / span >   < / div >
< div class = "line" > < a name = "l03594" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a9986c84a6cab9f2f14b2b6c13432367b" > 3594< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a9986c84a6cab9f2f14b2b6c13432367b" > RoutingModel::ApplyLocks< / a > (< span class = "keyword" > const< / span > std::vector< int64> & locks) {< / div >
< div class = "line" > < a name = "l03595" > < / a > < span class = "lineno" > 3595< / span >   < span class = "comment" > // TODO(user): Replace calls to this method with calls to< / span > < / div >
< div class = "line" > < a name = "l03596" > < / a > < span class = "lineno" > 3596< / span >   < span class = "comment" > // ApplyLocksToAllVehicles and remove this method?< / span > < / div >
< div class = "line" > < a name = "l03597" > < / a > < span class = "lineno" > 3597< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, 1);< / div >
< div class = "line" > < a name = "l03598" > < / a > < span class = "lineno" > 3598< / span >   preassignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aa71d36872f416feaa853788a7a7a7ef8" > Clear< / a > ();< / div >
< div class = "line" > < a name = "l03599" > < / a > < span class = "lineno" > 3599< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * next_var = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03600" > < / a > < span class = "lineno" > 3600< / span >   < span class = "keywordtype" > int< / span > lock_index = FindNextActive(-1, locks);< / div >
< div class = "line" > < a name = "l03601" > < / a > < span class = "lineno" > 3601< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = locks.size();< / div >
< div class = "line" > < a name = "l03602" > < / a > < span class = "lineno" > 3602< / span >   < span class = "keywordflow" > if< / span > (lock_index < size) {< / div >
< div class = "line" > < a name = "l03603" > < / a > < span class = "lineno" > 3603< / span >   next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (locks[lock_index]);< / div >
< div class = "line" > < a name = "l03604" > < / a > < span class = "lineno" > 3604< / span >   preassignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (next_var);< / div >
< div class = "line" > < a name = "l03605" > < / a > < span class = "lineno" > 3605< / span >   < span class = "keywordflow" > for< / span > (lock_index = FindNextActive(lock_index, locks); lock_index < size;< / div >
< div class = "line" > < a name = "l03606" > < / a > < span class = "lineno" > 3606< / span >   lock_index = FindNextActive(lock_index, locks)) {< / div >
< div class = "line" > < a name = "l03607" > < / a > < span class = "lineno" > 3607< / span >   preassignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > SetValue< / a > (next_var, locks[lock_index]);< / div >
< div class = "line" > < a name = "l03608" > < / a > < span class = "lineno" > 3608< / span >   next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (locks[lock_index]);< / div >
< div class = "line" > < a name = "l03609" > < / a > < span class = "lineno" > 3609< / span >   preassignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (next_var);< / div >
< div class = "line" > < a name = "l03610" > < / a > < span class = "lineno" > 3610< / span >   }< / div >
< div class = "line" > < a name = "l03611" > < / a > < span class = "lineno" > 3611< / span >   }< / div >
< div class = "line" > < a name = "l03612" > < / a > < span class = "lineno" > 3612< / span >   < span class = "keywordflow" > return< / span > next_var;< / div >
< div class = "line" > < a name = "l03613" > < / a > < span class = "lineno" > 3613< / span >   }< / div >
< div class = "line" > < a name = "l03614" > < / a > < span class = "lineno" > 3614< / span >   < / div >
< div class = "line" > < a name = "l03615" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a410f7da30cf944b7874eebe57eebe41a" > 3615< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a410f7da30cf944b7874eebe57eebe41a" > RoutingModel::ApplyLocksToAllVehicles< / a > (< / div >
< div class = "line" > < a name = "l03616" > < / a > < span class = "lineno" > 3616< / span >   < span class = "keyword" > const< / span > std::vector< std::vector< int64> > & locks, < span class = "keywordtype" > bool< / span > close_routes) {< / div >
< div class = "line" > < a name = "l03617" > < / a > < span class = "lineno" > 3617< / span >   preassignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aa71d36872f416feaa853788a7a7a7ef8" > Clear< / a > ();< / div >
< div class = "line" > < a name = "l03618" > < / a > < span class = "lineno" > 3618< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a78f7f1cb8b08b7ec1d477a14447bd8d4" > RoutesToAssignment< / a > (locks, < span class = "keyword" > true< / span > , close_routes, preassignment_);< / div >
< div class = "line" > < a name = "l03619" > < / a > < span class = "lineno" > 3619< / span >   }< / div >
< div class = "line" > < a name = "l03620" > < / a > < span class = "lineno" > 3620< / span >   < / div >
< div class = "line" > < a name = "l03621" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a04bd106a61d493872cabb0f41f7f118f" > 3621< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a04bd106a61d493872cabb0f41f7f118f" > RoutingModel::GetNumberOfDecisionsInFirstSolution< / a > (< / div >
< div class = "line" > < a name = "l03622" > < / a > < span class = "lineno" > 3622< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03623" > < / a > < span class = "lineno" > 3623< / span >   < a class = "code" href = "classoperations__research_1_1_int_var_filtered_decision_builder.html" > IntVarFilteredDecisionBuilder< / a > * < span class = "keyword" > const< / span > decision_builder =< / div >
< div class = "line" > < a name = "l03624" > < / a > < span class = "lineno" > 3624< / span >   GetFilteredFirstSolutionDecisionBuilderOrNull(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l03625" > < / a > < span class = "lineno" > 3625< / span >   < span class = "keywordflow" > return< / span > decision_builder != < span class = "keyword" > nullptr< / span > ? decision_builder-> < a class = "code" href = "classoperations__research_1_1_int_var_filtered_decision_builder.html#ab9cbb9e796806062460be9c7a4033e80" > number_of_decisions< / a > ()< / div >
< div class = "line" > < a name = "l03626" > < / a > < span class = "lineno" > 3626< / span >   : 0;< / div >
< div class = "line" > < a name = "l03627" > < / a > < span class = "lineno" > 3627< / span >   }< / div >
< div class = "line" > < a name = "l03628" > < / a > < span class = "lineno" > 3628< / span >   < / div >
< div class = "line" > < a name = "l03629" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aefff345740a5db07caea065ec14ec52f" > 3629< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aefff345740a5db07caea065ec14ec52f" > RoutingModel::GetNumberOfRejectsInFirstSolution< / a > (< / div >
< div class = "line" > < a name = "l03630" > < / a > < span class = "lineno" > 3630< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03631" > < / a > < span class = "lineno" > 3631< / span >   < a class = "code" href = "classoperations__research_1_1_int_var_filtered_decision_builder.html" > IntVarFilteredDecisionBuilder< / a > * < span class = "keyword" > const< / span > decision_builder =< / div >
< div class = "line" > < a name = "l03632" > < / a > < span class = "lineno" > 3632< / span >   GetFilteredFirstSolutionDecisionBuilderOrNull(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l03633" > < / a > < span class = "lineno" > 3633< / span >   < span class = "keywordflow" > return< / span > decision_builder != < span class = "keyword" > nullptr< / span > ? decision_builder-> < a class = "code" href = "classoperations__research_1_1_int_var_filtered_decision_builder.html#ab35b677ad56dbdc2521d9bb28a68f566" > number_of_rejects< / a > ()< / div >
< div class = "line" > < a name = "l03634" > < / a > < span class = "lineno" > 3634< / span >   : 0;< / div >
< div class = "line" > < a name = "l03635" > < / a > < span class = "lineno" > 3635< / span >   }< / div >
< div class = "line" > < a name = "l03636" > < / a > < span class = "lineno" > 3636< / span >   < / div >
< div class = "line" > < a name = "l03637" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73" > 3637< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73" > RoutingModel::WriteAssignment< / a > (< span class = "keyword" > const< / span > std::string& file_name)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03638" > < / a > < span class = "lineno" > 3638< / span >   < span class = "keywordflow" > if< / span > (collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > () == 1 & & assignment_ != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l03639" > < / a > < span class = "lineno" > 3639< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (0));< / div >
< div class = "line" > < a name = "l03640" > < / a > < span class = "lineno" > 3640< / span >   < span class = "keywordflow" > return< / span > assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a6b181a6b49df0fa3c31f492c53693174" > Save< / a > (file_name);< / div >
< div class = "line" > < a name = "l03641" > < / a > < span class = "lineno" > 3641< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03642" > < / a > < span class = "lineno" > 3642< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03643" > < / a > < span class = "lineno" > 3643< / span >   }< / div >
< div class = "line" > < a name = "l03644" > < / a > < span class = "lineno" > 3644< / span >   }< / div >
< div class = "line" > < a name = "l03645" > < / a > < span class = "lineno" > 3645< / span >   < / div >
< div class = "line" > < a name = "l03646" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf" > 3646< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf" > RoutingModel::ReadAssignment< / a > (< span class = "keyword" > const< / span > std::string& file_name) {< / div >
< div class = "line" > < a name = "l03647" > < / a > < span class = "lineno" > 3647< / span >   QuietCloseModel();< / div >
< div class = "line" > < a name = "l03648" > < / a > < span class = "lineno" > 3648< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment_ != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03649" > < / a > < span class = "lineno" > 3649< / span >   < span class = "keywordflow" > if< / span > (assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a4ffd516bcdda189f37da20040fba290e" > Load< / a > (file_name)) {< / div >
< div class = "line" > < a name = "l03650" > < / a > < span class = "lineno" > 3650< / span >   < span class = "keywordflow" > return< / span > DoRestoreAssignment();< / div >
< div class = "line" > < a name = "l03651" > < / a > < span class = "lineno" > 3651< / span >   }< / div >
< div class = "line" > < a name = "l03652" > < / a > < span class = "lineno" > 3652< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03653" > < / a > < span class = "lineno" > 3653< / span >   }< / div >
< div class = "line" > < a name = "l03654" > < / a > < span class = "lineno" > 3654< / span >   < / div >
< div class = "line" > < a name = "l03655" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9" > 3655< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9" > RoutingModel::RestoreAssignment< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & solution) {< / div >
< div class = "line" > < a name = "l03656" > < / a > < span class = "lineno" > 3656< / span >   QuietCloseModel();< / div >
< div class = "line" > < a name = "l03657" > < / a > < span class = "lineno" > 3657< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment_ != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03658" > < / a > < span class = "lineno" > 3658< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > CopyIntersection< / a > (& solution);< / div >
< div class = "line" > < a name = "l03659" > < / a > < span class = "lineno" > 3659< / span >   < span class = "keywordflow" > return< / span > DoRestoreAssignment();< / div >
< div class = "line" > < a name = "l03660" > < / a > < span class = "lineno" > 3660< / span >   }< / div >
< div class = "line" > < a name = "l03661" > < / a > < span class = "lineno" > 3661< / span >   < / div >
< div class = "line" > < a name = "l03662" > < / a > < span class = "lineno" > 3662< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * RoutingModel::DoRestoreAssignment() {< / div >
< div class = "line" > < a name = "l03663" > < / a > < span class = "lineno" > 3663< / span >   < span class = "keywordflow" > if< / span > (status_ == < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > ROUTING_INVALID< / a > ) {< / div >
< div class = "line" > < a name = "l03664" > < / a > < span class = "lineno" > 3664< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03665" > < / a > < span class = "lineno" > 3665< / span >   }< / div >
< div class = "line" > < a name = "l03666" > < / a > < span class = "lineno" > 3666< / span >   solver_-> Solve(restore_assignment_, monitors_);< / div >
< div class = "line" > < a name = "l03667" > < / a > < span class = "lineno" > 3667< / span >   < span class = "keywordflow" > if< / span > (collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > solution_count< / a > () == 1) {< / div >
< div class = "line" > < a name = "l03668" > < / a > < span class = "lineno" > 3668< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e" > ROUTING_SUCCESS< / a > ;< / div >
< div class = "line" > < a name = "l03669" > < / a > < span class = "lineno" > 3669< / span >   < span class = "keywordflow" > return< / span > collect_assignments_-> < a class = "code" href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > solution< / a > (0);< / div >
< div class = "line" > < a name = "l03670" > < / a > < span class = "lineno" > 3670< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03671" > < / a > < span class = "lineno" > 3671< / span >   status_ = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd" > ROUTING_FAIL< / a > ;< / div >
< div class = "line" > < a name = "l03672" > < / a > < span class = "lineno" > 3672< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03673" > < / a > < span class = "lineno" > 3673< / span >   }< / div >
< div class = "line" > < a name = "l03674" > < / a > < span class = "lineno" > 3674< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03675" > < / a > < span class = "lineno" > 3675< / span >   }< / div >
< div class = "line" > < a name = "l03676" > < / a > < span class = "lineno" > 3676< / span >   < / div >
< div class = "line" > < a name = "l03677" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a78f7f1cb8b08b7ec1d477a14447bd8d4" > 3677< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a78f7f1cb8b08b7ec1d477a14447bd8d4" > RoutingModel::RoutesToAssignment< / a > (< / div >
< div class = "line" > < a name = "l03678" > < / a > < span class = "lineno" > 3678< / span >   < span class = "keyword" > const< / span > std::vector< std::vector< int64> > & routes, < span class = "keywordtype" > bool< / span > ignore_inactive_indices,< / div >
< div class = "line" > < a name = "l03679" > < / a > < span class = "lineno" > 3679< / span >   < span class = "keywordtype" > bool< / span > close_routes, < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < span class = "keyword" > const< / span > assignment)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03680" > < / a > < span class = "lineno" > 3680< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03681" > < / a > < span class = "lineno" > 3681< / span >   < span class = "keywordflow" > if< / span > (!closed_) {< / div >
< div class = "line" > < a name = "l03682" > < / a > < span class = "lineno" > 3682< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " The model is not closed yet" < / span > ;< / div >
< div class = "line" > < a name = "l03683" > < / a > < span class = "lineno" > 3683< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03684" > < / a > < span class = "lineno" > 3684< / span >   }< / div >
< div class = "line" > < a name = "l03685" > < / a > < span class = "lineno" > 3685< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_routes = routes.size();< / div >
< div class = "line" > < a name = "l03686" > < / a > < span class = "lineno" > 3686< / span >   < span class = "keywordflow" > if< / span > (num_routes > vehicles_) {< / div >
< div class = "line" > < a name = "l03687" > < / a > < span class = "lineno" > 3687< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " The number of vehicles in the assignment (" < / span > < < routes.size()< / div >
< div class = "line" > < a name = "l03688" > < / a > < span class = "lineno" > 3688< / span >   < < < span class = "stringliteral" > " ) is greater than the number of vehicles in the model (" < / span > < / div >
< div class = "line" > < a name = "l03689" > < / a > < span class = "lineno" > 3689< / span >   < < vehicles_ < < < span class = "stringliteral" > " )" < / span > ;< / div >
< div class = "line" > < a name = "l03690" > < / a > < span class = "lineno" > 3690< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03691" > < / a > < span class = "lineno" > 3691< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03692" > < / a > < span class = "lineno" > 3692< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03693" > < / a > < span class = "lineno" > 3693< / span >   absl::flat_hash_set< int> visited_indices;< / div >
< div class = "line" > < a name = "l03694" > < / a > < span class = "lineno" > 3694< / span >   < span class = "comment" > // Set value to NextVars based on the routes.< / span > < / div >
< div class = "line" > < a name = "l03695" > < / a > < span class = "lineno" > 3695< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < num_routes; ++vehicle) {< / div >
< div class = "line" > < a name = "l03696" > < / a > < span class = "lineno" > 3696< / span >   < span class = "keyword" > const< / span > std::vector< int64> & route = routes[vehicle];< / div >
< div class = "line" > < a name = "l03697" > < / a > < span class = "lineno" > 3697< / span >   < span class = "keywordtype" > int< / span > from_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03698" > < / a > < span class = "lineno" > 3698< / span >   std::pair< absl::flat_hash_set< int> ::iterator, < span class = "keywordtype" > bool< / span > > insert_result =< / div >
< div class = "line" > < a name = "l03699" > < / a > < span class = "lineno" > 3699< / span >   visited_indices.insert(from_index);< / div >
< div class = "line" > < a name = "l03700" > < / a > < span class = "lineno" > 3700< / span >   < span class = "keywordflow" > if< / span > (!insert_result.second) {< / div >
< div class = "line" > < a name = "l03701" > < / a > < span class = "lineno" > 3701< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Index " < / span > < < from_index < < < span class = "stringliteral" > " (start node for vehicle " < / span > < / div >
< div class = "line" > < a name = "l03702" > < / a > < span class = "lineno" > 3702< / span >   < < vehicle < < < span class = "stringliteral" > " ) was already used" < / span > ;< / div >
< div class = "line" > < a name = "l03703" > < / a > < span class = "lineno" > 3703< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03704" > < / a > < span class = "lineno" > 3704< / span >   }< / div >
< div class = "line" > < a name = "l03705" > < / a > < span class = "lineno" > 3705< / span >   < / div >
< div class = "line" > < a name = "l03706" > < / a > < span class = "lineno" > 3706< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index : route) {< / div >
< div class = "line" > < a name = "l03707" > < / a > < span class = "lineno" > 3707< / span >   < span class = "keywordflow" > if< / span > (to_index < 0 || to_index > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ()) {< / div >
< div class = "line" > < a name = "l03708" > < / a > < span class = "lineno" > 3708< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Invalid index: " < / span > < < to_index;< / div >
< div class = "line" > < a name = "l03709" > < / a > < span class = "lineno" > 3709< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03710" > < / a > < span class = "lineno" > 3710< / span >   }< / div >
< div class = "line" > < a name = "l03711" > < / a > < span class = "lineno" > 3711< / span >   < / div >
< div class = "line" > < a name = "l03712" > < / a > < span class = "lineno" > 3712< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > active_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (to_index);< / div >
< div class = "line" > < a name = "l03713" > < / a > < span class = "lineno" > 3713< / span >   < span class = "keywordflow" > if< / span > (active_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > () == 0) {< / div >
< div class = "line" > < a name = "l03714" > < / a > < span class = "lineno" > 3714< / span >   < span class = "keywordflow" > if< / span > (ignore_inactive_indices) {< / div >
< div class = "line" > < a name = "l03715" > < / a > < span class = "lineno" > 3715< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l03716" > < / a > < span class = "lineno" > 3716< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03717" > < / a > < span class = "lineno" > 3717< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Index " < / span > < < to_index < < < span class = "stringliteral" > " is not active" < / span > ;< / div >
< div class = "line" > < a name = "l03718" > < / a > < span class = "lineno" > 3718< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03719" > < / a > < span class = "lineno" > 3719< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03720" > < / a > < span class = "lineno" > 3720< / span >   }< / div >
< div class = "line" > < a name = "l03721" > < / a > < span class = "lineno" > 3721< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03722" > < / a > < span class = "lineno" > 3722< / span >   insert_result = visited_indices.insert(to_index);< / div >
< div class = "line" > < a name = "l03723" > < / a > < span class = "lineno" > 3723< / span >   < span class = "keywordflow" > if< / span > (!insert_result.second) {< / div >
< div class = "line" > < a name = "l03724" > < / a > < span class = "lineno" > 3724< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Index " < / span > < < to_index < < < span class = "stringliteral" > " is used multiple times" < / span > ;< / div >
< div class = "line" > < a name = "l03725" > < / a > < span class = "lineno" > 3725< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03726" > < / a > < span class = "lineno" > 3726< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03727" > < / a > < span class = "lineno" > 3727< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03728" > < / a > < span class = "lineno" > 3728< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (to_index);< / div >
< div class = "line" > < a name = "l03729" > < / a > < span class = "lineno" > 3729< / span >   < span class = "keywordflow" > if< / span > (!vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_var.html#a7005edfb93d09a9ca1ecb989a9bc6733" > Contains< / a > (vehicle)) {< / div >
< div class = "line" > < a name = "l03730" > < / a > < span class = "lineno" > 3730< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Vehicle " < / span > < < vehicle < < < span class = "stringliteral" > " is not allowed at index " < / span > < / div >
< div class = "line" > < a name = "l03731" > < / a > < span class = "lineno" > 3731< / span >   < < to_index;< / div >
< div class = "line" > < a name = "l03732" > < / a > < span class = "lineno" > 3732< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03733" > < / a > < span class = "lineno" > 3733< / span >   }< / div >
< div class = "line" > < a name = "l03734" > < / a > < span class = "lineno" > 3734< / span >   < / div >
< div class = "line" > < a name = "l03735" > < / a > < span class = "lineno" > 3735< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > from_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (from_index);< / div >
< div class = "line" > < a name = "l03736" > < / a > < span class = "lineno" > 3736< / span >   < span class = "keywordflow" > if< / span > (!assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (from_var)) {< / div >
< div class = "line" > < a name = "l03737" > < / a > < span class = "lineno" > 3737< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (from_var);< / div >
< div class = "line" > < a name = "l03738" > < / a > < span class = "lineno" > 3738< / span >   }< / div >
< div class = "line" > < a name = "l03739" > < / a > < span class = "lineno" > 3739< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > SetValue< / a > (from_var, to_index);< / div >
< div class = "line" > < a name = "l03740" > < / a > < span class = "lineno" > 3740< / span >   < / div >
< div class = "line" > < a name = "l03741" > < / a > < span class = "lineno" > 3741< / span >   from_index = to_index;< / div >
< div class = "line" > < a name = "l03742" > < / a > < span class = "lineno" > 3742< / span >   }< / div >
< div class = "line" > < a name = "l03743" > < / a > < span class = "lineno" > 3743< / span >   < / div >
< div class = "line" > < a name = "l03744" > < / a > < span class = "lineno" > 3744< / span >   < span class = "keywordflow" > if< / span > (close_routes) {< / div >
< div class = "line" > < a name = "l03745" > < / a > < span class = "lineno" > 3745< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > last_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (from_index);< / div >
< div class = "line" > < a name = "l03746" > < / a > < span class = "lineno" > 3746< / span >   < span class = "keywordflow" > if< / span > (!assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (last_var)) {< / div >
< div class = "line" > < a name = "l03747" > < / a > < span class = "lineno" > 3747< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (last_var);< / div >
< div class = "line" > < a name = "l03748" > < / a > < span class = "lineno" > 3748< / span >   }< / div >
< div class = "line" > < a name = "l03749" > < / a > < span class = "lineno" > 3749< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > SetValue< / a > (last_var, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03750" > < / a > < span class = "lineno" > 3750< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03751" > < / a > < span class = "lineno" > 3751< / span >   }< / div >
< div class = "line" > < a name = "l03752" > < / a > < span class = "lineno" > 3752< / span >   < / div >
< div class = "line" > < a name = "l03753" > < / a > < span class = "lineno" > 3753< / span >   < span class = "comment" > // Do not use the remaining vehicles.< / span > < / div >
< div class = "line" > < a name = "l03754" > < / a > < span class = "lineno" > 3754< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = num_routes; vehicle < vehicles_; ++vehicle) {< / div >
< div class = "line" > < a name = "l03755" > < / a > < span class = "lineno" > 3755< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03756" > < / a > < span class = "lineno" > 3756< / span >   < span class = "comment" > // Even if close_routes is false, we still need to add the start index to< / span > < / div >
< div class = "line" > < a name = "l03757" > < / a > < span class = "lineno" > 3757< / span >   < span class = "comment" > // visited_indices so that deactivating other nodes works correctly.< / span > < / div >
< div class = "line" > < a name = "l03758" > < / a > < span class = "lineno" > 3758< / span >   std::pair< absl::flat_hash_set< int> ::iterator, < span class = "keywordtype" > bool< / span > > insert_result =< / div >
< div class = "line" > < a name = "l03759" > < / a > < span class = "lineno" > 3759< / span >   visited_indices.insert(start_index);< / div >
< div class = "line" > < a name = "l03760" > < / a > < span class = "lineno" > 3760< / span >   < span class = "keywordflow" > if< / span > (!insert_result.second) {< / div >
< div class = "line" > < a name = "l03761" > < / a > < span class = "lineno" > 3761< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > ) < < < span class = "stringliteral" > " Index " < / span > < < start_index < < < span class = "stringliteral" > " is used multiple times" < / span > ;< / div >
< div class = "line" > < a name = "l03762" > < / a > < span class = "lineno" > 3762< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l03763" > < / a > < span class = "lineno" > 3763< / span >   }< / div >
< div class = "line" > < a name = "l03764" > < / a > < span class = "lineno" > 3764< / span >   < span class = "keywordflow" > if< / span > (close_routes) {< / div >
< div class = "line" > < a name = "l03765" > < / a > < span class = "lineno" > 3765< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > start_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (start_index);< / div >
< div class = "line" > < a name = "l03766" > < / a > < span class = "lineno" > 3766< / span >   < span class = "keywordflow" > if< / span > (!assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (start_var)) {< / div >
< div class = "line" > < a name = "l03767" > < / a > < span class = "lineno" > 3767< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (start_var);< / div >
< div class = "line" > < a name = "l03768" > < / a > < span class = "lineno" > 3768< / span >   }< / div >
< div class = "line" > < a name = "l03769" > < / a > < span class = "lineno" > 3769< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > SetValue< / a > (start_var, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle));< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03770" > < / a > < span class = "lineno" > 3770< / span >   }< / div >
< div class = "line" > < a name = "l03771" > < / a > < span class = "lineno" > 3771< / span >   }< / div >
< div class = "line" > < a name = "l03772" > < / a > < span class = "lineno" > 3772< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03773" > < / a > < span class = "lineno" > 3773< / span >   < span class = "comment" > // Deactivate other nodes (by pointing them to themselves).< / span > < / div >
< div class = "line" > < a name = "l03774" > < / a > < span class = "lineno" > 3774< / span >   < span class = "keywordflow" > if< / span > (close_routes) {< / div >
< div class = "line" > < a name = "l03775" > < / a > < span class = "lineno" > 3775< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = 0; < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l03776" > < / a > < span class = "lineno" > 3776< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (visited_indices, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l03777" > < / a > < span class = "lineno" > 3777< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03778" > < / a > < span class = "lineno" > 3778< / span >   < span class = "keywordflow" > if< / span > (!assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (next_var)) {< / div >
< div class = "line" > < a name = "l03779" > < / a > < span class = "lineno" > 3779< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (next_var);< / div >
< div class = "line" > < a name = "l03780" > < / a > < span class = "lineno" > 3780< / span >   }< / div >
< div class = "line" > < a name = "l03781" > < / a > < span class = "lineno" > 3781< / span >   assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > SetValue< / a > (next_var, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03782" > < / a > < span class = "lineno" > 3782< / span >   }< / div >
< div class = "line" > < a name = "l03783" > < / a > < span class = "lineno" > 3783< / span >   }< / div >
< div class = "line" > < a name = "l03784" > < / a > < span class = "lineno" > 3784< / span >   }< / div >
< div class = "line" > < a name = "l03785" > < / a > < span class = "lineno" > 3785< / span >   < / div >
< div class = "line" > < a name = "l03786" > < / a > < span class = "lineno" > 3786< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l03787" > < / a > < span class = "lineno" > 3787< / span >   }< / div >
< div class = "line" > < a name = "l03788" > < / a > < span class = "lineno" > 3788< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03789" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a12e98c90493eed1ffd6dba61eeb719a3" > 3789< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a12e98c90493eed1ffd6dba61eeb719a3" > RoutingModel::ReadAssignmentFromRoutes< / a > (< / div >
< div class = "line" > < a name = "l03790" > < / a > < span class = "lineno" > 3790< / span >   < span class = "keyword" > const< / span > std::vector< std::vector< int64> > & routes,< / div >
< div class = "line" > < a name = "l03791" > < / a > < span class = "lineno" > 3791< / span >   < span class = "keywordtype" > bool< / span > ignore_inactive_indices) {< / div >
< div class = "line" > < a name = "l03792" > < / a > < span class = "lineno" > 3792< / span >   QuietCloseModel();< / div >
< div class = "line" > < a name = "l03793" > < / a > < span class = "lineno" > 3793< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#a78f7f1cb8b08b7ec1d477a14447bd8d4" > RoutesToAssignment< / a > (routes, ignore_inactive_indices, < span class = "keyword" > true< / span > , assignment_)) {< / div >
< div class = "line" > < a name = "l03794" > < / a > < span class = "lineno" > 3794< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l03795" > < / a > < span class = "lineno" > 3795< / span >   }< / div >
< div class = "line" > < a name = "l03796" > < / a > < span class = "lineno" > 3796< / span >   < span class = "comment" > // DoRestoreAssignment() might still fail when checking constraints (most< / span > < / div >
< div class = "line" > < a name = "l03797" > < / a > < span class = "lineno" > 3797< / span >   < span class = "comment" > // constraints are not verified by RoutesToAssignment) or when filling in< / span > < / div >
< div class = "line" > < a name = "l03798" > < / a > < span class = "lineno" > 3798< / span >   < span class = "comment" > // dimension variables.< / span > < / div >
< div class = "line" > < a name = "l03799" > < / a > < span class = "lineno" > 3799< / span >   < span class = "keywordflow" > return< / span > DoRestoreAssignment();< / div >
< div class = "line" > < a name = "l03800" > < / a > < span class = "lineno" > 3800< / span >   }< / div >
< div class = "line" > < a name = "l03801" > < / a > < span class = "lineno" > 3801< / span >   < / div >
< div class = "line" > < a name = "l03802" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a97d152b7049084186342b719eee6fa15" > 3802< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a97d152b7049084186342b719eee6fa15" > RoutingModel::AssignmentToRoutes< / a > (< / div >
< div class = "line" > < a name = "l03803" > < / a > < span class = "lineno" > 3803< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment,< / div >
< div class = "line" > < a name = "l03804" > < / a > < span class = "lineno" > 3804< / span >   std::vector< std::vector< int64> > * < span class = "keyword" > const< / span > routes)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03805" > < / a > < span class = "lineno" > 3805< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (closed_);< / div >
< div class = "line" > < a name = "l03806" > < / a > < span class = "lineno" > 3806< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (routes != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l03807" > < / a > < span class = "lineno" > 3807< / span >   < / div >
< div class = "line" > < a name = "l03808" > < / a > < span class = "lineno" > 3808< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > model_size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l03809" > < / a > < span class = "lineno" > 3809< / span >   routes-> resize(vehicles_);< / div >
< div class = "line" > < a name = "l03810" > < / a > < span class = "lineno" > 3810< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < vehicles_; ++vehicle) {< / div >
< div class = "line" > < a name = "l03811" > < / a > < span class = "lineno" > 3811< / span >   std::vector< int64> * < span class = "keyword" > const< / span > vehicle_route = & routes-> at(vehicle);< / div >
< div class = "line" > < a name = "l03812" > < / a > < span class = "lineno" > 3812< / span >   vehicle_route-> clear();< / div >
< div class = "line" > < a name = "l03813" > < / a > < span class = "lineno" > 3813< / span >   < / div >
< div class = "line" > < a name = "l03814" > < / a > < span class = "lineno" > 3814< / span >   < span class = "keywordtype" > int< / span > num_visited_indices = 0;< / div >
< div class = "line" > < a name = "l03815" > < / a > < span class = "lineno" > 3815< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > first_index = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03816" > < / a > < span class = "lineno" > 3816< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > first_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (first_index);< / div >
< div class = "line" > < a name = "l03817" > < / a > < span class = "lineno" > 3817< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (first_var));< / div >
< div class = "line" > < a name = "l03818" > < / a > < span class = "lineno" > 3818< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (first_var));< / div >
< div class = "line" > < a name = "l03819" > < / a > < span class = "lineno" > 3819< / span >   < span class = "keywordtype" > int< / span > current_index = assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (first_var);< / div >
< div class = "line" > < a name = "l03820" > < / a > < span class = "lineno" > 3820< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (current_index)) {< / div >
< div class = "line" > < a name = "l03821" > < / a > < span class = "lineno" > 3821< / span >   vehicle_route-> push_back(current_index);< / div >
< div class = "line" > < a name = "l03822" > < / a > < span class = "lineno" > 3822< / span >   < / div >
< div class = "line" > < a name = "l03823" > < / a > < span class = "lineno" > 3823< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (current_index);< / div >
< div class = "line" > < a name = "l03824" > < / a > < span class = "lineno" > 3824< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (next_var));< / div >
< div class = "line" > < a name = "l03825" > < / a > < span class = "lineno" > 3825< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (next_var));< / div >
< div class = "line" > < a name = "l03826" > < / a > < span class = "lineno" > 3826< / span >   current_index = assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (next_var);< / div >
< div class = "line" > < a name = "l03827" > < / a > < span class = "lineno" > 3827< / span >   < / div >
< div class = "line" > < a name = "l03828" > < / a > < span class = "lineno" > 3828< / span >   ++num_visited_indices;< / div >
< div class = "line" > < a name = "l03829" > < / a > < span class = "lineno" > 3829< / span >   < a class = "code" href = "base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c" > CHECK_LE< / a > (num_visited_indices, model_size)< / div >
< div class = "line" > < a name = "l03830" > < / a > < span class = "lineno" > 3830< / span >   < < < span class = "stringliteral" > " The assignment contains a cycle" < / span > ;< / div >
< div class = "line" > < a name = "l03831" > < / a > < span class = "lineno" > 3831< / span >   }< / div >
< div class = "line" > < a name = "l03832" > < / a > < span class = "lineno" > 3832< / span >   }< / div >
< div class = "line" > < a name = "l03833" > < / a > < span class = "lineno" > 3833< / span >   }< / div >
< div class = "line" > < a name = "l03834" > < / a > < span class = "lineno" > 3834< / span >   < / div >
< div class = "line" > < a name = "l03835" > < / a > < span class = "lineno" > 3835< / span >   < span class = "preprocessor" > #ifndef SWIG< / span > < / div >
< div class = "line" > < a name = "l03836" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a5b629ec63dd2723180eaaf6668a9f118" > 3836< / a > < / span >   std::vector< std::vector< int64> > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5b629ec63dd2723180eaaf6668a9f118" > RoutingModel::GetRoutesFromAssignment< / a > (< / div >
< div class = "line" > < a name = "l03837" > < / a > < span class = "lineno" > 3837< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment) {< / div >
< div class = "line" > < a name = "l03838" > < / a > < span class = "lineno" > 3838< / span >   std::vector< std::vector< int64> > route_indices(< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ());< / div >
< div class = "line" > < a name = "l03839" > < / a > < span class = "lineno" > 3839< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l03840" > < / a > < span class = "lineno" > 3840< / span >   < span class = "keywordflow" > if< / span > (!assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (vehicle))) {< / div >
< div class = "line" > < a name = "l03841" > < / a > < span class = "lineno" > 3841< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (DFATAL) < < < span class = "stringliteral" > " GetRoutesFromAssignment() called on incomplete solution:" < / span > < / div >
< div class = "line" > < a name = "l03842" > < / a > < span class = "lineno" > 3842< / span >   < < < span class = "stringliteral" > " NextVar(" < / span > < < vehicle < < < span class = "stringliteral" > " ) is unbound." < / span > ;< / div >
< div class = "line" > < a name = "l03843" > < / a > < span class = "lineno" > 3843< / span >   }< / div >
< div class = "line" > < a name = "l03844" > < / a > < span class = "lineno" > 3844< / span >   }< / div >
< div class = "line" > < a name = "l03845" > < / a > < span class = "lineno" > 3845< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l03846" > < / a > < span class = "lineno" > 3846< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l03847" > < / a > < span class = "lineno" > 3847< / span >   route_indices[vehicle].push_back(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03848" > < / a > < span class = "lineno" > 3848< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l03849" > < / a > < span class = "lineno" > 3849< / span >   < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ));< / div >
< div class = "line" > < a name = "l03850" > < / a > < span class = "lineno" > 3850< / span >   route_indices[vehicle].push_back(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03851" > < / a > < span class = "lineno" > 3851< / span >   }< / div >
< div class = "line" > < a name = "l03852" > < / a > < span class = "lineno" > 3852< / span >   }< / div >
< div class = "line" > < a name = "l03853" > < / a > < span class = "lineno" > 3853< / span >   < span class = "keywordflow" > return< / span > route_indices;< / div >
< div class = "line" > < a name = "l03854" > < / a > < span class = "lineno" > 3854< / span >   }< / div >
< div class = "line" > < a name = "l03855" > < / a > < span class = "lineno" > 3855< / span >   < span class = "preprocessor" > #endif< / span > < / div >
< div class = "line" > < a name = "l03856" > < / a > < span class = "lineno" > 3856< / span >   < / div >
< div class = "line" > < a name = "l03857" > < / a > < span class = "lineno" > 3857< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > RoutingModel::GetArcCostForClassInternal(< / div >
< div class = "line" > < a name = "l03858" > < / a > < span class = "lineno" > 3858< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index, CostClassIndex cost_class_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03859" > < / a > < span class = "lineno" > 3859< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (closed_);< / div >
< div class = "line" > < a name = "l03860" > < / a > < span class = "lineno" > 3860< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (cost_class_index, 0);< / div >
< div class = "line" > < a name = "l03861" > < / a > < span class = "lineno" > 3861< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (cost_class_index, cost_classes_.size());< / div >
< div class = "line" > < a name = "l03862" > < / a > < span class = "lineno" > 3862< / span >   CostCacheElement* < span class = "keyword" > const< / span > cache = & cost_cache_[from_index];< / div >
< div class = "line" > < a name = "l03863" > < / a > < span class = "lineno" > 3863< / span >   < span class = "comment" > // See the comment in CostCacheElement in the .h for the int64-> int cast.< / span > < / div >
< div class = "line" > < a name = "l03864" > < / a > < span class = "lineno" > 3864< / span >   < span class = "keywordflow" > if< / span > (cache-> index == < span class = "keyword" > static_cast< < / span > < span class = "keywordtype" > int< / span > < span class = "keyword" > > < / span > (to_index) & & < / div >
< div class = "line" > < a name = "l03865" > < / a > < span class = "lineno" > 3865< / span >   cache-> cost_class_index == cost_class_index) {< / div >
< div class = "line" > < a name = "l03866" > < / a > < span class = "lineno" > 3866< / span >   < span class = "keywordflow" > return< / span > cache-> cost;< / div >
< div class = "line" > < a name = "l03867" > < / a > < span class = "lineno" > 3867< / span >   }< / div >
< div class = "line" > < a name = "l03868" > < / a > < span class = "lineno" > 3868< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = 0;< / div >
< div class = "line" > < a name = "l03869" > < / a > < span class = "lineno" > 3869< / span >   < span class = "keyword" > const< / span > CostClass& cost_class = cost_classes_[cost_class_index];< / div >
< div class = "line" > < a name = "l03870" > < / a > < span class = "lineno" > 3870< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & evaluator = transit_evaluators_[cost_class.evaluator_index];< / div >
< div class = "line" > < a name = "l03871" > < / a > < span class = "lineno" > 3871< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (from_index)) {< / div >
< div class = "line" > < a name = "l03872" > < / a > < span class = "lineno" > 3872< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (evaluator(from_index, to_index),< / div >
< div class = "line" > < a name = "l03873" > < / a > < span class = "lineno" > 3873< / span >   GetDimensionTransitCostSum(from_index, to_index, cost_class));< / div >
< div class = "line" > < a name = "l03874" > < / a > < span class = "lineno" > 3874< / span >   } < span class = "keywordflow" > else< / span > < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to_index)) {< / div >
< div class = "line" > < a name = "l03875" > < / a > < span class = "lineno" > 3875< / span >   < span class = "comment" > // Apply route fixed cost on first non-first/last node, in other words on< / span > < / div >
< div class = "line" > < a name = "l03876" > < / a > < span class = "lineno" > 3876< / span >   < span class = "comment" > // the arc from the first node to its next node if it' s not the last node.< / span > < / div >
< div class = "line" > < a name = "l03877" > < / a > < span class = "lineno" > 3877< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (< / div >
< div class = "line" > < a name = "l03878" > < / a > < span class = "lineno" > 3878< / span >   evaluator(from_index, to_index),< / div >
< div class = "line" > < a name = "l03879" > < / a > < span class = "lineno" > 3879< / span >   < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (GetDimensionTransitCostSum(from_index, to_index, cost_class),< / div >
< div class = "line" > < a name = "l03880" > < / a > < span class = "lineno" > 3880< / span >   fixed_cost_of_vehicle_[index_to_vehicle_[from_index]]));< / div >
< div class = "line" > < a name = "l03881" > < / a > < span class = "lineno" > 3881< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03882" > < / a > < span class = "lineno" > 3882< / span >   < span class = "comment" > // If there' s only the first and last nodes on the route, it is considered< / span > < / div >
< div class = "line" > < a name = "l03883" > < / a > < span class = "lineno" > 3883< / span >   < span class = "comment" > // as an empty route.< / span > < / div >
< div class = "line" > < a name = "l03884" > < / a > < span class = "lineno" > 3884< / span >   < span class = "keywordflow" > if< / span > (consider_empty_route_costs_[index_to_vehicle_[from_index]]) {< / div >
< div class = "line" > < a name = "l03885" > < / a > < span class = "lineno" > 3885< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > =< / div >
< div class = "line" > < a name = "l03886" > < / a > < span class = "lineno" > 3886< / span >   < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (evaluator(from_index, to_index),< / div >
< div class = "line" > < a name = "l03887" > < / a > < span class = "lineno" > 3887< / span >   GetDimensionTransitCostSum(from_index, to_index, cost_class));< / div >
< div class = "line" > < a name = "l03888" > < / a > < span class = "lineno" > 3888< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03889" > < / a > < span class = "lineno" > 3889< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = 0;< / div >
< div class = "line" > < a name = "l03890" > < / a > < span class = "lineno" > 3890< / span >   }< / div >
< div class = "line" > < a name = "l03891" > < / a > < span class = "lineno" > 3891< / span >   }< / div >
< div class = "line" > < a name = "l03892" > < / a > < span class = "lineno" > 3892< / span >   *cache = {< span class = "keyword" > static_cast< < / span > < span class = "keywordtype" > int< / span > < span class = "keyword" > > < / span > (to_index), cost_class_index, < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > };< / div >
< div class = "line" > < a name = "l03893" > < / a > < span class = "lineno" > 3893< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ;< / div >
< div class = "line" > < a name = "l03894" > < / a > < span class = "lineno" > 3894< / span >   }< / div >
< div class = "line" > < a name = "l03895" > < / a > < span class = "lineno" > 3895< / span >   < / div >
< div class = "line" > < a name = "l03896" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > 3896< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > RoutingModel::IsStart< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03897" > < / a > < span class = "lineno" > 3897< / span >   < span class = "keywordflow" > return< / span > !< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) & & index_to_vehicle_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] != < a class = "code" href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > kUnassigned< / a > ;< / div >
< div class = "line" > < a name = "l03898" > < / a > < span class = "lineno" > 3898< / span >   }< / div >
< div class = "line" > < a name = "l03899" > < / a > < span class = "lineno" > 3899< / span >   < / div >
< div class = "line" > < a name = "l03900" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > 3900< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > RoutingModel::IsVehicleUsed< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment,< / div >
< div class = "line" > < a name = "l03901" > < / a > < span class = "lineno" > 3901< / span >   < span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03902" > < / a > < span class = "lineno" > 3902< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (vehicle, 0);< / div >
< div class = "line" > < a name = "l03903" > < / a > < span class = "lineno" > 3903< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicles_);< / div >
< div class = "line" > < a name = "l03904" > < / a > < span class = "lineno" > 3904< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (solver_.get(), assignment.< a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ());< / div >
< div class = "line" > < a name = "l03905" > < / a > < span class = "lineno" > 3905< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > start_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle));< / div >
< div class = "line" > < a name = "l03906" > < / a > < span class = "lineno" > 3906< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (start_var));< / div >
< div class = "line" > < a name = "l03907" > < / a > < span class = "lineno" > 3907< / span >   < span class = "keywordflow" > return< / span > !< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (start_var));< / div >
< div class = "line" > < a name = "l03908" > < / a > < span class = "lineno" > 3908< / span >   }< / div >
< div class = "line" > < a name = "l03909" > < / a > < span class = "lineno" > 3909< / span >   < / div >
< div class = "line" > < a name = "l03910" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > 3910< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > RoutingModel::Next< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & assignment, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03911" > < / a > < span class = "lineno" > 3911< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (solver_.get(), assignment.< a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ());< / div >
< div class = "line" > < a name = "l03912" > < / a > < span class = "lineno" > 3912< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > next_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l03913" > < / a > < span class = "lineno" > 3913< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > Contains< / a > (next_var));< / div >
< div class = "line" > < a name = "l03914" > < / a > < span class = "lineno" > 3914< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (next_var));< / div >
< div class = "line" > < a name = "l03915" > < / a > < span class = "lineno" > 3915< / span >   < span class = "keywordflow" > return< / span > assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (next_var);< / div >
< div class = "line" > < a name = "l03916" > < / a > < span class = "lineno" > 3916< / span >   }< / div >
< div class = "line" > < a name = "l03917" > < / a > < span class = "lineno" > 3917< / span >   < / div >
< div class = "line" > < a name = "l03918" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > 3918< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > RoutingModel::GetArcCostForVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index,< / div >
< div class = "line" > < a name = "l03919" > < / a > < span class = "lineno" > 3919< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03920" > < / a > < span class = "lineno" > 3920< / span >   < span class = "keywordflow" > if< / span > (from_index != to_index & & vehicle > = 0) {< / div >
< div class = "line" > < a name = "l03921" > < / a > < span class = "lineno" > 3921< / span >   < span class = "keywordflow" > return< / span > GetArcCostForClassInternal(from_index, to_index,< / div >
< div class = "line" > < a name = "l03922" > < / a > < span class = "lineno" > 3922< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a32bba655accbd7dc8e23d30bf679b880" > GetCostClassIndexOfVehicle< / a > (vehicle));< / div >
< div class = "line" > < a name = "l03923" > < / a > < span class = "lineno" > 3923< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03924" > < / a > < span class = "lineno" > 3924< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03925" > < / a > < span class = "lineno" > 3925< / span >   }< / div >
< div class = "line" > < a name = "l03926" > < / a > < span class = "lineno" > 3926< / span >   }< / div >
< div class = "line" > < a name = "l03927" > < / a > < span class = "lineno" > 3927< / span >   < / div >
< div class = "line" > < a name = "l03928" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > 3928< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > RoutingModel::GetArcCostForClass< / a > (< / div >
< div class = "line" > < a name = "l03929" > < / a > < span class = "lineno" > 3929< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index,< / div >
< div class = "line" > < a name = "l03930" > < / a > < span class = "lineno" > 3930< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < span class = "comment" > /*CostClassIndex*/< / span > cost_class_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03931" > < / a > < span class = "lineno" > 3931< / span >   < span class = "keywordflow" > if< / span > (from_index != to_index) {< / div >
< div class = "line" > < a name = "l03932" > < / a > < span class = "lineno" > 3932< / span >   < span class = "keywordflow" > return< / span > GetArcCostForClassInternal(from_index, to_index,< / div >
< div class = "line" > < a name = "l03933" > < / a > < span class = "lineno" > 3933< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > CostClassIndex< / a > (cost_class_index));< / div >
< div class = "line" > < a name = "l03934" > < / a > < span class = "lineno" > 3934< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l03935" > < / a > < span class = "lineno" > 3935< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l03936" > < / a > < span class = "lineno" > 3936< / span >   }< / div >
< div class = "line" > < a name = "l03937" > < / a > < span class = "lineno" > 3937< / span >   }< / div >
< div class = "line" > < a name = "l03938" > < / a > < span class = "lineno" > 3938< / span >   < / div >
< div class = "line" > < a name = "l03939" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > 3939< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > RoutingModel::GetArcCostForFirstSolution< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from_index,< / div >
< div class = "line" > < a name = "l03940" > < / a > < span class = "lineno" > 3940< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03941" > < / a > < span class = "lineno" > 3941< / span >   < span class = "comment" > // Return high cost if connecting to an end (or bound-to-end) node;< / span > < / div >
< div class = "line" > < a name = "l03942" > < / a > < span class = "lineno" > 3942< / span >   < span class = "comment" > // this is used in the cost-based first solution strategies to avoid closing< / span > < / div >
< div class = "line" > < a name = "l03943" > < / a > < span class = "lineno" > 3943< / span >   < span class = "comment" > // routes too soon.< / span > < / div >
< div class = "line" > < a name = "l03944" > < / a > < span class = "lineno" > 3944< / span >   < span class = "keywordflow" > if< / span > (!is_bound_to_end_ct_added_.< a class = "code" href = "classoperations__research_1_1_rev_switch.html#acd90006e99a15f7e9df2aee5cf46549c" > Switched< / a > ()) {< / div >
< div class = "line" > < a name = "l03945" > < / a > < span class = "lineno" > 3945< / span >   < span class = "comment" > // Lazily adding path-cumul constraint propagating connection to route end,< / span > < / div >
< div class = "line" > < a name = "l03946" > < / a > < span class = "lineno" > 3946< / span >   < span class = "comment" > // as it can be pretty costly in the general case.< / span > < / div >
< div class = "line" > < a name = "l03947" > < / a > < span class = "lineno" > 3947< / span >   std::vector< IntVar*> zero_transit(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (), solver_-> MakeIntConst(0));< / div >
< div class = "line" > < a name = "l03948" > < / a > < span class = "lineno" > 3948< / span >   solver_-> AddConstraint(solver_-> MakeDelayedPathCumul(< / div >
< div class = "line" > < a name = "l03949" > < / a > < span class = "lineno" > 3949< / span >   nexts_, active_, is_bound_to_end_, zero_transit));< / div >
< div class = "line" > < a name = "l03950" > < / a > < span class = "lineno" > 3950< / span >   is_bound_to_end_ct_added_.< a class = "code" href = "classoperations__research_1_1_rev_switch.html#aba56f30d7550dc96d418c689e3ea41f0" > Switch< / a > (solver_.get());< / div >
< div class = "line" > < a name = "l03951" > < / a > < span class = "lineno" > 3951< / span >   }< / div >
< div class = "line" > < a name = "l03952" > < / a > < span class = "lineno" > 3952< / span >   < span class = "keywordflow" > if< / span > (is_bound_to_end_[to_index]-> Min() == 1) < span class = "keywordflow" > return< / span > < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l03953" > < / a > < span class = "lineno" > 3953< / span >   < span class = "comment" > // TODO(user): Take vehicle into account.< / span > < / div >
< div class = "line" > < a name = "l03954" > < / a > < span class = "lineno" > 3954< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > GetHomogeneousCost< / a > (from_index, to_index);< / div >
< div class = "line" > < a name = "l03955" > < / a > < span class = "lineno" > 3955< / span >   }< / div >
< div class = "line" > < a name = "l03956" > < / a > < span class = "lineno" > 3956< / span >   < / div >
< div class = "line" > < a name = "l03957" > < / a > < span class = "lineno" > 3957< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > RoutingModel::GetDimensionTransitCostSum(< / div >
< div class = "line" > < a name = "l03958" > < / a > < span class = "lineno" > 3958< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < span class = "keyword" > const< / span > CostClass& cost_class)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l03959" > < / a > < span class = "lineno" > 3959< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = 0;< / div >
< div class = "line" > < a name = "l03960" > < / a > < span class = "lineno" > 3960< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & evaluator_and_coefficient :< / div >
< div class = "line" > < a name = "l03961" > < / a > < span class = "lineno" > 3961< / span >   cost_class.dimension_transit_evaluator_class_and_cost_coefficient) {< / div >
< div class = "line" > < a name = "l03962" > < / a > < span class = "lineno" > 3962< / span >   < a class = "code" href = "base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a" > DCHECK_GT< / a > (evaluator_and_coefficient.cost_coefficient, 0);< / div >
< div class = "line" > < a name = "l03963" > < / a > < span class = "lineno" > 3963< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (< / div >
< div class = "line" > < a name = "l03964" > < / a > < span class = "lineno" > 3964< / span >   < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ,< / div >
< div class = "line" > < a name = "l03965" > < / a > < span class = "lineno" > 3965< / span >   < a class = "code" href = "namespaceoperations__research.html#ab216763dccd16f5060d2fbcfb08173fb" > CapProd< / a > (evaluator_and_coefficient.cost_coefficient,< / div >
< div class = "line" > < a name = "l03966" > < / a > < span class = "lineno" > 3966< / span >   evaluator_and_coefficient.dimension-> GetTransitValueFromClass(< / div >
< div class = "line" > < a name = "l03967" > < / a > < span class = "lineno" > 3967< / span >   i, j, evaluator_and_coefficient.transit_evaluator_class)));< / div >
< div class = "line" > < a name = "l03968" > < / a > < span class = "lineno" > 3968< / span >   }< / div >
< div class = "line" > < a name = "l03969" > < / a > < span class = "lineno" > 3969< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ;< / div >
< div class = "line" > < a name = "l03970" > < / a > < span class = "lineno" > 3970< / span >   }< / div >
< div class = "line" > < a name = "l03971" > < / a > < span class = "lineno" > 3971< / span >   < / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l03972" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a1048b3f7ef92f0d7747f93c8586ea1cc" > 3972< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1048b3f7ef92f0d7747f93c8586ea1cc" > RoutingModel::ArcIsMoreConstrainedThanArc< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to1,< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03973" > < / a > < span class = "lineno" > 3973< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to2) {< / div >
< div class = "line" > < a name = "l03974" > < / a > < span class = "lineno" > 3974< / span >   < span class = "comment" > // Deal with end nodes: never pick an end node over a non-end node.< / span > < / div >
< div class = "line" > < a name = "l03975" > < / a > < span class = "lineno" > 3975< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to1) || < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to2)) {< / div >
< div class = "line" > < a name = "l03976" > < / a > < span class = "lineno" > 3976< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to1) != < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to2)) < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (to2);< / div >
< div class = "line" > < a name = "l03977" > < / a > < span class = "lineno" > 3977< / span >   < span class = "comment" > // If both are end nodes, we don' t care; the right end node will be picked< / span > < / div >
< div class = "line" > < a name = "l03978" > < / a > < span class = "lineno" > 3978< / span >   < span class = "comment" > // by constraint propagation. Break the tie by index.< / span > < / div >
< div class = "line" > < a name = "l03979" > < / a > < span class = "lineno" > 3979< / span >   < span class = "keywordflow" > return< / span > to1 < to2;< / div >
< div class = "line" > < a name = "l03980" > < / a > < span class = "lineno" > 3980< / span >   }< / div >
< div class = "line" > < a name = "l03981" > < / a > < span class = "lineno" > 3981< / span >   < / div >
< div class = "line" > < a name = "l03982" > < / a > < span class = "lineno" > 3982< / span >   < span class = "comment" > // Look whether they are mandatory (must be performed) or optional.< / span > < / div >
< div class = "line" > < a name = "l03983" > < / a > < span class = "lineno" > 3983< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > mandatory1 = active_[to1]-> Min() == 1;< / div >
< div class = "line" > < a name = "l03984" > < / a > < span class = "lineno" > 3984< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > mandatory2 = active_[to2]-> Min() == 1;< / div >
< div class = "line" > < a name = "l03985" > < / a > < span class = "lineno" > 3985< / span >   < span class = "comment" > // Always pick a mandatory node over a non-mandatory one.< / span > < / div >
< div class = "line" > < a name = "l03986" > < / a > < span class = "lineno" > 3986< / span >   < span class = "keywordflow" > if< / span > (mandatory1 != mandatory2) < span class = "keywordflow" > return< / span > mandatory1;< / div >
< div class = "line" > < a name = "l03987" > < / a > < span class = "lineno" > 3987< / span >   < / div >
< div class = "line" > < a name = "l03988" > < / a > < span class = "lineno" > 3988< / span >   < span class = "comment" > // Look at the vehicle variables.< / span > < / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l03989" > < / a > < span class = "lineno" > 3989< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > src_vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (from);< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l03990" > < / a > < span class = "lineno" > 3990< / span >   < span class = "comment" > // In case the source vehicle is bound, " src_vehicle" will be it.< / span > < / div >
< div class = "line" > < a name = "l03991" > < / a > < span class = "lineno" > 3991< / span >   < span class = "comment" > // Otherwise, it' ll be set to some possible source vehicle that< / span > < / div >
< div class = "line" > < a name = "l03992" > < / a > < span class = "lineno" > 3992< / span >   < span class = "comment" > // isn' t -1 (if possible).< / span > < / div >
< div class = "line" > < a name = "l03993" > < / a > < span class = "lineno" > 3993< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > src_vehicle = src_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ();< / div >
< div class = "line" > < a name = "l03994" > < / a > < span class = "lineno" > 3994< / span >   < span class = "keywordflow" > if< / span > (src_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > ()) {< / div >
< div class = "line" > < a name = "l03995" > < / a > < span class = "lineno" > 3995< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > to1_vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (to1);< / div >
< div class = "line" > < a name = "l03996" > < / a > < span class = "lineno" > 3996< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > to2_vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (to2);< / div >
< div class = "line" > < a name = "l03997" > < / a > < span class = "lineno" > 3997< / span >   < span class = "comment" > // Subtle: non-mandatory node have kNoVehicle as possible value for< / span > < / div >
< div class = "line" > < a name = "l03998" > < / a > < span class = "lineno" > 3998< / span >   < span class = "comment" > // their vehicle variable. So they' re effectively " bound" when their domain< / span > < / div >
< div class = "line" > < a name = "l03999" > < / a > < span class = "lineno" > 3999< / span >   < span class = "comment" > // size is 2.< / span > < / div >
< div class = "line" > < a name = "l04000" > < / a > < span class = "lineno" > 4000< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > bound1 =< / div >
< div class = "line" > < a name = "l04001" > < / a > < span class = "lineno" > 4001< / span >   mandatory1 ? to1_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > () : (to1_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_var.html#accbd81450997e4b279396e56ab44c0b4" > Size< / a > () < = 2);< / div >
< div class = "line" > < a name = "l04002" > < / a > < span class = "lineno" > 4002< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > bound2 =< / div >
< div class = "line" > < a name = "l04003" > < / a > < span class = "lineno" > 4003< / span >   mandatory2 ? to2_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > () : (to2_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_var.html#accbd81450997e4b279396e56ab44c0b4" > Size< / a > () < = 2);< / div >
< div class = "line" > < a name = "l04004" > < / a > < span class = "lineno" > 4004< / span >   < span class = "comment" > // Prefer a destination bound to a given vehicle, even if it' s not< / span > < / div >
< div class = "line" > < a name = "l04005" > < / a > < span class = "lineno" > 4005< / span >   < span class = "comment" > // bound to the right one (the propagation will quickly rule it out).< / span > < / div >
< div class = "line" > < a name = "l04006" > < / a > < span class = "lineno" > 4006< / span >   < span class = "keywordflow" > if< / span > (bound1 != bound2) < span class = "keywordflow" > return< / span > bound1;< / div >
< div class = "line" > < a name = "l04007" > < / a > < span class = "lineno" > 4007< / span >   < span class = "keywordflow" > if< / span > (bound1) { < span class = "comment" > // same as bound1 & & bound2.< / span > < / div >
< div class = "line" > < a name = "l04008" > < / a > < span class = "lineno" > 4008< / span >   < span class = "comment" > // Min() will return kNoVehicle for optional nodes. Thus we use Max().< / span > < / div >
< div class = "line" > < a name = "l04009" > < / a > < span class = "lineno" > 4009< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle1 = to1_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ();< / div >
< div class = "line" > < a name = "l04010" > < / a > < span class = "lineno" > 4010< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle2 = to2_vehicle_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ();< / div >
< div class = "line" > < a name = "l04011" > < / a > < span class = "lineno" > 4011< / span >   < span class = "comment" > // Prefer a destination bound to the right vehicle.< / span > < / div >
< div class = "line" > < a name = "l04012" > < / a > < span class = "lineno" > 4012< / span >   < span class = "comment" > // TODO(user): cover this clause in a unit test.< / span > < / div >
< div class = "line" > < a name = "l04013" > < / a > < span class = "lineno" > 4013< / span >   < span class = "keywordflow" > if< / span > ((vehicle1 == src_vehicle) != (vehicle2 == src_vehicle)) {< / div >
< div class = "line" > < a name = "l04014" > < / a > < span class = "lineno" > 4014< / span >   < span class = "keywordflow" > return< / span > vehicle1 == src_vehicle;< / div >
< div class = "line" > < a name = "l04015" > < / a > < span class = "lineno" > 4015< / span >   }< / div >
< div class = "line" > < a name = "l04016" > < / a > < span class = "lineno" > 4016< / span >   < span class = "comment" > // If no destination is bound to the right vehicle, whatever we< / span > < / div >
< div class = "line" > < a name = "l04017" > < / a > < span class = "lineno" > 4017< / span >   < span class = "comment" > // return doesn' t matter: both are infeasible. To be consistent, we< / span > < / div >
< div class = "line" > < a name = "l04018" > < / a > < span class = "lineno" > 4018< / span >   < span class = "comment" > // just break the tie.< / span > < / div >
< div class = "line" > < a name = "l04019" > < / a > < span class = "lineno" > 4019< / span >   < span class = "keywordflow" > if< / span > (vehicle1 != src_vehicle) < span class = "keywordflow" > return< / span > to1 < to2;< / div >
< div class = "line" > < a name = "l04020" > < / a > < span class = "lineno" > 4020< / span >   }< / div >
< div class = "line" > < a name = "l04021" > < / a > < span class = "lineno" > 4021< / span >   }< / div >
< div class = "line" > < a name = "l04022" > < / a > < span class = "lineno" > 4022< / span >   < span class = "comment" > // At this point, either both destinations are bound to the source vehicle,< / span > < / div >
< div class = "line" > < a name = "l04023" > < / a > < span class = "lineno" > 4023< / span >   < span class = "comment" > // or none of them is bound, or the source vehicle isn' t bound.< / span > < / div >
< div class = "line" > < a name = "l04024" > < / a > < span class = "lineno" > 4024< / span >   < span class = "comment" > // We don' t bother inspecting the domains of the vehicle variables further.< / span > < / div >
< div class = "line" > < a name = "l04025" > < / a > < span class = "lineno" > 4025< / span >   < / div >
< div class = "line" > < a name = "l04026" > < / a > < span class = "lineno" > 4026< / span >   < span class = "comment" > // Inspect the primary constrained dimension, if any.< / span > < / div >
< div class = "line" > < a name = "l04027" > < / a > < span class = "lineno" > 4027< / span >   < span class = "comment" > // TODO(user): try looking at all the dimensions, not just the primary one,< / span > < / div >
< div class = "line" > < a name = "l04028" > < / a > < span class = "lineno" > 4028< / span >   < span class = "comment" > // and reconsider the need for a " primary" dimension.< / span > < / div >
< div class = "line" > < a name = "l04029" > < / a > < span class = "lineno" > 4029< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#a08f0e7114d9118eafc2b3e3f96878014" > GetPrimaryConstrainedDimension< / a > ().empty()) {< / div >
< div class = "line" > < a name = "l04030" > < / a > < span class = "lineno" > 4030< / span >   < span class = "keyword" > const< / span > std::vector< IntVar*> & cumul_vars =< / div >
< div class = "line" > < a name = "l04031" > < / a > < span class = "lineno" > 4031< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76" > GetDimensionOrDie< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a08f0e7114d9118eafc2b3e3f96878014" > GetPrimaryConstrainedDimension< / a > ()).< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a1b6f521fdc9dff38b7e065c838fa54a3" > cumuls< / a > ();< / div >
< div class = "line" > < a name = "l04032" > < / a > < span class = "lineno" > 4032< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > dim1 = cumul_vars[to1];< / div >
< div class = "line" > < a name = "l04033" > < / a > < span class = "lineno" > 4033< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > dim2 = cumul_vars[to2];< / div >
< div class = "line" > < a name = "l04034" > < / a > < span class = "lineno" > 4034< / span >   < span class = "comment" > // Prefer the destination that has a lower upper bound for the constrained< / span > < / div >
< div class = "line" > < a name = "l04035" > < / a > < span class = "lineno" > 4035< / span >   < span class = "comment" > // dimension.< / span > < / div >
< div class = "line" > < a name = "l04036" > < / a > < span class = "lineno" > 4036< / span >   < span class = "keywordflow" > if< / span > (dim1-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > () != dim2-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ()) < span class = "keywordflow" > return< / span > dim1-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > () < dim2-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ();< / div >
< div class = "line" > < a name = "l04037" > < / a > < span class = "lineno" > 4037< / span >   < span class = "comment" > // TODO(user): evaluate the *actual* Min() of each cumul variable in the< / span > < / div >
< div class = "line" > < a name = "l04038" > < / a > < span class = "lineno" > 4038< / span >   < span class = "comment" > // scenario where the corresponding arc from-> to is performed, and pick< / span > < / div >
< div class = "line" > < a name = "l04039" > < / a > < span class = "lineno" > 4039< / span >   < span class = "comment" > // the destination with the lowest value.< / span > < / div >
< div class = "line" > < a name = "l04040" > < / a > < span class = "lineno" > 4040< / span >   }< / div >
< div class = "line" > < a name = "l04041" > < / a > < span class = "lineno" > 4041< / span >   < / div >
< div class = "line" > < a name = "l04042" > < / a > < span class = "lineno" > 4042< / span >   < span class = "comment" > // Break ties on equally constrained nodes with the (cost - unperformed< / span > < / div >
< div class = "line" > < a name = "l04043" > < / a > < span class = "lineno" > 4043< / span >   < span class = "comment" > // penalty).< / span > < / div >
< div class = "line" > < a name = "l04044" > < / a > < span class = "lineno" > 4044< / span >   {< / div >
< div class = "line" > < a name = "l04045" > < / a > < span class = "lineno" > 4045< / span >   < span class = "keyword" > const< / span > < span class = "comment" > /*CostClassIndex*/< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > cost_class_index =< / div >
< div class = "line" > < a name = "l04046" > < / a > < span class = "lineno" > 4046< / span >   SafeGetCostClassInt64OfVehicle(src_vehicle);< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l04047" > < / a > < span class = "lineno" > 4047< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > cost1 = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > GetArcCostForClass< / a > (from, to1, cost_class_index),< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04048" > < / a > < span class = "lineno" > 4048< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3600327c657a0c83430d7bd9566e9ab6" > UnperformedPenalty< / a > (to1));< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l04049" > < / a > < span class = "lineno" > 4049< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > cost2 = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > GetArcCostForClass< / a > (from, to2, cost_class_index),< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04050" > < / a > < span class = "lineno" > 4050< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3600327c657a0c83430d7bd9566e9ab6" > UnperformedPenalty< / a > (to2));< / div >
< div class = "line" > < a name = "l04051" > < / a > < span class = "lineno" > 4051< / span >   < span class = "keywordflow" > if< / span > (cost1 != cost2) < span class = "keywordflow" > return< / span > cost1 < cost2;< / div >
< div class = "line" > < a name = "l04052" > < / a > < span class = "lineno" > 4052< / span >   }< / div >
< div class = "line" > < a name = "l04053" > < / a > < span class = "lineno" > 4053< / span >   < / div >
< div class = "line" > < a name = "l04054" > < / a > < span class = "lineno" > 4054< / span >   < span class = "comment" > // Further break ties by looking at the size of the VehicleVar.< / span > < / div >
< div class = "line" > < a name = "l04055" > < / a > < span class = "lineno" > 4055< / span >   {< / div >
< div class = "line" > < a name = "l04056" > < / a > < span class = "lineno" > 4056< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > num_vehicles1 = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (to1)-> < a class = "code" href = "classoperations__research_1_1_int_var.html#accbd81450997e4b279396e56ab44c0b4" > Size< / a > ();< / div >
< div class = "line" > < a name = "l04057" > < / a > < span class = "lineno" > 4057< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > num_vehicles2 = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (to2)-> < a class = "code" href = "classoperations__research_1_1_int_var.html#accbd81450997e4b279396e56ab44c0b4" > Size< / a > ();< / div >
< div class = "line" > < a name = "l04058" > < / a > < span class = "lineno" > 4058< / span >   < span class = "keywordflow" > if< / span > (num_vehicles1 != num_vehicles2) < span class = "keywordflow" > return< / span > num_vehicles1 < num_vehicles2;< / div >
< div class = "line" > < a name = "l04059" > < / a > < span class = "lineno" > 4059< / span >   }< / div >
< div class = "line" > < a name = "l04060" > < / a > < span class = "lineno" > 4060< / span >   < / div >
< div class = "line" > < a name = "l04061" > < / a > < span class = "lineno" > 4061< / span >   < span class = "comment" > // Break perfect ties by value.< / span > < / div >
< div class = "line" > < a name = "l04062" > < / a > < span class = "lineno" > 4062< / span >   < span class = "keywordflow" > return< / span > to1 < to2;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04063" > < / a > < span class = "lineno" > 4063< / span >   }< / div >
< div class = "line" > < a name = "l04064" > < / a > < span class = "lineno" > 4064< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04065" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a77320442b8568aad01f668c2f9eb6f07" > 4065< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a77320442b8568aad01f668c2f9eb6f07" > RoutingModel::SetVisitType< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < span class = "keywordtype" > int< / span > type, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059" > VisitTypePolicy< / a > policy) {< / div >
< div class = "line" > < a name = "l04066" > < / a > < span class = "lineno" > 4066< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , index_to_visit_type_.size());< / div >
< div class = "line" > < a name = "l04067" > < / a > < span class = "lineno" > 4067< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (index_to_visit_type_.size(), index_to_type_policy_.size());< / div >
< div class = "line" > < a name = "l04068" > < / a > < span class = "lineno" > 4068< / span >   index_to_visit_type_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = type;< / div >
< div class = "line" > < a name = "l04069" > < / a > < span class = "lineno" > 4069< / span >   index_to_type_policy_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = policy;< / div >
< div class = "line" > < a name = "l04070" > < / a > < span class = "lineno" > 4070< / span >   num_visit_types_ = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (num_visit_types_, type + 1);< / div >
< div class = "line" > < a name = "l04071" > < / a > < span class = "lineno" > 4071< / span >   }< / div >
< div class = "line" > < a name = "l04072" > < / a > < span class = "lineno" > 4072< / span >   < / div >
< div class = "line" > < a name = "l04073" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > 4073< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > RoutingModel::GetVisitType< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04074" > < / a > < span class = "lineno" > 4074< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , index_to_visit_type_.size());< / div >
< div class = "line" > < a name = "l04075" > < / a > < span class = "lineno" > 4075< / span >   < span class = "keywordflow" > return< / span > index_to_visit_type_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l04076" > < / a > < span class = "lineno" > 4076< / span >   }< / div >
< div class = "line" > < a name = "l04077" > < / a > < span class = "lineno" > 4077< / span >   < / div >
< div class = "line" > < a name = "l04078" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5" > 4078< / a > < / span >   < span class = "keyword" > const< / span > std::vector< int> & < a class = "code" href = "classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5" > RoutingModel::GetSingleNodesOfType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04079" > < / a > < span class = "lineno" > 4079< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, single_nodes_of_type_.size());< / div >
< div class = "line" > < a name = "l04080" > < / a > < span class = "lineno" > 4080< / span >   < span class = "keywordflow" > return< / span > single_nodes_of_type_[type];< / div >
< div class = "line" > < a name = "l04081" > < / a > < span class = "lineno" > 4081< / span >   }< / div >
< div class = "line" > < a name = "l04082" > < / a > < span class = "lineno" > 4082< / span >   < / div >
< div class = "line" > < a name = "l04083" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972" > 4083< / a > < / span >   < span class = "keyword" > const< / span > std::vector< int> & < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972" > RoutingModel::GetPairIndicesOfType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04084" > < / a > < span class = "lineno" > 4084< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, pair_indices_of_type_.size());< / div >
< div class = "line" > < a name = "l04085" > < / a > < span class = "lineno" > 4085< / span >   < span class = "keywordflow" > return< / span > pair_indices_of_type_[type];< / div >
< div class = "line" > < a name = "l04086" > < / a > < span class = "lineno" > 4086< / span >   }< / div >
< div class = "line" > < a name = "l04087" > < / a > < span class = "lineno" > 4087< / span >   < / div >
< div class = "line" > < a name = "l04088" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#afb44a005674a48ac88da66f7c9b7b000" > 4088< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059" > RoutingModel::VisitTypePolicy< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#afb44a005674a48ac88da66f7c9b7b000" > RoutingModel::GetVisitTypePolicy< / a > (< / div >
< div class = "line" > < a name = "l04089" > < / a > < span class = "lineno" > 4089< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04090" > < / a > < span class = "lineno" > 4090< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , index_to_type_policy_.size());< / div >
< div class = "line" > < a name = "l04091" > < / a > < span class = "lineno" > 4091< / span >   < span class = "keywordflow" > return< / span > index_to_type_policy_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l04092" > < / a > < span class = "lineno" > 4092< / span >   }< / div >
< div class = "line" > < a name = "l04093" > < / a > < span class = "lineno" > 4093< / span >   < / div >
< div class = "line" > < a name = "l04094" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89" > 4094< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89" > RoutingModel::CloseVisitTypes< / a > () {< / div >
< div class = "line" > < a name = "l04095" > < / a > < span class = "lineno" > 4095< / span >   hard_incompatible_types_per_type_index_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l04096" > < / a > < span class = "lineno" > 4096< / span >   temporal_incompatible_types_per_type_index_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l04097" > < / a > < span class = "lineno" > 4097< / span >   same_vehicle_required_type_alternatives_per_type_index_.resize(< / div >
< div class = "line" > < a name = "l04098" > < / a > < span class = "lineno" > 4098< / span >   num_visit_types_);< / div >
< div class = "line" > < a name = "l04099" > < / a > < span class = "lineno" > 4099< / span >   required_type_alternatives_when_adding_type_index_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l04100" > < / a > < span class = "lineno" > 4100< / span >   required_type_alternatives_when_removing_type_index_.resize(num_visit_types_);< / div >
< div class = "line" > < a name = "l04101" > < / a > < span class = "lineno" > 4101< / span >   }< / div >
< div class = "line" > < a name = "l04102" > < / a > < span class = "lineno" > 4102< / span >   < / div >
< div class = "line" > < a name = "l04103" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952" > 4103< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952" > RoutingModel::AddHardTypeIncompatibility< / a > (< span class = "keywordtype" > int< / span > type1, < span class = "keywordtype" > int< / span > type2) {< / div >
< div class = "line" > < a name = "l04104" > < / a > < span class = "lineno" > 4104< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (< a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (type1, type2),< / div >
< div class = "line" > < a name = "l04105" > < / a > < span class = "lineno" > 4105< / span >   hard_incompatible_types_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04106" > < / a > < span class = "lineno" > 4106< / span >   has_hard_type_incompatibilities_ = < span class = "keyword" > true< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04107" > < / a > < span class = "lineno" > 4107< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04108" > < / a > < span class = "lineno" > 4108< / span >   hard_incompatible_types_per_type_index_[type1].insert(type2);< / div >
< div class = "line" > < a name = "l04109" > < / a > < span class = "lineno" > 4109< / span >   hard_incompatible_types_per_type_index_[type2].insert(type1);< / div >
< div class = "line" > < a name = "l04110" > < / a > < span class = "lineno" > 4110< / span >   }< / div >
< div class = "line" > < a name = "l04111" > < / a > < span class = "lineno" > 4111< / span >   < / div >
< div class = "line" > < a name = "l04112" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384" > 4112< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384" > RoutingModel::AddTemporalTypeIncompatibility< / a > (< span class = "keywordtype" > int< / span > type1, < span class = "keywordtype" > int< / span > type2) {< / div >
< div class = "line" > < a name = "l04113" > < / a > < span class = "lineno" > 4113< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (< a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (type1, type2),< / div >
< div class = "line" > < a name = "l04114" > < / a > < span class = "lineno" > 4114< / span >   temporal_incompatible_types_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04115" > < / a > < span class = "lineno" > 4115< / span >   has_temporal_type_incompatibilities_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04116" > < / a > < span class = "lineno" > 4116< / span >   < / div >
< div class = "line" > < a name = "l04117" > < / a > < span class = "lineno" > 4117< / span >   temporal_incompatible_types_per_type_index_[type1].insert(type2);< / div >
< div class = "line" > < a name = "l04118" > < / a > < span class = "lineno" > 4118< / span >   temporal_incompatible_types_per_type_index_[type2].insert(type1);< / div >
< div class = "line" > < a name = "l04119" > < / a > < span class = "lineno" > 4119< / span >   }< / div >
< div class = "line" > < a name = "l04120" > < / a > < span class = "lineno" > 4120< / span >   < / div >
< div class = "line" > < a name = "l04121" > < / a > < span class = "lineno" > 4121< / span >   < span class = "keyword" > const< / span > absl::flat_hash_set< int> & < / div >
< div class = "line" > < a name = "l04122" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895" > 4122< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895" > RoutingModel::GetHardTypeIncompatibilitiesOfType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04123" > < / a > < span class = "lineno" > 4123< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (type, 0);< / div >
< div class = "line" > < a name = "l04124" > < / a > < span class = "lineno" > 4124< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, hard_incompatible_types_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04125" > < / a > < span class = "lineno" > 4125< / span >   < span class = "keywordflow" > return< / span > hard_incompatible_types_per_type_index_[type];< / div >
< div class = "line" > < a name = "l04126" > < / a > < span class = "lineno" > 4126< / span >   }< / div >
< div class = "line" > < a name = "l04127" > < / a > < span class = "lineno" > 4127< / span >   < / div >
< div class = "line" > < a name = "l04128" > < / a > < span class = "lineno" > 4128< / span >   < span class = "keyword" > const< / span > absl::flat_hash_set< int> & < / div >
< div class = "line" > < a name = "l04129" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7" > 4129< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7" > RoutingModel::GetTemporalTypeIncompatibilitiesOfType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04130" > < / a > < span class = "lineno" > 4130< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (type, 0);< / div >
< div class = "line" > < a name = "l04131" > < / a > < span class = "lineno" > 4131< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, temporal_incompatible_types_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04132" > < / a > < span class = "lineno" > 4132< / span >   < span class = "keywordflow" > return< / span > temporal_incompatible_types_per_type_index_[type];< / div >
< div class = "line" > < a name = "l04133" > < / a > < span class = "lineno" > 4133< / span >   }< / div >
< div class = "line" > < a name = "l04134" > < / a > < span class = "lineno" > 4134< / span >   < / div >
< div class = "line" > < a name = "l04135" > < / a > < span class = "lineno" > 4135< / span >   < span class = "comment" > // TODO(user): Consider if an empty " required_type_alternatives" should mean< / span > < / div >
< div class = "line" > < a name = "l04136" > < / a > < span class = "lineno" > 4136< / span >   < span class = "comment" > // trivially feasible requirement, as there are no required type alternatives?< / span > < / div >
< div class = "line" > < a name = "l04137" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1" > 4137< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1" > RoutingModel::AddSameVehicleRequiredTypeAlternatives< / a > (< / div >
< div class = "line" > < a name = "l04138" > < / a > < span class = "lineno" > 4138< / span >   < span class = "keywordtype" > int< / span > dependent_type, absl::flat_hash_set< int> required_type_alternatives) {< / div >
< div class = "line" > < a name = "l04139" > < / a > < span class = "lineno" > 4139< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (dependent_type,< / div >
< div class = "line" > < a name = "l04140" > < / a > < span class = "lineno" > 4140< / span >   same_vehicle_required_type_alternatives_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04141" > < / a > < span class = "lineno" > 4141< / span >   < / div >
< div class = "line" > < a name = "l04142" > < / a > < span class = "lineno" > 4142< / span >   < span class = "keywordflow" > if< / span > (required_type_alternatives.empty()) {< / div >
< div class = "line" > < a name = "l04143" > < / a > < span class = "lineno" > 4143< / span >   < span class = "comment" > // The dependent_type requires an infeasible (empty) set of types.< / span > < / div >
< div class = "line" > < a name = "l04144" > < / a > < span class = "lineno" > 4144< / span >   < span class = "comment" > // Nodes of this type and all policies except< / span > < / div >
< div class = "line" > < a name = "l04145" > < / a > < span class = "lineno" > 4145< / span >   < span class = "comment" > // ADDED_TYPE_REMOVED_FROM_VEHICLE are trivially infeasible.< / span > < / div >
< div class = "line" > < a name = "l04146" > < / a > < span class = "lineno" > 4146< / span >   absl::flat_hash_set< VisitTypePolicy> & infeasible_policies =< / div >
< div class = "line" > < a name = "l04147" > < / a > < span class = "lineno" > 4147< / span >   trivially_infeasible_visit_types_to_policies_[dependent_type];< / div >
< div class = "line" > < a name = "l04148" > < / a > < span class = "lineno" > 4148< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > TYPE_ADDED_TO_VEHICLE< / a > );< / div >
< div class = "line" > < a name = "l04149" > < / a > < span class = "lineno" > 4149< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1" > TYPE_ON_VEHICLE_UP_TO_VISIT< / a > );< / div >
< div class = "line" > < a name = "l04150" > < / a > < span class = "lineno" > 4150< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / a > );< / div >
< div class = "line" > < a name = "l04151" > < / a > < span class = "lineno" > 4151< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l04152" > < / a > < span class = "lineno" > 4152< / span >   }< / div >
< div class = "line" > < a name = "l04153" > < / a > < span class = "lineno" > 4153< / span >   < / div >
< div class = "line" > < a name = "l04154" > < / a > < span class = "lineno" > 4154< / span >   has_same_vehicle_type_requirements_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04155" > < / a > < span class = "lineno" > 4155< / span >   same_vehicle_required_type_alternatives_per_type_index_[dependent_type]< / div >
< div class = "line" > < a name = "l04156" > < / a > < span class = "lineno" > 4156< / span >   .push_back(std::move(required_type_alternatives));< / div >
< div class = "line" > < a name = "l04157" > < / a > < span class = "lineno" > 4157< / span >   }< / div >
< div class = "line" > < a name = "l04158" > < / a > < span class = "lineno" > 4158< / span >   < / div >
< div class = "line" > < a name = "l04159" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b" > 4159< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b" > RoutingModel::AddRequiredTypeAlternativesWhenAddingType< / a > (< / div >
< div class = "line" > < a name = "l04160" > < / a > < span class = "lineno" > 4160< / span >   < span class = "keywordtype" > int< / span > dependent_type, absl::flat_hash_set< int> required_type_alternatives) {< / div >
< div class = "line" > < a name = "l04161" > < / a > < span class = "lineno" > 4161< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (dependent_type,< / div >
< div class = "line" > < a name = "l04162" > < / a > < span class = "lineno" > 4162< / span >   required_type_alternatives_when_adding_type_index_.size());< / div >
< div class = "line" > < a name = "l04163" > < / a > < span class = "lineno" > 4163< / span >   < / div >
< div class = "line" > < a name = "l04164" > < / a > < span class = "lineno" > 4164< / span >   < span class = "keywordflow" > if< / span > (required_type_alternatives.empty()) {< / div >
< div class = "line" > < a name = "l04165" > < / a > < span class = "lineno" > 4165< / span >   < span class = "comment" > // The dependent_type requires an infeasible (empty) set of types.< / span > < / div >
< div class = "line" > < a name = "l04166" > < / a > < span class = "lineno" > 4166< / span >   < span class = "comment" > // Nodes of this type and policy TYPE_ADDED_TO_VEHICLE or< / span > < / div >
< div class = "line" > < a name = "l04167" > < / a > < span class = "lineno" > 4167< / span >   < span class = "comment" > // TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED are trivially infeasible.< / span > < / div >
< div class = "line" > < a name = "l04168" > < / a > < span class = "lineno" > 4168< / span >   absl::flat_hash_set< VisitTypePolicy> & infeasible_policies =< / div >
< div class = "line" > < a name = "l04169" > < / a > < span class = "lineno" > 4169< / span >   trivially_infeasible_visit_types_to_policies_[dependent_type];< / div >
< div class = "line" > < a name = "l04170" > < / a > < span class = "lineno" > 4170< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > TYPE_ADDED_TO_VEHICLE< / a > );< / div >
< div class = "line" > < a name = "l04171" > < / a > < span class = "lineno" > 4171< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / a > );< / div >
< div class = "line" > < a name = "l04172" > < / a > < span class = "lineno" > 4172< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l04173" > < / a > < span class = "lineno" > 4173< / span >   }< / div >
< div class = "line" > < a name = "l04174" > < / a > < span class = "lineno" > 4174< / span >   < / div >
< div class = "line" > < a name = "l04175" > < / a > < span class = "lineno" > 4175< / span >   has_temporal_type_requirements_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04176" > < / a > < span class = "lineno" > 4176< / span >   required_type_alternatives_when_adding_type_index_[dependent_type].push_back(< / div >
< div class = "line" > < a name = "l04177" > < / a > < span class = "lineno" > 4177< / span >   std::move(required_type_alternatives));< / div >
< div class = "line" > < a name = "l04178" > < / a > < span class = "lineno" > 4178< / span >   }< / div >
< div class = "line" > < a name = "l04179" > < / a > < span class = "lineno" > 4179< / span >   < / div >
< div class = "line" > < a name = "l04180" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74" > 4180< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74" > RoutingModel::AddRequiredTypeAlternativesWhenRemovingType< / a > (< / div >
< div class = "line" > < a name = "l04181" > < / a > < span class = "lineno" > 4181< / span >   < span class = "keywordtype" > int< / span > dependent_type, absl::flat_hash_set< int> required_type_alternatives) {< / div >
< div class = "line" > < a name = "l04182" > < / a > < span class = "lineno" > 4182< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (dependent_type,< / div >
< div class = "line" > < a name = "l04183" > < / a > < span class = "lineno" > 4183< / span >   required_type_alternatives_when_removing_type_index_.size());< / div >
< div class = "line" > < a name = "l04184" > < / a > < span class = "lineno" > 4184< / span >   < / div >
< div class = "line" > < a name = "l04185" > < / a > < span class = "lineno" > 4185< / span >   < span class = "keywordflow" > if< / span > (required_type_alternatives.empty()) {< / div >
< div class = "line" > < a name = "l04186" > < / a > < span class = "lineno" > 4186< / span >   < span class = "comment" > // The dependent_type requires an infeasible (empty) set of types.< / span > < / div >
< div class = "line" > < a name = "l04187" > < / a > < span class = "lineno" > 4187< / span >   < span class = "comment" > // Nodes of this type and all policies except TYPE_ADDED_TO_VEHICLE are< / span > < / div >
< div class = "line" > < a name = "l04188" > < / a > < span class = "lineno" > 4188< / span >   < span class = "comment" > // trivially infeasible.< / span > < / div >
< div class = "line" > < a name = "l04189" > < / a > < span class = "lineno" > 4189< / span >   absl::flat_hash_set< VisitTypePolicy> & infeasible_policies =< / div >
< div class = "line" > < a name = "l04190" > < / a > < span class = "lineno" > 4190< / span >   trivially_infeasible_visit_types_to_policies_[dependent_type];< / div >
< div class = "line" > < a name = "l04191" > < / a > < span class = "lineno" > 4191< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab" > ADDED_TYPE_REMOVED_FROM_VEHICLE< / a > );< / div >
< div class = "line" > < a name = "l04192" > < / a > < span class = "lineno" > 4192< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1" > TYPE_ON_VEHICLE_UP_TO_VISIT< / a > );< / div >
< div class = "line" > < a name = "l04193" > < / a > < span class = "lineno" > 4193< / span >   infeasible_policies.insert(< a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / a > );< / div >
< div class = "line" > < a name = "l04194" > < / a > < span class = "lineno" > 4194< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l04195" > < / a > < span class = "lineno" > 4195< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04196" > < / a > < span class = "lineno" > 4196< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04197" > < / a > < span class = "lineno" > 4197< / span >   has_temporal_type_requirements_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04198" > < / a > < span class = "lineno" > 4198< / span >   required_type_alternatives_when_removing_type_index_[dependent_type]< / div >
< div class = "line" > < a name = "l04199" > < / a > < span class = "lineno" > 4199< / span >   .push_back(std::move(required_type_alternatives));< / div >
< div class = "line" > < a name = "l04200" > < / a > < span class = "lineno" > 4200< / span >   }< / div >
< div class = "line" > < a name = "l04201" > < / a > < span class = "lineno" > 4201< / span >   < / div >
< div class = "line" > < a name = "l04202" > < / a > < span class = "lineno" > 4202< / span >   < span class = "keyword" > const< / span > std::vector< absl::flat_hash_set< int> > & < / div >
< div class = "line" > < a name = "l04203" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7" > 4203< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7" > RoutingModel::GetSameVehicleRequiredTypeAlternativesOfType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04204" > < / a > < span class = "lineno" > 4204< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (type, 0);< / div >
< div class = "line" > < a name = "l04205" > < / a > < span class = "lineno" > 4205< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type,< / div >
< div class = "line" > < a name = "l04206" > < / a > < span class = "lineno" > 4206< / span >   same_vehicle_required_type_alternatives_per_type_index_.size());< / div >
< div class = "line" > < a name = "l04207" > < / a > < span class = "lineno" > 4207< / span >   < span class = "keywordflow" > return< / span > same_vehicle_required_type_alternatives_per_type_index_[type];< / div >
< div class = "line" > < a name = "l04208" > < / a > < span class = "lineno" > 4208< / span >   }< / div >
< div class = "line" > < a name = "l04209" > < / a > < span class = "lineno" > 4209< / span >   < / div >
< div class = "line" > < a name = "l04210" > < / a > < span class = "lineno" > 4210< / span >   < span class = "keyword" > const< / span > std::vector< absl::flat_hash_set< int> > & < / div >
< div class = "line" > < a name = "l04211" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82" > 4211< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82" > RoutingModel::GetRequiredTypeAlternativesWhenAddingType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04212" > < / a > < span class = "lineno" > 4212< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (type, 0);< / div >
< div class = "line" > < a name = "l04213" > < / a > < span class = "lineno" > 4213< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, required_type_alternatives_when_adding_type_index_.size());< / div >
< div class = "line" > < a name = "l04214" > < / a > < span class = "lineno" > 4214< / span >   < span class = "keywordflow" > return< / span > required_type_alternatives_when_adding_type_index_[type];< / div >
< div class = "line" > < a name = "l04215" > < / a > < span class = "lineno" > 4215< / span >   }< / div >
< div class = "line" > < a name = "l04216" > < / a > < span class = "lineno" > 4216< / span >   < / div >
< div class = "line" > < a name = "l04217" > < / a > < span class = "lineno" > 4217< / span >   < span class = "keyword" > const< / span > std::vector< absl::flat_hash_set< int> > & < / div >
< div class = "line" > < a name = "l04218" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd" > 4218< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd" > RoutingModel::GetRequiredTypeAlternativesWhenRemovingType< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04219" > < / a > < span class = "lineno" > 4219< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (type, 0);< / div >
< div class = "line" > < a name = "l04220" > < / a > < span class = "lineno" > 4220< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, required_type_alternatives_when_removing_type_index_.size());< / div >
< div class = "line" > < a name = "l04221" > < / a > < span class = "lineno" > 4221< / span >   < span class = "keywordflow" > return< / span > required_type_alternatives_when_removing_type_index_[type];< / div >
< div class = "line" > < a name = "l04222" > < / a > < span class = "lineno" > 4222< / span >   }< / div >
< div class = "line" > < a name = "l04223" > < / a > < span class = "lineno" > 4223< / span >   < / div >
< div class = "line" > < a name = "l04224" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a3600327c657a0c83430d7bd9566e9ab6" > 4224< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a3600327c657a0c83430d7bd9566e9ab6" > RoutingModel::UnperformedPenalty< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > var_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04225" > < / a > < span class = "lineno" > 4225< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > UnperformedPenaltyOrValue< / a > (0, var_index);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04226" > < / a > < span class = "lineno" > 4226< / span >   }< / div >
< div class = "line" > < a name = "l04227" > < / a > < span class = "lineno" > 4227< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04228" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > 4228< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > RoutingModel::UnperformedPenaltyOrValue< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > default_value,< / div >
< div class = "line" > < a name = "l04229" > < / a > < span class = "lineno" > 4229< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > var_index)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04230" > < / a > < span class = "lineno" > 4230< / span >   < span class = "keywordflow" > if< / span > (active_[var_index]-> Min() == 1) < span class = "keywordflow" > return< / span > < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ; < span class = "comment" > // Forced active.< / span > < / div >
< div class = "line" > < a name = "l04231" > < / a > < span class = "lineno" > 4231< / span >   < span class = "keyword" > const< / span > std::vector< DisjunctionIndex> & disjunction_indices =< / div >
< div class = "line" > < a name = "l04232" > < / a > < span class = "lineno" > 4232< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a89b2c610c22a3223f1cac10233d7992d" > GetDisjunctionIndices< / a > (var_index);< / div >
< div class = "line" > < a name = "l04233" > < / a > < span class = "lineno" > 4233< / span >   < span class = "keywordflow" > if< / span > (disjunction_indices.size() != 1) < span class = "keywordflow" > return< / span > default_value;< / div >
< div class = "line" > < a name = "l04234" > < / a > < span class = "lineno" > 4234< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > DisjunctionIndex< / a > disjunction_index = disjunction_indices[0];< / div >
< div class = "line" > < a name = "l04235" > < / a > < span class = "lineno" > 4235< / span >   < span class = "comment" > // The disjunction penalty can be kNoPenalty iff there is more than one node< / span > < / div >
< div class = "line" > < a name = "l04236" > < / a > < span class = "lineno" > 4236< / span >   < span class = "comment" > // in the disjunction; otherwise we would have caught it earlier (the node< / span > < / div >
< div class = "line" > < a name = "l04237" > < / a > < span class = "lineno" > 4237< / span >   < span class = "comment" > // would be forced active).< / span > < / div >
< div class = "line" > < a name = "l04238" > < / a > < span class = "lineno" > 4238< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > {0}, disjunctions_[disjunction_index].value.penalty);< / div >
< div class = "line" > < a name = "l04239" > < / a > < span class = "lineno" > 4239< / span >   }< / div >
< div class = "line" > < a name = "l04240" > < / a > < span class = "lineno" > 4240< / span >   < / div >
< div class = "line" > < a name = "l04241" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018" > 4241< / a > < / span >   std::string < a class = "code" href = "classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018" > RoutingModel::DebugOutputAssignment< / a > (< / div >
< div class = "line" > < a name = "l04242" > < / a > < span class = "lineno" > 4242< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & solution_assignment,< / div >
< div class = "line" > < a name = "l04243" > < / a > < span class = "lineno" > 4243< / span >   < span class = "keyword" > const< / span > std::string& dimension_to_print)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04244" > < / a > < span class = "lineno" > 4244< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l04245" > < / a > < span class = "lineno" > 4245< / span >   < span class = "keywordflow" > if< / span > (!solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i))) {< / div >
< div class = "line" > < a name = "l04246" > < / a > < span class = "lineno" > 4246< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (DFATAL)< / div >
< div class = "line" > < a name = "l04247" > < / a > < span class = "lineno" > 4247< / span >   < < < span class = "stringliteral" > " DebugOutputVehicleSchedules() called on incomplete solution:" < / span > < / div >
< div class = "line" > < a name = "l04248" > < / a > < span class = "lineno" > 4248< / span >   < < < span class = "stringliteral" > " NextVar(" < / span > < < i < < < span class = "stringliteral" > " ) is unbound." < / span > ;< / div >
< div class = "line" > < a name = "l04249" > < / a > < span class = "lineno" > 4249< / span >   < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " " < / span > ;< / div >
< div class = "line" > < a name = "l04250" > < / a > < span class = "lineno" > 4250< / span >   }< / div >
< div class = "line" > < a name = "l04251" > < / a > < span class = "lineno" > 4251< / span >   }< / div >
< div class = "line" > < a name = "l04252" > < / a > < span class = "lineno" > 4252< / span >   std::string output;< / div >
< div class = "line" > < a name = "l04253" > < / a > < span class = "lineno" > 4253< / span >   absl::flat_hash_set< std::string> dimension_names;< / div >
< div class = "line" > < a name = "l04254" > < / a > < span class = "lineno" > 4254< / span >   < span class = "keywordflow" > if< / span > (dimension_to_print.empty()) {< / div >
< div class = "line" > < a name = "l04255" > < / a > < span class = "lineno" > 4255< / span >   < span class = "keyword" > const< / span > std::vector< std::string> all_dimension_names = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c" > GetAllDimensionNames< / a > ();< / div >
< div class = "line" > < a name = "l04256" > < / a > < span class = "lineno" > 4256< / span >   dimension_names.insert(all_dimension_names.begin(),< / div >
< div class = "line" > < a name = "l04257" > < / a > < span class = "lineno" > 4257< / span >   all_dimension_names.end());< / div >
< div class = "line" > < a name = "l04258" > < / a > < span class = "lineno" > 4258< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l04259" > < / a > < span class = "lineno" > 4259< / span >   dimension_names.insert(dimension_to_print);< / div >
< div class = "line" > < a name = "l04260" > < / a > < span class = "lineno" > 4260< / span >   }< / div >
< div class = "line" > < a name = "l04261" > < / a > < span class = "lineno" > 4261< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l04262" > < / a > < span class = "lineno" > 4262< / span >   < span class = "keywordtype" > int< / span > empty_vehicle_range_start = vehicle;< / div >
< div class = "line" > < a name = "l04263" > < / a > < span class = "lineno" > 4263< / span >   < span class = "keywordflow" > while< / span > (vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () & & < / div >
< div class = "line" > < a name = "l04264" > < / a > < span class = "lineno" > 4264< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle))))) {< / div >
< div class = "line" > < a name = "l04265" > < / a > < span class = "lineno" > 4265< / span >   vehicle++;< / div >
< div class = "line" > < a name = "l04266" > < / a > < span class = "lineno" > 4266< / span >   }< / div >
< div class = "line" > < a name = "l04267" > < / a > < span class = "lineno" > 4267< / span >   < span class = "keywordflow" > if< / span > (empty_vehicle_range_start != vehicle) {< / div >
< div class = "line" > < a name = "l04268" > < / a > < span class = "lineno" > 4268< / span >   < span class = "keywordflow" > if< / span > (empty_vehicle_range_start == vehicle - 1) {< / div >
< div class = "line" > < a name = "l04269" > < / a > < span class = "lineno" > 4269< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " Vehicle %d: empty" < / span > ,< / div >
< div class = "line" > < a name = "l04270" > < / a > < span class = "lineno" > 4270< / span >   empty_vehicle_range_start);< / div >
< div class = "line" > < a name = "l04271" > < / a > < span class = "lineno" > 4271< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l04272" > < / a > < span class = "lineno" > 4272< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " Vehicles %d-%d: empty" < / span > ,< / div >
< div class = "line" > < a name = "l04273" > < / a > < span class = "lineno" > 4273< / span >   empty_vehicle_range_start, vehicle - 1);< / div >
< div class = "line" > < a name = "l04274" > < / a > < span class = "lineno" > 4274< / span >   }< / div >
< div class = "line" > < a name = "l04275" > < / a > < span class = "lineno" > 4275< / span >   output.append(< span class = "stringliteral" > " \n" < / span > );< / div >
< div class = "line" > < a name = "l04276" > < / a > < span class = "lineno" > 4276< / span >   }< / div >
< div class = "line" > < a name = "l04277" > < / a > < span class = "lineno" > 4277< / span >   < span class = "keywordflow" > if< / span > (vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l04278" > < / a > < span class = "lineno" > 4278< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " Vehicle %d:" < / span > , vehicle);< / div >
< div class = "line" > < a name = "l04279" > < / a > < span class = "lineno" > 4279< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle);< / div >
< div class = "line" > < a name = "l04280" > < / a > < span class = "lineno" > 4280< / span >   < span class = "keywordflow" > for< / span > (;;) {< / div >
< div class = "line" > < a name = "l04281" > < / a > < span class = "lineno" > 4281< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * vehicle_var = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l04282" > < / a > < span class = "lineno" > 4282< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " %d Vehicle(%d) " < / span > , < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ,< / div >
< div class = "line" > < a name = "l04283" > < / a > < span class = "lineno" > 4283< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (vehicle_var));< / div >
< div class = "line" > < a name = "l04284" > < / a > < span class = "lineno" > 4284< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l04285" > < / a > < span class = "lineno" > 4285< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > (dimension_names, dimension-> name())) {< / div >
< div class = "line" > < a name = "l04286" > < / a > < span class = "lineno" > 4286< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > = dimension-> CumulVar(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l04287" > < / a > < span class = "lineno" > 4287< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " %s(%d..%d) " < / span > , dimension-> name(),< / div >
< div class = "line" > < a name = "l04288" > < / a > < span class = "lineno" > 4288< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a6099fe146d0d68c48a02ab793f2c2e54" > Min< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ),< / div >
< div class = "line" > < a name = "l04289" > < / a > < span class = "lineno" > 4289< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a91d07f8a9a47e81538a524eecf210a82" > Max< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ));< / div >
< div class = "line" > < a name = "l04290" > < / a > < span class = "lineno" > 4290< / span >   }< / div >
< div class = "line" > < a name = "l04291" > < / a > < span class = "lineno" > 4291< / span >   }< / div >
< div class = "line" > < a name = "l04292" > < / a > < span class = "lineno" > 4292< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l04293" > < / a > < span class = "lineno" > 4293< / span >   < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ));< / div >
< div class = "line" > < a name = "l04294" > < / a > < span class = "lineno" > 4294< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) output.append(< span class = "stringliteral" > " Route end " < / span > );< / div >
< div class = "line" > < a name = "l04295" > < / a > < span class = "lineno" > 4295< / span >   }< / div >
< div class = "line" > < a name = "l04296" > < / a > < span class = "lineno" > 4296< / span >   output.append(< span class = "stringliteral" > " \n" < / span > );< / div >
< div class = "line" > < a name = "l04297" > < / a > < span class = "lineno" > 4297< / span >   }< / div >
< div class = "line" > < a name = "l04298" > < / a > < span class = "lineno" > 4298< / span >   }< / div >
< div class = "line" > < a name = "l04299" > < / a > < span class = "lineno" > 4299< / span >   output.append(< span class = "stringliteral" > " Unperformed nodes: " < / span > );< / div >
< div class = "line" > < a name = "l04300" > < / a > < span class = "lineno" > 4300< / span >   < span class = "keywordtype" > bool< / span > has_unperformed = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04301" > < / a > < span class = "lineno" > 4301< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l04302" > < / a > < span class = "lineno" > 4302< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (i) & & !< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > IsStart< / a > (i) & & < / div >
< div class = "line" > < a name = "l04303" > < / a > < span class = "lineno" > 4303< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i)) == i) {< / div >
< div class = "line" > < a name = "l04304" > < / a > < span class = "lineno" > 4304< / span >   absl::StrAppendFormat(& output, < span class = "stringliteral" > " %d " < / span > , i);< / div >
< div class = "line" > < a name = "l04305" > < / a > < span class = "lineno" > 4305< / span >   has_unperformed = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04306" > < / a > < span class = "lineno" > 4306< / span >   }< / div >
< div class = "line" > < a name = "l04307" > < / a > < span class = "lineno" > 4307< / span >   }< / div >
< div class = "line" > < a name = "l04308" > < / a > < span class = "lineno" > 4308< / span >   < span class = "keywordflow" > if< / span > (!has_unperformed) output.append(< span class = "stringliteral" > " None" < / span > );< / div >
< div class = "line" > < a name = "l04309" > < / a > < span class = "lineno" > 4309< / span >   output.append(< span class = "stringliteral" > " \n" < / span > );< / div >
< div class = "line" > < a name = "l04310" > < / a > < span class = "lineno" > 4310< / span >   < span class = "keywordflow" > return< / span > output;< / div >
< div class = "line" > < a name = "l04311" > < / a > < span class = "lineno" > 4311< / span >   }< / div >
< div class = "line" > < a name = "l04312" > < / a > < span class = "lineno" > 4312< / span >   < / div >
< div class = "line" > < a name = "l04313" > < / a > < span class = "lineno" > 4313< / span >   < span class = "preprocessor" > #ifndef SWIG< / span > < / div >
< div class = "line" > < a name = "l04314" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aa1bbc9c58d70daeb04078ea9c9b5dca9" > 4314< / a > < / span >   std::vector< std::vector< std::pair< int64, int64> > > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa1bbc9c58d70daeb04078ea9c9b5dca9" > RoutingModel::GetCumulBounds< / a > (< / div >
< div class = "line" > < a name = "l04315" > < / a > < span class = "lineno" > 4315< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > & solution_assignment, < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > & dimension) {< / div >
< div class = "line" > < a name = "l04316" > < / a > < span class = "lineno" > 4316< / span >   std::vector< std::vector< std::pair< int64, int64> > > cumul_bounds(< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ());< / div >
< div class = "line" > < a name = "l04317" > < / a > < span class = "lineno" > 4317< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l04318" > < / a > < span class = "lineno" > 4318< / span >   < span class = "keywordflow" > if< / span > (!solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > Bound< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (vehicle))) {< / div >
< div class = "line" > < a name = "l04319" > < / a > < span class = "lineno" > 4319< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (DFATAL) < < < span class = "stringliteral" > " GetCumulBounds() called on incomplete solution:" < / span > < / div >
< div class = "line" > < a name = "l04320" > < / a > < span class = "lineno" > 4320< / span >   < < < span class = "stringliteral" > " NextVar(" < / span > < < vehicle < < < span class = "stringliteral" > " ) is unbound." < / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04321" > < / a > < span class = "lineno" > 4321< / span >   }< / div >
< div class = "line" > < a name = "l04322" > < / a > < span class = "lineno" > 4322< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04323" > < / a > < span class = "lineno" > 4323< / span >   < / div >
< div class = "line" > < a name = "l04324" > < / a > < span class = "lineno" > 4324< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle_id = 0; vehicle_id < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle_id) {< / div >
< div class = "line" > < a name = "l04325" > < / a > < span class = "lineno" > 4325< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle_id);< / div >
< div class = "line" > < a name = "l04326" > < / a > < span class = "lineno" > 4326< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * dim_var = dimension.< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l04327" > < / a > < span class = "lineno" > 4327< / span >   cumul_bounds[vehicle_id].emplace_back(solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a6099fe146d0d68c48a02ab793f2c2e54" > Min< / a > (dim_var),< / div >
< div class = "line" > < a name = "l04328" > < / a > < span class = "lineno" > 4328< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a91d07f8a9a47e81538a524eecf210a82" > Max< / a > (dim_var));< / div >
< div class = "line" > < a name = "l04329" > < / a > < span class = "lineno" > 4329< / span >   < span class = "keywordflow" > while< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l04330" > < / a > < span class = "lineno" > 4330< / span >   < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > Value< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ));< / div >
< div class = "line" > < a name = "l04331" > < / a > < span class = "lineno" > 4331< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * dim_var = dimension.< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l04332" > < / a > < span class = "lineno" > 4332< / span >   cumul_bounds[vehicle_id].emplace_back(solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a6099fe146d0d68c48a02ab793f2c2e54" > Min< / a > (dim_var),< / div >
< div class = "line" > < a name = "l04333" > < / a > < span class = "lineno" > 4333< / span >   solution_assignment.< a class = "code" href = "classoperations__research_1_1_assignment.html#a91d07f8a9a47e81538a524eecf210a82" > Max< / a > (dim_var));< / div >
< div class = "line" > < a name = "l04334" > < / a > < span class = "lineno" > 4334< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04335" > < / a > < span class = "lineno" > 4335< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04336" > < / a > < span class = "lineno" > 4336< / span >   < span class = "keywordflow" > return< / span > cumul_bounds;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l04337" > < / a > < span class = "lineno" > 4337< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04338" > < / a > < span class = "lineno" > 4338< / span >   < span class = "preprocessor" > #endif< / span > < / div >
< div class = "line" > < a name = "l04339" > < / a > < span class = "lineno" > 4339< / span >   < / div >
< div class = "line" > < a name = "l04340" > < / a > < span class = "lineno" > 4340< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * RoutingModel::GetOrCreateAssignment() {< / div >
< div class = "line" > < a name = "l04341" > < / a > < span class = "lineno" > 4341< / span >   < span class = "keywordflow" > if< / span > (assignment_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04342" > < / a > < span class = "lineno" > 4342< / span >   assignment_ = solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l04343" > < / a > < span class = "lineno" > 4343< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (nexts_);< / div >
< div class = "line" > < a name = "l04344" > < / a > < span class = "lineno" > 4344< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l04345" > < / a > < span class = "lineno" > 4345< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (vehicle_vars_);< / div >
< div class = "line" > < a name = "l04346" > < / a > < span class = "lineno" > 4346< / span >   }< / div >
< div class = "line" > < a name = "l04347" > < / a > < span class = "lineno" > 4347< / span >   assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff" > AddObjective< / a > (cost_);< / div >
< div class = "line" > < a name = "l04348" > < / a > < span class = "lineno" > 4348< / span >   }< / div >
< div class = "line" > < a name = "l04349" > < / a > < span class = "lineno" > 4349< / span >   < span class = "keywordflow" > return< / span > assignment_;< / div >
< div class = "line" > < a name = "l04350" > < / a > < span class = "lineno" > 4350< / span >   }< / div >
< div class = "line" > < a name = "l04351" > < / a > < span class = "lineno" > 4351< / span >   < / div >
< div class = "line" > < a name = "l04352" > < / a > < span class = "lineno" > 4352< / span >   Assignment* RoutingModel::GetOrCreateTmpAssignment() {< / div >
< div class = "line" > < a name = "l04353" > < / a > < span class = "lineno" > 4353< / span >   < span class = "keywordflow" > if< / span > (tmp_assignment_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04354" > < / a > < span class = "lineno" > 4354< / span >   tmp_assignment_ = solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l04355" > < / a > < span class = "lineno" > 4355< / span >   tmp_assignment_-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (nexts_);< / div >
< div class = "line" > < a name = "l04356" > < / a > < span class = "lineno" > 4356< / span >   }< / div >
< div class = "line" > < a name = "l04357" > < / a > < span class = "lineno" > 4357< / span >   < span class = "keywordflow" > return< / span > tmp_assignment_;< / div >
< div class = "line" > < a name = "l04358" > < / a > < span class = "lineno" > 4358< / span >   }< / div >
< div class = "line" > < a name = "l04359" > < / a > < span class = "lineno" > 4359< / span >   < / div >
< div class = "line" > < a name = "l04360" > < / a > < span class = "lineno" > 4360< / span >   RegularLimit* RoutingModel::GetOrCreateLimit() {< / div >
< div class = "line" > < a name = "l04361" > < / a > < span class = "lineno" > 4361< / span >   < span class = "keywordflow" > if< / span > (limit_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04362" > < / a > < span class = "lineno" > 4362< / span >   limit_ = solver_-> MakeLimit(absl::InfiniteDuration(), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l04363" > < / a > < span class = "lineno" > 4363< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < span class = "comment" > /*smart_time_check=*/< / span > < span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l04364" > < / a > < span class = "lineno" > 4364< / span >   }< / div >
< div class = "line" > < a name = "l04365" > < / a > < span class = "lineno" > 4365< / span >   < span class = "keywordflow" > return< / span > limit_;< / div >
< div class = "line" > < a name = "l04366" > < / a > < span class = "lineno" > 4366< / span >   }< / div >
< div class = "line" > < a name = "l04367" > < / a > < span class = "lineno" > 4367< / span >   < / div >
< div class = "line" > < a name = "l04368" > < / a > < span class = "lineno" > 4368< / span >   RegularLimit* RoutingModel::GetOrCreateLocalSearchLimit() {< / div >
< div class = "line" > < a name = "l04369" > < / a > < span class = "lineno" > 4369< / span >   < span class = "keywordflow" > if< / span > (ls_limit_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04370" > < / a > < span class = "lineno" > 4370< / span >   ls_limit_ =< / div >
< div class = "line" > < a name = "l04371" > < / a > < span class = "lineno" > 4371< / span >   solver_-> MakeLimit(absl::InfiniteDuration(), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l04372" > < / a > < span class = "lineno" > 4372< / span >   < span class = "comment" > /*solutions=*/< / span > 1, < span class = "comment" > /*smart_time_check=*/< / span > < span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l04373" > < / a > < span class = "lineno" > 4373< / span >   }< / div >
< div class = "line" > < a name = "l04374" > < / a > < span class = "lineno" > 4374< / span >   < span class = "keywordflow" > return< / span > ls_limit_;< / div >
< div class = "line" > < a name = "l04375" > < / a > < span class = "lineno" > 4375< / span >   }< / div >
< div class = "line" > < a name = "l04376" > < / a > < span class = "lineno" > 4376< / span >   < / div >
< div class = "line" > < a name = "l04377" > < / a > < span class = "lineno" > 4377< / span >   RegularLimit* RoutingModel::GetOrCreateLargeNeighborhoodSearchLimit() {< / div >
< div class = "line" > < a name = "l04378" > < / a > < span class = "lineno" > 4378< / span >   < span class = "keywordflow" > if< / span > (lns_limit_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04379" > < / a > < span class = "lineno" > 4379< / span >   lns_limit_ =< / div >
< div class = "line" > < a name = "l04380" > < / a > < span class = "lineno" > 4380< / span >   solver_-> MakeLimit(absl::InfiniteDuration(), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l04381" > < / a > < span class = "lineno" > 4381< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < span class = "comment" > /*smart_time_check=*/< / span > < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l04382" > < / a > < span class = "lineno" > 4382< / span >   }< / div >
< div class = "line" > < a name = "l04383" > < / a > < span class = "lineno" > 4383< / span >   < span class = "keywordflow" > return< / span > lns_limit_;< / div >
< div class = "line" > < a name = "l04384" > < / a > < span class = "lineno" > 4384< / span >   }< / div >
< div class = "line" > < a name = "l04385" > < / a > < span class = "lineno" > 4385< / span >   < / div >
< div class = "line" > < a name = "l04386" > < / a > < span class = "lineno" > 4386< / span >   RegularLimit*< / div >
< div class = "line" > < a name = "l04387" > < / a > < span class = "lineno" > 4387< / span >   RoutingModel::GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit() {< / div >
< div class = "line" > < a name = "l04388" > < / a > < span class = "lineno" > 4388< / span >   < span class = "keywordflow" > if< / span > (first_solution_lns_limit_ == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l04389" > < / a > < span class = "lineno" > 4389< / span >   first_solution_lns_limit_ =< / div >
< div class = "line" > < a name = "l04390" > < / a > < span class = "lineno" > 4390< / span >   solver_-> MakeLimit(absl::InfiniteDuration(), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l04391" > < / a > < span class = "lineno" > 4391< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < span class = "comment" > /*smart_time_check=*/< / span > < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l04392" > < / a > < span class = "lineno" > 4392< / span >   }< / div >
< div class = "line" > < a name = "l04393" > < / a > < span class = "lineno" > 4393< / span >   < span class = "keywordflow" > return< / span > first_solution_lns_limit_;< / div >
< div class = "line" > < a name = "l04394" > < / a > < span class = "lineno" > 4394< / span >   }< / div >
< div class = "line" > < a name = "l04395" > < / a > < span class = "lineno" > 4395< / span >   < / div >
< div class = "line" > < a name = "l04396" > < / a > < span class = "lineno" > 4396< / span >   LocalSearchOperator* RoutingModel::CreateInsertionOperator() {< / div >
< div class = "line" > < a name = "l04397" > < / a > < span class = "lineno" > 4397< / span >   LocalSearchOperator* insertion_operator =< / div >
< div class = "line" > < a name = "l04398" > < / a > < span class = "lineno" > 4398< / span >   CreateCPOperator< MakeActiveOperator> ();< / div >
< div class = "line" > < a name = "l04399" > < / a > < span class = "lineno" > 4399< / span >   < span class = "keywordflow" > if< / span > (!pickup_delivery_pairs_.empty()) {< / div >
< div class = "line" > < a name = "l04400" > < / a > < span class = "lineno" > 4400< / span >   insertion_operator = solver_-> ConcatenateOperators(< / div >
< div class = "line" > < a name = "l04401" > < / a > < span class = "lineno" > 4401< / span >   {CreatePairOperator< MakePairActiveOperator> (), insertion_operator});< / div >
< div class = "line" > < a name = "l04402" > < / a > < span class = "lineno" > 4402< / span >   }< / div >
< div class = "line" > < a name = "l04403" > < / a > < span class = "lineno" > 4403< / span >   < span class = "keywordflow" > if< / span > (!implicit_pickup_delivery_pairs_without_alternatives_.empty()) {< / div >
< div class = "line" > < a name = "l04404" > < / a > < span class = "lineno" > 4404< / span >   insertion_operator = solver_-> ConcatenateOperators(< / div >
< div class = "line" > < a name = "l04405" > < / a > < span class = "lineno" > 4405< / span >   {CreateOperator< MakePairActiveOperator> (< / div >
< div class = "line" > < a name = "l04406" > < / a > < span class = "lineno" > 4406< / span >   implicit_pickup_delivery_pairs_without_alternatives_),< / div >
< div class = "line" > < a name = "l04407" > < / a > < span class = "lineno" > 4407< / span >   insertion_operator});< / div >
< div class = "line" > < a name = "l04408" > < / a > < span class = "lineno" > 4408< / span >   }< / div >
< div class = "line" > < a name = "l04409" > < / a > < span class = "lineno" > 4409< / span >   < span class = "keywordflow" > return< / span > insertion_operator;< / div >
< div class = "line" > < a name = "l04410" > < / a > < span class = "lineno" > 4410< / span >   }< / div >
< div class = "line" > < a name = "l04411" > < / a > < span class = "lineno" > 4411< / span >   < / div >
< div class = "line" > < a name = "l04412" > < / a > < span class = "lineno" > 4412< / span >   LocalSearchOperator* RoutingModel::CreateMakeInactiveOperator() {< / div >
< div class = "line" > < a name = "l04413" > < / a > < span class = "lineno" > 4413< / span >   LocalSearchOperator* make_inactive_operator =< / div >
< div class = "line" > < a name = "l04414" > < / a > < span class = "lineno" > 4414< / span >   CreateCPOperator< MakeInactiveOperator> ();< / div >
< div class = "line" > < a name = "l04415" > < / a > < span class = "lineno" > 4415< / span >   < span class = "keywordflow" > if< / span > (!pickup_delivery_pairs_.empty()) {< / div >
< div class = "line" > < a name = "l04416" > < / a > < span class = "lineno" > 4416< / span >   make_inactive_operator = solver_-> ConcatenateOperators(< / div >
< div class = "line" > < a name = "l04417" > < / a > < span class = "lineno" > 4417< / span >   {CreatePairOperator< MakePairInactiveOperator> (),< / div >
< div class = "line" > < a name = "l04418" > < / a > < span class = "lineno" > 4418< / span >   make_inactive_operator});< / div >
< div class = "line" > < a name = "l04419" > < / a > < span class = "lineno" > 4419< / span >   }< / div >
< div class = "line" > < a name = "l04420" > < / a > < span class = "lineno" > 4420< / span >   < span class = "keywordflow" > return< / span > make_inactive_operator;< / div >
< div class = "line" > < a name = "l04421" > < / a > < span class = "lineno" > 4421< / span >   }< / div >
< div class = "line" > < a name = "l04422" > < / a > < span class = "lineno" > 4422< / span >   < / div >
< div class = "line" > < a name = "l04423" > < / a > < span class = "lineno" > 4423< / span >   < span class = "keywordtype" > void< / span > RoutingModel::CreateNeighborhoodOperators(< / div >
< div class = "line" > < a name = "l04424" > < / a > < span class = "lineno" > 4424< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04425" > < / a > < span class = "lineno" > 4425< / span >   local_search_operators_.clear();< / div >
< div class = "line" > < a name = "l04426" > < / a > < span class = "lineno" > 4426< / span >   local_search_operators_.resize(LOCAL_SEARCH_OPERATOR_COUNTER, < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l04427" > < / a > < span class = "lineno" > 4427< / span >   {< / div >
< div class = "line" > < a name = "l04428" > < / a > < span class = "lineno" > 4428< / span >   < span class = "comment" > // Operators defined by Solver::LocalSearchOperators.< / span > < / div >
< div class = "line" > < a name = "l04429" > < / a > < span class = "lineno" > 4429< / span >   < span class = "keyword" > const< / span > std::vector< < / div >
< div class = "line" > < a name = "l04430" > < / a > < span class = "lineno" > 4430< / span >   std::pair< RoutingLocalSearchOperator, Solver::LocalSearchOperators> > < / div >
< div class = "line" > < a name = "l04431" > < / a > < span class = "lineno" > 4431< / span >   operator_by_type = {{OR_OPT, < a class = "code" href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704" > Solver::OROPT< / a > },< / div >
< div class = "line" > < a name = "l04432" > < / a > < span class = "lineno" > 4432< / span >   {PATH_LNS, < a class = "code" href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3" > Solver::PATHLNS< / a > },< / div >
< div class = "line" > < a name = "l04433" > < / a > < span class = "lineno" > 4433< / span >   {FULL_PATH_LNS, < a class = "code" href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a" > Solver::FULLPATHLNS< / a > },< / div >
< div class = "line" > < a name = "l04434" > < / a > < span class = "lineno" > 4434< / span >   {INACTIVE_LNS, < a class = "code" href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408" > Solver::UNACTIVELNS< / a > }};< / div >
< div class = "line" > < a name = "l04435" > < / a > < span class = "lineno" > 4435< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > [type, op] : operator_by_type) {< / div >
< div class = "line" > < a name = "l04436" > < / a > < span class = "lineno" > 4436< / span >   local_search_operators_[type] =< / div >
< div class = "line" > < a name = "l04437" > < / a > < span class = "lineno" > 4437< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()< / div >
< div class = "line" > < a name = "l04438" > < / a > < span class = "lineno" > 4438< / span >   ? solver_-> MakeOperator(nexts_, op)< / div >
< div class = "line" > < a name = "l04439" > < / a > < span class = "lineno" > 4439< / span >   : solver_-> MakeOperator(nexts_, vehicle_vars_, op);< / div >
< div class = "line" > < a name = "l04440" > < / a > < span class = "lineno" > 4440< / span >   }< / div >
< div class = "line" > < a name = "l04441" > < / a > < span class = "lineno" > 4441< / span >   }< / div >
< div class = "line" > < a name = "l04442" > < / a > < span class = "lineno" > 4442< / span >   {< / div >
< div class = "line" > < a name = "l04443" > < / a > < span class = "lineno" > 4443< / span >   < span class = "comment" > // Operators defined by Solver::EvaluatorLocalSearchOperators.< / span > < / div >
< div class = "line" > < a name = "l04444" > < / a > < span class = "lineno" > 4444< / span >   < span class = "keyword" > const< / span > std::vector< std::pair< RoutingLocalSearchOperator,< / div >
< div class = "line" > < a name = "l04445" > < / a > < span class = "lineno" > 4445< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4" > Solver::EvaluatorLocalSearchOperators< / a > > > < / div >
< div class = "line" > < a name = "l04446" > < / a > < span class = "lineno" > 4446< / span >   operator_by_type = {{LIN_KERNIGHAN, < a class = "code" href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e" > Solver::LK< / a > },< / div >
< div class = "line" > < a name = "l04447" > < / a > < span class = "lineno" > 4447< / span >   {TSP_OPT, < a class = "code" href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87" > Solver::TSPOPT< / a > },< / div >
< div class = "line" > < a name = "l04448" > < / a > < span class = "lineno" > 4448< / span >   {TSP_LNS, < a class = "code" href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1" > Solver::TSPLNS< / a > }};< / div >
< div class = "line" > < a name = "l04449" > < / a > < span class = "lineno" > 4449< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > [type, op] : operator_by_type) {< / div >
< div class = "line" > < a name = "l04450" > < / a > < span class = "lineno" > 4450< / span >   < span class = "keyword" > auto< / span > arc_cost =< / div >
< div class = "line" > < a name = "l04451" > < / a > < span class = "lineno" > 4451< / span >   absl::bind_front(& < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > RoutingModel::GetArcCostForVehicle< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l04452" > < / a > < span class = "lineno" > 4452< / span >   local_search_operators_[type] =< / div >
< div class = "line" > < a name = "l04453" > < / a > < span class = "lineno" > 4453< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()< / div >
< div class = "line" > < a name = "l04454" > < / a > < span class = "lineno" > 4454< / span >   ? solver_-> MakeOperator(nexts_, std::move(arc_cost), op)< / div >
< div class = "line" > < a name = "l04455" > < / a > < span class = "lineno" > 4455< / span >   : solver_-> MakeOperator(nexts_, vehicle_vars_,< / div >
< div class = "line" > < a name = "l04456" > < / a > < span class = "lineno" > 4456< / span >   std::move(arc_cost), op);< / div >
< div class = "line" > < a name = "l04457" > < / a > < span class = "lineno" > 4457< / span >   }< / div >
< div class = "line" > < a name = "l04458" > < / a > < span class = "lineno" > 4458< / span >   }< / div >
< div class = "line" > < a name = "l04459" > < / a > < span class = "lineno" > 4459< / span >   < / div >
< div class = "line" > < a name = "l04460" > < / a > < span class = "lineno" > 4460< / span >   < span class = "comment" > // Other operators defined in the CP solver.< / span > < / div >
< div class = "line" > < a name = "l04461" > < / a > < span class = "lineno" > 4461< / span >   local_search_operators_[RELOCATE] = CreateCPOperator< Relocate> ();< / div >
< div class = "line" > < a name = "l04462" > < / a > < span class = "lineno" > 4462< / span >   local_search_operators_[EXCHANGE] = CreateCPOperator< Exchange> ();< / div >
< div class = "line" > < a name = "l04463" > < / a > < span class = "lineno" > 4463< / span >   local_search_operators_[CROSS] = CreateCPOperator< Cross> ();< / div >
< div class = "line" > < a name = "l04464" > < / a > < span class = "lineno" > 4464< / span >   local_search_operators_[TWO_OPT] = CreateCPOperator< TwoOpt> ();< / div >
< div class = "line" > < a name = "l04465" > < / a > < span class = "lineno" > 4465< / span >   local_search_operators_[RELOCATE_AND_MAKE_ACTIVE] =< / div >
< div class = "line" > < a name = "l04466" > < / a > < span class = "lineno" > 4466< / span >   CreateCPOperator< RelocateAndMakeActiveOperator> ();< / div >
< div class = "line" > < a name = "l04467" > < / a > < span class = "lineno" > 4467< / span >   local_search_operators_[MAKE_ACTIVE_AND_RELOCATE] =< / div >
< div class = "line" > < a name = "l04468" > < / a > < span class = "lineno" > 4468< / span >   CreateCPOperator< MakeActiveAndRelocate> ();< / div >
< div class = "line" > < a name = "l04469" > < / a > < span class = "lineno" > 4469< / span >   local_search_operators_[MAKE_CHAIN_INACTIVE] =< / div >
< div class = "line" > < a name = "l04470" > < / a > < span class = "lineno" > 4470< / span >   CreateCPOperator< MakeChainInactiveOperator> ();< / div >
< div class = "line" > < a name = "l04471" > < / a > < span class = "lineno" > 4471< / span >   local_search_operators_[SWAP_ACTIVE] = CreateCPOperator< SwapActiveOperator> ();< / div >
< div class = "line" > < a name = "l04472" > < / a > < span class = "lineno" > 4472< / span >   local_search_operators_[EXTENDED_SWAP_ACTIVE] =< / div >
< div class = "line" > < a name = "l04473" > < / a > < span class = "lineno" > 4473< / span >   CreateCPOperator< ExtendedSwapActiveOperator> ();< / div >
< div class = "line" > < a name = "l04474" > < / a > < span class = "lineno" > 4474< / span >   < / div >
< div class = "line" > < a name = "l04475" > < / a > < span class = "lineno" > 4475< / span >   < span class = "comment" > // Routing-specific operators.< / span > < / div >
< div class = "line" > < a name = "l04476" > < / a > < span class = "lineno" > 4476< / span >   local_search_operators_[MAKE_ACTIVE] = CreateInsertionOperator();< / div >
< div class = "line" > < a name = "l04477" > < / a > < span class = "lineno" > 4477< / span >   local_search_operators_[MAKE_INACTIVE] = CreateMakeInactiveOperator();< / div >
< div class = "line" > < a name = "l04478" > < / a > < span class = "lineno" > 4478< / span >   local_search_operators_[RELOCATE_PAIR] =< / div >
< div class = "line" > < a name = "l04479" > < / a > < span class = "lineno" > 4479< / span >   CreatePairOperator< PairRelocateOperator> ();< / div >
< div class = "line" > < a name = "l04480" > < / a > < span class = "lineno" > 4480< / span >   std::vector< LocalSearchOperator*> light_relocate_pair_operators;< / div >
< div class = "line" > < a name = "l04481" > < / a > < span class = "lineno" > 4481< / span >   light_relocate_pair_operators.push_back(< / div >
< div class = "line" > < a name = "l04482" > < / a > < span class = "lineno" > 4482< / span >   CreatePairOperator< LightPairRelocateOperator> ());< / div >
< div class = "line" > < a name = "l04483" > < / a > < span class = "lineno" > 4483< / span >   local_search_operators_[LIGHT_RELOCATE_PAIR] =< / div >
< div class = "line" > < a name = "l04484" > < / a > < span class = "lineno" > 4484< / span >   solver_-> ConcatenateOperators(light_relocate_pair_operators);< / div >
< div class = "line" > < a name = "l04485" > < / a > < span class = "lineno" > 4485< / span >   local_search_operators_[EXCHANGE_PAIR] =< / div >
< div class = "line" > < a name = "l04486" > < / a > < span class = "lineno" > 4486< / span >   CreatePairOperator< PairExchangeOperator> ();< / div >
< div class = "line" > < a name = "l04487" > < / a > < span class = "lineno" > 4487< / span >   local_search_operators_[EXCHANGE_RELOCATE_PAIR] =< / div >
< div class = "line" > < a name = "l04488" > < / a > < span class = "lineno" > 4488< / span >   CreatePairOperator< PairExchangeRelocateOperator> ();< / div >
< div class = "line" > < a name = "l04489" > < / a > < span class = "lineno" > 4489< / span >   local_search_operators_[RELOCATE_NEIGHBORS] =< / div >
< div class = "line" > < a name = "l04490" > < / a > < span class = "lineno" > 4490< / span >   CreateOperator< MakeRelocateNeighborsOperator> (< / div >
< div class = "line" > < a name = "l04491" > < / a > < span class = "lineno" > 4491< / span >   absl::bind_front(& < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > RoutingModel::GetHomogeneousCost< / a > , < span class = "keyword" > this< / span > ));< / div >
< div class = "line" > < a name = "l04492" > < / a > < span class = "lineno" > 4492< / span >   local_search_operators_[NODE_PAIR_SWAP] = solver_-> ConcatenateOperators(< / div >
< div class = "line" > < a name = "l04493" > < / a > < span class = "lineno" > 4493< / span >   {CreatePairOperator< IndexPairSwapActiveOperator> (),< / div >
< div class = "line" > < a name = "l04494" > < / a > < span class = "lineno" > 4494< / span >   CreatePairOperator< SwapIndexPairOperator> (),< / div >
< div class = "line" > < a name = "l04495" > < / a > < span class = "lineno" > 4495< / span >   CreatePairOperator< PairNodeSwapActiveOperator< true> > (),< / div >
< div class = "line" > < a name = "l04496" > < / a > < span class = "lineno" > 4496< / span >   CreatePairOperator< PairNodeSwapActiveOperator< false> > ()});< / div >
< div class = "line" > < a name = "l04497" > < / a > < span class = "lineno" > 4497< / span >   local_search_operators_[RELOCATE_SUBTRIP] =< / div >
< div class = "line" > < a name = "l04498" > < / a > < span class = "lineno" > 4498< / span >   CreatePairOperator< RelocateSubtrip> ();< / div >
< div class = "line" > < a name = "l04499" > < / a > < span class = "lineno" > 4499< / span >   local_search_operators_[EXCHANGE_SUBTRIP] =< / div >
< div class = "line" > < a name = "l04500" > < / a > < span class = "lineno" > 4500< / span >   CreatePairOperator< ExchangeSubtrip> ();< / div >
< div class = "line" > < a name = "l04501" > < / a > < span class = "lineno" > 4501< / span >   < / div >
< div class = "line" > < a name = "l04502" > < / a > < span class = "lineno" > 4502< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > arc_cost_for_path_start =< / div >
< div class = "line" > < a name = "l04503" > < / a > < span class = "lineno" > 4503< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > before_node, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > after_node, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_index) {< / div >
< div class = "line" > < a name = "l04504" > < / a > < span class = "lineno" > 4504< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle = index_to_vehicle_[start_index];< / div >
< div class = "line" > < a name = "l04505" > < / a > < span class = "lineno" > 4505< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > arc_cost =< / div >
< div class = "line" > < a name = "l04506" > < / a > < span class = "lineno" > 4506< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (before_node, after_node, vehicle);< / div >
< div class = "line" > < a name = "l04507" > < / a > < span class = "lineno" > 4507< / span >   < span class = "keywordflow" > return< / span > (before_node != start_index || < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (after_node))< / div >
< div class = "line" > < a name = "l04508" > < / a > < span class = "lineno" > 4508< / span >   ? arc_cost< / div >
< div class = "line" > < a name = "l04509" > < / a > < span class = "lineno" > 4509< / span >   : < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (arc_cost, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4bab641f5b9bf8de266adad29558b4c2" > GetFixedCostOfVehicle< / a > (vehicle));< / div >
< div class = "line" > < a name = "l04510" > < / a > < span class = "lineno" > 4510< / span >   };< / div >
< div class = "line" > < a name = "l04511" > < / a > < span class = "lineno" > 4511< / span >   local_search_operators_[RELOCATE_EXPENSIVE_CHAIN] =< / div >
< div class = "line" > < a name = "l04512" > < / a > < span class = "lineno" > 4512< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > RelocateExpensiveChain(< / div >
< div class = "line" > < a name = "l04513" > < / a > < span class = "lineno" > 4513< / span >   nexts_,< / div >
< div class = "line" > < a name = "l04514" > < / a > < span class = "lineno" > 4514< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > () ? std::vector< IntVar*> ()< / div >
< div class = "line" > < a name = "l04515" > < / a > < span class = "lineno" > 4515< / span >   : vehicle_vars_,< / div >
< div class = "line" > < a name = "l04516" > < / a > < span class = "lineno" > 4516< / span >   vehicle_start_class_callback_,< / div >
< div class = "line" > < a name = "l04517" > < / a > < span class = "lineno" > 4517< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .relocate_expensive_chain_num_arcs_to_consider(),< / div >
< div class = "line" > < a name = "l04518" > < / a > < span class = "lineno" > 4518< / span >   arc_cost_for_path_start));< / div >
< div class = "line" > < a name = "l04519" > < / a > < span class = "lineno" > 4519< / span >   < / div >
< div class = "line" > < a name = "l04520" > < / a > < span class = "lineno" > 4520< / span >   < span class = "comment" > // Insertion-based LNS neighborhoods.< / span > < / div >
< div class = "line" > < a name = "l04521" > < / a > < span class = "lineno" > 4521< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > make_global_cheapest_insertion_filtered_heuristic =< / div >
< div class = "line" > < a name = "l04522" > < / a > < span class = "lineno" > 4522< / span >   [< span class = "keyword" > this< / span > , & < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ]() {< / div >
< div class = "line" > < a name = "l04523" > < / a > < span class = "lineno" > 4523< / span >   < span class = "keyword" > using< / span > Heuristic = GlobalCheapestInsertionFilteredHeuristic;< / div >
< div class = "line" > < a name = "l04524" > < / a > < span class = "lineno" > 4524< / span >   Heuristic::GlobalCheapestInsertionParameters ls_gci_parameters;< / div >
< div class = "line" > < a name = "l04525" > < / a > < span class = "lineno" > 4525< / span >   ls_gci_parameters.is_sequential = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04526" > < / a > < span class = "lineno" > 4526< / span >   ls_gci_parameters.farthest_seeds_ratio = 0.0;< / div >
< div class = "line" > < a name = "l04527" > < / a > < span class = "lineno" > 4527< / span >   ls_gci_parameters.neighbors_ratio =< / div >
< div class = "line" > < a name = "l04528" > < / a > < span class = "lineno" > 4528< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .cheapest_insertion_ls_operator_neighbors_ratio();< / div >
< div class = "line" > < a name = "l04529" > < / a > < span class = "lineno" > 4529< / span >   ls_gci_parameters.min_neighbors =< / div >
< div class = "line" > < a name = "l04530" > < / a > < span class = "lineno" > 4530< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .cheapest_insertion_ls_operator_min_neighbors();< / div >
< div class = "line" > < a name = "l04531" > < / a > < span class = "lineno" > 4531< / span >   ls_gci_parameters.use_neighbors_ratio_for_initialization = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04532" > < / a > < span class = "lineno" > 4532< / span >   ls_gci_parameters.add_unperformed_entries =< / div >
< div class = "line" > < a name = "l04533" > < / a > < span class = "lineno" > 4533< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .cheapest_insertion_add_unperformed_entries();< / div >
< div class = "line" > < a name = "l04534" > < / a > < span class = "lineno" > 4534< / span >   < span class = "keywordflow" > return< / span > absl::make_unique< Heuristic> (< / div >
< div class = "line" > < a name = "l04535" > < / a > < span class = "lineno" > 4535< / span >   < span class = "keyword" > this< / span > , absl::bind_front(& < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > RoutingModel::GetArcCostForVehicle< / a > , < span class = "keyword" > this< / span > ),< / div >
< div class = "line" > < a name = "l04536" > < / a > < span class = "lineno" > 4536< / span >   absl::bind_front(& < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > RoutingModel::UnperformedPenaltyOrValue< / a > , < span class = "keyword" > this< / span > , 0),< / div >
< div class = "line" > < a name = "l04537" > < / a > < span class = "lineno" > 4537< / span >   GetOrCreateFeasibilityFilterManager(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ), ls_gci_parameters);< / div >
< div class = "line" > < a name = "l04538" > < / a > < span class = "lineno" > 4538< / span >   };< / div >
< div class = "line" > < a name = "l04539" > < / a > < span class = "lineno" > 4539< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > make_local_cheapest_insertion_filtered_heuristic =< / div >
< div class = "line" > < a name = "l04540" > < / a > < span class = "lineno" > 4540< / span >   [< span class = "keyword" > this< / span > , & < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ]() {< / div >
< div class = "line" > < a name = "l04541" > < / a > < span class = "lineno" > 4541< / span >   < span class = "keywordflow" > return< / span > absl::make_unique< LocalCheapestInsertionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l04542" > < / a > < span class = "lineno" > 4542< / span >   < span class = "keyword" > this< / span > , absl::bind_front(& < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > RoutingModel::GetArcCostForVehicle< / a > , < span class = "keyword" > this< / span > ),< / div >
< div class = "line" > < a name = "l04543" > < / a > < span class = "lineno" > 4543< / span >   GetOrCreateFeasibilityFilterManager(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ));< / div >
< div class = "line" > < a name = "l04544" > < / a > < span class = "lineno" > 4544< / span >   };< / div >
< div class = "line" > < a name = "l04545" > < / a > < span class = "lineno" > 4545< / span >   local_search_operators_[GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS] =< / div >
< div class = "line" > < a name = "l04546" > < / a > < span class = "lineno" > 4546< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicCloseNodesLNSOperator(< / div >
< div class = "line" > < a name = "l04547" > < / a > < span class = "lineno" > 4547< / span >   make_global_cheapest_insertion_filtered_heuristic(),< / div >
< div class = "line" > < a name = "l04548" > < / a > < span class = "lineno" > 4548< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .heuristic_close_nodes_lns_num_nodes()));< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04549" > < / a > < span class = "lineno" > 4549< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04550" > < / a > < span class = "lineno" > 4550< / span >   local_search_operators_[LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS] =< / div >
< div class = "line" > < a name = "l04551" > < / a > < span class = "lineno" > 4551< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicCloseNodesLNSOperator(< / div >
< div class = "line" > < a name = "l04552" > < / a > < span class = "lineno" > 4552< / span >   make_local_cheapest_insertion_filtered_heuristic(),< / div >
< div class = "line" > < a name = "l04553" > < / a > < span class = "lineno" > 4553< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .heuristic_close_nodes_lns_num_nodes()));< / div >
< div class = "line" > < a name = "l04554" > < / a > < span class = "lineno" > 4554< / span >   < / div >
< div class = "line" > < a name = "l04555" > < / a > < span class = "lineno" > 4555< / span >   local_search_operators_[GLOBAL_CHEAPEST_INSERTION_PATH_LNS] =< / div >
< div class = "line" > < a name = "l04556" > < / a > < span class = "lineno" > 4556< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicPathLNSOperator(< / div >
< div class = "line" > < a name = "l04557" > < / a > < span class = "lineno" > 4557< / span >   make_global_cheapest_insertion_filtered_heuristic()));< / div >
< div class = "line" > < a name = "l04558" > < / a > < span class = "lineno" > 4558< / span >   < / div >
< div class = "line" > < a name = "l04559" > < / a > < span class = "lineno" > 4559< / span >   local_search_operators_[LOCAL_CHEAPEST_INSERTION_PATH_LNS] =< / div >
< div class = "line" > < a name = "l04560" > < / a > < span class = "lineno" > 4560< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicPathLNSOperator(< / div >
< div class = "line" > < a name = "l04561" > < / a > < span class = "lineno" > 4561< / span >   make_local_cheapest_insertion_filtered_heuristic()));< / div >
< div class = "line" > < a name = "l04562" > < / a > < span class = "lineno" > 4562< / span >   < / div >
< div class = "line" > < a name = "l04563" > < / a > < span class = "lineno" > 4563< / span >   local_search_operators_< / div >
< div class = "line" > < a name = "l04564" > < / a > < span class = "lineno" > 4564< / span >   [RELOCATE_PATH_GLOBAL_CHEAPEST_INSERTION_INSERT_UNPERFORMED] =< / div >
< div class = "line" > < a name = "l04565" > < / a > < span class = "lineno" > 4565< / span >   solver_-> RevAlloc(< / div >
< div class = "line" > < a name = "l04566" > < / a > < span class = "lineno" > 4566< / span >   < span class = "keyword" > new< / span > RelocatePathAndHeuristicInsertUnperformedOperator(< / div >
< div class = "line" > < a name = "l04567" > < / a > < span class = "lineno" > 4567< / span >   make_global_cheapest_insertion_filtered_heuristic()));< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04568" > < / a > < span class = "lineno" > 4568< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04569" > < / a > < span class = "lineno" > 4569< / span >   local_search_operators_[GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS] =< / div >
< div class = "line" > < a name = "l04570" > < / a > < span class = "lineno" > 4570< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicExpensiveChainLNSOperator(< / div >
< div class = "line" > < a name = "l04571" > < / a > < span class = "lineno" > 4571< / span >   make_global_cheapest_insertion_filtered_heuristic(),< / div >
< div class = "line" > < a name = "l04572" > < / a > < span class = "lineno" > 4572< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .heuristic_expensive_chain_lns_num_arcs_to_consider(),< / div >
< div class = "line" > < a name = "l04573" > < / a > < span class = "lineno" > 4573< / span >   arc_cost_for_path_start));< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04574" > < / a > < span class = "lineno" > 4574< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04575" > < / a > < span class = "lineno" > 4575< / span >   local_search_operators_[LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS] =< / div >
< div class = "line" > < a name = "l04576" > < / a > < span class = "lineno" > 4576< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > FilteredHeuristicExpensiveChainLNSOperator(< / div >
< div class = "line" > < a name = "l04577" > < / a > < span class = "lineno" > 4577< / span >   make_local_cheapest_insertion_filtered_heuristic(),< / div >
< div class = "line" > < a name = "l04578" > < / a > < span class = "lineno" > 4578< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .heuristic_expensive_chain_lns_num_arcs_to_consider(),< / div >
< div class = "line" > < a name = "l04579" > < / a > < span class = "lineno" > 4579< / span >   arc_cost_for_path_start));< / div >
< div class = "line" > < a name = "l04580" > < / a > < span class = "lineno" > 4580< / span >   }< / div >
< div class = "line" > < a name = "l04581" > < / a > < span class = "lineno" > 4581< / span >   < / div >
< div class = "line" > < a name = "l04582" > < / a > < span class = "lineno" > < a class = "line" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > 4582< / a > < / span >   < span class = "preprocessor" > #define CP_ROUTING_PUSH_OPERATOR(operator_type, operator_method, operators) \< / span > < / div >
< div class = "line" > < a name = "l04583" > < / a > < span class = "lineno" > 4583< / span >   < span class = "preprocessor" > if (search_parameters.local_search_operators().use_##operator_method() == \< / span > < / div >
< div class = "line" > < a name = "l04584" > < / a > < span class = "lineno" > 4584< / span >   < span class = "preprocessor" > BOOL_TRUE) { \< / span > < / div >
< div class = "line" > < a name = "l04585" > < / a > < span class = "lineno" > 4585< / span >   < span class = "preprocessor" > operators.push_back(local_search_operators_[operator_type]); \< / span > < / div >
< div class = "line" > < a name = "l04586" > < / a > < span class = "lineno" > 4586< / span >   < span class = "preprocessor" > }< / span > < / div >
< div class = "line" > < a name = "l04587" > < / a > < span class = "lineno" > 4587< / span >   < / div >
< div class = "line" > < a name = "l04588" > < / a > < span class = "lineno" > 4588< / span >   LocalSearchOperator* RoutingModel::ConcatenateOperators(< / div >
< div class = "line" > < a name = "l04589" > < / a > < span class = "lineno" > 4589< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters,< / div >
< div class = "line" > < a name = "l04590" > < / a > < span class = "lineno" > 4590< / span >   < span class = "keyword" > const< / span > std::vector< LocalSearchOperator*> & operators)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04591" > < / a > < span class = "lineno" > 4591< / span >   < span class = "keywordflow" > if< / span > (search_parameters.use_multi_armed_bandit_concatenate_operators()) {< / div >
< div class = "line" > < a name = "l04592" > < / a > < span class = "lineno" > 4592< / span >   < span class = "keywordflow" > return< / span > solver_-> MultiArmedBanditConcatenateOperators(< / div >
< div class = "line" > < a name = "l04593" > < / a > < span class = "lineno" > 4593< / span >   operators,< / div >
< div class = "line" > < a name = "l04594" > < / a > < span class = "lineno" > 4594< / span >   search_parameters< / div >
< div class = "line" > < a name = "l04595" > < / a > < span class = "lineno" > 4595< / span >   .multi_armed_bandit_compound_operator_memory_coefficient(),< / div >
< div class = "line" > < a name = "l04596" > < / a > < span class = "lineno" > 4596< / span >   search_parameters< / div >
< div class = "line" > < a name = "l04597" > < / a > < span class = "lineno" > 4597< / span >   .multi_armed_bandit_compound_operator_exploration_coefficient(),< / div >
< div class = "line" > < a name = "l04598" > < / a > < span class = "lineno" > 4598< / span >   < span class = "comment" > /*maximize=*/< / span > < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l04599" > < / a > < span class = "lineno" > 4599< / span >   }< / div >
< div class = "line" > < a name = "l04600" > < / a > < span class = "lineno" > 4600< / span >   < span class = "keywordflow" > return< / span > solver_-> ConcatenateOperators(operators);< / div >
< div class = "line" > < a name = "l04601" > < / a > < span class = "lineno" > 4601< / span >   }< / div >
< div class = "line" > < a name = "l04602" > < / a > < span class = "lineno" > 4602< / span >   < / div >
< div class = "line" > < a name = "l04603" > < / a > < span class = "lineno" > 4603< / span >   LocalSearchOperator* RoutingModel::GetNeighborhoodOperators(< / div >
< div class = "line" > < a name = "l04604" > < / a > < span class = "lineno" > 4604< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04605" > < / a > < span class = "lineno" > 4605< / span >   std::vector< LocalSearchOperator*> operator_groups;< / div >
< div class = "line" > < a name = "l04606" > < / a > < span class = "lineno" > 4606< / span >   std::vector< LocalSearchOperator*> operators = extra_operators_;< / div >
< div class = "line" > < a name = "l04607" > < / a > < span class = "lineno" > 4607< / span >   < span class = "keywordflow" > if< / span > (!pickup_delivery_pairs_.empty()) {< / div >
< div class = "line" > < a name = "l04608" > < / a > < span class = "lineno" > 4608< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (RELOCATE_PAIR, relocate_pair, operators);< / div >
< div class = "line" > < a name = "l04609" > < / a > < span class = "lineno" > 4609< / span >   < span class = "comment" > // Only add the light version of relocate pair if the normal version has not< / span > < / div >
< div class = "line" > < a name = "l04610" > < / a > < span class = "lineno" > 4610< / span >   < span class = "comment" > // already been added as it covers a subset of its neighborhood.< / span > < / div >
< div class = "line" > < a name = "l04611" > < / a > < span class = "lineno" > 4611< / span >   < span class = "keywordflow" > if< / span > (search_parameters.local_search_operators().use_relocate_pair() ==< / div >
< div class = "line" > < a name = "l04612" > < / a > < span class = "lineno" > 4612< / span >   < a class = "code" href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2" > BOOL_FALSE< / a > ) {< / div >
< div class = "line" > < a name = "l04613" > < / a > < span class = "lineno" > 4613< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (LIGHT_RELOCATE_PAIR, light_relocate_pair,< / div >
< div class = "line" > < a name = "l04614" > < / a > < span class = "lineno" > 4614< / span >   operators);< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04615" > < / a > < span class = "lineno" > 4615< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04616" > < / a > < span class = "lineno" > 4616< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (EXCHANGE_PAIR, exchange_pair, operators);< / div >
< div class = "line" > < a name = "l04617" > < / a > < span class = "lineno" > 4617< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (NODE_PAIR_SWAP, node_pair_swap_active, operators);< / div >
< div class = "line" > < a name = "l04618" > < / a > < span class = "lineno" > 4618< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (RELOCATE_SUBTRIP, relocate_subtrip, operators);< / div >
< div class = "line" > < a name = "l04619" > < / a > < span class = "lineno" > 4619< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (EXCHANGE_SUBTRIP, exchange_subtrip, operators);< / div >
< div class = "line" > < a name = "l04620" > < / a > < span class = "lineno" > 4620< / span >   }< / div >
< div class = "line" > < a name = "l04621" > < / a > < span class = "lineno" > 4621< / span >   < span class = "keywordflow" > if< / span > (vehicles_ > 1) {< / div >
< div class = "line" > < a name = "l04622" > < / a > < span class = "lineno" > 4622< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2" > GetNumOfSingletonNodes< / a > () > 0) {< / div >
< div class = "line" > < a name = "l04623" > < / a > < span class = "lineno" > 4623< / span >   < span class = "comment" > // If there are only pairs in the model the only case where Relocate will< / span > < / div >
< div class = "line" > < a name = "l04624" > < / a > < span class = "lineno" > 4624< / span >   < span class = "comment" > // work is for intra-route moves, already covered by OrOpt.< / span > < / div >
< div class = "line" > < a name = "l04625" > < / a > < span class = "lineno" > 4625< / span >   < span class = "comment" > // We are not disabling Exchange and Cross because there are no< / span > < / div >
< div class = "line" > < a name = "l04626" > < / a > < span class = "lineno" > 4626< / span >   < span class = "comment" > // intra-route equivalents.< / span > < / div >
< div class = "line" > < a name = "l04627" > < / a > < span class = "lineno" > 4627< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (RELOCATE, relocate, operators);< / div >
< div class = "line" > < a name = "l04628" > < / a > < span class = "lineno" > 4628< / span >   }< / div >
< div class = "line" > < a name = "l04629" > < / a > < span class = "lineno" > 4629< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (EXCHANGE, exchange, operators);< / div >
< div class = "line" > < a name = "l04630" > < / a > < span class = "lineno" > 4630< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (CROSS, cross, operators);< / div >
< div class = "line" > < a name = "l04631" > < / a > < span class = "lineno" > 4631< / span >   }< / div >
< div class = "line" > < a name = "l04632" > < / a > < span class = "lineno" > 4632< / span >   < span class = "keywordflow" > if< / span > (!pickup_delivery_pairs_.empty() ||< / div >
< div class = "line" > < a name = "l04633" > < / a > < span class = "lineno" > 4633< / span >   search_parameters.local_search_operators().use_relocate_neighbors() ==< / div >
< div class = "line" > < a name = "l04634" > < / a > < span class = "lineno" > 4634< / span >   < a class = "code" href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0" > BOOL_TRUE< / a > ) {< / div >
< div class = "line" > < a name = "l04635" > < / a > < span class = "lineno" > 4635< / span >   operators.push_back(local_search_operators_[RELOCATE_NEIGHBORS]);< / div >
< div class = "line" > < a name = "l04636" > < / a > < span class = "lineno" > 4636< / span >   }< / div >
< div class = "line" > < a name = "l04637" > < / a > < span class = "lineno" > 4637< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > LocalSearchMetaheuristic::Value< / a > local_search_metaheuristic =< / div >
< div class = "line" > < a name = "l04638" > < / a > < span class = "lineno" > 4638< / span >   search_parameters.local_search_metaheuristic();< / div >
< div class = "line" > < a name = "l04639" > < / a > < span class = "lineno" > 4639< / span >   < span class = "keywordflow" > if< / span > (local_search_metaheuristic != LocalSearchMetaheuristic::TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04640" > < / a > < span class = "lineno" > 4640< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04641" > < / a > < span class = "lineno" > 4641< / span >   LocalSearchMetaheuristic::GENERIC_TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04642" > < / a > < span class = "lineno" > 4642< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04643" > < / a > < span class = "lineno" > 4643< / span >   LocalSearchMetaheuristic::SIMULATED_ANNEALING) {< / div >
< div class = "line" > < a name = "l04644" > < / a > < span class = "lineno" > 4644< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (LIN_KERNIGHAN, lin_kernighan, operators);< / div >
< div class = "line" > < a name = "l04645" > < / a > < span class = "lineno" > 4645< / span >   }< / div >
< div class = "line" > < a name = "l04646" > < / a > < span class = "lineno" > 4646< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (TWO_OPT, two_opt, operators);< / div >
< div class = "line" > < a name = "l04647" > < / a > < span class = "lineno" > 4647< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (OR_OPT, or_opt, operators);< / div >
< div class = "line" > < a name = "l04648" > < / a > < span class = "lineno" > 4648< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (RELOCATE_EXPENSIVE_CHAIN, relocate_expensive_chain,< / div >
< div class = "line" > < a name = "l04649" > < / a > < span class = "lineno" > 4649< / span >   operators);< / div >
< div class = "line" > < a name = "l04650" > < / a > < span class = "lineno" > 4650< / span >   < span class = "keywordflow" > if< / span > (!disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc" > empty< / a > ()) {< / div >
< div class = "line" > < a name = "l04651" > < / a > < span class = "lineno" > 4651< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (MAKE_INACTIVE, make_inactive, operators);< / div >
< div class = "line" > < a name = "l04652" > < / a > < span class = "lineno" > 4652< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (MAKE_CHAIN_INACTIVE, make_chain_inactive,< / div >
< div class = "line" > < a name = "l04653" > < / a > < span class = "lineno" > 4653< / span >   operators);< / div >
< div class = "line" > < a name = "l04654" > < / a > < span class = "lineno" > 4654< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (MAKE_ACTIVE, make_active, operators);< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04655" > < / a > < span class = "lineno" > 4655< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04656" > < / a > < span class = "lineno" > 4656< / span >   < span class = "comment" > // The relocate_and_make_active parameter activates all neighborhoods< / span > < / div >
< div class = "line" > < a name = "l04657" > < / a > < span class = "lineno" > 4657< / span >   < span class = "comment" > // relocating a node together with making another active.< / span > < / div >
< div class = "line" > < a name = "l04658" > < / a > < span class = "lineno" > 4658< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (RELOCATE_AND_MAKE_ACTIVE, relocate_and_make_active,< / div >
< div class = "line" > < a name = "l04659" > < / a > < span class = "lineno" > 4659< / span >   operators);< / div >
< div class = "line" > < a name = "l04660" > < / a > < span class = "lineno" > 4660< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (MAKE_ACTIVE_AND_RELOCATE, relocate_and_make_active,< / div >
< div class = "line" > < a name = "l04661" > < / a > < span class = "lineno" > 4661< / span >   operators);< / div >
< div class = "line" > < a name = "l04662" > < / a > < span class = "lineno" > 4662< / span >   < / div >
< div class = "line" > < a name = "l04663" > < / a > < span class = "lineno" > 4663< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (SWAP_ACTIVE, swap_active, operators);< / div >
< div class = "line" > < a name = "l04664" > < / a > < span class = "lineno" > 4664< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (EXTENDED_SWAP_ACTIVE, extended_swap_active,< / div >
< div class = "line" > < a name = "l04665" > < / a > < span class = "lineno" > 4665< / span >   operators);< / div >
< div class = "line" > < a name = "l04666" > < / a > < span class = "lineno" > 4666< / span >   }< / div >
< div class = "line" > < a name = "l04667" > < / a > < span class = "lineno" > 4667< / span >   operator_groups.push_back(ConcatenateOperators(search_parameters, operators));< / div >
< div class = "line" > < a name = "l04668" > < / a > < span class = "lineno" > 4668< / span >   < / div >
< div class = "line" > < a name = "l04669" > < / a > < span class = "lineno" > 4669< / span >   < span class = "comment" > // Second local search loop: LNS-like operators.< / span > < / div >
< div class = "line" > < a name = "l04670" > < / a > < span class = "lineno" > 4670< / span >   operators.clear();< / div >
< div class = "line" > < a name = "l04671" > < / a > < span class = "lineno" > 4671< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () > 1) {< / div >
< div class = "line" > < a name = "l04672" > < / a > < span class = "lineno" > 4672< / span >   < span class = "comment" > // NOTE: The following heuristic path LNS with a single vehicle are< / span > < / div >
< div class = "line" > < a name = "l04673" > < / a > < span class = "lineno" > 4673< / span >   < span class = "comment" > // equivalent to using the heuristic as first solution strategy, so we only< / span > < / div >
< div class = "line" > < a name = "l04674" > < / a > < span class = "lineno" > 4674< / span >   < span class = "comment" > // add these moves if we have at least 2 vehicles in the model.< / span > < / div >
< div class = "line" > < a name = "l04675" > < / a > < span class = "lineno" > 4675< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (GLOBAL_CHEAPEST_INSERTION_PATH_LNS,< / div >
< div class = "line" > < a name = "l04676" > < / a > < span class = "lineno" > 4676< / span >   global_cheapest_insertion_path_lns, operators);< / div >
< div class = "line" > < a name = "l04677" > < / a > < span class = "lineno" > 4677< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (LOCAL_CHEAPEST_INSERTION_PATH_LNS,< / div >
< div class = "line" > < a name = "l04678" > < / a > < span class = "lineno" > 4678< / span >   local_cheapest_insertion_path_lns, operators);< / div >
< div class = "line" > < a name = "l04679" > < / a > < span class = "lineno" > 4679< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (< / div >
< div class = "line" > < a name = "l04680" > < / a > < span class = "lineno" > 4680< / span >   RELOCATE_PATH_GLOBAL_CHEAPEST_INSERTION_INSERT_UNPERFORMED,< / div >
< div class = "line" > < a name = "l04681" > < / a > < span class = "lineno" > 4681< / span >   relocate_path_global_cheapest_insertion_insert_unperformed, operators);< / div >
< div class = "line" > < a name = "l04682" > < / a > < span class = "lineno" > 4682< / span >   }< / div >
< div class = "line" > < a name = "l04683" > < / a > < span class = "lineno" > 4683< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,< / div >
< div class = "line" > < a name = "l04684" > < / a > < span class = "lineno" > 4684< / span >   global_cheapest_insertion_expensive_chain_lns,< / div >
< div class = "line" > < a name = "l04685" > < / a > < span class = "lineno" > 4685< / span >   operators);< / div >
< div class = "line" > < a name = "l04686" > < / a > < span class = "lineno" > 4686< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,< / div >
< div class = "line" > < a name = "l04687" > < / a > < span class = "lineno" > 4687< / span >   local_cheapest_insertion_expensive_chain_lns,< / div >
< div class = "line" > < a name = "l04688" > < / a > < span class = "lineno" > 4688< / span >   operators);< / div >
< div class = "line" > < a name = "l04689" > < / a > < span class = "lineno" > 4689< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,< / div >
< div class = "line" > < a name = "l04690" > < / a > < span class = "lineno" > 4690< / span >   global_cheapest_insertion_close_nodes_lns,< / div >
< div class = "line" > < a name = "l04691" > < / a > < span class = "lineno" > 4691< / span >   operators);< / div >
< div class = "line" > < a name = "l04692" > < / a > < span class = "lineno" > 4692< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,< / div >
< div class = "line" > < a name = "l04693" > < / a > < span class = "lineno" > 4693< / span >   local_cheapest_insertion_close_nodes_lns, operators);< / div >
< div class = "line" > < a name = "l04694" > < / a > < span class = "lineno" > 4694< / span >   operator_groups.push_back(ConcatenateOperators(search_parameters, operators));< / div >
< div class = "line" > < a name = "l04695" > < / a > < span class = "lineno" > 4695< / span >   < / div >
< div class = "line" > < a name = "l04696" > < / a > < span class = "lineno" > 4696< / span >   < span class = "comment" > // Third local search loop: Expensive LNS operators.< / span > < / div >
< div class = "line" > < a name = "l04697" > < / a > < span class = "lineno" > 4697< / span >   operators.clear();< / div >
< div class = "line" > < a name = "l04698" > < / a > < span class = "lineno" > 4698< / span >   < span class = "keywordflow" > if< / span > (local_search_metaheuristic != LocalSearchMetaheuristic::TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04699" > < / a > < span class = "lineno" > 4699< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04700" > < / a > < span class = "lineno" > 4700< / span >   LocalSearchMetaheuristic::GENERIC_TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04701" > < / a > < span class = "lineno" > 4701< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04702" > < / a > < span class = "lineno" > 4702< / span >   LocalSearchMetaheuristic::SIMULATED_ANNEALING) {< / div >
< div class = "line" > < a name = "l04703" > < / a > < span class = "lineno" > 4703< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (TSP_OPT, tsp_opt, operators);< / div >
< div class = "line" > < a name = "l04704" > < / a > < span class = "lineno" > 4704< / span >   }< / div >
< div class = "line" > < a name = "l04705" > < / a > < span class = "lineno" > 4705< / span >   < span class = "keywordflow" > if< / span > (local_search_metaheuristic != LocalSearchMetaheuristic::TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04706" > < / a > < span class = "lineno" > 4706< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04707" > < / a > < span class = "lineno" > 4707< / span >   LocalSearchMetaheuristic::GENERIC_TABU_SEARCH & & < / div >
< div class = "line" > < a name = "l04708" > < / a > < span class = "lineno" > 4708< / span >   local_search_metaheuristic !=< / div >
< div class = "line" > < a name = "l04709" > < / a > < span class = "lineno" > 4709< / span >   LocalSearchMetaheuristic::SIMULATED_ANNEALING) {< / div >
< div class = "line" > < a name = "l04710" > < / a > < span class = "lineno" > 4710< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (TSP_LNS, tsp_lns, operators);< / div >
< div class = "line" > < a name = "l04711" > < / a > < span class = "lineno" > 4711< / span >   }< / div >
< div class = "line" > < a name = "l04712" > < / a > < span class = "lineno" > 4712< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (FULL_PATH_LNS, full_path_lns, operators);< / div >
< div class = "line" > < a name = "l04713" > < / a > < span class = "lineno" > 4713< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (PATH_LNS, path_lns, operators);< / div >
< div class = "line" > < a name = "l04714" > < / a > < span class = "lineno" > 4714< / span >   < span class = "keywordflow" > if< / span > (!disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc" > empty< / a > ()) {< / div >
< div class = "line" > < a name = "l04715" > < / a > < span class = "lineno" > 4715< / span >   < a class = "code" href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > (INACTIVE_LNS, inactive_lns, operators);< / div >
< div class = "line" > < a name = "l04716" > < / a > < span class = "lineno" > 4716< / span >   }< / div >
< div class = "line" > < a name = "l04717" > < / a > < span class = "lineno" > 4717< / span >   operator_groups.push_back(ConcatenateOperators(search_parameters, operators));< / div >
< div class = "line" > < a name = "l04718" > < / a > < span class = "lineno" > 4718< / span >   < / div >
< div class = "line" > < a name = "l04719" > < / a > < span class = "lineno" > 4719< / span >   < span class = "keywordflow" > return< / span > solver_-> ConcatenateOperators(operator_groups);< / div >
< div class = "line" > < a name = "l04720" > < / a > < span class = "lineno" > 4720< / span >   }< / div >
< div class = "line" > < a name = "l04721" > < / a > < span class = "lineno" > 4721< / span >   < / div >
< div class = "line" > < a name = "l04722" > < / a > < span class = "lineno" > 4722< / span >   < span class = "preprocessor" > #undef CP_ROUTING_PUSH_OPERATOR< / span > < / div >
< div class = "line" > < a name = "l04723" > < / a > < span class = "lineno" > 4723< / span >   < / div >
< div class = "line" > < a name = "l04724" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378" > 4724< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378" > HasUnaryDimension< / a > (< span class = "keyword" > const< / span > std::vector< RoutingDimension*> & dimensions) {< / div >
< div class = "line" > < a name = "l04725" > < / a > < span class = "lineno" > 4725< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension : dimensions) {< / div >
< div class = "line" > < a name = "l04726" > < / a > < span class = "lineno" > 4726< / span >   < span class = "keywordflow" > if< / span > (dimension-> GetUnaryTransitEvaluator(0) != < span class = "keyword" > nullptr< / span > ) < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04727" > < / a > < span class = "lineno" > 4727< / span >   }< / div >
< div class = "line" > < a name = "l04728" > < / a > < span class = "lineno" > 4728< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04729" > < / a > < span class = "lineno" > 4729< / span >   }< / div >
< div class = "line" > < a name = "l04730" > < / a > < span class = "lineno" > 4730< / span >   < / div >
< div class = "line" > < a name = "l04731" > < / a > < span class = "lineno" > 4731< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l04732" > < / a > < span class = "lineno" > 4732< / span >   < / div >
< div class = "line" > < a name = "l04733" > < / a > < span class = "lineno" > 4733< / span >   < span class = "keywordtype" > void< / span > ConvertVectorInt64ToVectorInt(< span class = "keyword" > const< / span > std::vector< int64> & < a class = "code" href = "parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051" > input< / a > ,< / div >
< div class = "line" > < a name = "l04734" > < / a > < span class = "lineno" > 4734< / span >   std::vector< int> * output) {< / div >
< div class = "line" > < a name = "l04735" > < / a > < span class = "lineno" > 4735< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > n = < a class = "code" href = "parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051" > input< / a > .size();< / div >
< div class = "line" > < a name = "l04736" > < / a > < span class = "lineno" > 4736< / span >   output-> resize(n);< / div >
< div class = "line" > < a name = "l04737" > < / a > < span class = "lineno" > 4737< / span >   < span class = "keywordtype" > int< / span > * data = output-> data();< / div >
< div class = "line" > < a name = "l04738" > < / a > < span class = "lineno" > 4738< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < n; ++i) {< / div >
< div class = "line" > < a name = "l04739" > < / a > < span class = "lineno" > 4739< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > element = < span class = "keyword" > static_cast< < / span > < span class = "keywordtype" > int< / span > < span class = "keyword" > > < / span > (< a class = "code" href = "parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051" > input< / a > [i]);< / div >
< div class = "line" > < a name = "l04740" > < / a > < span class = "lineno" > 4740< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (< a class = "code" href = "parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051" > input< / a > [i], < span class = "keyword" > static_cast< < / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < span class = "keyword" > > < / span > (element));< / div >
< div class = "line" > < a name = "l04741" > < / a > < span class = "lineno" > 4741< / span >   data[i] = element;< / div >
< div class = "line" > < a name = "l04742" > < / a > < span class = "lineno" > 4742< / span >   }< / div >
< div class = "line" > < a name = "l04743" > < / a > < span class = "lineno" > 4743< / span >   }< / div >
< div class = "line" > < a name = "l04744" > < / a > < span class = "lineno" > 4744< / span >   < / div >
< div class = "line" > < a name = "l04745" > < / a > < span class = "lineno" > 4745< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l04746" > < / a > < span class = "lineno" > 4746< / span >   < / div >
< div class = "line" > < a name = "l04747" > < / a > < span class = "lineno" > 4747< / span >   std::vector< LocalSearchFilterManager::FilterEvent> < / div >
< div class = "line" > < a name = "l04748" > < / a > < span class = "lineno" > 4748< / span >   RoutingModel::GetOrCreateLocalSearchFilters(< / div >
< div class = "line" > < a name = "l04749" > < / a > < span class = "lineno" > 4749< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "keywordtype" > bool< / span > filter_cost) {< / div >
< div class = "line" > < a name = "l04750" > < / a > < span class = "lineno" > 4750< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > kAccept = LocalSearchFilterManager::FilterEventType::kAccept;< / div >
< div class = "line" > < a name = "l04751" > < / a > < span class = "lineno" > 4751< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > kRelax = LocalSearchFilterManager::FilterEventType::kRelax;< / div >
< div class = "line" > < a name = "l04752" > < / a > < span class = "lineno" > 4752< / span >   < span class = "comment" > // As of 2013/01, three filters evaluate sub-parts of the objective< / span > < / div >
< div class = "line" > < a name = "l04753" > < / a > < span class = "lineno" > 4753< / span >   < span class = "comment" > // function:< / span > < / div >
< div class = "line" > < a name = "l04754" > < / a > < span class = "lineno" > 4754< / span >   < span class = "comment" > // - NodeDisjunctionFilter: takes disjunction penalty costs into account,< / span > < / div >
< div class = "line" > < a name = "l04755" > < / a > < span class = "lineno" > 4755< / span >   < span class = "comment" > // - PathCumulFilter: takes dimension span costs into account,< / span > < / div >
< div class = "line" > < a name = "l04756" > < / a > < span class = "lineno" > 4756< / span >   < span class = "comment" > // - ObjectiveFilter:< / span > < / div >
< div class = "line" > < a name = "l04757" > < / a > < span class = "lineno" > 4757< / span >   < span class = "comment" > // - VehicleAmortizedCostFilter, which considers the part of the cost< / span > < / div >
< div class = "line" > < a name = "l04758" > < / a > < span class = "lineno" > 4758< / span >   < span class = "comment" > // related to amortized linear and quadratic vehicle cost factors.< / span > < / div >
< div class = "line" > < a name = "l04759" > < / a > < span class = "lineno" > 4759< / span >   < span class = "comment" > // - LocalSearchObjectiveFilter, which takes dimension " arc" costs into< / span > < / div >
< div class = "line" > < a name = "l04760" > < / a > < span class = "lineno" > 4760< / span >   < span class = "comment" > // account.< / span > < / div >
< div class = "line" > < a name = "l04761" > < / a > < span class = "lineno" > 4761< / span >   std::vector< LocalSearchFilterManager::FilterEvent> filters;< / div >
< div class = "line" > < a name = "l04762" > < / a > < span class = "lineno" > 4762< / span >   < span class = "comment" > // VehicleAmortizedCostFilter can have a negative value, so it must be first.< / span > < / div >
< div class = "line" > < a name = "l04763" > < / a > < span class = "lineno" > 4763< / span >   < span class = "keywordflow" > if< / span > (filter_cost & & vehicle_amortized_cost_factors_set_) {< / div >
< div class = "line" > < a name = "l04764" > < / a > < span class = "lineno" > 4764< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#a4bbb86ef97d259aabe86e0abde4759e3" > MakeVehicleAmortizedCostFilter< / a > (*< span class = "keyword" > this< / span > ), kAccept});< / div >
< div class = "line" > < a name = "l04765" > < / a > < span class = "lineno" > 4765< / span >   }< / div >
< div class = "line" > < a name = "l04766" > < / a > < span class = "lineno" > 4766< / span >   < / div >
< div class = "line" > < a name = "l04767" > < / a > < span class = "lineno" > 4767< / span >   < span class = "comment" > // The SumObjectiveFilter has the best reject/second ratio in practice,< / span > < / div >
< div class = "line" > < a name = "l04768" > < / a > < span class = "lineno" > 4768< / span >   < span class = "comment" > // so it is the earliest.< / span > < / div >
< div class = "line" > < a name = "l04769" > < / a > < span class = "lineno" > 4769< / span >   < span class = "keywordflow" > if< / span > (filter_cost) {< / div >
< div class = "line" > < a name = "l04770" > < / a > < span class = "lineno" > 4770< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l04771" > < / a > < span class = "lineno" > 4771< / span >   LocalSearchFilter* sum = solver_-> MakeSumObjectiveFilter(< / div >
< div class = "line" > < a name = "l04772" > < / a > < span class = "lineno" > 4772< / span >   nexts_, [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > GetHomogeneousCost< / a > (i, j); },< / div >
< div class = "line" > < a name = "l04773" > < / a > < span class = "lineno" > 4773< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61" > Solver::LE< / a > );< / div >
< div class = "line" > < a name = "l04774" > < / a > < span class = "lineno" > 4774< / span >   filters.push_back({sum, kAccept});< / div >
< div class = "line" > < a name = "l04775" > < / a > < span class = "lineno" > 4775< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l04776" > < / a > < span class = "lineno" > 4776< / span >   LocalSearchFilter* sum = solver_-> MakeSumObjectiveFilter(< / div >
< div class = "line" > < a name = "l04777" > < / a > < span class = "lineno" > 4777< / span >   nexts_, vehicle_vars_,< / div >
< div class = "line" > < a name = "l04778" > < / a > < span class = "lineno" > 4778< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > k) {< / div >
< div class = "line" > < a name = "l04779" > < / a > < span class = "lineno" > 4779< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, k);< / div >
< div class = "line" > < a name = "l04780" > < / a > < span class = "lineno" > 4780< / span >   },< / div >
< div class = "line" > < a name = "l04781" > < / a > < span class = "lineno" > 4781< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61" > Solver::LE< / a > );< / div >
< div class = "line" > < a name = "l04782" > < / a > < span class = "lineno" > 4782< / span >   filters.push_back({sum, kAccept});< / div >
< div class = "line" > < a name = "l04783" > < / a > < span class = "lineno" > 4783< / span >   }< / div >
< div class = "line" > < a name = "l04784" > < / a > < span class = "lineno" > 4784< / span >   }< / div >
< div class = "line" > < a name = "l04785" > < / a > < span class = "lineno" > 4785< / span >   < / div >
< div class = "line" > < a name = "l04786" > < / a > < span class = "lineno" > 4786< / span >   filters.push_back({solver_-> MakeVariableDomainFilter(), kAccept});< / div >
< div class = "line" > < a name = "l04787" > < / a > < span class = "lineno" > 4787< / span >   < / div >
< div class = "line" > < a name = "l04788" > < / a > < span class = "lineno" > 4788< / span >   < span class = "keywordflow" > if< / span > (vehicles_ > max_active_vehicles_) {< / div >
< div class = "line" > < a name = "l04789" > < / a > < span class = "lineno" > 4789< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#aa2ef113e19924b88159b114a929b3358" > MakeMaxActiveVehiclesFilter< / a > (*< span class = "keyword" > this< / span > ), kAccept});< / div >
< div class = "line" > < a name = "l04790" > < / a > < span class = "lineno" > 4790< / span >   }< / div >
< div class = "line" > < a name = "l04791" > < / a > < span class = "lineno" > 4791< / span >   < / div >
< div class = "line" > < a name = "l04792" > < / a > < span class = "lineno" > 4792< / span >   < span class = "keywordflow" > if< / span > (!disjunctions_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc" > empty< / a > ()) {< / div >
< div class = "line" > < a name = "l04793" > < / a > < span class = "lineno" > 4793< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#aeb15e4444582a925522843bb414de9c3" > MakeNodeDisjunctionFilter< / a > (*< span class = "keyword" > this< / span > ), kAccept});< / div >
< div class = "line" > < a name = "l04794" > < / a > < span class = "lineno" > 4794< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04795" > < / a > < span class = "lineno" > 4795< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04796" > < / a > < span class = "lineno" > 4796< / span >   < span class = "keywordflow" > if< / span > (!pickup_delivery_pairs_.empty()) {< / div >
< div class = "line" > < a name = "l04797" > < / a > < span class = "lineno" > 4797< / span >   filters.push_back(< / div >
< div class = "line" > < a name = "l04798" > < / a > < span class = "lineno" > 4798< / span >   {< a class = "code" href = "namespaceoperations__research.html#ad03cbd2a51a0688c1fd08d3a7c1754c9" > MakePickupDeliveryFilter< / a > (*< span class = "keyword" > this< / span > , pickup_delivery_pairs_,< / div >
< div class = "line" > < a name = "l04799" > < / a > < span class = "lineno" > 4799< / span >   vehicle_pickup_delivery_policy_),< / div >
< div class = "line" > < a name = "l04800" > < / a > < span class = "lineno" > 4800< / span >   kAccept});< / div >
< div class = "line" > < a name = "l04801" > < / a > < span class = "lineno" > 4801< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04802" > < / a > < span class = "lineno" > 4802< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04803" > < / a > < span class = "lineno" > 4803< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045" > HasTypeRegulations< / a > ()) {< / div >
< div class = "line" > < a name = "l04804" > < / a > < span class = "lineno" > 4804< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#ada7da4059546f5ef90de0b2f8bada19a" > MakeTypeRegulationsFilter< / a > (*< span class = "keyword" > this< / span > ), kAccept});< / div >
< div class = "line" > < a name = "l04805" > < / a > < span class = "lineno" > 4805< / span >   }< / div >
< div class = "line" > < a name = "l04806" > < / a > < span class = "lineno" > 4806< / span >   < / div >
< div class = "line" > < a name = "l04807" > < / a > < span class = "lineno" > 4807< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#ab962de016b1a14868457ac876eadf008" > MakeVehicleVarFilter< / a > (*< span class = "keyword" > this< / span > ), kAccept});< / div >
< div class = "line" > < a name = "l04808" > < / a > < span class = "lineno" > 4808< / span >   < / div >
< div class = "line" > < a name = "l04809" > < / a > < span class = "lineno" > 4809< / span >   < span class = "keyword" > const< / span > PathState* path_state_reference = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l04810" > < / a > < span class = "lineno" > 4810< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378" > HasUnaryDimension< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a635aac580cbeb4bcde72c9464f33ac06" > GetDimensions< / a > ())) {< / div >
< div class = "line" > < a name = "l04811" > < / a > < span class = "lineno" > 4811< / span >   std::vector< int> path_starts;< / div >
< div class = "line" > < a name = "l04812" > < / a > < span class = "lineno" > 4812< / span >   std::vector< int> path_ends;< / div >
< div class = "line" > < a name = "l04813" > < / a > < span class = "lineno" > 4813< / span >   ConvertVectorInt64ToVectorInt(starts_, & path_starts);< / div >
< div class = "line" > < a name = "l04814" > < / a > < span class = "lineno" > 4814< / span >   ConvertVectorInt64ToVectorInt(ends_, & path_ends);< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04815" > < / a > < span class = "lineno" > 4815< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04816" > < / a > < span class = "lineno" > 4816< / span >   < span class = "keyword" > auto< / span > path_state = absl::make_unique< PathState> (< / div >
< div class = "line" > < a name = "l04817" > < / a > < span class = "lineno" > 4817< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), std::move(path_starts), std::move(path_ends));< / div >
< div class = "line" > < a name = "l04818" > < / a > < span class = "lineno" > 4818< / span >   path_state_reference = path_state.get();< / div >
< div class = "line" > < a name = "l04819" > < / a > < span class = "lineno" > 4819< / span >   filters.push_back(< / div >
< div class = "line" > < a name = "l04820" > < / a > < span class = "lineno" > 4820< / span >   {< a class = "code" href = "namespaceoperations__research.html#ae1de0a1f7cf121d53ee230f794ce51f5" > MakePathStateFilter< / a > (solver_.get(), std::move(path_state), < a class = "code" href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > Nexts< / a > ()),< / div >
< div class = "line" > < a name = "l04821" > < / a > < span class = "lineno" > 4821< / span >   kRelax});< / div >
< div class = "line" > < a name = "l04822" > < / a > < span class = "lineno" > 4822< / span >   < a class = "code" href = "namespaceoperations__research.html#ae2219dbffeee11e9bca17cc1e8217747" > AppendLightWeightDimensionFilters< / a > (path_state_reference, < a class = "code" href = "classoperations__research_1_1_routing_model.html#a635aac580cbeb4bcde72c9464f33ac06" > GetDimensions< / a > (),< / div >
< div class = "line" > < a name = "l04823" > < / a > < span class = "lineno" > 4823< / span >   & filters);< / div >
< div class = "line" > < a name = "l04824" > < / a > < span class = "lineno" > 4824< / span >   }< / div >
< div class = "line" > < a name = "l04825" > < / a > < span class = "lineno" > 4825< / span >   < / div >
< div class = "line" > < a name = "l04826" > < / a > < span class = "lineno" > 4826< / span >   < a class = "code" href = "namespaceoperations__research.html#a0e3e4445c55d0c59ef4edbaf7acbd3a8" > AppendDimensionCumulFilters< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a635aac580cbeb4bcde72c9464f33ac06" > GetDimensions< / a > (), < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , filter_cost,< / div >
< div class = "line" > < a name = "l04827" > < / a > < span class = "lineno" > 4827< / span >   & filters);< / div >
< div class = "line" > < a name = "l04828" > < / a > < span class = "lineno" > 4828< / span >   < / div >
< div class = "line" > < a name = "l04829" > < / a > < span class = "lineno" > 4829< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l04830" > < / a > < span class = "lineno" > 4830< / span >   < span class = "keywordflow" > if< / span > (!dimension-> HasBreakConstraints()) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l04831" > < / a > < span class = "lineno" > 4831< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#a447588dfd4d5f539ec22f403e21ca668" > MakeVehicleBreaksFilter< / a > (*< span class = "keyword" > this< / span > , *dimension), kAccept});< / div >
< div class = "line" > < a name = "l04832" > < / a > < span class = "lineno" > 4832< / span >   }< / div >
< div class = "line" > < a name = "l04833" > < / a > < span class = "lineno" > 4833< / span >   filters.insert(filters.end(), extra_filters_.begin(), extra_filters_.end());< / div >
< div class = "line" > < a name = "l04834" > < / a > < span class = "lineno" > 4834< / span >   < span class = "keywordflow" > return< / span > filters;< / div >
< div class = "line" > < a name = "l04835" > < / a > < span class = "lineno" > 4835< / span >   }< / div >
< div class = "line" > < a name = "l04836" > < / a > < span class = "lineno" > 4836< / span >   < / div >
< div class = "line" > < a name = "l04837" > < / a > < span class = "lineno" > 4837< / span >   LocalSearchFilterManager* RoutingModel::GetOrCreateLocalSearchFilterManager(< / div >
< div class = "line" > < a name = "l04838" > < / a > < span class = "lineno" > 4838< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04839" > < / a > < span class = "lineno" > 4839< / span >   < span class = "keywordflow" > if< / span > (!local_search_filter_manager_) {< / div >
< div class = "line" > < a name = "l04840" > < / a > < span class = "lineno" > 4840< / span >   local_search_filter_manager_ =< / div >
< div class = "line" > < a name = "l04841" > < / a > < span class = "lineno" > 4841< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > LocalSearchFilterManager(< / div >
< div class = "line" > < a name = "l04842" > < / a > < span class = "lineno" > 4842< / span >   GetOrCreateLocalSearchFilters(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )));< / div >
< div class = "line" > < a name = "l04843" > < / a > < span class = "lineno" > 4843< / span >   }< / div >
< div class = "line" > < a name = "l04844" > < / a > < span class = "lineno" > 4844< / span >   < span class = "keywordflow" > return< / span > local_search_filter_manager_;< / div >
< div class = "line" > < a name = "l04845" > < / a > < span class = "lineno" > 4845< / span >   }< / div >
< div class = "line" > < a name = "l04846" > < / a > < span class = "lineno" > 4846< / span >   < / div >
< div class = "line" > < a name = "l04847" > < / a > < span class = "lineno" > 4847< / span >   std::vector< LocalSearchFilterManager::FilterEvent> < / div >
< div class = "line" > < a name = "l04848" > < / a > < span class = "lineno" > 4848< / span >   RoutingModel::GetOrCreateFeasibilityFilters(< / div >
< div class = "line" > < a name = "l04849" > < / a > < span class = "lineno" > 4849< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04850" > < / a > < span class = "lineno" > 4850< / span >   < span class = "keywordflow" > return< / span > GetOrCreateLocalSearchFilters(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > , < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l04851" > < / a > < span class = "lineno" > 4851< / span >   }< / div >
< div class = "line" > < a name = "l04852" > < / a > < span class = "lineno" > 4852< / span >   < / div >
< div class = "line" > < a name = "l04853" > < / a > < span class = "lineno" > 4853< / span >   LocalSearchFilterManager* RoutingModel::GetOrCreateFeasibilityFilterManager(< / div >
< div class = "line" > < a name = "l04854" > < / a > < span class = "lineno" > 4854< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04855" > < / a > < span class = "lineno" > 4855< / span >   < span class = "keywordflow" > if< / span > (!feasibility_filter_manager_) {< / div >
< div class = "line" > < a name = "l04856" > < / a > < span class = "lineno" > 4856< / span >   feasibility_filter_manager_ =< / div >
< div class = "line" > < a name = "l04857" > < / a > < span class = "lineno" > 4857< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > LocalSearchFilterManager(< / div >
< div class = "line" > < a name = "l04858" > < / a > < span class = "lineno" > 4858< / span >   GetOrCreateFeasibilityFilters(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > )));< / div >
< div class = "line" > < a name = "l04859" > < / a > < span class = "lineno" > 4859< / span >   }< / div >
< div class = "line" > < a name = "l04860" > < / a > < span class = "lineno" > 4860< / span >   < span class = "keywordflow" > return< / span > feasibility_filter_manager_;< / div >
< div class = "line" > < a name = "l04861" > < / a > < span class = "lineno" > 4861< / span >   }< / div >
< div class = "line" > < a name = "l04862" > < / a > < span class = "lineno" > 4862< / span >   < / div >
< div class = "line" > < a name = "l04863" > < / a > < span class = "lineno" > 4863< / span >   LocalSearchFilterManager*< / div >
< div class = "line" > < a name = "l04864" > < / a > < span class = "lineno" > 4864< / span >   RoutingModel::GetOrCreateStrongFeasibilityFilterManager(< / div >
< div class = "line" > < a name = "l04865" > < / a > < span class = "lineno" > 4865< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04866" > < / a > < span class = "lineno" > 4866< / span >   < span class = "keywordflow" > if< / span > (!strong_feasibility_filter_manager_) {< / div >
< div class = "line" > < a name = "l04867" > < / a > < span class = "lineno" > 4867< / span >   std::vector< LocalSearchFilterManager::FilterEvent> filters =< / div >
< div class = "line" > < a name = "l04868" > < / a > < span class = "lineno" > 4868< / span >   GetOrCreateFeasibilityFilters(< a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l04869" > < / a > < span class = "lineno" > 4869< / span >   filters.push_back({< a class = "code" href = "namespaceoperations__research.html#a6a24a85a196ecfb2b799a0409ef757c6" > MakeCPFeasibilityFilter< / a > (< span class = "keyword" > this< / span > ),< / div >
< div class = "line" > < a name = "l04870" > < / a > < span class = "lineno" > 4870< / span >   LocalSearchFilterManager::FilterEventType::kAccept});< / div >
< div class = "line" > < a name = "l04871" > < / a > < span class = "lineno" > 4871< / span >   strong_feasibility_filter_manager_ =< / div >
< div class = "line" > < a name = "l04872" > < / a > < span class = "lineno" > 4872< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > LocalSearchFilterManager(std::move(filters)));< / div >
< div class = "line" > < a name = "l04873" > < / a > < span class = "lineno" > 4873< / span >   }< / div >
< div class = "line" > < a name = "l04874" > < / a > < span class = "lineno" > 4874< / span >   < span class = "keywordflow" > return< / span > strong_feasibility_filter_manager_;< / div >
< div class = "line" > < a name = "l04875" > < / a > < span class = "lineno" > 4875< / span >   }< / div >
< div class = "line" > < a name = "l04876" > < / a > < span class = "lineno" > 4876< / span >   < / div >
< div class = "line" > < a name = "l04877" > < / a > < span class = "lineno" > 4877< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l04878" > < / a > < span class = "lineno" > 4878< / span >   < span class = "keywordtype" > bool< / span > AllTransitsPositive(< span class = "keyword" > const< / span > RoutingDimension& dimension) {< / div >
< div class = "line" > < a name = "l04879" > < / a > < span class = "lineno" > 4879< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < dimension.model()-> vehicles(); vehicle++) {< / div >
< div class = "line" > < a name = "l04880" > < / a > < span class = "lineno" > 4880< / span >   < span class = "keywordflow" > if< / span > (!dimension.AreVehicleTransitsPositive(vehicle)) {< / div >
< div class = "line" > < a name = "l04881" > < / a > < span class = "lineno" > 4881< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04882" > < / a > < span class = "lineno" > 4882< / span >   }< / div >
< div class = "line" > < a name = "l04883" > < / a > < span class = "lineno" > 4883< / span >   }< / div >
< div class = "line" > < a name = "l04884" > < / a > < span class = "lineno" > 4884< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04885" > < / a > < span class = "lineno" > 4885< / span >   }< / div >
< div class = "line" > < a name = "l04886" > < / a > < span class = "lineno" > 4886< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l04887" > < / a > < span class = "lineno" > 4887< / span >   < / div >
< div class = "line" > < a name = "l04888" > < / a > < span class = "lineno" > 4888< / span >   < span class = "keywordtype" > void< / span > RoutingModel::StoreDimensionCumulOptimizers(< / div >
< div class = "line" > < a name = "l04889" > < / a > < span class = "lineno" > 4889< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > ) {< / div >
< div class = "line" > < a name = "l04890" > < / a > < span class = "lineno" > 4890< / span >   Assignment* packed_dimensions_collector_assignment =< / div >
< div class = "line" > < a name = "l04891" > < / a > < span class = "lineno" > 4891< / span >   solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l04892" > < / a > < span class = "lineno" > 4892< / span >   packed_dimensions_collector_assignment-> AddObjective(< a class = "code" href = "classoperations__research_1_1_routing_model.html#abcbe77312783c0a5aa4926ace764533b" > CostVar< / a > ());< / div >
< div class = "line" > < a name = "l04893" > < / a > < span class = "lineno" > 4893< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_dimensions = dimensions_.size();< / div >
< div class = "line" > < a name = "l04894" > < / a > < span class = "lineno" > 4894< / span >   local_optimizer_index_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72" > resize< / a > (num_dimensions, -1);< / div >
< div class = "line" > < a name = "l04895" > < / a > < span class = "lineno" > 4895< / span >   global_optimizer_index_.< a class = "code" href = "classabsl_1_1_strong_vector.html#a4e3670a285a3642eaa07f66766cffa72" > resize< / a > (num_dimensions, -1);< / div >
< div class = "line" > < a name = "l04896" > < / a > < span class = "lineno" > 4896< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > dim = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > DimensionIndex< / a > (0); dim < num_dimensions; dim++) {< / div >
< div class = "line" > < a name = "l04897" > < / a > < span class = "lineno" > 4897< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * dimension = dimensions_[dim];< / div >
< div class = "line" > < a name = "l04898" > < / a > < span class = "lineno" > 4898< / span >   < span class = "keywordflow" > if< / span > (dimension-> global_span_cost_coefficient() > 0 ||< / div >
< div class = "line" > < a name = "l04899" > < / a > < span class = "lineno" > 4899< / span >   !dimension-> GetNodePrecedences().empty()) {< / div >
< div class = "line" > < a name = "l04900" > < / a > < span class = "lineno" > 4900< / span >   < span class = "comment" > // Use global optimizer.< / span > < / div >
< div class = "line" > < a name = "l04901" > < / a > < span class = "lineno" > 4901< / span >   global_optimizer_index_[dim] = global_dimension_optimizers_.size();< / div >
< div class = "line" > < a name = "l04902" > < / a > < span class = "lineno" > 4902< / span >   global_dimension_optimizers_.push_back(< / div >
< div class = "line" > < a name = "l04903" > < / a > < span class = "lineno" > 4903< / span >   absl::make_unique< GlobalDimensionCumulOptimizer> (dimension));< / div >
< div class = "line" > < a name = "l04904" > < / a > < span class = "lineno" > 4904< / span >   packed_dimensions_collector_assignment-> Add(dimension-> cumuls());< / div >
< div class = "line" > < a name = "l04905" > < / a > < span class = "lineno" > 4905< / span >   < span class = "keywordflow" > if< / span > (!AllTransitsPositive(*dimension)) {< / div >
< div class = "line" > < a name = "l04906" > < / a > < span class = "lineno" > 4906< / span >   dimension-> SetOffsetForGlobalOptimizer(0);< / div >
< div class = "line" > < a name = "l04907" > < / a > < span class = "lineno" > 4907< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l04908" > < / a > < span class = "lineno" > 4908< / span >   }< / div >
< div class = "line" > < a name = "l04909" > < / a > < span class = "lineno" > 4909< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > offset = < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () == 0 ? 0 : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l04910" > < / a > < span class = "lineno" > 4910< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l04911" > < / a > < span class = "lineno" > 4911< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle))-> Min(), 0);< / div >
< div class = "line" > < a name = "l04912" > < / a > < span class = "lineno" > 4912< / span >   offset =< / div >
< div class = "line" > < a name = "l04913" > < / a > < span class = "lineno" > 4913< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (offset, dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle))-> Min() - 1);< / div >
< div class = "line" > < a name = "l04914" > < / a > < span class = "lineno" > 4914< / span >   }< / div >
< div class = "line" > < a name = "l04915" > < / a > < span class = "lineno" > 4915< / span >   dimension-> SetOffsetForGlobalOptimizer(< a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "namespaceoperations__research.html#a009f247167f32509baf749083e4bc984" > Zero< / a > (), offset));< / div >
< div class = "line" > < a name = "l04916" > < / a > < span class = "lineno" > 4916< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l04917" > < / a > < span class = "lineno" > 4917< / span >   < span class = "keywordtype" > bool< / span > has_span_cost = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04918" > < / a > < span class = "lineno" > 4918< / span >   < span class = "keywordtype" > bool< / span > has_span_limit = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04919" > < / a > < span class = "lineno" > 4919< / span >   std::vector< int64> vehicle_offsets(< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ());< / div >
< div class = "line" > < a name = "l04920" > < / a > < span class = "lineno" > 4920< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l04921" > < / a > < span class = "lineno" > 4921< / span >   < span class = "keywordflow" > if< / span > (dimension-> GetSpanCostCoefficientForVehicle(vehicle) > 0) {< / div >
< div class = "line" > < a name = "l04922" > < / a > < span class = "lineno" > 4922< / span >   has_span_cost = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04923" > < / a > < span class = "lineno" > 4923< / span >   }< / div >
< div class = "line" > < a name = "l04924" > < / a > < span class = "lineno" > 4924< / span >   < span class = "keywordflow" > if< / span > (dimension-> GetSpanUpperBoundForVehicle(vehicle) < < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ) {< / div >
< div class = "line" > < a name = "l04925" > < / a > < span class = "lineno" > 4925< / span >   has_span_limit = < span class = "keyword" > true< / span > ;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l04926" > < / a > < span class = "lineno" > 4926< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l04927" > < / a > < span class = "lineno" > 4927< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle))-> Min(), 0);< / div >
< div class = "line" > < a name = "l04928" > < / a > < span class = "lineno" > 4928< / span >   vehicle_offsets[vehicle] =< / div >
< div class = "line" > < a name = "l04929" > < / a > < span class = "lineno" > 4929< / span >   dimension-> AreVehicleTransitsPositive(vehicle)< / div >
< div class = "line" > < a name = "l04930" > < / a > < span class = "lineno" > 4930< / span >   ? < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "namespaceoperations__research.html#a009f247167f32509baf749083e4bc984" > Zero< / a > (),< / div >
< div class = "line" > < a name = "l04931" > < / a > < span class = "lineno" > 4931< / span >   dimension-> CumulVar(< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle))-> Min() - 1)< / div >
< div class = "line" > < a name = "l04932" > < / a > < span class = "lineno" > 4932< / span >   : 0;< / div >
< div class = "line" > < a name = "l04933" > < / a > < span class = "lineno" > 4933< / span >   }< / div >
< div class = "line" > < a name = "l04934" > < / a > < span class = "lineno" > 4934< / span >   < span class = "keywordtype" > bool< / span > has_soft_lower_bound = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04935" > < / a > < span class = "lineno" > 4935< / span >   < span class = "keywordtype" > bool< / span > has_soft_upper_bound = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04936" > < / a > < span class = "lineno" > 4936< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < dimension-> cumuls().size(); ++i) {< / div >
< div class = "line" > < a name = "l04937" > < / a > < span class = "lineno" > 4937< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasCumulVarSoftLowerBound(i)) {< / div >
< div class = "line" > < a name = "l04938" > < / a > < span class = "lineno" > 4938< / span >   has_soft_lower_bound = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04939" > < / a > < span class = "lineno" > 4939< / span >   }< / div >
< div class = "line" > < a name = "l04940" > < / a > < span class = "lineno" > 4940< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasCumulVarSoftUpperBound(i)) {< / div >
< div class = "line" > < a name = "l04941" > < / a > < span class = "lineno" > 4941< / span >   has_soft_upper_bound = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04942" > < / a > < span class = "lineno" > 4942< / span >   }< / div >
< div class = "line" > < a name = "l04943" > < / a > < span class = "lineno" > 4943< / span >   }< / div >
< div class = "line" > < a name = "l04944" > < / a > < span class = "lineno" > 4944< / span >   < span class = "keywordtype" > int< / span > num_linear_constraints = 0;< / div >
< div class = "line" > < a name = "l04945" > < / a > < span class = "lineno" > 4945< / span >   < span class = "keywordflow" > if< / span > (has_span_cost) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04946" > < / a > < span class = "lineno" > 4946< / span >   < span class = "keywordflow" > if< / span > (has_span_limit) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04947" > < / a > < span class = "lineno" > 4947< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasSoftSpanUpperBounds()) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04948" > < / a > < span class = "lineno" > 4948< / span >   < span class = "keywordflow" > if< / span > (has_soft_lower_bound) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04949" > < / a > < span class = "lineno" > 4949< / span >   < span class = "keywordflow" > if< / span > (has_soft_upper_bound) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04950" > < / a > < span class = "lineno" > 4950< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasBreakConstraints()) ++num_linear_constraints;< / div >
< div class = "line" > < a name = "l04951" > < / a > < span class = "lineno" > 4951< / span >   < span class = "keywordflow" > if< / span > (num_linear_constraints > = 2) {< / div >
< div class = "line" > < a name = "l04952" > < / a > < span class = "lineno" > 4952< / span >   dimension-> SetVehicleOffsetsForLocalOptimizer(< / div >
< div class = "line" > < a name = "l04953" > < / a > < span class = "lineno" > 4953< / span >   std::move(vehicle_offsets));< / div >
< div class = "line" > < a name = "l04954" > < / a > < span class = "lineno" > 4954< / span >   local_optimizer_index_[dim] = local_dimension_optimizers_.size();< / div >
< div class = "line" > < a name = "l04955" > < / a > < span class = "lineno" > 4955< / span >   local_dimension_optimizers_.push_back(< / div >
< div class = "line" > < a name = "l04956" > < / a > < span class = "lineno" > 4956< / span >   absl::make_unique< LocalDimensionCumulOptimizer> (< / div >
< div class = "line" > < a name = "l04957" > < / a > < span class = "lineno" > 4957< / span >   dimension, < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .continuous_scheduling_solver()));< / div >
< div class = "line" > < a name = "l04958" > < / a > < span class = "lineno" > 4958< / span >   < span class = "keywordtype" > bool< / span > has_intervals = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l04959" > < / a > < span class = "lineno" > 4959< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > SortedDisjointIntervalList& intervals :< / div >
< div class = "line" > < a name = "l04960" > < / a > < span class = "lineno" > 4960< / span >   dimension-> forbidden_intervals()) {< / div >
< div class = "line" > < a name = "l04961" > < / a > < span class = "lineno" > 4961< / span >   < span class = "comment" > // TODO(user): Change the following test to check intervals within< / span > < / div >
< div class = "line" > < a name = "l04962" > < / a > < span class = "lineno" > 4962< / span >   < span class = "comment" > // the domain of the corresponding variables.< / span > < / div >
< div class = "line" > < a name = "l04963" > < / a > < span class = "lineno" > 4963< / span >   < span class = "keywordflow" > if< / span > (intervals.NumIntervals() > 0) {< / div >
< div class = "line" > < a name = "l04964" > < / a > < span class = "lineno" > 4964< / span >   has_intervals = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l04965" > < / a > < span class = "lineno" > 4965< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l04966" > < / a > < span class = "lineno" > 4966< / span >   }< / div >
< div class = "line" > < a name = "l04967" > < / a > < span class = "lineno" > 4967< / span >   }< / div >
< div class = "line" > < a name = "l04968" > < / a > < span class = "lineno" > 4968< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasBreakConstraints() || has_intervals) {< / div >
< div class = "line" > < a name = "l04969" > < / a > < span class = "lineno" > 4969< / span >   local_dimension_mp_optimizers_.push_back(< / div >
< div class = "line" > < a name = "l04970" > < / a > < span class = "lineno" > 4970< / span >   absl::make_unique< LocalDimensionCumulOptimizer> (< / div >
< div class = "line" > < a name = "l04971" > < / a > < span class = "lineno" > 4971< / span >   dimension, < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > .mixed_integer_scheduling_solver()));< / div >
< div class = "line" > < a name = "l04972" > < / a > < span class = "lineno" > 4972< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l04973" > < / a > < span class = "lineno" > 4973< / span >   local_dimension_mp_optimizers_.push_back(< span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l04974" > < / a > < span class = "lineno" > 4974< / span >   }< / div >
< div class = "line" > < a name = "l04975" > < / a > < span class = "lineno" > 4975< / span >   packed_dimensions_collector_assignment-> Add(dimension-> cumuls());< / div >
< div class = "line" > < a name = "l04976" > < / a > < span class = "lineno" > 4976< / span >   }< / div >
< div class = "line" > < a name = "l04977" > < / a > < span class = "lineno" > 4977< / span >   }< / div >
< div class = "line" > < a name = "l04978" > < / a > < span class = "lineno" > 4978< / span >   < a class = "code" href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > (local_dimension_mp_optimizers_.size(),< / div >
< div class = "line" > < a name = "l04979" > < / a > < span class = "lineno" > 4979< / span >   local_dimension_optimizers_.size());< / div >
< div class = "line" > < a name = "l04980" > < / a > < span class = "lineno" > 4980< / span >   }< / div >
< div class = "line" > < a name = "l04981" > < / a > < span class = "lineno" > 4981< / span >   < / div >
< div class = "line" > < a name = "l04982" > < / a > < span class = "lineno" > 4982< / span >   < span class = "comment" > // NOTE(b/129252839): We also add all other extra variables to the< / span > < / div >
< div class = "line" > < a name = "l04983" > < / a > < span class = "lineno" > 4983< / span >   < span class = "comment" > // packed_dimensions_collector_assignment to make sure the necessary< / span > < / div >
< div class = "line" > < a name = "l04984" > < / a > < span class = "lineno" > 4984< / span >   < span class = "comment" > // propagations on these variables after packing are correctly stored.< / span > < / div >
< div class = "line" > < a name = "l04985" > < / a > < span class = "lineno" > 4985< / span >   < span class = "keywordflow" > for< / span > (IntVar* < span class = "keyword" > const< / span > extra_var : extra_vars_) {< / div >
< div class = "line" > < a name = "l04986" > < / a > < span class = "lineno" > 4986< / span >   packed_dimensions_collector_assignment-> Add(extra_var);< / div >
< div class = "line" > < a name = "l04987" > < / a > < span class = "lineno" > 4987< / span >   }< / div >
< div class = "line" > < a name = "l04988" > < / a > < span class = "lineno" > 4988< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* < span class = "keyword" > const< / span > extra_interval : extra_intervals_) {< / div >
< div class = "line" > < a name = "l04989" > < / a > < span class = "lineno" > 4989< / span >   packed_dimensions_collector_assignment-> Add(extra_interval);< / div >
< div class = "line" > < a name = "l04990" > < / a > < span class = "lineno" > 4990< / span >   }< / div >
< div class = "line" > < a name = "l04991" > < / a > < span class = "lineno" > 4991< / span >   < / div >
< div class = "line" > < a name = "l04992" > < / a > < span class = "lineno" > 4992< / span >   packed_dimensions_assignment_collector_ = solver_-> MakeFirstSolutionCollector(< / div >
< div class = "line" > < a name = "l04993" > < / a > < span class = "lineno" > 4993< / span >   packed_dimensions_collector_assignment);< / div >
< div class = "line" > < a name = "l04994" > < / a > < span class = "lineno" > 4994< / span >   }< / div >
< div class = "line" > < a name = "l04995" > < / a > < span class = "lineno" > 4995< / span >   < / div >
< div class = "line" > < a name = "l04996" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13" > 4996< / a > < / span >   std::vector< RoutingDimension*> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13" > RoutingModel::GetDimensionsWithSoftOrSpanCosts< / a > ()< span class = "keyword" > < / span > < / div >
< div class = "line" > < a name = "l04997" > < / a > < span class = "lineno" > 4997< / span >   < span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l04998" > < / a > < span class = "lineno" > 4998< / span >   std::vector< RoutingDimension*> dimensions;< / div >
< div class = "line" > < a name = "l04999" > < / a > < span class = "lineno" > 4999< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l05000" > < / a > < span class = "lineno" > 5000< / span >   < span class = "keywordtype" > bool< / span > has_soft_or_span_cost = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l05001" > < / a > < span class = "lineno" > 5001< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++vehicle) {< / div >
< div class = "line" > < a name = "l05002" > < / a > < span class = "lineno" > 5002< / span >   < span class = "keywordflow" > if< / span > (dimension-> GetSpanCostCoefficientForVehicle(vehicle) > 0) {< / div >
< div class = "line" > < a name = "l05003" > < / a > < span class = "lineno" > 5003< / span >   has_soft_or_span_cost = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l05004" > < / a > < span class = "lineno" > 5004< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05005" > < / a > < span class = "lineno" > 5005< / span >   }< / div >
< div class = "line" > < a name = "l05006" > < / a > < span class = "lineno" > 5006< / span >   }< / div >
< div class = "line" > < a name = "l05007" > < / a > < span class = "lineno" > 5007< / span >   < span class = "keywordflow" > if< / span > (!has_soft_or_span_cost) {< / div >
< div class = "line" > < a name = "l05008" > < / a > < span class = "lineno" > 5008< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < dimension-> cumuls().size(); ++i) {< / div >
< div class = "line" > < a name = "l05009" > < / a > < span class = "lineno" > 5009< / span >   < span class = "keywordflow" > if< / span > (dimension-> HasCumulVarSoftUpperBound(i) ||< / div >
< div class = "line" > < a name = "l05010" > < / a > < span class = "lineno" > 5010< / span >   dimension-> HasCumulVarSoftLowerBound(i)) {< / div >
< div class = "line" > < a name = "l05011" > < / a > < span class = "lineno" > 5011< / span >   has_soft_or_span_cost = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l05012" > < / a > < span class = "lineno" > 5012< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05013" > < / a > < span class = "lineno" > 5013< / span >   }< / div >
< div class = "line" > < a name = "l05014" > < / a > < span class = "lineno" > 5014< / span >   }< / div >
< div class = "line" > < a name = "l05015" > < / a > < span class = "lineno" > 5015< / span >   }< / div >
< div class = "line" > < a name = "l05016" > < / a > < span class = "lineno" > 5016< / span >   < span class = "keywordflow" > if< / span > (has_soft_or_span_cost) dimensions.push_back(dimension);< / div >
< div class = "line" > < a name = "l05017" > < / a > < span class = "lineno" > 5017< / span >   }< / div >
< div class = "line" > < a name = "l05018" > < / a > < span class = "lineno" > 5018< / span >   < span class = "keywordflow" > return< / span > dimensions;< / div >
< div class = "line" > < a name = "l05019" > < / a > < span class = "lineno" > 5019< / span >   }< / div >
< div class = "line" > < a name = "l05020" > < / a > < span class = "lineno" > 5020< / span >   < / div >
< div class = "line" > < a name = "l05021" > < / a > < span class = "lineno" > 5021< / span >   < a class = "code" href = "classoperations__research_1_1_decision_builder.html" > DecisionBuilder< / a > *< / div >
< div class = "line" > < a name = "l05022" > < / a > < span class = "lineno" > 5022< / span >   RoutingModel::CreateFinalizerForMinimizedAndMaximizedVariables() {< / div >
< div class = "line" > < a name = "l05023" > < / a > < span class = "lineno" > 5023< / span >   std::stable_sort(finalizer_variable_cost_pairs_.begin(),< / div >
< div class = "line" > < a name = "l05024" > < / a > < span class = "lineno" > 5024< / span >   finalizer_variable_cost_pairs_.end(),< / div >
< div class = "line" > < a name = "l05025" > < / a > < span class = "lineno" > 5025< / span >   [](< span class = "keyword" > const< / span > std::pair< IntVar*, int64> & var_cost1,< / div >
< div class = "line" > < a name = "l05026" > < / a > < span class = "lineno" > 5026< / span >   < span class = "keyword" > const< / span > std::pair< IntVar*, int64> & var_cost2) {< / div >
< div class = "line" > < a name = "l05027" > < / a > < span class = "lineno" > 5027< / span >   return var_cost1.second > var_cost2.second;< / div >
< div class = "line" > < a name = "l05028" > < / a > < span class = "lineno" > 5028< / span >   });< / div >
< div class = "line" > < a name = "l05029" > < / a > < span class = "lineno" > 5029< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_variables = finalizer_variable_cost_pairs_.size() +< / div >
< div class = "line" > < a name = "l05030" > < / a > < span class = "lineno" > 5030< / span >   finalizer_variable_target_pairs_.size();< / div >
< div class = "line" > < a name = "l05031" > < / a > < span class = "lineno" > 5031< / span >   std::vector< IntVar*> variables;< / div >
< div class = "line" > < a name = "l05032" > < / a > < span class = "lineno" > 5032< / span >   std::vector< int64> targets;< / div >
< div class = "line" > < a name = "l05033" > < / a > < span class = "lineno" > 5033< / span >   variables.reserve(num_variables);< / div >
< div class = "line" > < a name = "l05034" > < / a > < span class = "lineno" > 5034< / span >   targets.reserve(num_variables);< / div >
< div class = "line" > < a name = "l05035" > < / a > < span class = "lineno" > 5035< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & variable_cost : finalizer_variable_cost_pairs_) {< / div >
< div class = "line" > < a name = "l05036" > < / a > < span class = "lineno" > 5036< / span >   variables.push_back(variable_cost.first);< / div >
< div class = "line" > < a name = "l05037" > < / a > < span class = "lineno" > 5037< / span >   targets.push_back(< a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l05038" > < / a > < span class = "lineno" > 5038< / span >   }< / div >
< div class = "line" > < a name = "l05039" > < / a > < span class = "lineno" > 5039< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & variable_target : finalizer_variable_target_pairs_) {< / div >
< div class = "line" > < a name = "l05040" > < / a > < span class = "lineno" > 5040< / span >   variables.push_back(variable_target.first);< / div >
< div class = "line" > < a name = "l05041" > < / a > < span class = "lineno" > 5041< / span >   targets.push_back(variable_target.second);< / div >
< div class = "line" > < a name = "l05042" > < / a > < span class = "lineno" > 5042< / span >   }< / div >
< div class = "line" > < a name = "l05043" > < / a > < span class = "lineno" > 5043< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > MakeSetValuesFromTargets< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > (), std::move(variables),< / div >
< div class = "line" > < a name = "l05044" > < / a > < span class = "lineno" > 5044< / span >   std::move(targets));< / div >
< div class = "line" > < a name = "l05045" > < / a > < span class = "lineno" > 5045< / span >   }< / div >
< div class = "line" > < a name = "l05046" > < / a > < span class = "lineno" > 5046< / span >   < / div >
< div class = "line" > < a name = "l05047" > < / a > < span class = "lineno" > 5047< / span >   DecisionBuilder* RoutingModel::CreateSolutionFinalizer(SearchLimit* lns_limit) {< / div >
< div class = "line" > < a name = "l05048" > < / a > < span class = "lineno" > 5048< / span >   std::vector< DecisionBuilder*> decision_builders;< / div >
< div class = "line" > < a name = "l05049" > < / a > < span class = "lineno" > 5049< / span >   decision_builders.push_back(solver_-> MakePhase(< / div >
< div class = "line" > < a name = "l05050" > < / a > < span class = "lineno" > 5050< / span >   nexts_, < a class = "code" href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9" > Solver::CHOOSE_FIRST_UNBOUND< / a > , < a class = "code" href = "classoperations__research_1_1_solver.html#a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886" > Solver::ASSIGN_MIN_VALUE< / a > ));< / div >
< div class = "line" > < a name = "l05051" > < / a > < span class = "lineno" > 5051< / span >   < / div >
< div class = "line" > < a name = "l05052" > < / a > < span class = "lineno" > 5052< / span >   < span class = "keywordflow" > if< / span > (!local_dimension_optimizers_.empty()) {< / div >
< div class = "line" > < a name = "l05053" > < / a > < span class = "lineno" > 5053< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l05054" > < / a > < span class = "lineno" > 5054< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SetCumulsFromLocalDimensionCosts(< / div >
< div class = "line" > < a name = "l05055" > < / a > < span class = "lineno" > 5055< / span >   & local_dimension_optimizers_, & local_dimension_mp_optimizers_,< / div >
< div class = "line" > < a name = "l05056" > < / a > < span class = "lineno" > 5056< / span >   lns_limit)));< / div >
< div class = "line" > < a name = "l05057" > < / a > < span class = "lineno" > 5057< / span >   }< / div >
< div class = "line" > < a name = "l05058" > < / a > < span class = "lineno" > 5058< / span >   < span class = "keywordflow" > if< / span > (!global_dimension_optimizers_.empty()) {< / div >
< div class = "line" > < a name = "l05059" > < / a > < span class = "lineno" > 5059< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l05060" > < / a > < span class = "lineno" > 5060< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SetCumulsFromGlobalDimensionCosts(< / div >
< div class = "line" > < a name = "l05061" > < / a > < span class = "lineno" > 5061< / span >   & global_dimension_optimizers_, lns_limit)));< / div >
< div class = "line" > < a name = "l05062" > < / a > < span class = "lineno" > 5062< / span >   }< / div >
< div class = "line" > < a name = "l05063" > < / a > < span class = "lineno" > 5063< / span >   decision_builders.push_back(< / div >
< div class = "line" > < a name = "l05064" > < / a > < span class = "lineno" > 5064< / span >   CreateFinalizerForMinimizedAndMaximizedVariables());< / div >
< div class = "line" > < a name = "l05065" > < / a > < span class = "lineno" > 5065< / span >   < / div >
< div class = "line" > < a name = "l05066" > < / a > < span class = "lineno" > 5066< / span >   < span class = "keywordflow" > return< / span > solver_-> Compose(decision_builders);< / div >
< div class = "line" > < a name = "l05067" > < / a > < span class = "lineno" > 5067< / span >   }< / div >
< div class = "line" > < a name = "l05068" > < / a > < span class = "lineno" > 5068< / span >   < / div >
< div class = "line" > < a name = "l05069" > < / a > < span class = "lineno" > 5069< / span >   < span class = "keywordtype" > void< / span > RoutingModel::CreateFirstSolutionDecisionBuilders(< / div >
< div class = "line" > < a name = "l05070" > < / a > < span class = "lineno" > 5070< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05071" > < / a > < span class = "lineno" > 5071< / span >   first_solution_decision_builders_.resize(< / div >
< div class = "line" > < a name = "l05072" > < / a > < span class = "lineno" > 5072< / span >   < a class = "code" href = "namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a" > FirstSolutionStrategy_Value_Value_ARRAYSIZE< / a > , < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05073" > < / a > < span class = "lineno" > 5073< / span >   first_solution_filtered_decision_builders_.resize(< / div >
< div class = "line" > < a name = "l05074" > < / a > < span class = "lineno" > 5074< / span >   < a class = "code" href = "namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a" > FirstSolutionStrategy_Value_Value_ARRAYSIZE< / a > , < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05075" > < / a > < span class = "lineno" > 5075< / span >   DecisionBuilder* < span class = "keyword" > const< / span > finalize_solution =< / div >
< div class = "line" > < a name = "l05076" > < / a > < span class = "lineno" > 5076< / span >   CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit());< / div >
< div class = "line" > < a name = "l05077" > < / a > < span class = "lineno" > 5077< / span >   < span class = "comment" > // Default heuristic< / span > < / div >
< div class = "line" > < a name = "l05078" > < / a > < span class = "lineno" > 5078< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05079" > < / a > < span class = "lineno" > 5079< / span >   [FirstSolutionStrategy::FIRST_UNBOUND_MIN_VALUE] = finalize_solution;< / div >
< div class = "line" > < a name = "l05080" > < / a > < span class = "lineno" > 5080< / span >   < span class = "comment" > // Global cheapest addition heuristic.< / span > < / div >
< div class = "line" > < a name = "l05081" > < / a > < span class = "lineno" > 5081< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05082" > < / a > < span class = "lineno" > 5082< / span >   [FirstSolutionStrategy::GLOBAL_CHEAPEST_ARC] = solver_-> MakePhase(< / div >
< div class = "line" > < a name = "l05083" > < / a > < span class = "lineno" > 5083< / span >   nexts_,< / div >
< div class = "line" > < a name = "l05084" > < / a > < span class = "lineno" > 5084< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > GetArcCostForFirstSolution< / a > (i, j); },< / div >
< div class = "line" > < a name = "l05085" > < / a > < span class = "lineno" > 5085< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1" > Solver::CHOOSE_STATIC_GLOBAL_BEST< / a > );< / div >
< div class = "line" > < a name = "l05086" > < / a > < span class = "lineno" > 5086< / span >   < span class = "comment" > // Cheapest addition heuristic.< / span > < / div >
< div class = "line" > < a name = "l05087" > < / a > < span class = "lineno" > 5087< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#abb24034fec2804ac3c0172f043087321" > Solver::IndexEvaluator2< / a > eval = [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) {< / div >
< div class = "line" > < a name = "l05088" > < / a > < span class = "lineno" > 5088< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > GetArcCostForFirstSolution< / a > (i, j);< / div >
< div class = "line" > < a name = "l05089" > < / a > < span class = "lineno" > 5089< / span >   };< / div >
< div class = "line" > < a name = "l05090" > < / a > < span class = "lineno" > 5090< / span >   first_solution_decision_builders_[FirstSolutionStrategy::LOCAL_CHEAPEST_ARC] =< / div >
< div class = "line" > < a name = "l05091" > < / a > < span class = "lineno" > 5091< / span >   solver_-> MakePhase(nexts_, < a class = "code" href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9" > Solver::CHOOSE_FIRST_UNBOUND< / a > , eval);< / div >
< div class = "line" > < a name = "l05092" > < / a > < span class = "lineno" > 5092< / span >   < span class = "comment" > // Path-based cheapest addition heuristic.< / span > < / div >
< div class = "line" > < a name = "l05093" > < / a > < span class = "lineno" > 5093< / span >   first_solution_decision_builders_[FirstSolutionStrategy::PATH_CHEAPEST_ARC] =< / div >
< div class = "line" > < a name = "l05094" > < / a > < span class = "lineno" > 5094< / span >   solver_-> MakePhase(nexts_, < a class = "code" href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d" > Solver::CHOOSE_PATH< / a > , eval);< / div >
< div class = "line" > < a name = "l05095" > < / a > < span class = "lineno" > 5095< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.use_unfiltered_first_solution_strategy()) {< / div >
< div class = "line" > < a name = "l05096" > < / a > < span class = "lineno" > 5096< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05097" > < / a > < span class = "lineno" > 5097< / span >   [FirstSolutionStrategy::PATH_CHEAPEST_ARC] =< / div >
< div class = "line" > < a name = "l05098" > < / a > < span class = "lineno" > 5098< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05099" > < / a > < span class = "lineno" > 5099< / span >   absl::make_unique< EvaluatorCheapestAdditionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05100" > < / a > < span class = "lineno" > 5100< / span >   < span class = "keyword" > this< / span > ,< / div >
< div class = "line" > < a name = "l05101" > < / a > < span class = "lineno" > 5101< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) {< / div >
< div class = "line" > < a name = "l05102" > < / a > < span class = "lineno" > 5102< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > GetArcCostForFirstSolution< / a > (i, j);< / div >
< div class = "line" > < a name = "l05103" > < / a > < span class = "lineno" > 5103< / span >   },< / div >
< div class = "line" > < a name = "l05104" > < / a > < span class = "lineno" > 5104< / span >   GetOrCreateFeasibilityFilterManager(search_parameters))));< / div >
< div class = "line" > < a name = "l05105" > < / a > < span class = "lineno" > 5105< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05106" > < / a > < span class = "lineno" > 5106< / span >   [FirstSolutionStrategy::PATH_CHEAPEST_ARC] =< / div >
< div class = "line" > < a name = "l05107" > < / a > < span class = "lineno" > 5107< / span >   solver_-> Try(first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05108" > < / a > < span class = "lineno" > 5108< / span >   [FirstSolutionStrategy::PATH_CHEAPEST_ARC],< / div >
< div class = "line" > < a name = "l05109" > < / a > < span class = "lineno" > 5109< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05110" > < / a > < span class = "lineno" > 5110< / span >   [FirstSolutionStrategy::PATH_CHEAPEST_ARC]);< / div >
< div class = "line" > < a name = "l05111" > < / a > < span class = "lineno" > 5111< / span >   }< / div >
< div class = "line" > < a name = "l05112" > < / a > < span class = "lineno" > 5112< / span >   < span class = "comment" > // Path-based most constrained arc addition heuristic.< / span > < / div >
< div class = "line" > < a name = "l05113" > < / a > < span class = "lineno" > 5113< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html#a3094f1982f455fd97342c64b7c0b3ccf" > Solver::VariableValueComparator< / a > comp = [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > k) {< / div >
< div class = "line" > < a name = "l05114" > < / a > < span class = "lineno" > 5114< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1048b3f7ef92f0d7747f93c8586ea1cc" > ArcIsMoreConstrainedThanArc< / a > (i, j, k);< / div >
< div class = "line" > < a name = "l05115" > < / a > < span class = "lineno" > 5115< / span >   };< / div >
< div class = "line" > < a name = "l05116" > < / a > < span class = "lineno" > 5116< / span >   < / div >
< div class = "line" > < a name = "l05117" > < / a > < span class = "lineno" > 5117< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05118" > < / a > < span class = "lineno" > 5118< / span >   [FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC] =< / div >
< div class = "line" > < a name = "l05119" > < / a > < span class = "lineno" > 5119< / span >   solver_-> MakePhase(nexts_, < a class = "code" href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d" > Solver::CHOOSE_PATH< / a > , comp);< / div >
< div class = "line" > < a name = "l05120" > < / a > < span class = "lineno" > 5120< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.use_unfiltered_first_solution_strategy()) {< / div >
< div class = "line" > < a name = "l05121" > < / a > < span class = "lineno" > 5121< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05122" > < / a > < span class = "lineno" > 5122< / span >   [FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC] =< / div >
< div class = "line" > < a name = "l05123" > < / a > < span class = "lineno" > 5123< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05124" > < / a > < span class = "lineno" > 5124< / span >   absl::make_unique< ComparatorCheapestAdditionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05125" > < / a > < span class = "lineno" > 5125< / span >   < span class = "keyword" > this< / span > , comp,< / div >
< div class = "line" > < a name = "l05126" > < / a > < span class = "lineno" > 5126< / span >   GetOrCreateFeasibilityFilterManager(search_parameters))));< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05127" > < / a > < span class = "lineno" > 5127< / span >   first_solution_decision_builders_< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05128" > < / a > < span class = "lineno" > 5128< / span >   [FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC] = solver_-> Try(< / div >
< div class = "line" > < a name = "l05129" > < / a > < span class = "lineno" > 5129< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05130" > < / a > < span class = "lineno" > 5130< / span >   [FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC],< / div >
< div class = "line" > < a name = "l05131" > < / a > < span class = "lineno" > 5131< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05132" > < / a > < span class = "lineno" > 5132< / span >   [FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC]);< / div >
< div class = "line" > < a name = "l05133" > < / a > < span class = "lineno" > 5133< / span >   }< / div >
< div class = "line" > < a name = "l05134" > < / a > < span class = "lineno" > 5134< / span >   < span class = "comment" > // Evaluator-based path heuristic.< / span > < / div >
< div class = "line" > < a name = "l05135" > < / a > < span class = "lineno" > 5135< / span >   < span class = "keywordflow" > if< / span > (first_solution_evaluator_ != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l05136" > < / a > < span class = "lineno" > 5136< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05137" > < / a > < span class = "lineno" > 5137< / span >   [FirstSolutionStrategy::EVALUATOR_STRATEGY] = solver_-> MakePhase(< / div >
< div class = "line" > < a name = "l05138" > < / a > < span class = "lineno" > 5138< / span >   nexts_, < a class = "code" href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d" > Solver::CHOOSE_PATH< / a > , first_solution_evaluator_);< / div >
< div class = "line" > < a name = "l05139" > < / a > < span class = "lineno" > 5139< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05140" > < / a > < span class = "lineno" > 5140< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05141" > < / a > < span class = "lineno" > 5141< / span >   [FirstSolutionStrategy::EVALUATOR_STRATEGY] = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l05142" > < / a > < span class = "lineno" > 5142< / span >   }< / div >
< div class = "line" > < a name = "l05143" > < / a > < span class = "lineno" > 5143< / span >   < span class = "comment" > // All unperformed heuristic.< / span > < / div >
< div class = "line" > < a name = "l05144" > < / a > < span class = "lineno" > 5144< / span >   first_solution_decision_builders_[FirstSolutionStrategy::ALL_UNPERFORMED] =< / div >
< div class = "line" > < a name = "l05145" > < / a > < span class = "lineno" > 5145< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > AllUnperformed(< span class = "keyword" > this< / span > ));< / div >
< div class = "line" > < a name = "l05146" > < / a > < span class = "lineno" > 5146< / span >   < span class = "comment" > // Best insertion heuristic.< / span > < / div >
< div class = "line" > < a name = "l05147" > < / a > < span class = "lineno" > 5147< / span >   RegularLimit* < span class = "keyword" > const< / span > ls_limit =< / div >
< div class = "line" > < a name = "l05148" > < / a > < span class = "lineno" > 5148< / span >   solver_-> MakeLimit(GetTimeLimit(search_parameters), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ,< / div >
< div class = "line" > < a name = "l05149" > < / a > < span class = "lineno" > 5149< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , < span class = "comment" > /*smart_time_check=*/< / span > < span class = "keyword" > true< / span > );< / div >
< div class = "line" > < a name = "l05150" > < / a > < span class = "lineno" > 5150< / span >   DecisionBuilder* < span class = "keyword" > const< / span > finalize = solver_-> MakeSolveOnce(< / div >
< div class = "line" > < a name = "l05151" > < / a > < span class = "lineno" > 5151< / span >   finalize_solution, GetOrCreateLargeNeighborhoodSearchLimit());< / div >
< div class = "line" > < a name = "l05152" > < / a > < span class = "lineno" > 5152< / span >   LocalSearchPhaseParameters* < span class = "keyword" > const< / span > insertion_parameters =< / div >
< div class = "line" > < a name = "l05153" > < / a > < span class = "lineno" > 5153< / span >   solver_-> MakeLocalSearchPhaseParameters(< / div >
< div class = "line" > < a name = "l05154" > < / a > < span class = "lineno" > 5154< / span >   < span class = "keyword" > nullptr< / span > , CreateInsertionOperator(), finalize, ls_limit,< / div >
< div class = "line" > < a name = "l05155" > < / a > < span class = "lineno" > 5155< / span >   GetOrCreateLocalSearchFilterManager(search_parameters));< / div >
< div class = "line" > < a name = "l05156" > < / a > < span class = "lineno" > 5156< / span >   std::vector< IntVar*> decision_vars = nexts_;< / div >
< div class = "line" > < a name = "l05157" > < / a > < span class = "lineno" > 5157< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l05158" > < / a > < span class = "lineno" > 5158< / span >   decision_vars.insert(decision_vars.end(), vehicle_vars_.begin(),< / div >
< div class = "line" > < a name = "l05159" > < / a > < span class = "lineno" > 5159< / span >   vehicle_vars_.end());< / div >
< div class = "line" > < a name = "l05160" > < / a > < span class = "lineno" > 5160< / span >   }< / div >
< div class = "line" > < a name = "l05161" > < / a > < span class = "lineno" > 5161< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > optimization_step = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< / div >
< div class = "line" > < a name = "l05162" > < / a > < span class = "lineno" > 5162< / span >   < a class = "code" href = "classoperations__research_1_1_math_util.html#aec89d533eea50ada5268533f068f97ec" > MathUtil::FastInt64Round< / a > (search_parameters.optimization_step()), < a class = "code" href = "namespaceoperations__research.html#aa96bb5a28dd9c1ccc864b1587e8e1a98" > One< / a > ());< / div >
< div class = "line" > < a name = "l05163" > < / a > < span class = "lineno" > 5163< / span >   first_solution_decision_builders_[FirstSolutionStrategy::BEST_INSERTION] =< / div >
< div class = "line" > < a name = "l05164" > < / a > < span class = "lineno" > 5164< / span >   solver_-> MakeNestedOptimize(< / div >
< div class = "line" > < a name = "l05165" > < / a > < span class = "lineno" > 5165< / span >   solver_-> MakeLocalSearchPhase(< / div >
< div class = "line" > < a name = "l05166" > < / a > < span class = "lineno" > 5166< / span >   decision_vars, solver_-> RevAlloc(< span class = "keyword" > new< / span > AllUnperformed(< span class = "keyword" > this< / span > )),< / div >
< div class = "line" > < a name = "l05167" > < / a > < span class = "lineno" > 5167< / span >   insertion_parameters),< / div >
< div class = "line" > < a name = "l05168" > < / a > < span class = "lineno" > 5168< / span >   GetOrCreateAssignment(), < span class = "keyword" > false< / span > , optimization_step);< / div >
< div class = "line" > < a name = "l05169" > < / a > < span class = "lineno" > 5169< / span >   first_solution_decision_builders_[FirstSolutionStrategy::BEST_INSERTION] =< / div >
< div class = "line" > < a name = "l05170" > < / a > < span class = "lineno" > 5170< / span >   solver_-> Compose(first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05171" > < / a > < span class = "lineno" > 5171< / span >   [FirstSolutionStrategy::BEST_INSERTION],< / div >
< div class = "line" > < a name = "l05172" > < / a > < span class = "lineno" > 5172< / span >   finalize);< / div >
< div class = "line" > < a name = "l05173" > < / a > < span class = "lineno" > 5173< / span >   < / div >
< div class = "line" > < a name = "l05174" > < / a > < span class = "lineno" > 5174< / span >   < span class = "comment" > // Parallel/Sequential Global cheapest insertion< / span > < / div >
< div class = "line" > < a name = "l05175" > < / a > < span class = "lineno" > 5175< / span >   GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters< / div >
< div class = "line" > < a name = "l05176" > < / a > < span class = "lineno" > 5176< / span >   gci_parameters;< / div >
< div class = "line" > < a name = "l05177" > < / a > < span class = "lineno" > 5177< / span >   gci_parameters.is_sequential = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l05178" > < / a > < span class = "lineno" > 5178< / span >   gci_parameters.farthest_seeds_ratio =< / div >
< div class = "line" > < a name = "l05179" > < / a > < span class = "lineno" > 5179< / span >   search_parameters.cheapest_insertion_farthest_seeds_ratio();< / div >
< div class = "line" > < a name = "l05180" > < / a > < span class = "lineno" > 5180< / span >   gci_parameters.neighbors_ratio =< / div >
< div class = "line" > < a name = "l05181" > < / a > < span class = "lineno" > 5181< / span >   search_parameters.cheapest_insertion_first_solution_neighbors_ratio();< / div >
< div class = "line" > < a name = "l05182" > < / a > < span class = "lineno" > 5182< / span >   gci_parameters.min_neighbors =< / div >
< div class = "line" > < a name = "l05183" > < / a > < span class = "lineno" > 5183< / span >   search_parameters.cheapest_insertion_first_solution_min_neighbors();< / div >
< div class = "line" > < a name = "l05184" > < / a > < span class = "lineno" > 5184< / span >   gci_parameters.use_neighbors_ratio_for_initialization = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l05185" > < / a > < span class = "lineno" > 5185< / span >   gci_parameters.add_unperformed_entries =< / div >
< div class = "line" > < a name = "l05186" > < / a > < span class = "lineno" > 5186< / span >   search_parameters.cheapest_insertion_add_unperformed_entries();< / div >
< div class = "line" > < a name = "l05187" > < / a > < span class = "lineno" > 5187< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > bool< / span > is_sequential : {< span class = "keyword" > false< / span > , < span class = "keyword" > true< / span > }) {< / div >
< div class = "line" > < a name = "l05188" > < / a > < span class = "lineno" > 5188< / span >   < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > FirstSolutionStrategy::Value< / a > first_solution_strategy =< / div >
< div class = "line" > < a name = "l05189" > < / a > < span class = "lineno" > 5189< / span >   is_sequential ? FirstSolutionStrategy::SEQUENTIAL_CHEAPEST_INSERTION< / div >
< div class = "line" > < a name = "l05190" > < / a > < span class = "lineno" > 5190< / span >   : FirstSolutionStrategy::PARALLEL_CHEAPEST_INSERTION;< / div >
< div class = "line" > < a name = "l05191" > < / a > < span class = "lineno" > 5191< / span >   gci_parameters.is_sequential = is_sequential;< / div >
< div class = "line" > < a name = "l05192" > < / a > < span class = "lineno" > 5192< / span >   < / div >
< div class = "line" > < a name = "l05193" > < / a > < span class = "lineno" > 5193< / span >   first_solution_filtered_decision_builders_[first_solution_strategy] =< / div >
< div class = "line" > < a name = "l05194" > < / a > < span class = "lineno" > 5194< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05195" > < / a > < span class = "lineno" > 5195< / span >   absl::make_unique< GlobalCheapestInsertionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05196" > < / a > < span class = "lineno" > 5196< / span >   < span class = "keyword" > this< / span > ,< / div >
< div class = "line" > < a name = "l05197" > < / a > < span class = "lineno" > 5197< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l05198" > < / a > < span class = "lineno" > 5198< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, vehicle);< / div >
< div class = "line" > < a name = "l05199" > < / a > < span class = "lineno" > 5199< / span >   },< / div >
< div class = "line" > < a name = "l05200" > < / a > < span class = "lineno" > 5200< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i) { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > UnperformedPenaltyOrValue< / a > (0, i); },< / div >
< div class = "line" > < a name = "l05201" > < / a > < span class = "lineno" > 5201< / span >   GetOrCreateFeasibilityFilterManager(search_parameters),< / div >
< div class = "line" > < a name = "l05202" > < / a > < span class = "lineno" > 5202< / span >   gci_parameters)));< / div >
< div class = "line" > < a name = "l05203" > < / a > < span class = "lineno" > 5203< / span >   IntVarFilteredDecisionBuilder* < span class = "keyword" > const< / span > strong_gci =< / div >
< div class = "line" > < a name = "l05204" > < / a > < span class = "lineno" > 5204< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05205" > < / a > < span class = "lineno" > 5205< / span >   absl::make_unique< GlobalCheapestInsertionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05206" > < / a > < span class = "lineno" > 5206< / span >   < span class = "keyword" > this< / span > ,< / div >
< div class = "line" > < a name = "l05207" > < / a > < span class = "lineno" > 5207< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l05208" > < / a > < span class = "lineno" > 5208< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, vehicle);< / div >
< div class = "line" > < a name = "l05209" > < / a > < span class = "lineno" > 5209< / span >   },< / div >
< div class = "line" > < a name = "l05210" > < / a > < span class = "lineno" > 5210< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i) { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > UnperformedPenaltyOrValue< / a > (0, i); },< / div >
< div class = "line" > < a name = "l05211" > < / a > < span class = "lineno" > 5211< / span >   GetOrCreateStrongFeasibilityFilterManager(search_parameters),< / div >
< div class = "line" > < a name = "l05212" > < / a > < span class = "lineno" > 5212< / span >   gci_parameters)));< / div >
< div class = "line" > < a name = "l05213" > < / a > < span class = "lineno" > 5213< / span >   first_solution_decision_builders_[first_solution_strategy] = solver_-> Try(< / div >
< div class = "line" > < a name = "l05214" > < / a > < span class = "lineno" > 5214< / span >   first_solution_filtered_decision_builders_[first_solution_strategy],< / div >
< div class = "line" > < a name = "l05215" > < / a > < span class = "lineno" > 5215< / span >   solver_-> Try(strong_gci, first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05216" > < / a > < span class = "lineno" > 5216< / span >   [FirstSolutionStrategy::BEST_INSERTION]));< / div >
< div class = "line" > < a name = "l05217" > < / a > < span class = "lineno" > 5217< / span >   }< / div >
< div class = "line" > < a name = "l05218" > < / a > < span class = "lineno" > 5218< / span >   < / div >
< div class = "line" > < a name = "l05219" > < / a > < span class = "lineno" > 5219< / span >   < span class = "comment" > // Local cheapest insertion< / span > < / div >
< div class = "line" > < a name = "l05220" > < / a > < span class = "lineno" > 5220< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05221" > < / a > < span class = "lineno" > 5221< / span >   [FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION] =< / div >
< div class = "line" > < a name = "l05222" > < / a > < span class = "lineno" > 5222< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05223" > < / a > < span class = "lineno" > 5223< / span >   absl::make_unique< LocalCheapestInsertionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05224" > < / a > < span class = "lineno" > 5224< / span >   < span class = "keyword" > this< / span > ,< / div >
< div class = "line" > < a name = "l05225" > < / a > < span class = "lineno" > 5225< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l05226" > < / a > < span class = "lineno" > 5226< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, vehicle);< / div >
< div class = "line" > < a name = "l05227" > < / a > < span class = "lineno" > 5227< / span >   },< / div >
< div class = "line" > < a name = "l05228" > < / a > < span class = "lineno" > 5228< / span >   GetOrCreateFeasibilityFilterManager(search_parameters))));< / div >
< div class = "line" > < a name = "l05229" > < / a > < span class = "lineno" > 5229< / span >   IntVarFilteredDecisionBuilder* < span class = "keyword" > const< / span > strong_lci =< / div >
< div class = "line" > < a name = "l05230" > < / a > < span class = "lineno" > 5230< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05231" > < / a > < span class = "lineno" > 5231< / span >   absl::make_unique< LocalCheapestInsertionFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05232" > < / a > < span class = "lineno" > 5232< / span >   < span class = "keyword" > this< / span > ,< / div >
< div class = "line" > < a name = "l05233" > < / a > < span class = "lineno" > 5233< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l05234" > < / a > < span class = "lineno" > 5234< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, vehicle);< / div >
< div class = "line" > < a name = "l05235" > < / a > < span class = "lineno" > 5235< / span >   },< / div >
< div class = "line" > < a name = "l05236" > < / a > < span class = "lineno" > 5236< / span >   GetOrCreateStrongFeasibilityFilterManager(search_parameters))));< / div >
< div class = "line" > < a name = "l05237" > < / a > < span class = "lineno" > 5237< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05238" > < / a > < span class = "lineno" > 5238< / span >   [FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION] = solver_-> Try(< / div >
< div class = "line" > < a name = "l05239" > < / a > < span class = "lineno" > 5239< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05240" > < / a > < span class = "lineno" > 5240< / span >   [FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION],< / div >
< div class = "line" > < a name = "l05241" > < / a > < span class = "lineno" > 5241< / span >   solver_-> Try(strong_lci,< / div >
< div class = "line" > < a name = "l05242" > < / a > < span class = "lineno" > 5242< / span >   first_solution_decision_builders_< / div >
< div class = "line" > < a name = "l05243" > < / a > < span class = "lineno" > 5243< / span >   [FirstSolutionStrategy::BEST_INSERTION]));< / div >
< div class = "line" > < a name = "l05244" > < / a > < span class = "lineno" > 5244< / span >   < span class = "comment" > // Savings< / span > < / div >
< div class = "line" > < a name = "l05245" > < / a > < span class = "lineno" > 5245< / span >   SavingsFilteredHeuristic::SavingsParameters savings_parameters;< / div >
< div class = "line" > < a name = "l05246" > < / a > < span class = "lineno" > 5246< / span >   savings_parameters.neighbors_ratio =< / div >
< div class = "line" > < a name = "l05247" > < / a > < span class = "lineno" > 5247< / span >   search_parameters.savings_neighbors_ratio();< / div >
< div class = "line" > < a name = "l05248" > < / a > < span class = "lineno" > 5248< / span >   savings_parameters.max_memory_usage_bytes =< / div >
< div class = "line" > < a name = "l05249" > < / a > < span class = "lineno" > 5249< / span >   search_parameters.savings_max_memory_usage_bytes();< / div >
< div class = "line" > < a name = "l05250" > < / a > < span class = "lineno" > 5250< / span >   savings_parameters.add_reverse_arcs =< / div >
< div class = "line" > < a name = "l05251" > < / a > < span class = "lineno" > 5251< / span >   search_parameters.savings_add_reverse_arcs();< / div >
< div class = "line" > < a name = "l05252" > < / a > < span class = "lineno" > 5252< / span >   savings_parameters.arc_coefficient =< / div >
< div class = "line" > < a name = "l05253" > < / a > < span class = "lineno" > 5253< / span >   search_parameters.savings_arc_coefficient();< / div >
< div class = "line" > < a name = "l05254" > < / a > < span class = "lineno" > 5254< / span >   LocalSearchFilterManager* filter_manager = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l05255" > < / a > < span class = "lineno" > 5255< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.use_unfiltered_first_solution_strategy()) {< / div >
< div class = "line" > < a name = "l05256" > < / a > < span class = "lineno" > 5256< / span >   filter_manager = GetOrCreateFeasibilityFilterManager(search_parameters);< / div >
< div class = "line" > < a name = "l05257" > < / a > < span class = "lineno" > 5257< / span >   }< / div >
< div class = "line" > < a name = "l05258" > < / a > < span class = "lineno" > 5258< / span >   < / div >
< div class = "line" > < a name = "l05259" > < / a > < span class = "lineno" > 5259< / span >   < span class = "keywordflow" > if< / span > (search_parameters.savings_parallel_routes()) {< / div >
< div class = "line" > < a name = "l05260" > < / a > < span class = "lineno" > 5260< / span >   IntVarFilteredDecisionBuilder* savings_db =< / div >
< div class = "line" > < a name = "l05261" > < / a > < span class = "lineno" > 5261< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05262" > < / a > < span class = "lineno" > 5262< / span >   absl::make_unique< ParallelSavingsFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05263" > < / a > < span class = "lineno" > 5263< / span >   < span class = "keyword" > this< / span > , & manager_, savings_parameters, filter_manager)));< / div >
< div class = "line" > < a name = "l05264" > < / a > < span class = "lineno" > 5264< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.use_unfiltered_first_solution_strategy()) {< / div >
< div class = "line" > < a name = "l05265" > < / a > < span class = "lineno" > 5265< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05266" > < / a > < span class = "lineno" > 5266< / span >   [FirstSolutionStrategy::SAVINGS] = savings_db;< / div >
< div class = "line" > < a name = "l05267" > < / a > < span class = "lineno" > 5267< / span >   }< / div >
< div class = "line" > < a name = "l05268" > < / a > < span class = "lineno" > 5268< / span >   < / div >
< div class = "line" > < a name = "l05269" > < / a > < span class = "lineno" > 5269< / span >   first_solution_decision_builders_[FirstSolutionStrategy::SAVINGS] =< / div >
< div class = "line" > < a name = "l05270" > < / a > < span class = "lineno" > 5270< / span >   solver_-> Try(savings_db,< / div >
< div class = "line" > < a name = "l05271" > < / a > < span class = "lineno" > 5271< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05272" > < / a > < span class = "lineno" > 5272< / span >   absl::make_unique< ParallelSavingsFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05273" > < / a > < span class = "lineno" > 5273< / span >   < span class = "keyword" > this< / span > , & manager_, savings_parameters,< / div >
< div class = "line" > < a name = "l05274" > < / a > < span class = "lineno" > 5274< / span >   GetOrCreateStrongFeasibilityFilterManager(< / div >
< div class = "line" > < a name = "l05275" > < / a > < span class = "lineno" > 5275< / span >   search_parameters)))));< / div >
< div class = "line" > < a name = "l05276" > < / a > < span class = "lineno" > 5276< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05277" > < / a > < span class = "lineno" > 5277< / span >   IntVarFilteredDecisionBuilder* savings_db =< / div >
< div class = "line" > < a name = "l05278" > < / a > < span class = "lineno" > 5278< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05279" > < / a > < span class = "lineno" > 5279< / span >   absl::make_unique< SequentialSavingsFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05280" > < / a > < span class = "lineno" > 5280< / span >   < span class = "keyword" > this< / span > , & manager_, savings_parameters, filter_manager)));< / div >
< div class = "line" > < a name = "l05281" > < / a > < span class = "lineno" > 5281< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.use_unfiltered_first_solution_strategy()) {< / div >
< div class = "line" > < a name = "l05282" > < / a > < span class = "lineno" > 5282< / span >   first_solution_filtered_decision_builders_< / div >
< div class = "line" > < a name = "l05283" > < / a > < span class = "lineno" > 5283< / span >   [FirstSolutionStrategy::SAVINGS] = savings_db;< / div >
< div class = "line" > < a name = "l05284" > < / a > < span class = "lineno" > 5284< / span >   }< / div >
< div class = "line" > < a name = "l05285" > < / a > < span class = "lineno" > 5285< / span >   < / div >
< div class = "line" > < a name = "l05286" > < / a > < span class = "lineno" > 5286< / span >   first_solution_decision_builders_[FirstSolutionStrategy::SAVINGS] =< / div >
< div class = "line" > < a name = "l05287" > < / a > < span class = "lineno" > 5287< / span >   solver_-> Try(savings_db,< / div >
< div class = "line" > < a name = "l05288" > < / a > < span class = "lineno" > 5288< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05289" > < / a > < span class = "lineno" > 5289< / span >   absl::make_unique< SequentialSavingsFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05290" > < / a > < span class = "lineno" > 5290< / span >   < span class = "keyword" > this< / span > , & manager_, savings_parameters,< / div >
< div class = "line" > < a name = "l05291" > < / a > < span class = "lineno" > 5291< / span >   GetOrCreateStrongFeasibilityFilterManager(< / div >
< div class = "line" > < a name = "l05292" > < / a > < span class = "lineno" > 5292< / span >   search_parameters)))));< / div >
< div class = "line" > < a name = "l05293" > < / a > < span class = "lineno" > 5293< / span >   }< / div >
< div class = "line" > < a name = "l05294" > < / a > < span class = "lineno" > 5294< / span >   < span class = "comment" > // Sweep< / span > < / div >
< div class = "line" > < a name = "l05295" > < / a > < span class = "lineno" > 5295< / span >   first_solution_decision_builders_[FirstSolutionStrategy::SWEEP] =< / div >
< div class = "line" > < a name = "l05296" > < / a > < span class = "lineno" > 5296< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SweepBuilder(< span class = "keyword" > this< / span > , < span class = "keyword" > true< / span > ));< / div >
< div class = "line" > < a name = "l05297" > < / a > < span class = "lineno" > 5297< / span >   DecisionBuilder* sweep_builder =< / div >
< div class = "line" > < a name = "l05298" > < / a > < span class = "lineno" > 5298< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > SweepBuilder(< span class = "keyword" > this< / span > , < span class = "keyword" > false< / span > ));< / div >
< div class = "line" > < a name = "l05299" > < / a > < span class = "lineno" > 5299< / span >   first_solution_decision_builders_[FirstSolutionStrategy::SWEEP] =< / div >
< div class = "line" > < a name = "l05300" > < / a > < span class = "lineno" > 5300< / span >   solver_-> Try(< / div >
< div class = "line" > < a name = "l05301" > < / a > < span class = "lineno" > 5301< / span >   sweep_builder,< / div >
< div class = "line" > < a name = "l05302" > < / a > < span class = "lineno" > 5302< / span >   first_solution_decision_builders_[FirstSolutionStrategy::SWEEP]);< / div >
< div class = "line" > < a name = "l05303" > < / a > < span class = "lineno" > 5303< / span >   < span class = "comment" > // Christofides< / span > < / div >
< div class = "line" > < a name = "l05304" > < / a > < span class = "lineno" > 5304< / span >   first_solution_decision_builders_[FirstSolutionStrategy::CHRISTOFIDES] =< / div >
< div class = "line" > < a name = "l05305" > < / a > < span class = "lineno" > 5305< / span >   solver_-> RevAlloc(< span class = "keyword" > new< / span > IntVarFilteredDecisionBuilder(< / div >
< div class = "line" > < a name = "l05306" > < / a > < span class = "lineno" > 5306< / span >   absl::make_unique< ChristofidesFilteredHeuristic> (< / div >
< div class = "line" > < a name = "l05307" > < / a > < span class = "lineno" > 5307< / span >   < span class = "keyword" > this< / span > , GetOrCreateFeasibilityFilterManager(search_parameters),< / div >
< div class = "line" > < a name = "l05308" > < / a > < span class = "lineno" > 5308< / span >   search_parameters.christofides_use_minimum_matching())));< / div >
< div class = "line" > < a name = "l05309" > < / a > < span class = "lineno" > 5309< / span >   < span class = "comment" > // Automatic< / span > < / div >
< div class = "line" > < a name = "l05310" > < / a > < span class = "lineno" > 5310< / span >   < span class = "comment" > // TODO(user): make this smarter.< / span > < / div >
< div class = "line" > < a name = "l05311" > < / a > < span class = "lineno" > 5311< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > bool< / span > has_precedences = std::any_of(< / div >
< div class = "line" > < a name = "l05312" > < / a > < span class = "lineno" > 5312< / span >   dimensions_.begin(), dimensions_.end(),< / div >
< div class = "line" > < a name = "l05313" > < / a > < span class = "lineno" > 5313< / span >   [](< a class = "code" href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > RoutingDimension< / a > * dim) { return !dim-> GetNodePrecedences().empty(); });< / div >
< div class = "line" > < a name = "l05314" > < / a > < span class = "lineno" > 5314< / span >   < span class = "keywordflow" > if< / span > (pickup_delivery_pairs_.empty() & & !has_precedences) {< / div >
< div class = "line" > < a name = "l05315" > < / a > < span class = "lineno" > 5315< / span >   automatic_first_solution_strategy_ =< / div >
< div class = "line" > < a name = "l05316" > < / a > < span class = "lineno" > 5316< / span >   FirstSolutionStrategy::PATH_CHEAPEST_ARC;< / div >
< div class = "line" > < a name = "l05317" > < / a > < span class = "lineno" > 5317< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05318" > < / a > < span class = "lineno" > 5318< / span >   automatic_first_solution_strategy_ =< / div >
< div class = "line" > < a name = "l05319" > < / a > < span class = "lineno" > 5319< / span >   FirstSolutionStrategy::PARALLEL_CHEAPEST_INSERTION;< / div >
< div class = "line" > < a name = "l05320" > < / a > < span class = "lineno" > 5320< / span >   }< / div >
< div class = "line" > < a name = "l05321" > < / a > < span class = "lineno" > 5321< / span >   first_solution_decision_builders_[FirstSolutionStrategy::AUTOMATIC] =< / div >
< div class = "line" > < a name = "l05322" > < / a > < span class = "lineno" > 5322< / span >   first_solution_decision_builders_[automatic_first_solution_strategy_];< / div >
< div class = "line" > < a name = "l05323" > < / a > < span class = "lineno" > 5323< / span >   first_solution_decision_builders_[FirstSolutionStrategy::UNSET] =< / div >
< div class = "line" > < a name = "l05324" > < / a > < span class = "lineno" > 5324< / span >   first_solution_decision_builders_[FirstSolutionStrategy::AUTOMATIC];< / div >
< div class = "line" > < a name = "l05325" > < / a > < span class = "lineno" > 5325< / span >   }< / div >
< div class = "line" > < a name = "l05326" > < / a > < span class = "lineno" > 5326< / span >   < / div >
< div class = "line" > < a name = "l05327" > < / a > < span class = "lineno" > 5327< / span >   DecisionBuilder* RoutingModel::GetFirstSolutionDecisionBuilder(< / div >
< div class = "line" > < a name = "l05328" > < / a > < span class = "lineno" > 5328< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l05329" > < / a > < span class = "lineno" > 5329< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > FirstSolutionStrategy::Value< / a > first_solution_strategy =< / div >
< div class = "line" > < a name = "l05330" > < / a > < span class = "lineno" > 5330< / span >   search_parameters.first_solution_strategy();< / div >
< div class = "line" > < a name = "l05331" > < / a > < span class = "lineno" > 5331< / span >   < span class = "keywordflow" > if< / span > (first_solution_strategy < first_solution_decision_builders_.size()) {< / div >
< div class = "line" > < a name = "l05332" > < / a > < span class = "lineno" > 5332< / span >   < span class = "keywordflow" > return< / span > first_solution_decision_builders_[first_solution_strategy];< / div >
< div class = "line" > < a name = "l05333" > < / a > < span class = "lineno" > 5333< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05334" > < / a > < span class = "lineno" > 5334< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l05335" > < / a > < span class = "lineno" > 5335< / span >   }< / div >
< div class = "line" > < a name = "l05336" > < / a > < span class = "lineno" > 5336< / span >   }< / div >
< div class = "line" > < a name = "l05337" > < / a > < span class = "lineno" > 5337< / span >   < / div >
< div class = "line" > < a name = "l05338" > < / a > < span class = "lineno" > 5338< / span >   IntVarFilteredDecisionBuilder*< / div >
< div class = "line" > < a name = "l05339" > < / a > < span class = "lineno" > 5339< / span >   RoutingModel::GetFilteredFirstSolutionDecisionBuilderOrNull(< / div >
< div class = "line" > < a name = "l05340" > < / a > < span class = "lineno" > 5340< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l05341" > < / a > < span class = "lineno" > 5341< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > FirstSolutionStrategy::Value< / a > first_solution_strategy =< / div >
< div class = "line" > < a name = "l05342" > < / a > < span class = "lineno" > 5342< / span >   search_parameters.first_solution_strategy();< / div >
< div class = "line" > < a name = "l05343" > < / a > < span class = "lineno" > 5343< / span >   < span class = "keywordflow" > return< / span > first_solution_filtered_decision_builders_[first_solution_strategy];< / div >
< div class = "line" > < a name = "l05344" > < / a > < span class = "lineno" > 5344< / span >   }< / div >
< div class = "line" > < a name = "l05345" > < / a > < span class = "lineno" > 5345< / span >   < / div >
< div class = "line" > < a name = "l05346" > < / a > < span class = "lineno" > 5346< / span >   LocalSearchPhaseParameters* RoutingModel::CreateLocalSearchParameters(< / div >
< div class = "line" > < a name = "l05347" > < / a > < span class = "lineno" > 5347< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05348" > < / a > < span class = "lineno" > 5348< / span >   SearchLimit* lns_limit = GetOrCreateLargeNeighborhoodSearchLimit();< / div >
< div class = "line" > < a name = "l05349" > < / a > < span class = "lineno" > 5349< / span >   < span class = "keywordflow" > return< / span > solver_-> MakeLocalSearchPhaseParameters(< / div >
< div class = "line" > < a name = "l05350" > < / a > < span class = "lineno" > 5350< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#abcbe77312783c0a5aa4926ace764533b" > CostVar< / a > (), GetNeighborhoodOperators(search_parameters),< / div >
< div class = "line" > < a name = "l05351" > < / a > < span class = "lineno" > 5351< / span >   solver_-> MakeSolveOnce(CreateSolutionFinalizer(lns_limit), lns_limit),< / div >
< div class = "line" > < a name = "l05352" > < / a > < span class = "lineno" > 5352< / span >   GetOrCreateLocalSearchLimit(),< / div >
< div class = "line" > < a name = "l05353" > < / a > < span class = "lineno" > 5353< / span >   GetOrCreateLocalSearchFilterManager(search_parameters));< / div >
< div class = "line" > < a name = "l05354" > < / a > < span class = "lineno" > 5354< / span >   }< / div >
< div class = "line" > < a name = "l05355" > < / a > < span class = "lineno" > 5355< / span >   < / div >
< div class = "line" > < a name = "l05356" > < / a > < span class = "lineno" > 5356< / span >   DecisionBuilder* RoutingModel::CreateLocalSearchDecisionBuilder(< / div >
< div class = "line" > < a name = "l05357" > < / a > < span class = "lineno" > 5357< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05358" > < / a > < span class = "lineno" > 5358< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l05359" > < / a > < span class = "lineno" > 5359< / span >   DecisionBuilder* first_solution =< / div >
< div class = "line" > < a name = "l05360" > < / a > < span class = "lineno" > 5360< / span >   GetFirstSolutionDecisionBuilder(search_parameters);< / div >
< div class = "line" > < a name = "l05361" > < / a > < span class = "lineno" > 5361< / span >   LocalSearchPhaseParameters* < span class = "keyword" > const< / span > < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > =< / div >
< div class = "line" > < a name = "l05362" > < / a > < span class = "lineno" > 5362< / span >   CreateLocalSearchParameters(search_parameters);< / div >
< div class = "line" > < a name = "l05363" > < / a > < span class = "lineno" > 5363< / span >   SearchLimit* first_solution_lns_limit =< / div >
< div class = "line" > < a name = "l05364" > < / a > < span class = "lineno" > 5364< / span >   GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();< / div >
< div class = "line" > < a name = "l05365" > < / a > < span class = "lineno" > 5365< / span >   DecisionBuilder* < span class = "keyword" > const< / span > first_solution_sub_decision_builder =< / div >
< div class = "line" > < a name = "l05366" > < / a > < span class = "lineno" > 5366< / span >   solver_-> MakeSolveOnce(CreateSolutionFinalizer(first_solution_lns_limit),< / div >
< div class = "line" > < a name = "l05367" > < / a > < span class = "lineno" > 5367< / span >   first_solution_lns_limit);< / div >
< div class = "line" > < a name = "l05368" > < / a > < span class = "lineno" > 5368< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l05369" > < / a > < span class = "lineno" > 5369< / span >   < span class = "keywordflow" > return< / span > solver_-> MakeLocalSearchPhase(nexts_, first_solution,< / div >
< div class = "line" > < a name = "l05370" > < / a > < span class = "lineno" > 5370< / span >   first_solution_sub_decision_builder,< / div >
< div class = "line" > < a name = "l05371" > < / a > < span class = "lineno" > 5371< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l05372" > < / a > < span class = "lineno" > 5372< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05373" > < / a > < span class = "lineno" > 5373< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > all_size = size + size + vehicles_;< / div >
< div class = "line" > < a name = "l05374" > < / a > < span class = "lineno" > 5374< / span >   std::vector< IntVar*> all_vars(all_size);< / div >
< div class = "line" > < a name = "l05375" > < / a > < span class = "lineno" > 5375< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l05376" > < / a > < span class = "lineno" > 5376< / span >   all_vars[i] = nexts_[i];< / div >
< div class = "line" > < a name = "l05377" > < / a > < span class = "lineno" > 5377< / span >   }< / div >
< div class = "line" > < a name = "l05378" > < / a > < span class = "lineno" > 5378< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = size; i < all_size; ++i) {< / div >
< div class = "line" > < a name = "l05379" > < / a > < span class = "lineno" > 5379< / span >   all_vars[i] = vehicle_vars_[i - size];< / div >
< div class = "line" > < a name = "l05380" > < / a > < span class = "lineno" > 5380< / span >   }< / div >
< div class = "line" > < a name = "l05381" > < / a > < span class = "lineno" > 5381< / span >   < span class = "keywordflow" > return< / span > solver_-> MakeLocalSearchPhase(all_vars, first_solution,< / div >
< div class = "line" > < a name = "l05382" > < / a > < span class = "lineno" > 5382< / span >   first_solution_sub_decision_builder,< / div >
< div class = "line" > < a name = "l05383" > < / a > < span class = "lineno" > 5383< / span >   < a class = "code" href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > );< / div >
< div class = "line" > < a name = "l05384" > < / a > < span class = "lineno" > 5384< / span >   }< / div >
< div class = "line" > < a name = "l05385" > < / a > < span class = "lineno" > 5385< / span >   }< / div >
< div class = "line" > < a name = "l05386" > < / a > < span class = "lineno" > 5386< / span >   < / div >
< div class = "line" > < a name = "l05387" > < / a > < span class = "lineno" > 5387< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupDecisionBuilders(< / div >
< div class = "line" > < a name = "l05388" > < / a > < span class = "lineno" > 5388< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05389" > < / a > < span class = "lineno" > 5389< / span >   < span class = "keywordflow" > if< / span > (search_parameters.use_depth_first_search()) {< / div >
< div class = "line" > < a name = "l05390" > < / a > < span class = "lineno" > 5390< / span >   SearchLimit* first_lns_limit =< / div >
< div class = "line" > < a name = "l05391" > < / a > < span class = "lineno" > 5391< / span >   GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();< / div >
< div class = "line" > < a name = "l05392" > < / a > < span class = "lineno" > 5392< / span >   solve_db_ = solver_-> Compose(< / div >
< div class = "line" > < a name = "l05393" > < / a > < span class = "lineno" > 5393< / span >   GetFirstSolutionDecisionBuilder(search_parameters),< / div >
< div class = "line" > < a name = "l05394" > < / a > < span class = "lineno" > 5394< / span >   solver_-> MakeSolveOnce(CreateSolutionFinalizer(first_lns_limit),< / div >
< div class = "line" > < a name = "l05395" > < / a > < span class = "lineno" > 5395< / span >   first_lns_limit));< / div >
< div class = "line" > < a name = "l05396" > < / a > < span class = "lineno" > 5396< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05397" > < / a > < span class = "lineno" > 5397< / span >   solve_db_ = CreateLocalSearchDecisionBuilder(search_parameters);< / div >
< div class = "line" > < a name = "l05398" > < / a > < span class = "lineno" > 5398< / span >   }< / div >
< div class = "line" > < a name = "l05399" > < / a > < span class = "lineno" > 5399< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (preassignment_ != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05400" > < / a > < span class = "lineno" > 5400< / span >   DecisionBuilder* restore_preassignment =< / div >
< div class = "line" > < a name = "l05401" > < / a > < span class = "lineno" > 5401< / span >   solver_-> MakeRestoreAssignment(preassignment_);< / div >
< div class = "line" > < a name = "l05402" > < / a > < span class = "lineno" > 5402< / span >   solve_db_ = solver_-> Compose(restore_preassignment, solve_db_);< / div >
< div class = "line" > < a name = "l05403" > < / a > < span class = "lineno" > 5403< / span >   improve_db_ =< / div >
< div class = "line" > < a name = "l05404" > < / a > < span class = "lineno" > 5404< / span >   solver_-> Compose(restore_preassignment,< / div >
< div class = "line" > < a name = "l05405" > < / a > < span class = "lineno" > 5405< / span >   solver_-> MakeLocalSearchPhase(< / div >
< div class = "line" > < a name = "l05406" > < / a > < span class = "lineno" > 5406< / span >   GetOrCreateAssignment(),< / div >
< div class = "line" > < a name = "l05407" > < / a > < span class = "lineno" > 5407< / span >   CreateLocalSearchParameters(search_parameters)));< / div >
< div class = "line" > < a name = "l05408" > < / a > < span class = "lineno" > 5408< / span >   restore_assignment_ = solver_-> Compose(< / div >
< div class = "line" > < a name = "l05409" > < / a > < span class = "lineno" > 5409< / span >   solver_-> MakeRestoreAssignment(GetOrCreateAssignment()),< / div >
< div class = "line" > < a name = "l05410" > < / a > < span class = "lineno" > 5410< / span >   CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit()));< / div >
< div class = "line" > < a name = "l05411" > < / a > < span class = "lineno" > 5411< / span >   restore_tmp_assignment_ = solver_-> Compose(< / div >
< div class = "line" > < a name = "l05412" > < / a > < span class = "lineno" > 5412< / span >   restore_preassignment,< / div >
< div class = "line" > < a name = "l05413" > < / a > < span class = "lineno" > 5413< / span >   solver_-> MakeRestoreAssignment(GetOrCreateTmpAssignment()),< / div >
< div class = "line" > < a name = "l05414" > < / a > < span class = "lineno" > 5414< / span >   CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit()));< / div >
< div class = "line" > < a name = "l05415" > < / a > < span class = "lineno" > 5415< / span >   }< / div >
< div class = "line" > < a name = "l05416" > < / a > < span class = "lineno" > 5416< / span >   < / div >
< div class = "line" > < a name = "l05417" > < / a > < span class = "lineno" > 5417< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupMetaheuristics(< / div >
< div class = "line" > < a name = "l05418" > < / a > < span class = "lineno" > 5418< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05419" > < / a > < span class = "lineno" > 5419< / span >   SearchMonitor* optimize;< / div >
< div class = "line" > < a name = "l05420" > < / a > < span class = "lineno" > 5420< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > LocalSearchMetaheuristic::Value< / a > metaheuristic =< / div >
< div class = "line" > < a name = "l05421" > < / a > < span class = "lineno" > 5421< / span >   search_parameters.local_search_metaheuristic();< / div >
< div class = "line" > < a name = "l05422" > < / a > < span class = "lineno" > 5422< / span >   < span class = "comment" > // Some metaheuristics will effectively never terminate; warn< / span > < / div >
< div class = "line" > < a name = "l05423" > < / a > < span class = "lineno" > 5423< / span >   < span class = "comment" > // user if they fail to set a time limit.< / span > < / div >
< div class = "line" > < a name = "l05424" > < / a > < span class = "lineno" > 5424< / span >   < span class = "keywordtype" > bool< / span > limit_too_long = !search_parameters.has_time_limit() & & < / div >
< div class = "line" > < a name = "l05425" > < / a > < span class = "lineno" > 5425< / span >   search_parameters.solution_limit() == < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l05426" > < / a > < span class = "lineno" > 5426< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > optimization_step = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< / div >
< div class = "line" > < a name = "l05427" > < / a > < span class = "lineno" > 5427< / span >   < a class = "code" href = "classoperations__research_1_1_math_util.html#aec89d533eea50ada5268533f068f97ec" > MathUtil::FastInt64Round< / a > (search_parameters.optimization_step()), < a class = "code" href = "namespaceoperations__research.html#aa96bb5a28dd9c1ccc864b1587e8e1a98" > One< / a > ());< / div >
< div class = "line" > < a name = "l05428" > < / a > < span class = "lineno" > 5428< / span >   < span class = "keywordflow" > switch< / span > (metaheuristic) {< / div >
< div class = "line" > < a name = "l05429" > < / a > < span class = "lineno" > 5429< / span >   < span class = "keywordflow" > case< / span > LocalSearchMetaheuristic::GUIDED_LOCAL_SEARCH:< / div >
< div class = "line" > < a name = "l05430" > < / a > < span class = "lineno" > 5430< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > CostsAreHomogeneousAcrossVehicles< / a > ()) {< / div >
< div class = "line" > < a name = "l05431" > < / a > < span class = "lineno" > 5431< / span >   optimize = solver_-> MakeGuidedLocalSearch(< / div >
< div class = "line" > < a name = "l05432" > < / a > < span class = "lineno" > 5432< / span >   < span class = "keyword" > false< / span > , cost_,< / div >
< div class = "line" > < a name = "l05433" > < / a > < span class = "lineno" > 5433< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j) { < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > GetHomogeneousCost< / a > (i, j); },< / div >
< div class = "line" > < a name = "l05434" > < / a > < span class = "lineno" > 5434< / span >   optimization_step, nexts_,< / div >
< div class = "line" > < a name = "l05435" > < / a > < span class = "lineno" > 5435< / span >   search_parameters.guided_local_search_lambda_coefficient());< / div >
< div class = "line" > < a name = "l05436" > < / a > < span class = "lineno" > 5436< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05437" > < / a > < span class = "lineno" > 5437< / span >   optimize = solver_-> MakeGuidedLocalSearch(< / div >
< div class = "line" > < a name = "l05438" > < / a > < span class = "lineno" > 5438< / span >   < span class = "keyword" > false< / span > , cost_,< / div >
< div class = "line" > < a name = "l05439" > < / a > < span class = "lineno" > 5439< / span >   [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > k) {< / div >
< div class = "line" > < a name = "l05440" > < / a > < span class = "lineno" > 5440< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > GetArcCostForVehicle< / a > (i, j, k);< / div >
< div class = "line" > < a name = "l05441" > < / a > < span class = "lineno" > 5441< / span >   },< / div >
< div class = "line" > < a name = "l05442" > < / a > < span class = "lineno" > 5442< / span >   optimization_step, nexts_, vehicle_vars_,< / div >
< div class = "line" > < a name = "l05443" > < / a > < span class = "lineno" > 5443< / span >   search_parameters.guided_local_search_lambda_coefficient());< / div >
< div class = "line" > < a name = "l05444" > < / a > < span class = "lineno" > 5444< / span >   }< / div >
< div class = "line" > < a name = "l05445" > < / a > < span class = "lineno" > 5445< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05446" > < / a > < span class = "lineno" > 5446< / span >   < span class = "keywordflow" > case< / span > LocalSearchMetaheuristic::SIMULATED_ANNEALING:< / div >
< div class = "line" > < a name = "l05447" > < / a > < span class = "lineno" > 5447< / span >   optimize =< / div >
< div class = "line" > < a name = "l05448" > < / a > < span class = "lineno" > 5448< / span >   solver_-> MakeSimulatedAnnealing(< span class = "keyword" > false< / span > , cost_, optimization_step, 100);< / div >
< div class = "line" > < a name = "l05449" > < / a > < span class = "lineno" > 5449< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05450" > < / a > < span class = "lineno" > 5450< / span >   < span class = "keywordflow" > case< / span > LocalSearchMetaheuristic::TABU_SEARCH:< / div >
< div class = "line" > < a name = "l05451" > < / a > < span class = "lineno" > 5451< / span >   optimize = solver_-> MakeTabuSearch(< span class = "keyword" > false< / span > , cost_, optimization_step,< / div >
< div class = "line" > < a name = "l05452" > < / a > < span class = "lineno" > 5452< / span >   nexts_, 10, 10, .8);< / div >
< div class = "line" > < a name = "l05453" > < / a > < span class = "lineno" > 5453< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05454" > < / a > < span class = "lineno" > 5454< / span >   < span class = "keywordflow" > case< / span > LocalSearchMetaheuristic::GENERIC_TABU_SEARCH: {< / div >
< div class = "line" > < a name = "l05455" > < / a > < span class = "lineno" > 5455< / span >   std::vector< operations_research::IntVar*> tabu_vars;< / div >
< div class = "line" > < a name = "l05456" > < / a > < span class = "lineno" > 5456< / span >   < span class = "keywordflow" > if< / span > (tabu_var_callback_) {< / div >
< div class = "line" > < a name = "l05457" > < / a > < span class = "lineno" > 5457< / span >   tabu_vars = tabu_var_callback_(< span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l05458" > < / a > < span class = "lineno" > 5458< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05459" > < / a > < span class = "lineno" > 5459< / span >   tabu_vars.push_back(cost_);< / div >
< div class = "line" > < a name = "l05460" > < / a > < span class = "lineno" > 5460< / span >   }< / div >
< div class = "line" > < a name = "l05461" > < / a > < span class = "lineno" > 5461< / span >   optimize = solver_-> MakeGenericTabuSearch(< span class = "keyword" > false< / span > , cost_, optimization_step,< / div >
< div class = "line" > < a name = "l05462" > < / a > < span class = "lineno" > 5462< / span >   tabu_vars, 100);< / div >
< div class = "line" > < a name = "l05463" > < / a > < span class = "lineno" > 5463< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l05464" > < / a > < span class = "lineno" > 5464< / span >   }< / div >
< div class = "line" > < a name = "l05465" > < / a > < span class = "lineno" > 5465< / span >   < span class = "keywordflow" > default< / span > :< / div >
< div class = "line" > < a name = "l05466" > < / a > < span class = "lineno" > 5466< / span >   limit_too_long = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l05467" > < / a > < span class = "lineno" > 5467< / span >   optimize = solver_-> MakeMinimize(cost_, optimization_step);< / div >
< div class = "line" > < a name = "l05468" > < / a > < span class = "lineno" > 5468< / span >   }< / div >
< div class = "line" > < a name = "l05469" > < / a > < span class = "lineno" > 5469< / span >   < span class = "keywordflow" > if< / span > (limit_too_long) {< / div >
< div class = "line" > < a name = "l05470" > < / a > < span class = "lineno" > 5470< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < LocalSearchMetaheuristic::Value_Name(metaheuristic)< / div >
< div class = "line" > < a name = "l05471" > < / a > < span class = "lineno" > 5471< / span >   < < < span class = "stringliteral" > " specified without sane timeout: solve may run forever." < / span > ;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05472" > < / a > < span class = "lineno" > 5472< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05473" > < / a > < span class = "lineno" > 5473< / span >   monitors_.push_back(optimize);< / div >
< div class = "line" > < a name = "l05474" > < / a > < span class = "lineno" > 5474< / span >   }< / div >
< div class = "line" > < a name = "l05475" > < / a > < span class = "lineno" > 5475< / span >   < / div >
< div class = "line" > < a name = "l05476" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c" > 5476< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c" > RoutingModel::SetTabuVarsCallback< / a > (< a class = "code" href = "classoperations__research_1_1_routing_model.html#a0e106a97f0156868f1d1c741b283793e" > GetTabuVarsCallback< / a > tabu_var_callback) {< / div >
< div class = "line" > < a name = "l05477" > < / a > < span class = "lineno" > 5477< / span >   tabu_var_callback_ = std::move(tabu_var_callback);< / div >
< div class = "line" > < a name = "l05478" > < / a > < span class = "lineno" > 5478< / span >   }< / div >
< div class = "line" > < a name = "l05479" > < / a > < span class = "lineno" > 5479< / span >   < / div >
< div class = "line" > < a name = "l05480" > < / a > < span class = "lineno" > 5480< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupAssignmentCollector(< / div >
< div class = "line" > < a name = "l05481" > < / a > < span class = "lineno" > 5481< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05482" > < / a > < span class = "lineno" > 5482< / span >   < a class = "code" href = "classoperations__research_1_1_assignment.html" > Assignment< / a > * full_assignment = solver_-> MakeAssignment();< / div >
< div class = "line" > < a name = "l05483" > < / a > < span class = "lineno" > 5483< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * < span class = "keyword" > const< / span > dimension : dimensions_) {< / div >
< div class = "line" > < a name = "l05484" > < / a > < span class = "lineno" > 5484< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (dimension-> cumuls());< / div >
< div class = "line" > < a name = "l05485" > < / a > < span class = "lineno" > 5485< / span >   }< / div >
< div class = "line" > < a name = "l05486" > < / a > < span class = "lineno" > 5486< / span >   < span class = "keywordflow" > for< / span > (IntVar* < span class = "keyword" > const< / span > extra_var : extra_vars_) {< / div >
< div class = "line" > < a name = "l05487" > < / a > < span class = "lineno" > 5487< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (extra_var);< / div >
< div class = "line" > < a name = "l05488" > < / a > < span class = "lineno" > 5488< / span >   }< / div >
< div class = "line" > < a name = "l05489" > < / a > < span class = "lineno" > 5489< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* < span class = "keyword" > const< / span > extra_interval : extra_intervals_) {< / div >
< div class = "line" > < a name = "l05490" > < / a > < span class = "lineno" > 5490< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (extra_interval);< / div >
< div class = "line" > < a name = "l05491" > < / a > < span class = "lineno" > 5491< / span >   }< / div >
< div class = "line" > < a name = "l05492" > < / a > < span class = "lineno" > 5492< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (nexts_);< / div >
< div class = "line" > < a name = "l05493" > < / a > < span class = "lineno" > 5493< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (active_);< / div >
< div class = "line" > < a name = "l05494" > < / a > < span class = "lineno" > 5494< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > Add< / a > (vehicle_vars_);< / div >
< div class = "line" > < a name = "l05495" > < / a > < span class = "lineno" > 5495< / span >   full_assignment-> < a class = "code" href = "classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff" > AddObjective< / a > (cost_);< / div >
< div class = "line" > < a name = "l05496" > < / a > < span class = "lineno" > 5496< / span >   < / div >
< div class = "line" > < a name = "l05497" > < / a > < span class = "lineno" > 5497< / span >   collect_assignments_ = solver_-> MakeNBestValueSolutionCollector(< / div >
< div class = "line" > < a name = "l05498" > < / a > < span class = "lineno" > 5498< / span >   full_assignment, search_parameters.number_of_solutions_to_collect(),< / div >
< div class = "line" > < a name = "l05499" > < / a > < span class = "lineno" > 5499< / span >   < span class = "keyword" > false< / span > );< / div >
< div class = "line" > < a name = "l05500" > < / a > < span class = "lineno" > 5500< / span >   collect_one_assignment_ =< / div >
< div class = "line" > < a name = "l05501" > < / a > < span class = "lineno" > 5501< / span >   solver_-> MakeFirstSolutionCollector(full_assignment);< / div >
< div class = "line" > < a name = "l05502" > < / a > < span class = "lineno" > 5502< / span >   monitors_.push_back(collect_assignments_);< / div >
< div class = "line" > < a name = "l05503" > < / a > < span class = "lineno" > 5503< / span >   }< / div >
< div class = "line" > < a name = "l05504" > < / a > < span class = "lineno" > 5504< / span >   < / div >
< div class = "line" > < a name = "l05505" > < / a > < span class = "lineno" > 5505< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupTrace(< / div >
< div class = "line" > < a name = "l05506" > < / a > < span class = "lineno" > 5506< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05507" > < / a > < span class = "lineno" > 5507< / span >   < span class = "keywordflow" > if< / span > (search_parameters.log_search()) {< / div >
< div class = "line" > < a name = "l05508" > < / a > < span class = "lineno" > 5508< / span >   Solver::SearchLogParameters search_log_parameters;< / div >
< div class = "line" > < a name = "l05509" > < / a > < span class = "lineno" > 5509< / span >   search_log_parameters.branch_period = 10000;< / div >
< div class = "line" > < a name = "l05510" > < / a > < span class = "lineno" > 5510< / span >   search_log_parameters.objective = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l05511" > < / a > < span class = "lineno" > 5511< / span >   search_log_parameters.variable = cost_;< / div >
< div class = "line" > < a name = "l05512" > < / a > < span class = "lineno" > 5512< / span >   search_log_parameters.scaling_factor =< / div >
< div class = "line" > < a name = "l05513" > < / a > < span class = "lineno" > 5513< / span >   search_parameters.log_cost_scaling_factor();< / div >
< div class = "line" > < a name = "l05514" > < / a > < span class = "lineno" > 5514< / span >   search_log_parameters.offset = search_parameters.log_cost_offset();< / div >
< div class = "line" > < a name = "l05515" > < / a > < span class = "lineno" > 5515< / span >   < span class = "keywordflow" > if< / span > (!search_parameters.log_tag().empty()) {< / div >
< div class = "line" > < a name = "l05516" > < / a > < span class = "lineno" > 5516< / span >   < span class = "keyword" > const< / span > std::string& tag = search_parameters.log_tag();< / div >
< div class = "line" > < a name = "l05517" > < / a > < span class = "lineno" > 5517< / span >   search_log_parameters.display_callback = [tag]() { < span class = "keywordflow" > return< / span > tag; };< / div >
< div class = "line" > < a name = "l05518" > < / a > < span class = "lineno" > 5518< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05519" > < / a > < span class = "lineno" > 5519< / span >   search_log_parameters.display_callback = < span class = "keyword" > nullptr< / span > ;< / div >
< div class = "line" > < a name = "l05520" > < / a > < span class = "lineno" > 5520< / span >   }< / div >
< div class = "line" > < a name = "l05521" > < / a > < span class = "lineno" > 5521< / span >   search_log_parameters.display_on_new_solutions_only = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l05522" > < / a > < span class = "lineno" > 5522< / span >   monitors_.push_back(solver_-> MakeSearchLog(search_log_parameters));< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05523" > < / a > < span class = "lineno" > 5523< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l05524" > < / a > < span class = "lineno" > 5524< / span >   }< / div >
< div class = "line" > < a name = "l05525" > < / a > < span class = "lineno" > 5525< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05526" > < / a > < span class = "lineno" > 5526< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupImprovementLimit(< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05527" > < / a > < span class = "lineno" > 5527< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05528" > < / a > < span class = "lineno" > 5528< / span >   < span class = "keywordflow" > if< / span > (search_parameters.has_improvement_limit_parameters()) {< / div >
< div class = "line" > < a name = "l05529" > < / a > < span class = "lineno" > 5529< / span >   monitors_.push_back(solver_-> MakeImprovementLimit(< / div >
< div class = "line" > < a name = "l05530" > < / a > < span class = "lineno" > 5530< / span >   cost_, < span class = "comment" > /*maximize=*/< / span > < span class = "keyword" > false< / span > , search_parameters.log_cost_scaling_factor(),< / div >
< div class = "line" > < a name = "l05531" > < / a > < span class = "lineno" > 5531< / span >   search_parameters.log_cost_offset(),< / div >
< div class = "line" > < a name = "l05532" > < / a > < span class = "lineno" > 5532< / span >   search_parameters.improvement_limit_parameters()< / div >
< div class = "line" > < a name = "l05533" > < / a > < span class = "lineno" > 5533< / span >   .improvement_rate_coefficient(),< / div >
< div class = "line" > < a name = "l05534" > < / a > < span class = "lineno" > 5534< / span >   search_parameters.improvement_limit_parameters()< / div >
< div class = "line" > < a name = "l05535" > < / a > < span class = "lineno" > 5535< / span >   .improvement_rate_solutions_distance()));< / div >
< div class = "line" > < a name = "l05536" > < / a > < span class = "lineno" > 5536< / span >   }< / div >
< div class = "line" > < a name = "l05537" > < / a > < span class = "lineno" > 5537< / span >   }< / div >
< div class = "line" > < a name = "l05538" > < / a > < span class = "lineno" > 5538< / span >   < / div >
< div class = "line" > < a name = "l05539" > < / a > < span class = "lineno" > 5539< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupSearchMonitors(< / div >
< div class = "line" > < a name = "l05540" > < / a > < span class = "lineno" > 5540< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05541" > < / a > < span class = "lineno" > 5541< / span >   monitors_.push_back(GetOrCreateLimit());< / div >
< div class = "line" > < a name = "l05542" > < / a > < span class = "lineno" > 5542< / span >   SetupImprovementLimit(search_parameters);< / div >
< div class = "line" > < a name = "l05543" > < / a > < span class = "lineno" > 5543< / span >   SetupMetaheuristics(search_parameters);< / div >
< div class = "line" > < a name = "l05544" > < / a > < span class = "lineno" > 5544< / span >   SetupAssignmentCollector(search_parameters);< / div >
< div class = "line" > < a name = "l05545" > < / a > < span class = "lineno" > 5545< / span >   SetupTrace(search_parameters);< / div >
< div class = "line" > < a name = "l05546" > < / a > < span class = "lineno" > 5546< / span >   }< / div >
< div class = "line" > < a name = "l05547" > < / a > < span class = "lineno" > 5547< / span >   < / div >
< div class = "line" > < a name = "l05548" > < / a > < span class = "lineno" > 5548< / span >   < span class = "keywordtype" > bool< / span > RoutingModel::UsesLightPropagation(< / div >
< div class = "line" > < a name = "l05549" > < / a > < span class = "lineno" > 5549< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l05550" > < / a > < span class = "lineno" > 5550< / span >   < span class = "keywordflow" > return< / span > !search_parameters.use_full_propagation() & & < / div >
< div class = "line" > < a name = "l05551" > < / a > < span class = "lineno" > 5551< / span >   !search_parameters.use_depth_first_search() & & < / div >
< div class = "line" > < a name = "l05552" > < / a > < span class = "lineno" > 5552< / span >   search_parameters.first_solution_strategy() !=< / div >
< div class = "line" > < a name = "l05553" > < / a > < span class = "lineno" > 5553< / span >   FirstSolutionStrategy::FIRST_UNBOUND_MIN_VALUE;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05554" > < / a > < span class = "lineno" > 5554< / span >   }< / div >
< div class = "line" > < a name = "l05555" > < / a > < span class = "lineno" > 5555< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05556" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > 5556< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > RoutingModel::AddWeightedVariableMinimizedByFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l05557" > < / a > < span class = "lineno" > 5557< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ) {< / div >
< div class = "line" > < a name = "l05558" > < / a > < span class = "lineno" > 5558< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05559" > < / a > < span class = "lineno" > 5559< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > = < a class = "code" href = "namespacegtl.html#a7a0f8dc4187504b814d8a8be463b517c" > gtl::LookupOrInsert< / a > (& finalizer_variable_cost_index_, < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ,< / div >
< div class = "line" > < a name = "l05560" > < / a > < span class = "lineno" > 5560< / span >   finalizer_variable_cost_pairs_.size());< / div >
< div class = "line" > < a name = "l05561" > < / a > < span class = "lineno" > 5561< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < finalizer_variable_cost_pairs_.size()) {< / div >
< div class = "line" > < a name = "l05562" > < / a > < span class = "lineno" > 5562< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > old_cost = finalizer_variable_cost_pairs_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].second;< / div >
< div class = "line" > < a name = "l05563" > < / a > < span class = "lineno" > 5563< / span >   finalizer_variable_cost_pairs_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].second = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (old_cost, < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > );< / div >
< div class = "line" > < a name = "l05564" > < / a > < span class = "lineno" > 5564< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l05565" > < / a > < span class = "lineno" > 5565< / span >   finalizer_variable_cost_pairs_.emplace_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > );< / div >
< div class = "line" > < a name = "l05566" > < / a > < span class = "lineno" > 5566< / span >   }< / div >
< div class = "line" > < a name = "l05567" > < / a > < span class = "lineno" > 5567< / span >   }< / div >
< div class = "line" > < a name = "l05568" > < / a > < span class = "lineno" > 5568< / span >   < / div >
< div class = "line" > < a name = "l05569" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > 5569< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > RoutingModel::AddVariableTargetToFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > target) {< / div >
< div class = "line" > < a name = "l05570" > < / a > < span class = "lineno" > 5570< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05571" > < / a > < span class = "lineno" > 5571< / span >   < span class = "keywordflow" > if< / span > (finalizer_variable_target_set_.contains(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > )) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05572" > < / a > < span class = "lineno" > 5572< / span >   finalizer_variable_target_set_.insert(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l05573" > < / a > < span class = "lineno" > 5573< / span >   finalizer_variable_target_pairs_.emplace_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , target);< / div >
< div class = "line" > < a name = "l05574" > < / a > < span class = "lineno" > 5574< / span >   }< / div >
< div class = "line" > < a name = "l05575" > < / a > < span class = "lineno" > 5575< / span >   < / div >
< div class = "line" > < a name = "l05576" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff" > 5576< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff" > RoutingModel::AddVariableMaximizedByFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ) {< / div >
< div class = "line" > < a name = "l05577" > < / a > < span class = "lineno" > 5577< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l05578" > < / a > < span class = "lineno" > 5578< / span >   }< / div >
< div class = "line" > < a name = "l05579" > < / a > < span class = "lineno" > 5579< / span >   < / div >
< div class = "line" > < a name = "l05580" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473" > 5580< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473" > RoutingModel::AddVariableMinimizedByFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ) {< / div >
< div class = "line" > < a name = "l05581" > < / a > < span class = "lineno" > 5581< / span >   < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > , < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l05582" > < / a > < span class = "lineno" > 5582< / span >   }< / div >
< div class = "line" > < a name = "l05583" > < / a > < span class = "lineno" > 5583< / span >   < / div >
< div class = "line" > < a name = "l05584" > < / a > < span class = "lineno" > 5584< / span >   < span class = "keywordtype" > void< / span > RoutingModel::SetupSearch(< / div >
< div class = "line" > < a name = "l05585" > < / a > < span class = "lineno" > 5585< / span >   < span class = "keyword" > const< / span > RoutingSearchParameters& search_parameters) {< / div >
< div class = "line" > < a name = "l05586" > < / a > < span class = "lineno" > 5586< / span >   SetupDecisionBuilders(search_parameters);< / div >
< div class = "line" > < a name = "l05587" > < / a > < span class = "lineno" > 5587< / span >   SetupSearchMonitors(search_parameters);< / div >
< div class = "line" > < a name = "l05588" > < / a > < span class = "lineno" > 5588< / span >   }< / div >
< div class = "line" > < a name = "l05589" > < / a > < span class = "lineno" > 5589< / span >   < / div >
< div class = "line" > < a name = "l05590" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd" > 5590< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd" > RoutingModel::AddToAssignment< / a > (< a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > ) {< / div >
< div class = "line" > < a name = "l05591" > < / a > < span class = "lineno" > 5591< / span >   extra_vars_.push_back(< a class = "code" href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > );< / div >
< div class = "line" > < a name = "l05592" > < / a > < span class = "lineno" > 5592< / span >   }< / div >
< div class = "line" > < a name = "l05593" > < / a > < span class = "lineno" > 5593< / span >   < / div >
< div class = "line" > < a name = "l05594" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61" > 5594< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61" > RoutingModel::AddIntervalToAssignment< / a > (< a class = "code" href = "classoperations__research_1_1_interval_var.html" > IntervalVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > ) {< / div >
< div class = "line" > < a name = "l05595" > < / a > < span class = "lineno" > 5595< / span >   extra_intervals_.push_back(< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > );< / div >
< div class = "line" > < a name = "l05596" > < / a > < span class = "lineno" > 5596< / span >   }< / div >
< div class = "line" > < a name = "l05597" > < / a > < span class = "lineno" > 5597< / span >   < / div >
< div class = "line" > < a name = "l05598" > < / a > < span class = "lineno" > 5598< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l05599" > < / a > < span class = "lineno" > 5599< / span >   < / div >
< div class = "line" > < a name = "l05600" > < / a > < span class = "lineno" > 5600< / span >   < span class = "keyword" > class < / span > PathSpansAndTotalSlacks : < span class = "keyword" > public< / span > < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > {< / div >
< div class = "line" > < a name = "l05601" > < / a > < span class = "lineno" > 5601< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l05602" > < / a > < span class = "lineno" > 5602< / span >   PathSpansAndTotalSlacks(< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ,< / div >
< div class = "line" > < a name = "l05603" > < / a > < span class = "lineno" > 5603< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension,< / div >
< div class = "line" > < a name = "l05604" > < / a > < span class = "lineno" > 5604< / span >   std::vector< IntVar*> spans,< / div >
< div class = "line" > < a name = "l05605" > < / a > < span class = "lineno" > 5605< / span >   std::vector< IntVar*> total_slacks)< / div >
< div class = "line" > < a name = "l05606" > < / a > < span class = "lineno" > 5606< / span >   : < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > (< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> solver()),< / div >
< div class = "line" > < a name = "l05607" > < / a > < span class = "lineno" > 5607< / span >   model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l05608" > < / a > < span class = "lineno" > 5608< / span >   dimension_(dimension),< / div >
< div class = "line" > < a name = "l05609" > < / a > < span class = "lineno" > 5609< / span >   spans_(std::move(spans)),< / div >
< div class = "line" > < a name = "l05610" > < / a > < span class = "lineno" > 5610< / span >   total_slacks_(std::move(total_slacks)) {< / div >
< div class = "line" > < a name = "l05611" > < / a > < span class = "lineno" > 5611< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (spans_.size(), model_-> vehicles());< / div >
< div class = "line" > < a name = "l05612" > < / a > < span class = "lineno" > 5612< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (total_slacks_.size(), model_-> vehicles());< / div >
< div class = "line" > < a name = "l05613" > < / a > < span class = "lineno" > 5613< / span >   vehicle_demons_.resize(model_-> vehicles());< / div >
< div class = "line" > < a name = "l05614" > < / a > < span class = "lineno" > 5614< / span >   }< / div >
< div class = "line" > < a name = "l05615" > < / a > < span class = "lineno" > 5615< / span >   < / div >
< div class = "line" > < a name = "l05616" > < / a > < span class = "lineno" > 5616< / span >   std::string DebugString()< span class = "keyword" > const override < / span > { < span class = "keywordflow" > return< / span > < span class = "stringliteral" > " PathSpansAndTotalSlacks" < / span > ; }< / div >
< div class = "line" > < a name = "l05617" > < / a > < span class = "lineno" > 5617< / span >   < / div >
< div class = "line" > < a name = "l05618" > < / a > < span class = "lineno" > 5618< / span >   < span class = "keywordtype" > void< / span > Post()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l05619" > < / a > < span class = "lineno" > 5619< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_nodes = model_-> VehicleVars().size();< / div >
< div class = "line" > < a name = "l05620" > < / a > < span class = "lineno" > 5620< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_transits = model_-> Nexts().size();< / div >
< div class = "line" > < a name = "l05621" > < / a > < span class = "lineno" > 5621< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node = 0; node < num_nodes; ++node) {< / div >
< div class = "line" > < a name = "l05622" > < / a > < span class = "lineno" > 5622< / span >   < span class = "keyword" > auto< / span > * demon = < a class = "code" href = "namespaceoperations__research.html#a4fb750da00c784e5ffd1763fd3ce88f7" > MakeConstraintDemon1< / a > (< / div >
< div class = "line" > < a name = "l05623" > < / a > < span class = "lineno" > 5623< / span >   model_-> solver(), < span class = "keyword" > this< / span > , & PathSpansAndTotalSlacks::PropagateNode,< / div >
< div class = "line" > < a name = "l05624" > < / a > < span class = "lineno" > 5624< / span >   < span class = "stringliteral" > " PathSpansAndTotalSlacks::PropagateNode" < / span > , node);< / div >
< div class = "line" > < a name = "l05625" > < / a > < span class = "lineno" > 5625< / span >   dimension_-> CumulVar(node)-> WhenRange(demon);< / div >
< div class = "line" > < a name = "l05626" > < / a > < span class = "lineno" > 5626< / span >   model_-> VehicleVar(node)-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l05627" > < / a > < span class = "lineno" > 5627< / span >   < span class = "keywordflow" > if< / span > (node < num_transits) {< / div >
< div class = "line" > < a name = "l05628" > < / a > < span class = "lineno" > 5628< / span >   dimension_-> TransitVar(node)-> WhenRange(demon);< / div >
< div class = "line" > < a name = "l05629" > < / a > < span class = "lineno" > 5629< / span >   dimension_-> FixedTransitVar(node)-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l05630" > < / a > < span class = "lineno" > 5630< / span >   model_-> NextVar(node)-> WhenBound(demon);< / div >
< div class = "line" > < a name = "l05631" > < / a > < span class = "lineno" > 5631< / span >   }< / div >
< div class = "line" > < a name = "l05632" > < / a > < span class = "lineno" > 5632< / span >   }< / div >
< div class = "line" > < a name = "l05633" > < / a > < span class = "lineno" > 5633< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < spans_.size(); ++vehicle) {< / div >
< div class = "line" > < a name = "l05634" > < / a > < span class = "lineno" > 5634< / span >   < span class = "keywordflow" > if< / span > (!spans_[vehicle] & & !total_slacks_[vehicle]) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l05635" > < / a > < span class = "lineno" > 5635< / span >   < span class = "keyword" > auto< / span > * demon = < a class = "code" href = "namespaceoperations__research.html#a11f4a7dbafd8e00a36b892a82e44445f" > MakeDelayedConstraintDemon1< / a > (< / div >
< div class = "line" > < a name = "l05636" > < / a > < span class = "lineno" > 5636< / span >   solver(), < span class = "keyword" > this< / span > , & PathSpansAndTotalSlacks::PropagateVehicle,< / div >
< div class = "line" > < a name = "l05637" > < / a > < span class = "lineno" > 5637< / span >   < span class = "stringliteral" > " PathSpansAndTotalSlacks::PropagateVehicle" < / span > , vehicle);< / div >
< div class = "line" > < a name = "l05638" > < / a > < span class = "lineno" > 5638< / span >   vehicle_demons_[vehicle] = demon;< / div >
< div class = "line" > < a name = "l05639" > < / a > < span class = "lineno" > 5639< / span >   < span class = "keywordflow" > if< / span > (spans_[vehicle]) spans_[vehicle]-> WhenRange(demon);< / div >
< div class = "line" > < a name = "l05640" > < / a > < span class = "lineno" > 5640< / span >   < span class = "keywordflow" > if< / span > (total_slacks_[vehicle]) total_slacks_[vehicle]-> WhenRange(demon);< / div >
< div class = "line" > < a name = "l05641" > < / a > < span class = "lineno" > 5641< / span >   < span class = "keywordflow" > if< / span > (dimension_-> HasBreakConstraints()) {< / div >
< div class = "line" > < a name = "l05642" > < / a > < span class = "lineno" > 5642< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > : dimension_-> GetBreakIntervalsOfVehicle(vehicle)) {< / div >
< div class = "line" > < a name = "l05643" > < / a > < span class = "lineno" > 5643< / span >   < a class = "code" href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > -> WhenAnything(demon);< / div >
< div class = "line" > < a name = "l05644" > < / a > < span class = "lineno" > 5644< / span >   }< / div >
< div class = "line" > < a name = "l05645" > < / a > < span class = "lineno" > 5645< / span >   }< / div >
< div class = "line" > < a name = "l05646" > < / a > < span class = "lineno" > 5646< / span >   }< / div >
< div class = "line" > < a name = "l05647" > < / a > < span class = "lineno" > 5647< / span >   }< / div >
< div class = "line" > < a name = "l05648" > < / a > < span class = "lineno" > 5648< / span >   < / div >
< div class = "line" > < a name = "l05649" > < / a > < span class = "lineno" > 5649< / span >   < span class = "comment" > // Call propagator on all vehicles.< / span > < / div >
< div class = "line" > < a name = "l05650" > < / a > < span class = "lineno" > 5650< / span >   < span class = "keywordtype" > void< / span > InitialPropagate()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l05651" > < / a > < span class = "lineno" > 5651< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < spans_.size(); ++vehicle) {< / div >
< div class = "line" > < a name = "l05652" > < / a > < span class = "lineno" > 5652< / span >   < span class = "keywordflow" > if< / span > (!spans_[vehicle] & & !total_slacks_[vehicle]) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l05653" > < / a > < span class = "lineno" > 5653< / span >   PropagateVehicle(vehicle);< / div >
< div class = "line" > < a name = "l05654" > < / a > < span class = "lineno" > 5654< / span >   }< / div >
< div class = "line" > < a name = "l05655" > < / a > < span class = "lineno" > 5655< / span >   }< / div >
< div class = "line" > < a name = "l05656" > < / a > < span class = "lineno" > 5656< / span >   < / div >
< div class = "line" > < a name = "l05657" > < / a > < span class = "lineno" > 5657< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l05658" > < / a > < span class = "lineno" > 5658< / span >   < span class = "comment" > // Called when a path/dimension variables of the node changes,< / span > < / div >
< div class = "line" > < a name = "l05659" > < / a > < span class = "lineno" > 5659< / span >   < span class = "comment" > // this delays propagator calls until path variables (Next and VehicleVar)< / span > < / div >
< div class = "line" > < a name = "l05660" > < / a > < span class = "lineno" > 5660< / span >   < span class = "comment" > // are instantiated, which saves fruitless and multiple identical calls.< / span > < / div >
< div class = "line" > < a name = "l05661" > < / a > < span class = "lineno" > 5661< / span >   < span class = "keywordtype" > void< / span > PropagateNode(< span class = "keywordtype" > int< / span > node) {< / div >
< div class = "line" > < a name = "l05662" > < / a > < span class = "lineno" > 5662< / span >   < span class = "keywordflow" > if< / span > (!model_-> VehicleVar(node)-> Bound()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05663" > < / a > < span class = "lineno" > 5663< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle = model_-> VehicleVar(node)-> Min();< / div >
< div class = "line" > < a name = "l05664" > < / a > < span class = "lineno" > 5664< / span >   < span class = "keywordflow" > if< / span > (vehicle < 0 || vehicle_demons_[vehicle] == < span class = "keyword" > nullptr< / span > ) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05665" > < / a > < span class = "lineno" > 5665< / span >   EnqueueDelayedDemon(vehicle_demons_[vehicle]);< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05666" > < / a > < span class = "lineno" > 5666< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05667" > < / a > < span class = "lineno" > 5667< / span >   < / div >
< div class = "line" > < a name = "l05668" > < / a > < span class = "lineno" > 5668< / span >   < span class = "comment" > // In order to make reasoning on span and total_slack of a vehicle uniform,< / span > < / div >
< div class = "line" > < a name = "l05669" > < / a > < span class = "lineno" > 5669< / span >   < span class = "comment" > // we rely on the fact that span == sum_fixed_transits + total_slack< / span > < / div >
< div class = "line" > < a name = "l05670" > < / a > < span class = "lineno" > 5670< / span >   < span class = "comment" > // to present both span and total_slack in terms of span and fixed transit.< / span > < / div >
< div class = "line" > < a name = "l05671" > < / a > < span class = "lineno" > 5671< / span >   < span class = "comment" > // This allows to use the same code whether there actually are variables< / span > < / div >
< div class = "line" > < a name = "l05672" > < / a > < span class = "lineno" > 5672< / span >   < span class = "comment" > // for span and total_slack or not.< / span > < / div >
< div class = "line" > < a name = "l05673" > < / a > < span class = "lineno" > 5673< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > SpanMin(< span class = "keywordtype" > int< / span > vehicle, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits) {< / div >
< div class = "line" > < a name = "l05674" > < / a > < span class = "lineno" > 5674< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (sum_fixed_transits, 0);< / div >
< div class = "line" > < a name = "l05675" > < / a > < span class = "lineno" > 5675< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_min = spans_[vehicle] ? spans_[vehicle]-> Min() : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l05676" > < / a > < span class = "lineno" > 5676< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > total_slack_min =< / div >
< div class = "line" > < a name = "l05677" > < / a > < span class = "lineno" > 5677< / span >   total_slacks_[vehicle] ? total_slacks_[vehicle]-> Min() : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l05678" > < / a > < span class = "lineno" > 5678< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (span_min, < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (total_slack_min, sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05679" > < / a > < span class = "lineno" > 5679< / span >   }< / div >
< div class = "line" > < a name = "l05680" > < / a > < span class = "lineno" > 5680< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > SpanMax(< span class = "keywordtype" > int< / span > vehicle, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits) {< / div >
< div class = "line" > < a name = "l05681" > < / a > < span class = "lineno" > 5681< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (sum_fixed_transits, 0);< / div >
< div class = "line" > < a name = "l05682" > < / a > < span class = "lineno" > 5682< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_max = spans_[vehicle] ? spans_[vehicle]-> Max() : < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > ;< / div >
< div class = "line" > < a name = "l05683" > < / a > < span class = "lineno" > 5683< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > total_slack_max =< / div >
< div class = "line" > < a name = "l05684" > < / a > < span class = "lineno" > 5684< / span >   total_slacks_[vehicle] ? total_slacks_[vehicle]-> Max() : < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > ;< / div >
< div class = "line" > < a name = "l05685" > < / a > < span class = "lineno" > 5685< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (span_max, < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (total_slack_max, sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05686" > < / a > < span class = "lineno" > 5686< / span >   }< / div >
< div class = "line" > < a name = "l05687" > < / a > < span class = "lineno" > 5687< / span >   < span class = "keywordtype" > void< / span > SetSpanMin(< span class = "keywordtype" > int< / span > vehicle, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits) {< / div >
< div class = "line" > < a name = "l05688" > < / a > < span class = "lineno" > 5688< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (sum_fixed_transits, 0);< / div >
< div class = "line" > < a name = "l05689" > < / a > < span class = "lineno" > 5689< / span >   < span class = "keywordflow" > if< / span > (spans_[vehicle]) {< / div >
< div class = "line" > < a name = "l05690" > < / a > < span class = "lineno" > 5690< / span >   spans_[vehicle]-> SetMin(< a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > );< / div >
< div class = "line" > < a name = "l05691" > < / a > < span class = "lineno" > 5691< / span >   }< / div >
< div class = "line" > < a name = "l05692" > < / a > < span class = "lineno" > 5692< / span >   < span class = "keywordflow" > if< / span > (total_slacks_[vehicle]) {< / div >
< div class = "line" > < a name = "l05693" > < / a > < span class = "lineno" > 5693< / span >   total_slacks_[vehicle]-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > , sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05694" > < / a > < span class = "lineno" > 5694< / span >   }< / div >
< div class = "line" > < a name = "l05695" > < / a > < span class = "lineno" > 5695< / span >   }< / div >
< div class = "line" > < a name = "l05696" > < / a > < span class = "lineno" > 5696< / span >   < span class = "keywordtype" > void< / span > SetSpanMax(< span class = "keywordtype" > int< / span > vehicle, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits) {< / div >
< div class = "line" > < a name = "l05697" > < / a > < span class = "lineno" > 5697< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (sum_fixed_transits, 0);< / div >
< div class = "line" > < a name = "l05698" > < / a > < span class = "lineno" > 5698< / span >   < span class = "keywordflow" > if< / span > (spans_[vehicle]) {< / div >
< div class = "line" > < a name = "l05699" > < / a > < span class = "lineno" > 5699< / span >   spans_[vehicle]-> SetMax(< a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > );< / div >
< div class = "line" > < a name = "l05700" > < / a > < span class = "lineno" > 5700< / span >   }< / div >
< div class = "line" > < a name = "l05701" > < / a > < span class = "lineno" > 5701< / span >   < span class = "keywordflow" > if< / span > (total_slacks_[vehicle]) {< / div >
< div class = "line" > < a name = "l05702" > < / a > < span class = "lineno" > 5702< / span >   total_slacks_[vehicle]-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > , sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05703" > < / a > < span class = "lineno" > 5703< / span >   }< / div >
< div class = "line" > < a name = "l05704" > < / a > < span class = "lineno" > 5704< / span >   }< / div >
< div class = "line" > < a name = "l05705" > < / a > < span class = "lineno" > 5705< / span >   < span class = "comment" > // Propagates span == sum_fixed_transits + total_slack.< / span > < / div >
< div class = "line" > < a name = "l05706" > < / a > < span class = "lineno" > 5706< / span >   < span class = "comment" > // This should be called at least once during PropagateVehicle().< / span > < / div >
< div class = "line" > < a name = "l05707" > < / a > < span class = "lineno" > 5707< / span >   < span class = "keywordtype" > void< / span > SynchronizeSpanAndTotalSlack(< span class = "keywordtype" > int< / span > vehicle, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits) {< / div >
< div class = "line" > < a name = "l05708" > < / a > < span class = "lineno" > 5708< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (sum_fixed_transits, 0);< / div >
< div class = "line" > < a name = "l05709" > < / a > < span class = "lineno" > 5709< / span >   IntVar* span = spans_[vehicle];< / div >
< div class = "line" > < a name = "l05710" > < / a > < span class = "lineno" > 5710< / span >   IntVar* total_slack = total_slacks_[vehicle];< / div >
< div class = "line" > < a name = "l05711" > < / a > < span class = "lineno" > 5711< / span >   < span class = "keywordflow" > if< / span > (!span || !total_slack) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05712" > < / a > < span class = "lineno" > 5712< / span >   span-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (total_slack-> Min(), sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05713" > < / a > < span class = "lineno" > 5713< / span >   span-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (total_slack-> Max(), sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05714" > < / a > < span class = "lineno" > 5714< / span >   total_slack-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span-> Min(), sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05715" > < / a > < span class = "lineno" > 5715< / span >   total_slack-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span-> Max(), sum_fixed_transits));< / div >
< div class = "line" > < a name = "l05716" > < / a > < span class = "lineno" > 5716< / span >   }< / div >
< div class = "line" > < a name = "l05717" > < / a > < span class = "lineno" > 5717< / span >   < / div >
< div class = "line" > < a name = "l05718" > < / a > < span class = "lineno" > 5718< / span >   < span class = "keywordtype" > void< / span > PropagateVehicle(< span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l05719" > < / a > < span class = "lineno" > 5719< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (spans_[vehicle] || total_slacks_[vehicle]);< / div >
< div class = "line" > < a name = "l05720" > < / a > < span class = "lineno" > 5720< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > start = model_-> Start(vehicle);< / div >
< div class = "line" > < a name = "l05721" > < / a > < span class = "lineno" > 5721< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > end = model_-> End(vehicle);< / div >
< div class = "line" > < a name = "l05722" > < / a > < span class = "lineno" > 5722< / span >   < span class = "comment" > // Record path, if it is not fixed from start to end, stop here.< / span > < / div >
< div class = "line" > < a name = "l05723" > < / a > < span class = "lineno" > 5723< / span >   < span class = "comment" > // TRICKY: do not put end node yet, we look only at transits in the next< / span > < / div >
< div class = "line" > < a name = "l05724" > < / a > < span class = "lineno" > 5724< / span >   < span class = "comment" > // reasonings, we will append the end when we look at cumuls.< / span > < / div >
< div class = "line" > < a name = "l05725" > < / a > < span class = "lineno" > 5725< / span >   {< / div >
< div class = "line" > < a name = "l05726" > < / a > < span class = "lineno" > 5726< / span >   path_.clear();< / div >
< div class = "line" > < a name = "l05727" > < / a > < span class = "lineno" > 5727< / span >   < span class = "keywordtype" > int< / span > curr_node = start;< / div >
< div class = "line" > < a name = "l05728" > < / a > < span class = "lineno" > 5728< / span >   < span class = "keywordflow" > while< / span > (!model_-> IsEnd(curr_node)) {< / div >
< div class = "line" > < a name = "l05729" > < / a > < span class = "lineno" > 5729< / span >   < span class = "keyword" > const< / span > IntVar* next_var = model_-> NextVar(curr_node);< / div >
< div class = "line" > < a name = "l05730" > < / a > < span class = "lineno" > 5730< / span >   < span class = "keywordflow" > if< / span > (!next_var-> Bound()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05731" > < / a > < span class = "lineno" > 5731< / span >   path_.push_back(curr_node);< / div >
< div class = "line" > < a name = "l05732" > < / a > < span class = "lineno" > 5732< / span >   curr_node = next_var-> Value();< / div >
< div class = "line" > < a name = "l05733" > < / a > < span class = "lineno" > 5733< / span >   }< / div >
< div class = "line" > < a name = "l05734" > < / a > < span class = "lineno" > 5734< / span >   }< / div >
< div class = "line" > < a name = "l05735" > < / a > < span class = "lineno" > 5735< / span >   < span class = "comment" > // Compute the sum of fixed transits. Fixed transit variables should all be< / span > < / div >
< div class = "line" > < a name = "l05736" > < / a > < span class = "lineno" > 5736< / span >   < span class = "comment" > // fixed, otherwise we wait to get called later when propagation does it.< / span > < / div >
< div class = "line" > < a name = "l05737" > < / a > < span class = "lineno" > 5737< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > sum_fixed_transits = 0;< / div >
< div class = "line" > < a name = "l05738" > < / a > < span class = "lineno" > 5738< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > node : path_) {< / div >
< div class = "line" > < a name = "l05739" > < / a > < span class = "lineno" > 5739< / span >   < span class = "keyword" > const< / span > IntVar* fixed_transit_var = dimension_-> FixedTransitVar(node);< / div >
< div class = "line" > < a name = "l05740" > < / a > < span class = "lineno" > 5740< / span >   < span class = "keywordflow" > if< / span > (!fixed_transit_var-> Bound()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l05741" > < / a > < span class = "lineno" > 5741< / span >   sum_fixed_transits =< / div >
< div class = "line" > < a name = "l05742" > < / a > < span class = "lineno" > 5742< / span >   < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (sum_fixed_transits, fixed_transit_var-> Value());< / div >
< div class = "line" > < a name = "l05743" > < / a > < span class = "lineno" > 5743< / span >   }< / div >
< div class = "line" > < a name = "l05744" > < / a > < span class = "lineno" > 5744< / span >   < / div >
< div class = "line" > < a name = "l05745" > < / a > < span class = "lineno" > 5745< / span >   SynchronizeSpanAndTotalSlack(vehicle, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05746" > < / a > < span class = "lineno" > 5746< / span >   < / div >
< div class = "line" > < a name = "l05747" > < / a > < span class = "lineno" > 5747< / span >   < span class = "comment" > // The amount of break time that must occur during the route must be smaller< / span > < / div >
< div class = "line" > < a name = "l05748" > < / a > < span class = "lineno" > 5748< / span >   < span class = "comment" > // than span max - sum_fixed_transits. A break must occur on the route if it< / span > < / div >
< div class = "line" > < a name = "l05749" > < / a > < span class = "lineno" > 5749< / span >   < span class = "comment" > // must be after the route' s start and before the route' s end.< / span > < / div >
< div class = "line" > < a name = "l05750" > < / a > < span class = "lineno" > 5750< / span >   < span class = "comment" > // Propagate lower bound on span, then filter out values< / span > < / div >
< div class = "line" > < a name = "l05751" > < / a > < span class = "lineno" > 5751< / span >   < span class = "comment" > // that would force more breaks in route than possible.< / span > < / div >
< div class = "line" > < a name = "l05752" > < / a > < span class = "lineno" > 5752< / span >   < span class = "keywordflow" > if< / span > (dimension_-> HasBreakConstraints() & & < / div >
< div class = "line" > < a name = "l05753" > < / a > < span class = "lineno" > 5753< / span >   !dimension_-> GetBreakIntervalsOfVehicle(vehicle).empty()) {< / div >
< div class = "line" > < a name = "l05754" > < / a > < span class = "lineno" > 5754< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_start_max = dimension_-> CumulVar(start)-> Max();< / div >
< div class = "line" > < a name = "l05755" > < / a > < span class = "lineno" > 5755< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_end_min = dimension_-> CumulVar(end)-> Min();< / div >
< div class = "line" > < a name = "l05756" > < / a > < span class = "lineno" > 5756< / span >   < span class = "comment" > // Compute and propagate lower bound.< / span > < / div >
< div class = "line" > < a name = "l05757" > < / a > < span class = "lineno" > 5757< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > min_break_duration = 0;< / div >
< div class = "line" > < a name = "l05758" > < / a > < span class = "lineno" > 5758< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* br : dimension_-> GetBreakIntervalsOfVehicle(vehicle)) {< / div >
< div class = "line" > < a name = "l05759" > < / a > < span class = "lineno" > 5759< / span >   < span class = "keywordflow" > if< / span > (!br-> MustBePerformed()) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l05760" > < / a > < span class = "lineno" > 5760< / span >   < span class = "keywordflow" > if< / span > (vehicle_start_max < br-> EndMin() & & < / div >
< div class = "line" > < a name = "l05761" > < / a > < span class = "lineno" > 5761< / span >   br-> StartMax() < vehicle_end_min) {< / div >
< div class = "line" > < a name = "l05762" > < / a > < span class = "lineno" > 5762< / span >   min_break_duration = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (min_break_duration, br-> DurationMin());< / div >
< div class = "line" > < a name = "l05763" > < / a > < span class = "lineno" > 5763< / span >   }< / div >
< div class = "line" > < a name = "l05764" > < / a > < span class = "lineno" > 5764< / span >   }< / div >
< div class = "line" > < a name = "l05765" > < / a > < span class = "lineno" > 5765< / span >   SetSpanMin(vehicle, < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (min_break_duration, sum_fixed_transits),< / div >
< div class = "line" > < a name = "l05766" > < / a > < span class = "lineno" > 5766< / span >   sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05767" > < / a > < span class = "lineno" > 5767< / span >   < span class = "comment" > // If a break that is not inside the route may violate slack_max,< / span > < / div >
< div class = "line" > < a name = "l05768" > < / a > < span class = "lineno" > 5768< / span >   < span class = "comment" > // we can propagate in some cases: when the break must be before or< / span > < / div >
< div class = "line" > < a name = "l05769" > < / a > < span class = "lineno" > 5769< / span >   < span class = "comment" > // must be after the route.< / span > < / div >
< div class = "line" > < a name = "l05770" > < / a > < span class = "lineno" > 5770< / span >   < span class = "comment" > // In the other cases, we cannot deduce a better bound on a CumulVar or< / span > < / div >
< div class = "line" > < a name = "l05771" > < / a > < span class = "lineno" > 5771< / span >   < span class = "comment" > // on a break, so we do nothing.< / span > < / div >
< div class = "line" > < a name = "l05772" > < / a > < span class = "lineno" > 5772< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max =< / div >
< div class = "line" > < a name = "l05773" > < / a > < span class = "lineno" > 5773< / span >   < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (SpanMax(vehicle, sum_fixed_transits), sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05774" > < / a > < span class = "lineno" > 5774< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > max_additional_slack = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (slack_max, min_break_duration);< / div >
< div class = "line" > < a name = "l05775" > < / a > < span class = "lineno" > 5775< / span >   < span class = "keywordflow" > for< / span > (IntervalVar* br : dimension_-> GetBreakIntervalsOfVehicle(vehicle)) {< / div >
< div class = "line" > < a name = "l05776" > < / a > < span class = "lineno" > 5776< / span >   < span class = "keywordflow" > if< / span > (!br-> MustBePerformed()) < span class = "keywordflow" > continue< / span > ;< / div >
< div class = "line" > < a name = "l05777" > < / a > < span class = "lineno" > 5777< / span >   < span class = "comment" > // Break must be before end, detect whether it must be before start.< / span > < / div >
< div class = "line" > < a name = "l05778" > < / a > < span class = "lineno" > 5778< / span >   < span class = "keywordflow" > if< / span > (vehicle_start_max > = br-> EndMin() & & < / div >
< div class = "line" > < a name = "l05779" > < / a > < span class = "lineno" > 5779< / span >   br-> StartMax() < vehicle_end_min) {< / div >
< div class = "line" > < a name = "l05780" > < / a > < span class = "lineno" > 5780< / span >   < span class = "keywordflow" > if< / span > (br-> DurationMin() > max_additional_slack) {< / div >
< div class = "line" > < a name = "l05781" > < / a > < span class = "lineno" > 5781< / span >   < span class = "comment" > // Having the break inside would violate max_additional_slack..< / span > < / div >
< div class = "line" > < a name = "l05782" > < / a > < span class = "lineno" > 5782< / span >   < span class = "comment" > // Thus, it must be outside the route, in this case, before.< / span > < / div >
< div class = "line" > < a name = "l05783" > < / a > < span class = "lineno" > 5783< / span >   br-> SetEndMax(vehicle_start_max);< / div >
< div class = "line" > < a name = "l05784" > < / a > < span class = "lineno" > 5784< / span >   dimension_-> CumulVar(start)-> SetMin(br-> EndMin());< / div >
< div class = "line" > < a name = "l05785" > < / a > < span class = "lineno" > 5785< / span >   }< / div >
< div class = "line" > < a name = "l05786" > < / a > < span class = "lineno" > 5786< / span >   }< / div >
< div class = "line" > < a name = "l05787" > < / a > < span class = "lineno" > 5787< / span >   < span class = "comment" > // Break must be after start, detect whether it must be after end.< / span > < / div >
< div class = "line" > < a name = "l05788" > < / a > < span class = "lineno" > 5788< / span >   < span class = "comment" > // Same reasoning, in the case where the break is after.< / span > < / div >
< div class = "line" > < a name = "l05789" > < / a > < span class = "lineno" > 5789< / span >   < span class = "keywordflow" > if< / span > (vehicle_start_max < br-> EndMin() & & < / div >
< div class = "line" > < a name = "l05790" > < / a > < span class = "lineno" > 5790< / span >   br-> StartMax() > = vehicle_end_min) {< / div >
< div class = "line" > < a name = "l05791" > < / a > < span class = "lineno" > 5791< / span >   < span class = "keywordflow" > if< / span > (br-> DurationMin() > max_additional_slack) {< / div >
< div class = "line" > < a name = "l05792" > < / a > < span class = "lineno" > 5792< / span >   br-> SetStartMin(vehicle_end_min);< / div >
< div class = "line" > < a name = "l05793" > < / a > < span class = "lineno" > 5793< / span >   dimension_-> CumulVar(end)-> SetMax(br-> StartMax());< / div >
< div class = "line" > < a name = "l05794" > < / a > < span class = "lineno" > 5794< / span >   }< / div >
< div class = "line" > < a name = "l05795" > < / a > < span class = "lineno" > 5795< / span >   }< / div >
< div class = "line" > < a name = "l05796" > < / a > < span class = "lineno" > 5796< / span >   }< / div >
< div class = "line" > < a name = "l05797" > < / a > < span class = "lineno" > 5797< / span >   }< / div >
< div class = "line" > < a name = "l05798" > < / a > < span class = "lineno" > 5798< / span >   < / div >
< div class = "line" > < a name = "l05799" > < / a > < span class = "lineno" > 5799< / span >   < span class = "comment" > // Propagate span == cumul(end) - cumul(start).< / span > < / div >
< div class = "line" > < a name = "l05800" > < / a > < span class = "lineno" > 5800< / span >   {< / div >
< div class = "line" > < a name = "l05801" > < / a > < span class = "lineno" > 5801< / span >   IntVar* start_cumul = dimension_-> CumulVar(start);< / div >
< div class = "line" > < a name = "l05802" > < / a > < span class = "lineno" > 5802< / span >   IntVar* end_cumul = dimension_-> CumulVar(end);< / div >
< div class = "line" > < a name = "l05803" > < / a > < span class = "lineno" > 5803< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "sched__constraints_8cc.html#ab2188791e61e013dc8b28e66b31041cd" > start_min< / a > = start_cumul-> Min();< / div >
< div class = "line" > < a name = "l05804" > < / a > < span class = "lineno" > 5804< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "sched__constraints_8cc.html#a7c8133c50ba59755e2162ad1a9478da7" > start_max< / a > = start_cumul-> Max();< / div >
< div class = "line" > < a name = "l05805" > < / a > < span class = "lineno" > 5805< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "sched__constraints_8cc.html#a16edac3fa04d9ba10ff012b5fb8add05" > end_min< / a > = end_cumul-> Min();< / div >
< div class = "line" > < a name = "l05806" > < / a > < span class = "lineno" > 5806< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "sched__constraints_8cc.html#a3db7a45809ea7c6000b10a58f003b331" > end_max< / a > = end_cumul-> Max();< / div >
< div class = "line" > < a name = "l05807" > < / a > < span class = "lineno" > 5807< / span >   < span class = "comment" > // Propagate from cumuls to span.< / span > < / div >
< div class = "line" > < a name = "l05808" > < / a > < span class = "lineno" > 5808< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "sched__constraints_8cc.html#a16edac3fa04d9ba10ff012b5fb8add05" > end_min< / a > , < a class = "code" href = "sched__constraints_8cc.html#a7c8133c50ba59755e2162ad1a9478da7" > start_max< / a > );< / div >
< div class = "line" > < a name = "l05809" > < / a > < span class = "lineno" > 5809< / span >   SetSpanMin(vehicle, span_lb, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05810" > < / a > < span class = "lineno" > 5810< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_ub = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "sched__constraints_8cc.html#a3db7a45809ea7c6000b10a58f003b331" > end_max< / a > , < a class = "code" href = "sched__constraints_8cc.html#ab2188791e61e013dc8b28e66b31041cd" > start_min< / a > );< / div >
< div class = "line" > < a name = "l05811" > < / a > < span class = "lineno" > 5811< / span >   SetSpanMax(vehicle, span_ub, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05812" > < / a > < span class = "lineno" > 5812< / span >   < span class = "comment" > // Propagate from span to cumuls.< / span > < / div >
< div class = "line" > < a name = "l05813" > < / a > < span class = "lineno" > 5813< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_min = SpanMin(vehicle, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05814" > < / a > < span class = "lineno" > 5814< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_max = SpanMax(vehicle, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05815" > < / a > < span class = "lineno" > 5815< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_from_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span_max, span_lb);< / div >
< div class = "line" > < a name = "l05816" > < / a > < span class = "lineno" > 5816< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_from_ub = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span_ub, span_min);< / div >
< div class = "line" > < a name = "l05817" > < / a > < span class = "lineno" > 5817< / span >   < span class = "comment" > // start > = start_max - (span_max - span_lb).< / span > < / div >
< div class = "line" > < a name = "l05818" > < / a > < span class = "lineno" > 5818< / span >   start_cumul-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "sched__constraints_8cc.html#a7c8133c50ba59755e2162ad1a9478da7" > start_max< / a > , slack_from_lb));< / div >
< div class = "line" > < a name = "l05819" > < / a > < span class = "lineno" > 5819< / span >   < span class = "comment" > // end < = end_min + (span_max - span_lb).< / span > < / div >
< div class = "line" > < a name = "l05820" > < / a > < span class = "lineno" > 5820< / span >   end_cumul-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (< a class = "code" href = "sched__constraints_8cc.html#a16edac3fa04d9ba10ff012b5fb8add05" > end_min< / a > , slack_from_lb));< / div >
< div class = "line" > < a name = "l05821" > < / a > < span class = "lineno" > 5821< / span >   < span class = "comment" > // // start < = start_min + (span_ub - span_min)< / span > < / div >
< div class = "line" > < a name = "l05822" > < / a > < span class = "lineno" > 5822< / span >   start_cumul-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (< a class = "code" href = "sched__constraints_8cc.html#ab2188791e61e013dc8b28e66b31041cd" > start_min< / a > , slack_from_ub));< / div >
< div class = "line" > < a name = "l05823" > < / a > < span class = "lineno" > 5823< / span >   < span class = "comment" > // // end > = end_max - (span_ub - span_min)< / span > < / div >
< div class = "line" > < a name = "l05824" > < / a > < span class = "lineno" > 5824< / span >   end_cumul-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "sched__constraints_8cc.html#a3db7a45809ea7c6000b10a58f003b331" > end_max< / a > , slack_from_ub));< / div >
< div class = "line" > < a name = "l05825" > < / a > < span class = "lineno" > 5825< / span >   }< / div >
< div class = "line" > < a name = "l05826" > < / a > < span class = "lineno" > 5826< / span >   < / div >
< div class = "line" > < a name = "l05827" > < / a > < span class = "lineno" > 5827< / span >   < span class = "comment" > // Propagate sum transits == span.< / span > < / div >
< div class = "line" > < a name = "l05828" > < / a > < span class = "lineno" > 5828< / span >   {< / div >
< div class = "line" > < a name = "l05829" > < / a > < span class = "lineno" > 5829< / span >   < span class = "comment" > // Propagate from transits to span.< / span > < / div >
< div class = "line" > < a name = "l05830" > < / a > < span class = "lineno" > 5830< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_lb = 0;< / div >
< div class = "line" > < a name = "l05831" > < / a > < span class = "lineno" > 5831< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_ub = 0;< / div >
< div class = "line" > < a name = "l05832" > < / a > < span class = "lineno" > 5832< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > node : path_) {< / div >
< div class = "line" > < a name = "l05833" > < / a > < span class = "lineno" > 5833< / span >   span_lb = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (span_lb, dimension_-> TransitVar(node)-> Min());< / div >
< div class = "line" > < a name = "l05834" > < / a > < span class = "lineno" > 5834< / span >   span_ub = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (span_ub, dimension_-> TransitVar(node)-> Max());< / div >
< div class = "line" > < a name = "l05835" > < / a > < span class = "lineno" > 5835< / span >   }< / div >
< div class = "line" > < a name = "l05836" > < / a > < span class = "lineno" > 5836< / span >   SetSpanMin(vehicle, span_lb, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05837" > < / a > < span class = "lineno" > 5837< / span >   SetSpanMax(vehicle, span_ub, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05838" > < / a > < span class = "lineno" > 5838< / span >   < span class = "comment" > // Propagate from span to transits.< / span > < / div >
< div class = "line" > < a name = "l05839" > < / a > < span class = "lineno" > 5839< / span >   < span class = "comment" > // transit[i] < = transit_i_min + (span_max - span_lb)< / span > < / div >
< div class = "line" > < a name = "l05840" > < / a > < span class = "lineno" > 5840< / span >   < span class = "comment" > // transit[i] > = transit_i_max - (span_ub - span_min)< / span > < / div >
< div class = "line" > < a name = "l05841" > < / a > < span class = "lineno" > 5841< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_min = SpanMin(vehicle, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05842" > < / a > < span class = "lineno" > 5842< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_max = SpanMax(vehicle, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05843" > < / a > < span class = "lineno" > 5843< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_from_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span_max, span_lb);< / div >
< div class = "line" > < a name = "l05844" > < / a > < span class = "lineno" > 5844< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_from_ub =< / div >
< div class = "line" > < a name = "l05845" > < / a > < span class = "lineno" > 5845< / span >   span_ub < < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ? < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (span_ub, span_min) : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l05846" > < / a > < span class = "lineno" > 5846< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > node : path_) {< / div >
< div class = "line" > < a name = "l05847" > < / a > < span class = "lineno" > 5847< / span >   IntVar* transit_var = dimension_-> TransitVar(node);< / div >
< div class = "line" > < a name = "l05848" > < / a > < span class = "lineno" > 5848< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > transit_i_min = transit_var-> Min();< / div >
< div class = "line" > < a name = "l05849" > < / a > < span class = "lineno" > 5849< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > transit_i_max = transit_var-> Max();< / div >
< div class = "line" > < a name = "l05850" > < / a > < span class = "lineno" > 5850< / span >   < span class = "comment" > // TRICKY: the first propagation might change transit_var-> Max(),< / span > < / div >
< div class = "line" > < a name = "l05851" > < / a > < span class = "lineno" > 5851< / span >   < span class = "comment" > // but we must use the same value of transit_i_max in the computation< / span > < / div >
< div class = "line" > < a name = "l05852" > < / a > < span class = "lineno" > 5852< / span >   < span class = "comment" > // of transit[i]' s lower bound that was used for span_ub.< / span > < / div >
< div class = "line" > < a name = "l05853" > < / a > < span class = "lineno" > 5853< / span >   transit_var-> SetMax(< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (transit_i_min, slack_from_lb));< / div >
< div class = "line" > < a name = "l05854" > < / a > < span class = "lineno" > 5854< / span >   transit_var-> SetMin(< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (transit_i_max, slack_from_ub));< / div >
< div class = "line" > < a name = "l05855" > < / a > < span class = "lineno" > 5855< / span >   }< / div >
< div class = "line" > < a name = "l05856" > < / a > < span class = "lineno" > 5856< / span >   }< / div >
< div class = "line" > < a name = "l05857" > < / a > < span class = "lineno" > 5857< / span >   < / div >
< div class = "line" > < a name = "l05858" > < / a > < span class = "lineno" > 5858< / span >   < span class = "comment" > // TRICKY: add end node now, we will look at cumuls.< / span > < / div >
< div class = "line" > < a name = "l05859" > < / a > < span class = "lineno" > 5859< / span >   path_.push_back(end);< / div >
< div class = "line" > < a name = "l05860" > < / a > < span class = "lineno" > 5860< / span >   < / div >
< div class = "line" > < a name = "l05861" > < / a > < span class = "lineno" > 5861< / span >   < span class = "comment" > // A stronger bound: from start min of the route, go to node i+1 with time< / span > < / div >
< div class = "line" > < a name = "l05862" > < / a > < span class = "lineno" > 5862< / span >   < span class = "comment" > // max(cumul[i] + fixed_transit, cumul[i+1].Min()).< / span > < / div >
< div class = "line" > < a name = "l05863" > < / a > < span class = "lineno" > 5863< / span >   < span class = "comment" > // Record arrival time (should be the same as end cumul min).< / span > < / div >
< div class = "line" > < a name = "l05864" > < / a > < span class = "lineno" > 5864< / span >   < span class = "comment" > // Then do the reverse route, going to time< / span > < / div >
< div class = "line" > < a name = "l05865" > < / a > < span class = "lineno" > 5865< / span >   < span class = "comment" > // min(cumul[i+1] - fixed_transit, cumul[i].Max())< / span > < / div >
< div class = "line" > < a name = "l05866" > < / a > < span class = "lineno" > 5866< / span >   < span class = "comment" > // Record final time as departure time.< / span > < / div >
< div class = "line" > < a name = "l05867" > < / a > < span class = "lineno" > 5867< / span >   < span class = "comment" > // Then arrival time - departure time is a valid lower bound of span.< / span > < / div >
< div class = "line" > < a name = "l05868" > < / a > < span class = "lineno" > 5868< / span >   < span class = "comment" > // First reasoning: start - end - start< / span > < / div >
< div class = "line" > < a name = "l05869" > < / a > < span class = "lineno" > 5869< / span >   {< / div >
< div class = "line" > < a name = "l05870" > < / a > < span class = "lineno" > 5870< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > arrival_time = dimension_-> CumulVar(start)-> Min();< / div >
< div class = "line" > < a name = "l05871" > < / a > < span class = "lineno" > 5871< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 1; i < path_.size(); ++i) {< / div >
< div class = "line" > < a name = "l05872" > < / a > < span class = "lineno" > 5872< / span >   arrival_time =< / div >
< div class = "line" > < a name = "l05873" > < / a > < span class = "lineno" > 5873< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (arrival_time,< / div >
< div class = "line" > < a name = "l05874" > < / a > < span class = "lineno" > 5874< / span >   dimension_-> FixedTransitVar(path_[i - 1])-> Min()),< / div >
< div class = "line" > < a name = "l05875" > < / a > < span class = "lineno" > 5875< / span >   dimension_-> CumulVar(path_[i])-> Min());< / div >
< div class = "line" > < a name = "l05876" > < / a > < span class = "lineno" > 5876< / span >   }< / div >
< div class = "line" > < a name = "l05877" > < / a > < span class = "lineno" > 5877< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > departure_time = arrival_time;< / div >
< div class = "line" > < a name = "l05878" > < / a > < span class = "lineno" > 5878< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = path_.size() - 2; i > = 0; --i) {< / div >
< div class = "line" > < a name = "l05879" > < / a > < span class = "lineno" > 5879< / span >   departure_time =< / div >
< div class = "line" > < a name = "l05880" > < / a > < span class = "lineno" > 5880< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (departure_time,< / div >
< div class = "line" > < a name = "l05881" > < / a > < span class = "lineno" > 5881< / span >   dimension_-> FixedTransitVar(path_[i])-> Min()),< / div >
< div class = "line" > < a name = "l05882" > < / a > < span class = "lineno" > 5882< / span >   dimension_-> CumulVar(path_[i])-> Max());< / div >
< div class = "line" > < a name = "l05883" > < / a > < span class = "lineno" > 5883< / span >   }< / div >
< div class = "line" > < a name = "l05884" > < / a > < span class = "lineno" > 5884< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (arrival_time, departure_time);< / div >
< div class = "line" > < a name = "l05885" > < / a > < span class = "lineno" > 5885< / span >   SetSpanMin(vehicle, span_lb, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05886" > < / a > < span class = "lineno" > 5886< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > maximum_deviation =< / div >
< div class = "line" > < a name = "l05887" > < / a > < span class = "lineno" > 5887< / span >   < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (SpanMax(vehicle, sum_fixed_transits), span_lb);< / div >
< div class = "line" > < a name = "l05888" > < / a > < span class = "lineno" > 5888< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > start_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (departure_time, maximum_deviation);< / div >
< div class = "line" > < a name = "l05889" > < / a > < span class = "lineno" > 5889< / span >   dimension_-> CumulVar(start)-> SetMin(start_lb);< / div >
< div class = "line" > < a name = "l05890" > < / a > < span class = "lineno" > 5890< / span >   }< / div >
< div class = "line" > < a name = "l05891" > < / a > < span class = "lineno" > 5891< / span >   < span class = "comment" > // Second reasoning: end - start - end< / span > < / div >
< div class = "line" > < a name = "l05892" > < / a > < span class = "lineno" > 5892< / span >   {< / div >
< div class = "line" > < a name = "l05893" > < / a > < span class = "lineno" > 5893< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > departure_time = dimension_-> CumulVar(end)-> Max();< / div >
< div class = "line" > < a name = "l05894" > < / a > < span class = "lineno" > 5894< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = path_.size() - 2; i > = 0; --i) {< / div >
< div class = "line" > < a name = "l05895" > < / a > < span class = "lineno" > 5895< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > curr_node = path_[i];< / div >
< div class = "line" > < a name = "l05896" > < / a > < span class = "lineno" > 5896< / span >   departure_time =< / div >
< div class = "line" > < a name = "l05897" > < / a > < span class = "lineno" > 5897< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (< a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (departure_time,< / div >
< div class = "line" > < a name = "l05898" > < / a > < span class = "lineno" > 5898< / span >   dimension_-> FixedTransitVar(curr_node)-> Min()),< / div >
< div class = "line" > < a name = "l05899" > < / a > < span class = "lineno" > 5899< / span >   dimension_-> CumulVar(curr_node)-> Max());< / div >
< div class = "line" > < a name = "l05900" > < / a > < span class = "lineno" > 5900< / span >   }< / div >
< div class = "line" > < a name = "l05901" > < / a > < span class = "lineno" > 5901< / span >   < span class = "keywordtype" > int< / span > arrival_time = departure_time;< / div >
< div class = "line" > < a name = "l05902" > < / a > < span class = "lineno" > 5902< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 1; i < path_.size(); ++i) {< / div >
< div class = "line" > < a name = "l05903" > < / a > < span class = "lineno" > 5903< / span >   arrival_time =< / div >
< div class = "line" > < a name = "l05904" > < / a > < span class = "lineno" > 5904< / span >   < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (< a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (arrival_time,< / div >
< div class = "line" > < a name = "l05905" > < / a > < span class = "lineno" > 5905< / span >   dimension_-> FixedTransitVar(path_[i - 1])-> Min()),< / div >
< div class = "line" > < a name = "l05906" > < / a > < span class = "lineno" > 5906< / span >   dimension_-> CumulVar(path_[i])-> Min());< / div >
< div class = "line" > < a name = "l05907" > < / a > < span class = "lineno" > 5907< / span >   }< / div >
< div class = "line" > < a name = "l05908" > < / a > < span class = "lineno" > 5908< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > span_lb = < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (arrival_time, departure_time);< / div >
< div class = "line" > < a name = "l05909" > < / a > < span class = "lineno" > 5909< / span >   SetSpanMin(vehicle, span_lb, sum_fixed_transits);< / div >
< div class = "line" > < a name = "l05910" > < / a > < span class = "lineno" > 5910< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > maximum_deviation =< / div >
< div class = "line" > < a name = "l05911" > < / a > < span class = "lineno" > 5911< / span >   < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (SpanMax(vehicle, sum_fixed_transits), span_lb);< / div >
< div class = "line" > < a name = "l05912" > < / a > < span class = "lineno" > 5912< / span >   dimension_-> CumulVar(end)-> SetMax(< / div >
< div class = "line" > < a name = "l05913" > < / a > < span class = "lineno" > 5913< / span >   < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (arrival_time, maximum_deviation));< / div >
< div class = "line" > < a name = "l05914" > < / a > < span class = "lineno" > 5914< / span >   }< / div >
< div class = "line" > < a name = "l05915" > < / a > < span class = "lineno" > 5915< / span >   }< / div >
< div class = "line" > < a name = "l05916" > < / a > < span class = "lineno" > 5916< / span >   < / div >
< div class = "line" > < a name = "l05917" > < / a > < span class = "lineno" > 5917< / span >   < span class = "keyword" > const< / span > RoutingModel* < span class = "keyword" > const< / span > model_;< / div >
< div class = "line" > < a name = "l05918" > < / a > < span class = "lineno" > 5918< / span >   < span class = "keyword" > const< / span > RoutingDimension* < span class = "keyword" > const< / span > dimension_;< / div >
< div class = "line" > < a name = "l05919" > < / a > < span class = "lineno" > 5919< / span >   std::vector< IntVar*> spans_;< / div >
< div class = "line" > < a name = "l05920" > < / a > < span class = "lineno" > 5920< / span >   std::vector< IntVar*> total_slacks_;< / div >
< div class = "line" > < a name = "l05921" > < / a > < span class = "lineno" > 5921< / span >   std::vector< int> path_;< / div >
< div class = "line" > < a name = "l05922" > < / a > < span class = "lineno" > 5922< / span >   std::vector< Demon*> vehicle_demons_;< / div >
< div class = "line" > < a name = "l05923" > < / a > < span class = "lineno" > 5923< / span >   };< / div >
< div class = "line" > < a name = "l05924" > < / a > < span class = "lineno" > 5924< / span >   < / div >
< div class = "line" > < a name = "l05925" > < / a > < span class = "lineno" > 5925< / span >   } < span class = "comment" > // namespace< / span > < / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05926" > < / a > < span class = "lineno" > 5926< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05927" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c" > 5927< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > * < a class = "code" href = "classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c" > RoutingModel::MakePathSpansAndTotalSlacks< / a > (< / div >
< div class = "line" > < a name = "l05928" > < / a > < span class = "lineno" > 5928< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * dimension, std::vector< IntVar*> spans,< / div >
< div class = "line" > < a name = "l05929" > < / a > < span class = "lineno" > 5929< / span >   std::vector< IntVar*> total_slacks) {< / div >
< div class = "line" > < a name = "l05930" > < / a > < span class = "lineno" > 5930< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, spans.size());< / div >
< div class = "line" > < a name = "l05931" > < / a > < span class = "lineno" > 5931< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (vehicles_, total_slacks.size());< / div >
< div class = "line" > < a name = "l05932" > < / a > < span class = "lineno" > 5932< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ()-> < a class = "code" href = "classoperations__research_1_1_solver.html#ab741cb25dd32d1cbe02fbfb36337d9bb" > RevAlloc< / a > (< / div >
< div class = "line" > < a name = "l05933" > < / a > < span class = "lineno" > 5933< / span >   < span class = "keyword" > new< / span > PathSpansAndTotalSlacks(< span class = "keyword" > this< / span > , dimension, spans, total_slacks));< / div >
< div class = "line" > < a name = "l05934" > < / a > < span class = "lineno" > 5934< / span >   }< / div >
< div class = "line" > < a name = "l05935" > < / a > < span class = "lineno" > 5935< / span >   < / div >
< div class = "line" > < a name = "l05936" > < / a > < span class = "lineno" > 5936< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > char< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343" > RoutingModelVisitor::kLightElement< / a > [] = < span class = "stringliteral" > " LightElement" < / span > ;< / div >
< div class = "line" > < a name = "l05937" > < / a > < span class = "lineno" > 5937< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > char< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d" > RoutingModelVisitor::kLightElement2< / a > [] = < span class = "stringliteral" > " LightElement2" < / span > ;< / div >
< div class = "line" > < a name = "l05938" > < / a > < span class = "lineno" > 5938< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > char< / span > < a class = "code" href = "classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0" > RoutingModelVisitor::kRemoveValues< / a > [] = < span class = "stringliteral" > " RemoveValues" < / span > ;< / div >
< div class = "line" > < a name = "l05939" > < / a > < span class = "lineno" > 5939< / span >   < / div >
< div class = "line" > < a name = "l05940" > < / a > < span class = "lineno" > 5940< / span >   RoutingDimension::RoutingDimension(< a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ,< / div >
< div class = "line" > < a name = "l05941" > < / a > < span class = "lineno" > 5941< / span >   std::vector< int64> vehicle_capacities,< / div >
< div class = "line" > < a name = "l05942" > < / a > < span class = "lineno" > 5942< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ,< / div >
< div class = "line" > < a name = "l05943" > < / a > < span class = "lineno" > 5943< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html" > RoutingDimension< / a > * base_dimension)< / div >
< div class = "line" > < a name = "l05944" > < / a > < span class = "lineno" > 5944< / span >   : vehicle_capacities_(std::move(vehicle_capacities)),< / div >
< div class = "line" > < a name = "l05945" > < / a > < span class = "lineno" > 5945< / span >   base_dimension_(base_dimension),< / div >
< div class = "line" > < a name = "l05946" > < / a > < span class = "lineno" > 5946< / span >   global_span_cost_coefficient_(0),< / div >
< div class = "line" > < a name = "l05947" > < / a > < span class = "lineno" > 5947< / span >   model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l05948" > < / a > < span class = "lineno" > 5948< / span >   name_(< a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > ),< / div >
< div class = "line" > < a name = "l05949" > < / a > < span class = "lineno" > 5949< / span >   global_optimizer_offset_(0) {< / div >
< div class = "line" > < a name = "l05950" > < / a > < span class = "lineno" > 5950< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l05951" > < / a > < span class = "lineno" > 5951< / span >   vehicle_span_upper_bounds_.assign(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> vehicles(), < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l05952" > < / a > < span class = "lineno" > 5952< / span >   vehicle_span_cost_coefficients_.assign(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> vehicles(), 0);< / div >
< div class = "line" > < a name = "l05953" > < / a > < span class = "lineno" > 5953< / span >   }< / div >
< div class = "line" > < a name = "l05954" > < / a > < span class = "lineno" > 5954< / span >   < / div >
< div class = "line" > < a name = "l05955" > < / a > < span class = "lineno" > 5955< / span >   RoutingDimension::RoutingDimension(RoutingModel* < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ,< / div >
< div class = "line" > < a name = "l05956" > < / a > < span class = "lineno" > 5956< / span >   std::vector< int64> vehicle_capacities,< / div >
< div class = "line" > < a name = "l05957" > < / a > < span class = "lineno" > 5957< / span >   < span class = "keyword" > const< / span > std::string& < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > , SelfBased)< / div >
< div class = "line" > < a name = "l05958" > < / a > < span class = "lineno" > 5958< / span >   : RoutingDimension(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > , std::move(vehicle_capacities), < a class = "code" href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > , this) {}< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l05959" > < / a > < span class = "lineno" > 5959< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l05960" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04" > 5960< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04" > RoutingDimension::~RoutingDimension< / a > () {< / div >
< div class = "line" > < a name = "l05961" > < / a > < span class = "lineno" > 5961< / span >   cumul_var_piecewise_linear_cost_.clear();< / div >
< div class = "line" > < a name = "l05962" > < / a > < span class = "lineno" > 5962< / span >   }< / div >
< div class = "line" > < a name = "l05963" > < / a > < span class = "lineno" > 5963< / span >   < / div >
< div class = "line" > < a name = "l05964" > < / a > < span class = "lineno" > 5964< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::Initialize(< / div >
< div class = "line" > < a name = "l05965" > < / a > < span class = "lineno" > 5965< / span >   < span class = "keyword" > const< / span > std::vector< int> & transit_evaluators,< / div >
< div class = "line" > < a name = "l05966" > < / a > < span class = "lineno" > 5966< / span >   < span class = "keyword" > const< / span > std::vector< int> & state_dependent_transit_evaluators,< / div >
< div class = "line" > < a name = "l05967" > < / a > < span class = "lineno" > 5967< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max) {< / div >
< div class = "line" > < a name = "l05968" > < / a > < span class = "lineno" > 5968< / span >   InitializeCumuls();< / div >
< div class = "line" > < a name = "l05969" > < / a > < span class = "lineno" > 5969< / span >   InitializeTransits(transit_evaluators, state_dependent_transit_evaluators,< / div >
< div class = "line" > < a name = "l05970" > < / a > < span class = "lineno" > 5970< / span >   slack_max);< / div >
< div class = "line" > < a name = "l05971" > < / a > < span class = "lineno" > 5971< / span >   }< / div >
< div class = "line" > < a name = "l05972" > < / a > < span class = "lineno" > 5972< / span >   < / div >
< div class = "line" > < a name = "l05973" > < / a > < span class = "lineno" > 5973< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l05974" > < / a > < span class = "lineno" > 5974< / span >   < span class = "comment" > // Very light version of the RangeLessOrEqual constraint (see ./range_cst.cc).< / span > < / div >
< div class = "line" > < a name = "l05975" > < / a > < span class = "lineno" > 5975< / span >   < span class = "comment" > // Only performs initial propagation and then checks the compatibility of the< / span > < / div >
< div class = "line" > < a name = "l05976" > < / a > < span class = "lineno" > 5976< / span >   < span class = "comment" > // variable domains without domain pruning.< / span > < / div >
< div class = "line" > < a name = "l05977" > < / a > < span class = "lineno" > 5977< / span >   < span class = "comment" > // This is useful when to avoid ping-pong effects with costly constraints< / span > < / div >
< div class = "line" > < a name = "l05978" > < / a > < span class = "lineno" > 5978< / span >   < span class = "comment" > // such as the PathCumul constraint.< / span > < / div >
< div class = "line" > < a name = "l05979" > < / a > < span class = "lineno" > 5979< / span >   < span class = "comment" > // This constraint has not been added to the cp library (in range_cst.cc) given< / span > < / div >
< div class = "line" > < a name = "l05980" > < / a > < span class = "lineno" > 5980< / span >   < span class = "comment" > // it only does checking and no propagation (except the initial propagation)< / span > < / div >
< div class = "line" > < a name = "l05981" > < / a > < span class = "lineno" > 5981< / span >   < span class = "comment" > // and is only fit for local search, in particular in the context of vehicle< / span > < / div >
< div class = "line" > < a name = "l05982" > < / a > < span class = "lineno" > 5982< / span >   < span class = "comment" > // routing.< / span > < / div >
< div class = "line" > < a name = "l05983" > < / a > < span class = "lineno" > 5983< / span >   < span class = "keyword" > class < / span > LightRangeLessOrEqual : < span class = "keyword" > public< / span > Constraint {< / div >
< div class = "line" > < a name = "l05984" > < / a > < span class = "lineno" > 5984< / span >   < span class = "keyword" > public< / span > :< / div >
< div class = "line" > < a name = "l05985" > < / a > < span class = "lineno" > 5985< / span >   LightRangeLessOrEqual(Solver* < span class = "keyword" > const< / span > s, IntExpr* < span class = "keyword" > const< / span > l, IntExpr* < span class = "keyword" > const< / span > r);< / div >
< div class = "line" > < a name = "l05986" > < / a > < span class = "lineno" > 5986< / span >   ~LightRangeLessOrEqual()< span class = "keyword" > override < / span > {}< / div >
< div class = "line" > < a name = "l05987" > < / a > < span class = "lineno" > 5987< / span >   < span class = "keywordtype" > void< / span > Post() < span class = "keyword" > override< / span > ;< / div >
< div class = "line" > < a name = "l05988" > < / a > < span class = "lineno" > 5988< / span >   < span class = "keywordtype" > void< / span > InitialPropagate() < span class = "keyword" > override< / span > ;< / div >
< div class = "line" > < a name = "l05989" > < / a > < span class = "lineno" > 5989< / span >   std::string DebugString() < span class = "keyword" > const override< / span > ;< / div >
< div class = "line" > < a name = "l05990" > < / a > < span class = "lineno" > 5990< / span >   IntVar* Var()< span class = "keyword" > override < / span > {< / div >
< div class = "line" > < a name = "l05991" > < / a > < span class = "lineno" > 5991< / span >   < span class = "keywordflow" > return< / span > solver()-> MakeIsLessOrEqualVar(left_, right_);< / div >
< div class = "line" > < a name = "l05992" > < / a > < span class = "lineno" > 5992< / span >   }< / div >
< div class = "line" > < a name = "l05993" > < / a > < span class = "lineno" > 5993< / span >   < span class = "comment" > // TODO(user): introduce a kLightLessOrEqual tag.< / span > < / div >
< div class = "line" > < a name = "l05994" > < / a > < span class = "lineno" > 5994< / span >   < span class = "keywordtype" > void< / span > Accept(ModelVisitor* < span class = "keyword" > const< / span > visitor)< span class = "keyword" > const override < / span > {< / div >
< div class = "line" > < a name = "l05995" > < / a > < span class = "lineno" > 5995< / span >   visitor-> BeginVisitConstraint(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46" > ModelVisitor::kLessOrEqual< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l05996" > < / a > < span class = "lineno" > 5996< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a8e24c7d309e4aaa23eca1c75bd42bdc5" > ModelVisitor::kLeftArgument< / a > , left_);< / div >
< div class = "line" > < a name = "l05997" > < / a > < span class = "lineno" > 5997< / span >   visitor-> VisitIntegerExpressionArgument(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#aaeff643bea5491c9055dc67124d5d3d2" > ModelVisitor::kRightArgument< / a > ,< / div >
< div class = "line" > < a name = "l05998" > < / a > < span class = "lineno" > 5998< / span >   right_);< / div >
< div class = "line" > < a name = "l05999" > < / a > < span class = "lineno" > 5999< / span >   visitor-> EndVisitConstraint(< a class = "code" href = "classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46" > ModelVisitor::kLessOrEqual< / a > , < span class = "keyword" > this< / span > );< / div >
< div class = "line" > < a name = "l06000" > < / a > < span class = "lineno" > 6000< / span >   }< / div >
< div class = "line" > < a name = "l06001" > < / a > < span class = "lineno" > 6001< / span >   < / div >
< div class = "line" > < a name = "l06002" > < / a > < span class = "lineno" > 6002< / span >   < span class = "keyword" > private< / span > :< / div >
< div class = "line" > < a name = "l06003" > < / a > < span class = "lineno" > 6003< / span >   < span class = "keywordtype" > void< / span > CheckRange();< / div >
< div class = "line" > < a name = "l06004" > < / a > < span class = "lineno" > 6004< / span >   < / div >
< div class = "line" > < a name = "l06005" > < / a > < span class = "lineno" > 6005< / span >   IntExpr* < span class = "keyword" > const< / span > left_;< / div >
< div class = "line" > < a name = "l06006" > < / a > < span class = "lineno" > 6006< / span >   IntExpr* < span class = "keyword" > const< / span > right_;< / div >
< div class = "line" > < a name = "l06007" > < / a > < span class = "lineno" > 6007< / span >   Demon* demon_;< / div >
< div class = "line" > < a name = "l06008" > < / a > < span class = "lineno" > 6008< / span >   };< / div >
< div class = "line" > < a name = "l06009" > < / a > < span class = "lineno" > 6009< / span >   < / div >
< div class = "line" > < a name = "l06010" > < / a > < span class = "lineno" > 6010< / span >   LightRangeLessOrEqual::LightRangeLessOrEqual(Solver* < span class = "keyword" > const< / span > s, IntExpr* < span class = "keyword" > const< / span > l,< / div >
< div class = "line" > < a name = "l06011" > < / a > < span class = "lineno" > 6011< / span >   IntExpr* < span class = "keyword" > const< / span > r)< / div >
< div class = "line" > < a name = "l06012" > < / a > < span class = "lineno" > 6012< / span >   : Constraint(s), left_(l), right_(r), demon_(nullptr) {}< / div >
< div class = "line" > < a name = "l06013" > < / a > < span class = "lineno" > 6013< / span >   < / div >
< div class = "line" > < a name = "l06014" > < / a > < span class = "lineno" > 6014< / span >   < span class = "keywordtype" > void< / span > LightRangeLessOrEqual::Post() {< / div >
< div class = "line" > < a name = "l06015" > < / a > < span class = "lineno" > 6015< / span >   demon_ = < a class = "code" href = "namespaceoperations__research.html#a3ea6af6581e6922832918c97753146a7" > MakeConstraintDemon0< / a > (< / div >
< div class = "line" > < a name = "l06016" > < / a > < span class = "lineno" > 6016< / span >   solver(), < span class = "keyword" > this< / span > , & LightRangeLessOrEqual::CheckRange, < span class = "stringliteral" > " CheckRange" < / span > );< / div >
< div class = "line" > < a name = "l06017" > < / a > < span class = "lineno" > 6017< / span >   left_-> WhenRange(demon_);< / div >
< div class = "line" > < a name = "l06018" > < / a > < span class = "lineno" > 6018< / span >   right_-> WhenRange(demon_);< / div >
< div class = "line" > < a name = "l06019" > < / a > < span class = "lineno" > 6019< / span >   }< / div >
< div class = "line" > < a name = "l06020" > < / a > < span class = "lineno" > 6020< / span >   < / div >
< div class = "line" > < a name = "l06021" > < / a > < span class = "lineno" > 6021< / span >   < span class = "keywordtype" > void< / span > LightRangeLessOrEqual::InitialPropagate() {< / div >
< div class = "line" > < a name = "l06022" > < / a > < span class = "lineno" > 6022< / span >   left_-> SetMax(right_-> Max());< / div >
< div class = "line" > < a name = "l06023" > < / a > < span class = "lineno" > 6023< / span >   right_-> SetMin(left_-> Min());< / div >
< div class = "line" > < a name = "l06024" > < / a > < span class = "lineno" > 6024< / span >   < span class = "keywordflow" > if< / span > (left_-> Max() < = right_-> Min()) {< / div >
< div class = "line" > < a name = "l06025" > < / a > < span class = "lineno" > 6025< / span >   demon_-> < a class = "code" href = "classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a" > inhibit< / a > (solver());< / div >
< div class = "line" > < a name = "l06026" > < / a > < span class = "lineno" > 6026< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06027" > < / a > < span class = "lineno" > 6027< / span >   }< / div >
< div class = "line" > < a name = "l06028" > < / a > < span class = "lineno" > 6028< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06029" > < / a > < span class = "lineno" > 6029< / span >   < span class = "keywordtype" > void< / span > LightRangeLessOrEqual::CheckRange() {< / div >
< div class = "line" > < a name = "l06030" > < / a > < span class = "lineno" > 6030< / span >   < span class = "keywordflow" > if< / span > (left_-> Min() > right_-> Max()) {< / div >
< div class = "line" > < a name = "l06031" > < / a > < span class = "lineno" > 6031< / span >   solver()-> Fail();< / div >
< div class = "line" > < a name = "l06032" > < / a > < span class = "lineno" > 6032< / span >   }< / div >
< div class = "line" > < a name = "l06033" > < / a > < span class = "lineno" > 6033< / span >   < span class = "keywordflow" > if< / span > (left_-> Max() < = right_-> Min()) {< / div >
< div class = "line" > < a name = "l06034" > < / a > < span class = "lineno" > 6034< / span >   demon_-> < a class = "code" href = "classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a" > inhibit< / a > (solver());< / div >
< div class = "line" > < a name = "l06035" > < / a > < span class = "lineno" > 6035< / span >   }< / div >
< div class = "line" > < a name = "l06036" > < / a > < span class = "lineno" > 6036< / span >   }< / div >
< div class = "line" > < a name = "l06037" > < / a > < span class = "lineno" > 6037< / span >   < / div >
< div class = "line" > < a name = "l06038" > < / a > < span class = "lineno" > 6038< / span >   std::string LightRangeLessOrEqual::DebugString()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06039" > < / a > < span class = "lineno" > 6039< / span >   < span class = "keywordflow" > return< / span > left_-> DebugString() + < span class = "stringliteral" > " < " < / span > + right_-> DebugString();< / div >
< div class = "line" > < a name = "l06040" > < / a > < span class = "lineno" > 6040< / span >   }< / div >
< div class = "line" > < a name = "l06041" > < / a > < span class = "lineno" > 6041< / span >   < / div >
< div class = "line" > < a name = "l06042" > < / a > < span class = "lineno" > 6042< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l06043" > < / a > < span class = "lineno" > 6043< / span >   < / div >
< div class = "line" > < a name = "l06044" > < / a > < span class = "lineno" > 6044< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::InitializeCumuls() {< / div >
< div class = "line" > < a name = "l06045" > < / a > < span class = "lineno" > 6045< / span >   Solver* < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06046" > < / a > < span class = "lineno" > 6046< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > () + model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ();< / div >
< div class = "line" > < a name = "l06047" > < / a > < span class = "lineno" > 6047< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > capacity_range = std::minmax_element(vehicle_capacities_.begin(),< / div >
< div class = "line" > < a name = "l06048" > < / a > < span class = "lineno" > 6048< / span >   vehicle_capacities_.end());< / div >
< div class = "line" > < a name = "l06049" > < / a > < span class = "lineno" > 6049< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > min_capacity = *capacity_range.first;< / div >
< div class = "line" > < a name = "l06050" > < / a > < span class = "lineno" > 6050< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (min_capacity, 0);< / div >
< div class = "line" > < a name = "l06051" > < / a > < span class = "lineno" > 6051< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > max_capacity = *capacity_range.second;< / div >
< div class = "line" > < a name = "l06052" > < / a > < span class = "lineno" > 6052< / span >   solver-> MakeIntVarArray(size, 0, max_capacity, name_, & cumuls_);< / div >
< div class = "line" > < a name = "l06053" > < / a > < span class = "lineno" > 6053< / span >   < span class = "comment" > // Refine the min/max for vehicle start/ends based on vehicle capacities.< / span > < / div >
< div class = "line" > < a name = "l06054" > < / a > < span class = "lineno" > 6054< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > v = 0; v < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); v++) {< / div >
< div class = "line" > < a name = "l06055" > < / a > < span class = "lineno" > 6055< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle_capacity = vehicle_capacities_[v];< / div >
< div class = "line" > < a name = "l06056" > < / a > < span class = "lineno" > 6056< / span >   cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (v)]-> SetMax(vehicle_capacity);< / div >
< div class = "line" > < a name = "l06057" > < / a > < span class = "lineno" > 6057< / span >   cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (v)]-> SetMax(vehicle_capacity);< / div >
< div class = "line" > < a name = "l06058" > < / a > < span class = "lineno" > 6058< / span >   }< / div >
< div class = "line" > < a name = "l06059" > < / a > < span class = "lineno" > 6059< / span >   < / div >
< div class = "line" > < a name = "l06060" > < / a > < span class = "lineno" > 6060< / span >   forbidden_intervals_.resize(size);< / div >
< div class = "line" > < a name = "l06061" > < / a > < span class = "lineno" > 6061< / span >   capacity_vars_.clear();< / div >
< div class = "line" > < a name = "l06062" > < / a > < span class = "lineno" > 6062< / span >   < span class = "keywordflow" > if< / span > (min_capacity != max_capacity) {< / div >
< div class = "line" > < a name = "l06063" > < / a > < span class = "lineno" > 6063< / span >   solver-> MakeIntVarArray(size, 0, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , & capacity_vars_);< / div >
< div class = "line" > < a name = "l06064" > < / a > < span class = "lineno" > 6064< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l06065" > < / a > < span class = "lineno" > 6065< / span >   IntVar* < span class = "keyword" > const< / span > capacity_var = capacity_vars_[i];< / div >
< div class = "line" > < a name = "l06066" > < / a > < span class = "lineno" > 6066< / span >   < span class = "keywordflow" > if< / span > (i < model_-> Size()) {< / div >
< div class = "line" > < a name = "l06067" > < / a > < span class = "lineno" > 6067< / span >   IntVar* < span class = "keyword" > const< / span > capacity_active = solver-> MakeBoolVar();< / div >
< div class = "line" > < a name = "l06068" > < / a > < span class = "lineno" > 6068< / span >   solver-> AddConstraint(< / div >
< div class = "line" > < a name = "l06069" > < / a > < span class = "lineno" > 6069< / span >   solver-> MakeLessOrEqual(model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (i), capacity_active));< / div >
< div class = "line" > < a name = "l06070" > < / a > < span class = "lineno" > 6070< / span >   solver-> AddConstraint(solver-> MakeIsLessOrEqualCt(< / div >
< div class = "line" > < a name = "l06071" > < / a > < span class = "lineno" > 6071< / span >   cumuls_[i], capacity_var, capacity_active));< / div >
< div class = "line" > < a name = "l06072" > < / a > < span class = "lineno" > 6072< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06073" > < / a > < span class = "lineno" > 6073< / span >   solver-> AddConstraint(< / div >
< div class = "line" > < a name = "l06074" > < / a > < span class = "lineno" > 6074< / span >   solver-> MakeLessOrEqual(cumuls_[i], capacity_var));< / div >
< div class = "line" > < a name = "l06075" > < / a > < span class = "lineno" > 6075< / span >   }< / div >
< div class = "line" > < a name = "l06076" > < / a > < span class = "lineno" > 6076< / span >   }< / div >
< div class = "line" > < a name = "l06077" > < / a > < span class = "lineno" > 6077< / span >   }< / div >
< div class = "line" > < a name = "l06078" > < / a > < span class = "lineno" > 6078< / span >   }< / div >
< div class = "line" > < a name = "l06079" > < / a > < span class = "lineno" > 6079< / span >   < / div >
< div class = "line" > < a name = "l06080" > < / a > < span class = "lineno" > 6080< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l06081" > < / a > < span class = "lineno" > 6081< / span >   < span class = "keyword" > template< / span > < < span class = "keywordtype" > int< / span > 64 value> < / div >
< div class = "line" > < a name = "l06082" > < / a > < span class = "lineno" > 6082< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > IthElementOrValue(< span class = "keyword" > const< / span > std::vector< int64> & v, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l06083" > < / a > < span class = "lineno" > 6083< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > > = 0 ? v[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] : < a class = "code" href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > ;< / div >
< div class = "line" > < a name = "l06084" > < / a > < span class = "lineno" > 6084< / span >   }< / div >
< div class = "line" > < a name = "l06085" > < / a > < span class = "lineno" > 6085< / span >   < / div >
< div class = "line" > < a name = "l06086" > < / a > < span class = "lineno" > 6086< / span >   < span class = "keywordtype" > void< / span > ComputeTransitClasses(< span class = "keyword" > const< / span > std::vector< int> & evaluator_indices,< / div >
< div class = "line" > < a name = "l06087" > < / a > < span class = "lineno" > 6087< / span >   std::vector< int> * class_evaluators,< / div >
< div class = "line" > < a name = "l06088" > < / a > < span class = "lineno" > 6088< / span >   std::vector< int64> * vehicle_to_class) {< / div >
< div class = "line" > < a name = "l06089" > < / a > < span class = "lineno" > 6089< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (class_evaluators != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06090" > < / a > < span class = "lineno" > 6090< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (vehicle_to_class != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06091" > < / a > < span class = "lineno" > 6091< / span >   class_evaluators-> clear();< / div >
< div class = "line" > < a name = "l06092" > < / a > < span class = "lineno" > 6092< / span >   vehicle_to_class-> resize(evaluator_indices.size(), -1);< / div >
< div class = "line" > < a name = "l06093" > < / a > < span class = "lineno" > 6093< / span >   absl::flat_hash_map< int, int64> evaluator_to_class;< / div >
< div class = "line" > < a name = "l06094" > < / a > < span class = "lineno" > 6094< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < evaluator_indices.size(); ++i) {< / div >
< div class = "line" > < a name = "l06095" > < / a > < span class = "lineno" > 6095< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > evaluator_index = evaluator_indices[i];< / div >
< div class = "line" > < a name = "l06096" > < / a > < span class = "lineno" > 6096< / span >   < span class = "keywordtype" > int< / span > evaluator_class = -1;< / div >
< div class = "line" > < a name = "l06097" > < / a > < span class = "lineno" > 6097< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > (evaluator_to_class, evaluator_index, & evaluator_class)) {< / div >
< div class = "line" > < a name = "l06098" > < / a > < span class = "lineno" > 6098< / span >   evaluator_class = class_evaluators-> size();< / div >
< div class = "line" > < a name = "l06099" > < / a > < span class = "lineno" > 6099< / span >   evaluator_to_class[evaluator_index] = evaluator_class;< / div >
< div class = "line" > < a name = "l06100" > < / a > < span class = "lineno" > 6100< / span >   class_evaluators-> push_back(evaluator_index);< / div >
< div class = "line" > < a name = "l06101" > < / a > < span class = "lineno" > 6101< / span >   }< / div >
< div class = "line" > < a name = "l06102" > < / a > < span class = "lineno" > 6102< / span >   (*vehicle_to_class)[i] = evaluator_class;< / div >
< div class = "line" > < a name = "l06103" > < / a > < span class = "lineno" > 6103< / span >   }< / div >
< div class = "line" > < a name = "l06104" > < / a > < span class = "lineno" > 6104< / span >   }< / div >
< div class = "line" > < a name = "l06105" > < / a > < span class = "lineno" > 6105< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l06106" > < / a > < span class = "lineno" > 6106< / span >   < / div >
< div class = "line" > < a name = "l06107" > < / a > < span class = "lineno" > 6107< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::InitializeTransitVariables(< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max) {< / div >
< div class = "line" > < a name = "l06108" > < / a > < span class = "lineno" > 6108< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (!class_evaluators_.empty());< / div >
< div class = "line" > < a name = "l06109" > < / a > < span class = "lineno" > 6109< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (base_dimension_ == < span class = "keyword" > nullptr< / span > ||< / div >
< div class = "line" > < a name = "l06110" > < / a > < span class = "lineno" > 6110< / span >   !state_dependent_class_evaluators_.empty());< / div >
< div class = "line" > < a name = "l06111" > < / a > < span class = "lineno" > 6111< / span >   < / div >
< div class = "line" > < a name = "l06112" > < / a > < span class = "lineno" > 6112< / span >   Solver* < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06113" > < / a > < span class = "lineno" > 6113< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l06114" > < / a > < span class = "lineno" > 6114< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_solver.html#aa9726f5458b77973475a32178fe512b3" > Solver::IndexEvaluator1< / a > dependent_vehicle_class_function =< / div >
< div class = "line" > < a name = "l06115" > < / a > < span class = "lineno" > 6115< / span >   [< span class = "keyword" > this< / span > ](< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l06116" > < / a > < span class = "lineno" > 6116< / span >   < span class = "keywordflow" > return< / span > (0 < = < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > & & < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < state_dependent_vehicle_to_class_.size())< / div >
< div class = "line" > < a name = "l06117" > < / a > < span class = "lineno" > 6117< / span >   ? state_dependent_vehicle_to_class_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]< / div >
< div class = "line" > < a name = "l06118" > < / a > < span class = "lineno" > 6118< / span >   : state_dependent_class_evaluators_.size();< / div >
< div class = "line" > < a name = "l06119" > < / a > < span class = "lineno" > 6119< / span >   };< / div >
< div class = "line" > < a name = "l06120" > < / a > < span class = "lineno" > 6120< / span >   < span class = "keyword" > const< / span > std::string slack_name = name_ + < span class = "stringliteral" > " slack" < / span > ;< / div >
< div class = "line" > < a name = "l06121" > < / a > < span class = "lineno" > 6121< / span >   < span class = "keyword" > const< / span > std::string transit_name = name_ + < span class = "stringliteral" > " fixed transit" < / span > ;< / div >
< div class = "line" > < a name = "l06122" > < / a > < span class = "lineno" > 6122< / span >   < / div >
< div class = "line" > < a name = "l06123" > < / a > < span class = "lineno" > 6123< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > i = 0; i < size; ++i) {< / div >
< div class = "line" > < a name = "l06124" > < / a > < span class = "lineno" > 6124< / span >   fixed_transits_[i] =< / div >
< div class = "line" > < a name = "l06125" > < / a > < span class = "lineno" > 6125< / span >   solver-> MakeIntVar(< a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > , < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > , absl::StrCat(transit_name, i));< / div >
< div class = "line" > < a name = "l06126" > < / a > < span class = "lineno" > 6126< / span >   < span class = "comment" > // Setting dependent_transits_[i].< / span > < / div >
< div class = "line" > < a name = "l06127" > < / a > < span class = "lineno" > 6127< / span >   < span class = "keywordflow" > if< / span > (base_dimension_ != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06128" > < / a > < span class = "lineno" > 6128< / span >   < span class = "keywordflow" > if< / span > (state_dependent_class_evaluators_.size() == 1) {< / div >
< div class = "line" > < a name = "l06129" > < / a > < span class = "lineno" > 6129< / span >   std::vector< IntVar*> transition_variables(cumuls_.size(), < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06130" > < / a > < span class = "lineno" > 6130< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j = 0; j < cumuls_.size(); ++j) {< / div >
< div class = "line" > < a name = "l06131" > < / a > < span class = "lineno" > 6131< / span >   transition_variables[j] =< / div >
< div class = "line" > < a name = "l06132" > < / a > < span class = "lineno" > 6132< / span >   MakeRangeMakeElementExpr(< / div >
< div class = "line" > < a name = "l06133" > < / a > < span class = "lineno" > 6133< / span >   model_< / div >
< div class = "line" > < a name = "l06134" > < / a > < span class = "lineno" > 6134< / span >   -> StateDependentTransitCallback(< / div >
< div class = "line" > < a name = "l06135" > < / a > < span class = "lineno" > 6135< / span >   state_dependent_class_evaluators_[0])(i, j)< / div >
< div class = "line" > < a name = "l06136" > < / a > < span class = "lineno" > 6136< / span >   .transit,< / div >
< div class = "line" > < a name = "l06137" > < / a > < span class = "lineno" > 6137< / span >   base_dimension_-> < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (i), solver)< / div >
< div class = "line" > < a name = "l06138" > < / a > < span class = "lineno" > 6138< / span >   -> Var();< / div >
< div class = "line" > < a name = "l06139" > < / a > < span class = "lineno" > 6139< / span >   }< / div >
< div class = "line" > < a name = "l06140" > < / a > < span class = "lineno" > 6140< / span >   dependent_transits_[i] =< / div >
< div class = "line" > < a name = "l06141" > < / a > < span class = "lineno" > 6141< / span >   solver-> MakeElement(transition_variables, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i))< / div >
< div class = "line" > < a name = "l06142" > < / a > < span class = "lineno" > 6142< / span >   -> Var();< / div >
< div class = "line" > < a name = "l06143" > < / a > < span class = "lineno" > 6143< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06144" > < / a > < span class = "lineno" > 6144< / span >   IntVar* < span class = "keyword" > const< / span > vehicle_class_var =< / div >
< div class = "line" > < a name = "l06145" > < / a > < span class = "lineno" > 6145< / span >   solver< / div >
< div class = "line" > < a name = "l06146" > < / a > < span class = "lineno" > 6146< / span >   -> MakeElement(dependent_vehicle_class_function,< / div >
< div class = "line" > < a name = "l06147" > < / a > < span class = "lineno" > 6147< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (i))< / div >
< div class = "line" > < a name = "l06148" > < / a > < span class = "lineno" > 6148< / span >   -> Var();< / div >
< div class = "line" > < a name = "l06149" > < / a > < span class = "lineno" > 6149< / span >   std::vector< IntVar*> transit_for_vehicle;< / div >
< div class = "line" > < a name = "l06150" > < / a > < span class = "lineno" > 6150< / span >   transit_for_vehicle.reserve(state_dependent_class_evaluators_.size() +< / div >
< div class = "line" > < a name = "l06151" > < / a > < span class = "lineno" > 6151< / span >   1);< / div >
< div class = "line" > < a name = "l06152" > < / a > < span class = "lineno" > 6152< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > evaluator : state_dependent_class_evaluators_) {< / div >
< div class = "line" > < a name = "l06153" > < / a > < span class = "lineno" > 6153< / span >   std::vector< IntVar*> transition_variables(cumuls_.size(), < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06154" > < / a > < span class = "lineno" > 6154< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > j = 0; j < cumuls_.size(); ++j) {< / div >
< div class = "line" > < a name = "l06155" > < / a > < span class = "lineno" > 6155< / span >   transition_variables[j] =< / div >
< div class = "line" > < a name = "l06156" > < / a > < span class = "lineno" > 6156< / span >   MakeRangeMakeElementExpr(< / div >
< div class = "line" > < a name = "l06157" > < / a > < span class = "lineno" > 6157< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ac0772bdc4f47e45edccd5a5c25154993" > StateDependentTransitCallback< / a > (evaluator)(i, j)< / div >
< div class = "line" > < a name = "l06158" > < / a > < span class = "lineno" > 6158< / span >   .transit,< / div >
< div class = "line" > < a name = "l06159" > < / a > < span class = "lineno" > 6159< / span >   base_dimension_-> < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (i), solver)< / div >
< div class = "line" > < a name = "l06160" > < / a > < span class = "lineno" > 6160< / span >   -> Var();< / div >
< div class = "line" > < a name = "l06161" > < / a > < span class = "lineno" > 6161< / span >   }< / div >
< div class = "line" > < a name = "l06162" > < / a > < span class = "lineno" > 6162< / span >   transit_for_vehicle.push_back(< / div >
< div class = "line" > < a name = "l06163" > < / a > < span class = "lineno" > 6163< / span >   solver-> MakeElement(transition_variables, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i))< / div >
< div class = "line" > < a name = "l06164" > < / a > < span class = "lineno" > 6164< / span >   -> Var());< / div >
< div class = "line" > < a name = "l06165" > < / a > < span class = "lineno" > 6165< / span >   }< / div >
< div class = "line" > < a name = "l06166" > < / a > < span class = "lineno" > 6166< / span >   transit_for_vehicle.push_back(solver-> MakeIntConst(0));< / div >
< div class = "line" > < a name = "l06167" > < / a > < span class = "lineno" > 6167< / span >   dependent_transits_[i] =< / div >
< div class = "line" > < a name = "l06168" > < / a > < span class = "lineno" > 6168< / span >   solver-> MakeElement(transit_for_vehicle, vehicle_class_var)-> Var();< / div >
< div class = "line" > < a name = "l06169" > < / a > < span class = "lineno" > 6169< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06170" > < / a > < span class = "lineno" > 6170< / span >   } < span class = "keywordflow" > else< / span > {< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06171" > < / a > < span class = "lineno" > 6171< / span >   dependent_transits_[i] = solver-> MakeIntConst(0);< / div >
< div class = "line" > < a name = "l06172" > < / a > < span class = "lineno" > 6172< / span >   }< / div >
< div class = "line" > < a name = "l06173" > < / a > < span class = "lineno" > 6173< / span >   < / div >
< div class = "line" > < a name = "l06174" > < / a > < span class = "lineno" > 6174< / span >   < span class = "comment" > // Summing fixed transits, dependent transits and the slack.< / span > < / div >
< div class = "line" > < a name = "l06175" > < / a > < span class = "lineno" > 6175< / span >   IntExpr* transit_expr = fixed_transits_[i];< / div >
< div class = "line" > < a name = "l06176" > < / a > < span class = "lineno" > 6176< / span >   < span class = "keywordflow" > if< / span > (dependent_transits_[i]-> Min() != 0 ||< / div >
< div class = "line" > < a name = "l06177" > < / a > < span class = "lineno" > 6177< / span >   dependent_transits_[i]-> Max() != 0) {< / div >
< div class = "line" > < a name = "l06178" > < / a > < span class = "lineno" > 6178< / span >   transit_expr = solver-> MakeSum(transit_expr, dependent_transits_[i]);< / div >
< div class = "line" > < a name = "l06179" > < / a > < span class = "lineno" > 6179< / span >   }< / div >
< div class = "line" > < a name = "l06180" > < / a > < span class = "lineno" > 6180< / span >   < / div >
< div class = "line" > < a name = "l06181" > < / a > < span class = "lineno" > 6181< / span >   < span class = "keywordflow" > if< / span > (slack_max == 0) {< / div >
< div class = "line" > < a name = "l06182" > < / a > < span class = "lineno" > 6182< / span >   slacks_[i] = solver-> MakeIntConst(0);< / div >
< div class = "line" > < a name = "l06183" > < / a > < span class = "lineno" > 6183< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06184" > < / a > < span class = "lineno" > 6184< / span >   slacks_[i] =< / div >
< div class = "line" > < a name = "l06185" > < / a > < span class = "lineno" > 6185< / span >   solver-> MakeIntVar(0, slack_max, absl::StrCat(slack_name, i));< / div >
< div class = "line" > < a name = "l06186" > < / a > < span class = "lineno" > 6186< / span >   transit_expr = solver-> MakeSum(slacks_[i], transit_expr);< / div >
< div class = "line" > < a name = "l06187" > < / a > < span class = "lineno" > 6187< / span >   }< / div >
< div class = "line" > < a name = "l06188" > < / a > < span class = "lineno" > 6188< / span >   transits_[i] = transit_expr-> Var();< / div >
< div class = "line" > < a name = "l06189" > < / a > < span class = "lineno" > 6189< / span >   }< / div >
< div class = "line" > < a name = "l06190" > < / a > < span class = "lineno" > 6190< / span >   }< / div >
< div class = "line" > < a name = "l06191" > < / a > < span class = "lineno" > 6191< / span >   < / div >
< div class = "line" > < a name = "l06192" > < / a > < span class = "lineno" > 6192< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::InitializeTransits(< / div >
< div class = "line" > < a name = "l06193" > < / a > < span class = "lineno" > 6193< / span >   < span class = "keyword" > const< / span > std::vector< int> & transit_evaluators,< / div >
< div class = "line" > < a name = "l06194" > < / a > < span class = "lineno" > 6194< / span >   < span class = "keyword" > const< / span > std::vector< int> & state_dependent_transit_evaluators,< / div >
< div class = "line" > < a name = "l06195" > < / a > < span class = "lineno" > 6195< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > slack_max) {< / div >
< div class = "line" > < a name = "l06196" > < / a > < span class = "lineno" > 6196< / span >   < a class = "code" href = "base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b" > CHECK_EQ< / a > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), transit_evaluators.size());< / div >
< div class = "line" > < a name = "l06197" > < / a > < span class = "lineno" > 6197< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (base_dimension_ == < span class = "keyword" > nullptr< / span > ||< / div >
< div class = "line" > < a name = "l06198" > < / a > < span class = "lineno" > 6198< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () == state_dependent_transit_evaluators.size());< / div >
< div class = "line" > < a name = "l06199" > < / a > < span class = "lineno" > 6199< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > size = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ();< / div >
< div class = "line" > < a name = "l06200" > < / a > < span class = "lineno" > 6200< / span >   transits_.resize(size, < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06201" > < / a > < span class = "lineno" > 6201< / span >   fixed_transits_.resize(size, < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06202" > < / a > < span class = "lineno" > 6202< / span >   slacks_.resize(size, < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06203" > < / a > < span class = "lineno" > 6203< / span >   dependent_transits_.resize(size, < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06204" > < / a > < span class = "lineno" > 6204< / span >   ComputeTransitClasses(transit_evaluators, & class_evaluators_,< / div >
< div class = "line" > < a name = "l06205" > < / a > < span class = "lineno" > 6205< / span >   & vehicle_to_class_);< / div >
< div class = "line" > < a name = "l06206" > < / a > < span class = "lineno" > 6206< / span >   < span class = "keywordflow" > if< / span > (base_dimension_ != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06207" > < / a > < span class = "lineno" > 6207< / span >   ComputeTransitClasses(state_dependent_transit_evaluators,< / div >
< div class = "line" > < a name = "l06208" > < / a > < span class = "lineno" > 6208< / span >   & state_dependent_class_evaluators_,< / div >
< div class = "line" > < a name = "l06209" > < / a > < span class = "lineno" > 6209< / span >   & state_dependent_vehicle_to_class_);< / div >
< div class = "line" > < a name = "l06210" > < / a > < span class = "lineno" > 6210< / span >   }< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l06211" > < / a > < span class = "lineno" > 6211< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06212" > < / a > < span class = "lineno" > 6212< / span >   InitializeTransitVariables(slack_max);< / div >
< div class = "line" > < a name = "l06213" > < / a > < span class = "lineno" > 6213< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06214" > < / a > < span class = "lineno" > 6214< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06215" > < / a > < span class = "lineno" > < a class = "line" href = "namespaceoperations__research.html#ad13d20d0a1737677a4757bd6ef8a95b3" > 6215< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "namespaceoperations__research.html#ad13d20d0a1737677a4757bd6ef8a95b3" > FillPathEvaluation< / a > (< span class = "keyword" > const< / span > std::vector< int64> & path,< / div >
< div class = "line" > < a name = "l06216" > < / a > < span class = "lineno" > 6216< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a" > RoutingModel::TransitCallback2< / a > & evaluator,< / div >
< div class = "line" > < a name = "l06217" > < / a > < span class = "lineno" > 6217< / span >   std::vector< int64> * values) {< / div >
< div class = "line" > < a name = "l06218" > < / a > < span class = "lineno" > 6218< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_nodes = path.size();< / div >
< div class = "line" > < a name = "l06219" > < / a > < span class = "lineno" > 6219< / span >   values-> resize(num_nodes - 1);< / div >
< div class = "line" > < a name = "l06220" > < / a > < span class = "lineno" > 6220< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < num_nodes - 1; ++i) {< / div >
< div class = "line" > < a name = "l06221" > < / a > < span class = "lineno" > 6221< / span >   (*values)[i] = evaluator(path[i], path[i + 1]);< / div >
< div class = "line" > < a name = "l06222" > < / a > < span class = "lineno" > 6222< / span >   }< / div >
< div class = "line" > < a name = "l06223" > < / a > < span class = "lineno" > 6223< / span >   }< / div >
< div class = "line" > < a name = "l06224" > < / a > < span class = "lineno" > 6224< / span >   < / div >
< div class = "line" > < a name = "l06225" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080" > 6225< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080" > TypeRegulationsChecker::TypeRegulationsChecker< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > & < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > )< / div >
< div class = "line" > < a name = "l06226" > < / a > < span class = "lineno" > 6226< / span >   : model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ), occurrences_of_type_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > .GetNumberOfVisitTypes()) {}< / div >
< div class = "line" > < a name = "l06227" > < / a > < span class = "lineno" > 6227< / span >   < / div >
< div class = "line" > < a name = "l06228" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_checker.html#a68fa0aaa5c8d8dbead32a6b04463722e" > 6228< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a68fa0aaa5c8d8dbead32a6b04463722e" > TypeRegulationsChecker::CheckVehicle< / a > (< / div >
< div class = "line" > < a name = "l06229" > < / a > < span class = "lineno" > 6229< / span >   < span class = "keywordtype" > int< / span > vehicle, < span class = "keyword" > const< / span > std::function< < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > )> & next_accessor) {< / div >
< div class = "line" > < a name = "l06230" > < / a > < span class = "lineno" > 6230< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a1698ad93b76ebfc58a0e1a2771e4b75c" > HasRegulationsToCheck< / a > ()) {< / div >
< div class = "line" > < a name = "l06231" > < / a > < span class = "lineno" > 6231< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06232" > < / a > < span class = "lineno" > 6232< / span >   }< / div >
< div class = "line" > < a name = "l06233" > < / a > < span class = "lineno" > 6233< / span >   < / div >
< div class = "line" > < a name = "l06234" > < / a > < span class = "lineno" > 6234< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#af0019df09332cbcb2c4f37bc30d9a055" > InitializeCheck< / a > (vehicle, next_accessor);< / div >
< div class = "line" > < a name = "l06235" > < / a > < span class = "lineno" > 6235< / span >   < / div >
< div class = "line" > < a name = "l06236" > < / a > < span class = "lineno" > 6236< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > pos = 0; pos < current_route_visits_.size(); pos++) {< / div >
< div class = "line" > < a name = "l06237" > < / a > < span class = "lineno" > 6237< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > current_visit = current_route_visits_[pos];< / div >
< div class = "line" > < a name = "l06238" > < / a > < span class = "lineno" > 6238< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > type = < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > GetVisitType< / a > (current_visit);< / div >
< div class = "line" > < a name = "l06239" > < / a > < span class = "lineno" > 6239< / span >   < span class = "keywordflow" > if< / span > (type < 0) {< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06240" > < / a > < span class = "lineno" > 6240< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l06241" > < / a > < span class = "lineno" > 6241< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06242" > < / a > < span class = "lineno" > 6242< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059" > VisitTypePolicy< / a > policy = < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#afb44a005674a48ac88da66f7c9b7b000" > GetVisitTypePolicy< / a > (current_visit);< / div >
< div class = "line" > < a name = "l06243" > < / a > < span class = "lineno" > 6243< / span >   < / div >
< div class = "line" > < a name = "l06244" > < / a > < span class = "lineno" > 6244< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (type, occurrences_of_type_.size());< / div >
< div class = "line" > < a name = "l06245" > < / a > < span class = "lineno" > 6245< / span >   < span class = "keywordtype" > int< / span > & num_type_added = occurrences_of_type_[type].num_type_added_to_vehicle;< / div >
< div class = "line" > < a name = "l06246" > < / a > < span class = "lineno" > 6246< / span >   < span class = "keywordtype" > int< / span > & num_type_removed =< / div >
< div class = "line" > < a name = "l06247" > < / a > < span class = "lineno" > 6247< / span >   occurrences_of_type_[type].num_type_removed_from_vehicle;< / div >
< div class = "line" > < a name = "l06248" > < / a > < span class = "lineno" > 6248< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (num_type_removed, num_type_added);< / div >
< div class = "line" > < a name = "l06249" > < / a > < span class = "lineno" > 6249< / span >   < span class = "keywordflow" > if< / span > (policy == < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab" > RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE< / a > & & < / div >
< div class = "line" > < a name = "l06250" > < / a > < span class = "lineno" > 6250< / span >   num_type_removed == num_type_added) {< / div >
< div class = "line" > < a name = "l06251" > < / a > < span class = "lineno" > 6251< / span >   < span class = "comment" > // The type is not actually being removed as all added types have already< / span > < / div >
< div class = "line" > < a name = "l06252" > < / a > < span class = "lineno" > 6252< / span >   < span class = "comment" > // been removed.< / span > < / div >
< div class = "line" > < a name = "l06253" > < / a > < span class = "lineno" > 6253< / span >   < span class = "keywordflow" > continue< / span > ;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06254" > < / a > < span class = "lineno" > 6254< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06255" > < / a > < span class = "lineno" > 6255< / span >   < / div >
< div class = "line" > < a name = "l06256" > < / a > < span class = "lineno" > 6256< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a4d6ef97994588af94176c027b321bcb6" > CheckTypeRegulations< / a > (type, policy, pos)) {< / div >
< div class = "line" > < a name = "l06257" > < / a > < span class = "lineno" > 6257< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06258" > < / a > < span class = "lineno" > 6258< / span >   }< / div >
< div class = "line" > < a name = "l06259" > < / a > < span class = "lineno" > 6259< / span >   < span class = "comment" > // Update count of type based on the visit policy.< / span > < / div >
< div class = "line" > < a name = "l06260" > < / a > < span class = "lineno" > 6260< / span >   < span class = "keywordflow" > if< / span > (policy == VisitTypePolicy::TYPE_ADDED_TO_VEHICLE ||< / div >
< div class = "line" > < a name = "l06261" > < / a > < span class = "lineno" > 6261< / span >   policy == VisitTypePolicy::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED) {< / div >
< div class = "line" > < a name = "l06262" > < / a > < span class = "lineno" > 6262< / span >   num_type_added++;< / div >
< div class = "line" > < a name = "l06263" > < / a > < span class = "lineno" > 6263< / span >   }< / div >
< div class = "line" > < a name = "l06264" > < / a > < span class = "lineno" > 6264< / span >   < span class = "keywordflow" > if< / span > (policy == VisitTypePolicy::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED ||< / div >
< div class = "line" > < a name = "l06265" > < / a > < span class = "lineno" > 6265< / span >   policy == VisitTypePolicy::ADDED_TYPE_REMOVED_FROM_VEHICLE) {< / div >
< div class = "line" > < a name = "l06266" > < / a > < span class = "lineno" > 6266< / span >   num_type_removed++;< / div >
< div class = "line" > < a name = "l06267" > < / a > < span class = "lineno" > 6267< / span >   }< / div >
< div class = "line" > < a name = "l06268" > < / a > < span class = "lineno" > 6268< / span >   }< / div >
< div class = "line" > < a name = "l06269" > < / a > < span class = "lineno" > 6269< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a7a699c6ed63d424d0c3c322eb7161ace" > FinalizeCheck< / a > ();< / div >
< div class = "line" > < a name = "l06270" > < / a > < span class = "lineno" > 6270< / span >   }< / div >
< div class = "line" > < a name = "l06271" > < / a > < span class = "lineno" > 6271< / span >   < / div >
< div class = "line" > < a name = "l06272" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_checker.html#af0019df09332cbcb2c4f37bc30d9a055" > 6272< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#af0019df09332cbcb2c4f37bc30d9a055" > TypeRegulationsChecker::InitializeCheck< / a > (< / div >
< div class = "line" > < a name = "l06273" > < / a > < span class = "lineno" > 6273< / span >   < span class = "keywordtype" > int< / span > vehicle, < span class = "keyword" > const< / span > std::function< < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > )> & next_accessor) {< / div >
< div class = "line" > < a name = "l06274" > < / a > < span class = "lineno" > 6274< / span >   < span class = "comment" > // Accumulates the count of types before the current node.< / span > < / div >
< div class = "line" > < a name = "l06275" > < / a > < span class = "lineno" > 6275< / span >   < span class = "comment" > // {0, 0, -1} does not compile on or-tools.< / span > < / div >
< div class = "line" > < a name = "l06276" > < / a > < span class = "lineno" > 6276< / span >   std::fill(occurrences_of_type_.begin(), occurrences_of_type_.end(),< / div >
< div class = "line" > < a name = "l06277" > < / a > < span class = "lineno" > 6277< / span >   < a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html" > TypeRegulationsChecker::TypePolicyOccurrence< / a > ());< / div >
< div class = "line" > < a name = "l06278" > < / a > < span class = "lineno" > 6278< / span >   < / div >
< div class = "line" > < a name = "l06279" > < / a > < span class = "lineno" > 6279< / span >   < span class = "comment" > // TODO(user): Optimize the filter to avoid scanning the route an extra< / span > < / div >
< div class = "line" > < a name = "l06280" > < / a > < span class = "lineno" > 6280< / span >   < span class = "comment" > // time when there are no TYPE_ON_VEHICLE_UP_TO_VISIT policies on the route,< / span > < / div >
< div class = "line" > < a name = "l06281" > < / a > < span class = "lineno" > 6281< / span >   < span class = "comment" > // by passing a boolean to CheckVehicle() passed to InitializeCheck().< / span > < / div >
< div class = "line" > < a name = "l06282" > < / a > < span class = "lineno" > 6282< / span >   current_route_visits_.clear();< / div >
< div class = "line" > < a name = "l06283" > < / a > < span class = "lineno" > 6283< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > current = < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle); !< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > IsEnd< / a > (current);< / div >
< div class = "line" > < a name = "l06284" > < / a > < span class = "lineno" > 6284< / span >   current = next_accessor(current)) {< / div >
< div class = "line" > < a name = "l06285" > < / a > < span class = "lineno" > 6285< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > type = < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > GetVisitType< / a > (current);< / div >
< div class = "line" > < a name = "l06286" > < / a > < span class = "lineno" > 6286< / span >   < span class = "keywordflow" > if< / span > (type > = 0 & & < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#afb44a005674a48ac88da66f7c9b7b000" > GetVisitTypePolicy< / a > (current) ==< / div >
< div class = "line" > < a name = "l06287" > < / a > < span class = "lineno" > 6287< / span >   VisitTypePolicy::TYPE_ON_VEHICLE_UP_TO_VISIT) {< / div >
< div class = "line" > < a name = "l06288" > < / a > < span class = "lineno" > 6288< / span >   occurrences_of_type_[type].position_of_last_type_on_vehicle_up_to_visit =< / div >
< div class = "line" > < a name = "l06289" > < / a > < span class = "lineno" > 6289< / span >   current_route_visits_.size();< / div >
< div class = "line" > < a name = "l06290" > < / a > < span class = "lineno" > 6290< / span >   }< / div >
< div class = "line" > < a name = "l06291" > < / a > < span class = "lineno" > 6291< / span >   current_route_visits_.push_back(current);< / div >
< div class = "line" > < a name = "l06292" > < / a > < span class = "lineno" > 6292< / span >   }< / div >
< div class = "line" > < a name = "l06293" > < / a > < span class = "lineno" > 6293< / span >   < / div >
< div class = "line" > < a name = "l06294" > < / a > < span class = "lineno" > 6294< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a72ee439843f75a7dc189962f5561ad97" > OnInitializeCheck< / a > ();< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06295" > < / a > < span class = "lineno" > 6295< / span >   }< / div >
< div class = "line" > < a name = "l06296" > < / a > < span class = "lineno" > 6296< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06297" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417" > 6297< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417" > TypeRegulationsChecker::TypeOccursOnRoute< / a > (< span class = "keywordtype" > int< / span > type)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06298" > < / a > < span class = "lineno" > 6298< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html" > TypePolicyOccurrence< / a > & occurrences = occurrences_of_type_[type];< / div >
< div class = "line" > < a name = "l06299" > < / a > < span class = "lineno" > 6299< / span >   < span class = "keywordflow" > return< / span > occurrences.< a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e" > num_type_added_to_vehicle< / a > > 0 ||< / div >
< div class = "line" > < a name = "l06300" > < / a > < span class = "lineno" > 6300< / span >   occurrences.< a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9" > position_of_last_type_on_vehicle_up_to_visit< / a > > = 0;< / div >
< div class = "line" > < a name = "l06301" > < / a > < span class = "lineno" > 6301< / span >   }< / div >
< div class = "line" > < a name = "l06302" > < / a > < span class = "lineno" > 6302< / span >   < / div >
< div class = "line" > < a name = "l06303" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7" > 6303< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7" > TypeRegulationsChecker::TypeCurrentlyOnRoute< / a > (< span class = "keywordtype" > int< / span > type, < span class = "keywordtype" > int< / span > pos)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06304" > < / a > < span class = "lineno" > 6304< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html" > TypePolicyOccurrence< / a > & occurrences = occurrences_of_type_[type];< / div >
< div class = "line" > < a name = "l06305" > < / a > < span class = "lineno" > 6305< / span >   < span class = "keywordflow" > return< / span > occurrences.< a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#abb92435061d2042b268fb2041c8e2754" > num_type_removed_from_vehicle< / a > < < / div >
< div class = "line" > < a name = "l06306" > < / a > < span class = "lineno" > 6306< / span >   occurrences.< a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e" > num_type_added_to_vehicle< / a > ||< / div >
< div class = "line" > < a name = "l06307" > < / a > < span class = "lineno" > 6307< / span >   occurrences.< a class = "code" href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9" > position_of_last_type_on_vehicle_up_to_visit< / a > > = pos;< / div >
< div class = "line" > < a name = "l06308" > < / a > < span class = "lineno" > 6308< / span >   }< / div >
< div class = "line" > < a name = "l06309" > < / a > < span class = "lineno" > 6309< / span >   < / div >
< div class = "line" > < a name = "l06310" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394" > 6310< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394" > TypeIncompatibilityChecker::TypeIncompatibilityChecker< / a > (< / div >
< div class = "line" > < a name = "l06311" > < / a > < span class = "lineno" > 6311< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > & < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > , < span class = "keywordtype" > bool< / span > check_hard_incompatibilities)< / div >
< div class = "line" > < a name = "l06312" > < / a > < span class = "lineno" > 6312< / span >   : < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html" > TypeRegulationsChecker< / a > (< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l06313" > < / a > < span class = "lineno" > 6313< / span >   check_hard_incompatibilities_(check_hard_incompatibilities) {}< / div >
< div class = "line" > < a name = "l06314" > < / a > < span class = "lineno" > 6314< / span >   < / div >
< div class = "line" > < a name = "l06315" > < / a > < span class = "lineno" > 6315< / span >   < span class = "keywordtype" > bool< / span > TypeIncompatibilityChecker::HasRegulationsToCheck()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06316" > < / a > < span class = "lineno" > 6316< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#ad19492313b68e5a963af3793aaec8d90" > HasTemporalTypeIncompatibilities< / a > () ||< / div >
< div class = "line" > < a name = "l06317" > < / a > < span class = "lineno" > 6317< / span >   (check_hard_incompatibilities_ & & < / div >
< div class = "line" > < a name = "l06318" > < / a > < span class = "lineno" > 6318< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a9c58894df747f5498c335a3a8c5c0c88" > HasHardTypeIncompatibilities< / a > ());< / div >
< div class = "line" > < a name = "l06319" > < / a > < span class = "lineno" > 6319< / span >   }< / div >
< div class = "line" > < a name = "l06320" > < / a > < span class = "lineno" > 6320< / span >   < / div >
< div class = "line" > < a name = "l06321" > < / a > < span class = "lineno" > 6321< / span >   < span class = "comment" > // TODO(user): Remove the check_hard_incompatibilities_ boolean and always< / span > < / div >
< div class = "line" > < a name = "l06322" > < / a > < span class = "lineno" > 6322< / span >   < span class = "comment" > // check both incompatibilities to simplify the code?< / span > < / div >
< div class = "line" > < a name = "l06323" > < / a > < span class = "lineno" > 6323< / span >   < span class = "comment" > // TODO(user): Improve algorithm by only checking a given type if necessary?< / span > < / div >
< div class = "line" > < a name = "l06324" > < / a > < span class = "lineno" > 6324< / span >   < span class = "comment" > // - For temporal incompatibilities, only check if NonDeliveredType(count) == 1.< / span > < / div >
< div class = "line" > < a name = "l06325" > < / a > < span class = "lineno" > 6325< / span >   < span class = "comment" > // - For hard incompatibilities, only if NonDeliveryType(type) == 1.< / span > < / div >
< div class = "line" > < a name = "l06326" > < / a > < span class = "lineno" > 6326< / span >   < span class = "keywordtype" > bool< / span > TypeIncompatibilityChecker::CheckTypeRegulations(< span class = "keywordtype" > int< / span > type,< / div >
< div class = "line" > < a name = "l06327" > < / a > < span class = "lineno" > 6327< / span >   VisitTypePolicy policy,< / div >
< div class = "line" > < a name = "l06328" > < / a > < span class = "lineno" > 6328< / span >   < span class = "keywordtype" > int< / span > pos) {< / div >
< div class = "line" > < a name = "l06329" > < / a > < span class = "lineno" > 6329< / span >   < span class = "keywordflow" > if< / span > (policy == VisitTypePolicy::ADDED_TYPE_REMOVED_FROM_VEHICLE) {< / div >
< div class = "line" > < a name = "l06330" > < / a > < span class = "lineno" > 6330< / span >   < span class = "comment" > // NOTE: We don' t need to check incompatibilities when the type is being< / span > < / div >
< div class = "line" > < a name = "l06331" > < / a > < span class = "lineno" > 6331< / span >   < span class = "comment" > // removed from the route.< / span > < / div >
< div class = "line" > < a name = "l06332" > < / a > < span class = "lineno" > 6332< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06333" > < / a > < span class = "lineno" > 6333< / span >   }< / div >
< div class = "line" > < a name = "l06334" > < / a > < span class = "lineno" > 6334< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > incompatible_type :< / div >
< div class = "line" > < a name = "l06335" > < / a > < span class = "lineno" > 6335< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7" > GetTemporalTypeIncompatibilitiesOfType< / a > (type)) {< / div >
< div class = "line" > < a name = "l06336" > < / a > < span class = "lineno" > 6336< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7" > TypeCurrentlyOnRoute< / a > (incompatible_type, pos)) {< / div >
< div class = "line" > < a name = "l06337" > < / a > < span class = "lineno" > 6337< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06338" > < / a > < span class = "lineno" > 6338< / span >   }< / div >
< div class = "line" > < a name = "l06339" > < / a > < span class = "lineno" > 6339< / span >   }< / div >
< div class = "line" > < a name = "l06340" > < / a > < span class = "lineno" > 6340< / span >   < span class = "keywordflow" > if< / span > (check_hard_incompatibilities_) {< / div >
< div class = "line" > < a name = "l06341" > < / a > < span class = "lineno" > 6341< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > incompatible_type :< / div >
< div class = "line" > < a name = "l06342" > < / a > < span class = "lineno" > 6342< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895" > GetHardTypeIncompatibilitiesOfType< / a > (type)) {< / div >
< div class = "line" > < a name = "l06343" > < / a > < span class = "lineno" > 6343< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417" > TypeOccursOnRoute< / a > (incompatible_type)) {< / div >
< div class = "line" > < a name = "l06344" > < / a > < span class = "lineno" > 6344< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06345" > < / a > < span class = "lineno" > 6345< / span >   }< / div >
< div class = "line" > < a name = "l06346" > < / a > < span class = "lineno" > 6346< / span >   }< / div >
< div class = "line" > < a name = "l06347" > < / a > < span class = "lineno" > 6347< / span >   }< / div >
< div class = "line" > < a name = "l06348" > < / a > < span class = "lineno" > 6348< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06349" > < / a > < span class = "lineno" > 6349< / span >   }< / div >
< div class = "line" > < a name = "l06350" > < / a > < span class = "lineno" > 6350< / span >   < / div >
< div class = "line" > < a name = "l06351" > < / a > < span class = "lineno" > 6351< / span >   < span class = "keywordtype" > bool< / span > TypeRequirementChecker::HasRegulationsToCheck()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06352" > < / a > < span class = "lineno" > 6352< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891" > HasTemporalTypeRequirements< / a > () ||< / div >
< div class = "line" > < a name = "l06353" > < / a > < span class = "lineno" > 6353< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#abc101a64a3c876dcdf1b7176d59bd2c9" > HasSameVehicleTypeRequirements< / a > ();< / div >
< div class = "line" > < a name = "l06354" > < / a > < span class = "lineno" > 6354< / span >   }< / div >
< div class = "line" > < a name = "l06355" > < / a > < span class = "lineno" > 6355< / span >   < / div >
< div class = "line" > < a name = "l06356" > < / a > < span class = "lineno" > 6356< / span >   < span class = "keywordtype" > bool< / span > TypeRequirementChecker::CheckRequiredTypesCurrentlyOnRoute(< / div >
< div class = "line" > < a name = "l06357" > < / a > < span class = "lineno" > 6357< / span >   < span class = "keyword" > const< / span > std::vector< absl::flat_hash_set< int> > & required_type_alternatives,< / div >
< div class = "line" > < a name = "l06358" > < / a > < span class = "lineno" > 6358< / span >   < span class = "keywordtype" > int< / span > pos) {< / div >
< div class = "line" > < a name = "l06359" > < / a > < span class = "lineno" > 6359< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > absl::flat_hash_set< int> & requirement_alternatives :< / div >
< div class = "line" > < a name = "l06360" > < / a > < span class = "lineno" > 6360< / span >   required_type_alternatives) {< / div >
< div class = "line" > < a name = "l06361" > < / a > < span class = "lineno" > 6361< / span >   < span class = "keywordtype" > bool< / span > has_one_of_alternatives = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06362" > < / a > < span class = "lineno" > 6362< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > type_alternative : requirement_alternatives) {< / div >
< div class = "line" > < a name = "l06363" > < / a > < span class = "lineno" > 6363< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7" > TypeCurrentlyOnRoute< / a > (type_alternative, pos)) {< / div >
< div class = "line" > < a name = "l06364" > < / a > < span class = "lineno" > 6364< / span >   has_one_of_alternatives = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06365" > < / a > < span class = "lineno" > 6365< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l06366" > < / a > < span class = "lineno" > 6366< / span >   }< / div >
< div class = "line" > < a name = "l06367" > < / a > < span class = "lineno" > 6367< / span >   }< / div >
< div class = "line" > < a name = "l06368" > < / a > < span class = "lineno" > 6368< / span >   < span class = "keywordflow" > if< / span > (!has_one_of_alternatives) {< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06369" > < / a > < span class = "lineno" > 6369< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06370" > < / a > < span class = "lineno" > 6370< / span >   }< / div >
< div class = "line" > < a name = "l06371" > < / a > < span class = "lineno" > 6371< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06372" > < / a > < span class = "lineno" > 6372< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06373" > < / a > < span class = "lineno" > 6373< / span >   }< / div >
< div class = "line" > < a name = "l06374" > < / a > < span class = "lineno" > 6374< / span >   < / div >
< div class = "line" > < a name = "l06375" > < / a > < span class = "lineno" > 6375< / span >   < span class = "keywordtype" > bool< / span > TypeRequirementChecker::CheckTypeRegulations(< span class = "keywordtype" > int< / span > type,< / div >
< div class = "line" > < a name = "l06376" > < / a > < span class = "lineno" > 6376< / span >   VisitTypePolicy policy,< / div >
< div class = "line" > < a name = "l06377" > < / a > < span class = "lineno" > 6377< / span >   < span class = "keywordtype" > int< / span > pos) {< / div >
< div class = "line" > < a name = "l06378" > < / a > < span class = "lineno" > 6378< / span >   < span class = "keywordflow" > if< / span > (policy == < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > RoutingModel::TYPE_ADDED_TO_VEHICLE< / a > ||< / div >
< div class = "line" > < a name = "l06379" > < / a > < span class = "lineno" > 6379< / span >   policy == < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > RoutingModel::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / a > ) {< / div >
< div class = "line" > < a name = "l06380" > < / a > < span class = "lineno" > 6380< / span >   < span class = "keywordflow" > if< / span > (!CheckRequiredTypesCurrentlyOnRoute(< / div >
< div class = "line" > < a name = "l06381" > < / a > < span class = "lineno" > 6381< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82" > GetRequiredTypeAlternativesWhenAddingType< / a > (type), pos)) {< / div >
< div class = "line" > < a name = "l06382" > < / a > < span class = "lineno" > 6382< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06383" > < / a > < span class = "lineno" > 6383< / span >   }< / div >
< div class = "line" > < a name = "l06384" > < / a > < span class = "lineno" > 6384< / span >   }< / div >
< div class = "line" > < a name = "l06385" > < / a > < span class = "lineno" > 6385< / span >   < span class = "keywordflow" > if< / span > (policy != < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > RoutingModel::TYPE_ADDED_TO_VEHICLE< / a > ) {< / div >
< div class = "line" > < a name = "l06386" > < / a > < span class = "lineno" > 6386< / span >   < span class = "keywordflow" > if< / span > (!CheckRequiredTypesCurrentlyOnRoute(< / div >
< div class = "line" > < a name = "l06387" > < / a > < span class = "lineno" > 6387< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd" > GetRequiredTypeAlternativesWhenRemovingType< / a > (type), pos)) {< / div >
< div class = "line" > < a name = "l06388" > < / a > < span class = "lineno" > 6388< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06389" > < / a > < span class = "lineno" > 6389< / span >   }< / div >
< div class = "line" > < a name = "l06390" > < / a > < span class = "lineno" > 6390< / span >   }< / div >
< div class = "line" > < a name = "l06391" > < / a > < span class = "lineno" > 6391< / span >   < span class = "keywordflow" > if< / span > (policy != < a class = "code" href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab" > RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE< / a > & & < / div >
< div class = "line" > < a name = "l06392" > < / a > < span class = "lineno" > 6392< / span >   !< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7" > GetSameVehicleRequiredTypeAlternativesOfType< / a > (type).empty()) {< / div >
< div class = "line" > < a name = "l06393" > < / a > < span class = "lineno" > 6393< / span >   types_with_same_vehicle_requirements_on_route_.insert(type);< / div >
< div class = "line" > < a name = "l06394" > < / a > < span class = "lineno" > 6394< / span >   }< / div >
< div class = "line" > < a name = "l06395" > < / a > < span class = "lineno" > 6395< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06396" > < / a > < span class = "lineno" > 6396< / span >   }< / div >
< div class = "line" > < a name = "l06397" > < / a > < span class = "lineno" > 6397< / span >   < / div >
< div class = "line" > < a name = "l06398" > < / a > < span class = "lineno" > 6398< / span >   < span class = "keywordtype" > bool< / span > TypeRequirementChecker::FinalizeCheck()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06399" > < / a > < span class = "lineno" > 6399< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > type : types_with_same_vehicle_requirements_on_route_) {< / div >
< div class = "line" > < a name = "l06400" > < / a > < span class = "lineno" > 6400< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > absl::flat_hash_set< int> & requirement_alternatives :< / div >
< div class = "line" > < a name = "l06401" > < / a > < span class = "lineno" > 6401< / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > model_< / a > .< a class = "code" href = "classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7" > GetSameVehicleRequiredTypeAlternativesOfType< / a > (type)) {< / div >
< div class = "line" > < a name = "l06402" > < / a > < span class = "lineno" > 6402< / span >   < span class = "keywordtype" > bool< / span > has_one_of_alternatives = < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06403" > < / a > < span class = "lineno" > 6403< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > type_alternative : requirement_alternatives) {< / div >
< div class = "line" > < a name = "l06404" > < / a > < span class = "lineno" > 6404< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417" > TypeOccursOnRoute< / a > (type_alternative)) {< / div >
< div class = "line" > < a name = "l06405" > < / a > < span class = "lineno" > 6405< / span >   has_one_of_alternatives = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06406" > < / a > < span class = "lineno" > 6406< / span >   < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l06407" > < / a > < span class = "lineno" > 6407< / span >   }< / div >
< div class = "line" > < a name = "l06408" > < / a > < span class = "lineno" > 6408< / span >   }< / div >
< div class = "line" > < a name = "l06409" > < / a > < span class = "lineno" > 6409< / span >   < span class = "keywordflow" > if< / span > (!has_one_of_alternatives) {< / div >
< div class = "line" > < a name = "l06410" > < / a > < span class = "lineno" > 6410< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > false< / span > ;< / div >
< div class = "line" > < a name = "l06411" > < / a > < span class = "lineno" > 6411< / span >   }< / div >
< div class = "line" > < a name = "l06412" > < / a > < span class = "lineno" > 6412< / span >   }< / div >
< div class = "line" > < a name = "l06413" > < / a > < span class = "lineno" > 6413< / span >   }< / div >
< div class = "line" > < a name = "l06414" > < / a > < span class = "lineno" > 6414< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06415" > < / a > < span class = "lineno" > 6415< / span >   }< / div >
< div class = "line" > < a name = "l06416" > < / a > < span class = "lineno" > 6416< / span >   < / div >
< div class = "line" > < a name = "l06417" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46" > 6417< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46" > TypeRegulationsConstraint::TypeRegulationsConstraint< / a > (< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > & < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > )< / div >
< div class = "line" > < a name = "l06418" > < / a > < span class = "lineno" > 6418< / span >   : < a class = "code" href = "classoperations__research_1_1_constraint.html" > Constraint< / a > (< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > .solver()),< / div >
< div class = "line" > < a name = "l06419" > < / a > < span class = "lineno" > 6419< / span >   model_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l06420" > < / a > < span class = "lineno" > 6420< / span >   incompatibility_checker_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > , < span class = "comment" > /*check_hard_incompatibilities*/< / span > true),< / div >
< div class = "line" > < a name = "l06421" > < / a > < span class = "lineno" > 6421< / span >   requirement_checker_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ),< / div >
< div class = "line" > < a name = "l06422" > < / a > < span class = "lineno" > 6422< / span >   vehicle_demons_(< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > .vehicles()) {}< / div >
< div class = "line" > < a name = "l06423" > < / a > < span class = "lineno" > 6423< / span >   < / div >
< div class = "line" > < a name = "l06424" > < / a > < span class = "lineno" > 6424< / span >   < span class = "keywordtype" > void< / span > TypeRegulationsConstraint::PropagateNodeRegulations(< span class = "keywordtype" > int< / span > node) {< / div >
< div class = "line" > < a name = "l06425" > < / a > < span class = "lineno" > 6425< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (node, model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > ());< / div >
< div class = "line" > < a name = "l06426" > < / a > < span class = "lineno" > 6426< / span >   < span class = "keywordflow" > if< / span > (!model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > () || !model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > ()) {< / div >
< div class = "line" > < a name = "l06427" > < / a > < span class = "lineno" > 6427< / span >   < span class = "comment" > // Vehicle var or Next var not bound.< / span > < / div >
< div class = "line" > < a name = "l06428" > < / a > < span class = "lineno" > 6428< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06429" > < / a > < span class = "lineno" > 6429< / span >   }< / div >
< div class = "line" > < a name = "l06430" > < / a > < span class = "lineno" > 6430< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle = model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#ac4a4f30badcd311075302a4efcfaee0a" > Min< / a > ();< / div >
< div class = "line" > < a name = "l06431" > < / a > < span class = "lineno" > 6431< / span >   < span class = "keywordflow" > if< / span > (vehicle < 0) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06432" > < / a > < span class = "lineno" > 6432< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (vehicle_demons_[vehicle] != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06433" > < / a > < span class = "lineno" > 6433< / span >   < a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a173cbf153462b14f9b57362d2c45638a" > EnqueueDelayedDemon< / a > (vehicle_demons_[vehicle]);< / div >
< div class = "line" > < a name = "l06434" > < / a > < span class = "lineno" > 6434< / span >   }< / div >
< div class = "line" > < a name = "l06435" > < / a > < span class = "lineno" > 6435< / span >   < / div >
< div class = "line" > < a name = "l06436" > < / a > < span class = "lineno" > 6436< / span >   < span class = "keywordtype" > void< / span > TypeRegulationsConstraint::CheckRegulationsOnVehicle(< span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l06437" > < / a > < span class = "lineno" > 6437< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > next_accessor = [< span class = "keyword" > this< / span > , vehicle](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > node) {< / div >
< div class = "line" > < a name = "l06438" > < / a > < span class = "lineno" > 6438< / span >   < span class = "keywordflow" > if< / span > (model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > Bound< / a > ()) {< / div >
< div class = "line" > < a name = "l06439" > < / a > < span class = "lineno" > 6439< / span >   < span class = "keywordflow" > return< / span > model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_var.html#ac067bc2252cc65b1eb004d5285e5fdb2" > Value< / a > ();< / div >
< div class = "line" > < a name = "l06440" > < / a > < span class = "lineno" > 6440< / span >   }< / div >
< div class = "line" > < a name = "l06441" > < / a > < span class = "lineno" > 6441< / span >   < span class = "comment" > // Node not bound, skip to the end of the vehicle.< / span > < / div >
< div class = "line" > < a name = "l06442" > < / a > < span class = "lineno" > 6442< / span >   < span class = "keywordflow" > return< / span > model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle);< / div >
< div class = "line" > < a name = "l06443" > < / a > < span class = "lineno" > 6443< / span >   };< / div >
< div class = "line" > < a name = "l06444" > < / a > < span class = "lineno" > 6444< / span >   < span class = "keywordflow" > if< / span > (!incompatibility_checker_.< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a68fa0aaa5c8d8dbead32a6b04463722e" > CheckVehicle< / a > (vehicle, next_accessor) ||< / div >
< div class = "line" > < a name = "l06445" > < / a > < span class = "lineno" > 6445< / span >   !requirement_checker_.< a class = "code" href = "classoperations__research_1_1_type_regulations_checker.html#a68fa0aaa5c8d8dbead32a6b04463722e" > CheckVehicle< / a > (vehicle, next_accessor)) {< / div >
< div class = "line" > < a name = "l06446" > < / a > < span class = "lineno" > 6446< / span >   model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ()-> < a class = "code" href = "classoperations__research_1_1_solver.html#aeb92d4addb41255c9732cacfcb54f795" > Fail< / a > ();< / div >
< div class = "line" > < a name = "l06447" > < / a > < span class = "lineno" > 6447< / span >   }< / div >
< div class = "line" > < a name = "l06448" > < / a > < span class = "lineno" > 6448< / span >   }< / div >
< div class = "line" > < a name = "l06449" > < / a > < span class = "lineno" > 6449< / span >   < / div >
< div class = "line" > < a name = "l06450" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84" > 6450< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84" > TypeRegulationsConstraint::Post< / a > () {< / div >
< div class = "line" > < a name = "l06451" > < / a > < span class = "lineno" > 6451< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); vehicle++) {< / div >
< div class = "line" > < a name = "l06452" > < / a > < span class = "lineno" > 6452< / span >   vehicle_demons_[vehicle] = < a class = "code" href = "namespaceoperations__research.html#a11f4a7dbafd8e00a36b892a82e44445f" > MakeDelayedConstraintDemon1< / a > (< / div >
< div class = "line" > < a name = "l06453" > < / a > < span class = "lineno" > 6453< / span >   < a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > (), < span class = "keyword" > this< / span > , & TypeRegulationsConstraint::CheckRegulationsOnVehicle,< / div >
< div class = "line" > < a name = "l06454" > < / a > < span class = "lineno" > 6454< / span >   < span class = "stringliteral" > " CheckRegulationsOnVehicle" < / span > , vehicle);< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06455" > < / a > < span class = "lineno" > 6455< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06456" > < / a > < span class = "lineno" > 6456< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > node = 0; node < model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); node++) {< / div >
< div class = "line" > < a name = "l06457" > < / a > < span class = "lineno" > 6457< / span >   < a class = "code" href = "classoperations__research_1_1_demon.html" > Demon< / a > * node_demon = < a class = "code" href = "namespaceoperations__research.html#a4fb750da00c784e5ffd1763fd3ce88f7" > MakeConstraintDemon1< / a > (< / div >
< div class = "line" > < a name = "l06458" > < / a > < span class = "lineno" > 6458< / span >   < a class = "code" href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > (), < span class = "keyword" > this< / span > , & TypeRegulationsConstraint::PropagateNodeRegulations,< / div >
< div class = "line" > < a name = "l06459" > < / a > < span class = "lineno" > 6459< / span >   < span class = "stringliteral" > " PropagateNodeRegulations" < / span > , node);< / div >
< div class = "line" > < a name = "l06460" > < / a > < span class = "lineno" > 6460< / span >   model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc" > WhenBound< / a > (node_demon);< / div >
< div class = "line" > < a name = "l06461" > < / a > < span class = "lineno" > 6461< / span >   model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (node)-> < a class = "code" href = "classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc" > WhenBound< / a > (node_demon);< / div >
< div class = "line" > < a name = "l06462" > < / a > < span class = "lineno" > 6462< / span >   }< / div >
< div class = "line" > < a name = "l06463" > < / a > < span class = "lineno" > 6463< / span >   }< / div >
< div class = "line" > < a name = "l06464" > < / a > < span class = "lineno" > 6464< / span >   < / div >
< div class = "line" > < a name = "l06465" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938" > 6465< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938" > TypeRegulationsConstraint::InitialPropagate< / a > () {< / div >
< div class = "line" > < a name = "l06466" > < / a > < span class = "lineno" > 6466< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > vehicle = 0; vehicle < model_.< a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); vehicle++) {< / div >
< div class = "line" > < a name = "l06467" > < / a > < span class = "lineno" > 6467< / span >   CheckRegulationsOnVehicle(vehicle);< / div >
< div class = "line" > < a name = "l06468" > < / a > < span class = "lineno" > 6468< / span >   }< / div >
< div class = "line" > < a name = "l06469" > < / a > < span class = "lineno" > 6469< / span >   }< / div >
< div class = "line" > < a name = "l06470" > < / a > < span class = "lineno" > 6470< / span >   < / div >
< div class = "line" > < a name = "l06471" > < / a > < span class = "lineno" > 6471< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::CloseModel(< span class = "keywordtype" > bool< / span > use_light_propagation) {< / div >
< div class = "line" > < a name = "l06472" > < / a > < span class = "lineno" > 6472< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06473" > < / a > < span class = "lineno" > 6473< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > capacity_lambda = [< span class = "keyword" > this< / span > ](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle) {< / div >
< div class = "line" > < a name = "l06474" > < / a > < span class = "lineno" > 6474< / span >   < span class = "keywordflow" > return< / span > vehicle > = 0 ? vehicle_capacities_[vehicle] : < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l06475" > < / a > < span class = "lineno" > 6475< / span >   };< / div >
< div class = "line" > < a name = "l06476" > < / a > < span class = "lineno" > 6476< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < capacity_vars_.size(); ++i) {< / div >
< div class = "line" > < a name = "l06477" > < / a > < span class = "lineno" > 6477< / span >   IntVar* < span class = "keyword" > const< / span > vehicle_var = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (i);< / div >
< div class = "line" > < a name = "l06478" > < / a > < span class = "lineno" > 6478< / span >   IntVar* < span class = "keyword" > const< / span > capacity_var = capacity_vars_[i];< / div >
< div class = "line" > < a name = "l06479" > < / a > < span class = "lineno" > 6479< / span >   < span class = "keywordflow" > if< / span > (use_light_propagation) {< / div >
< div class = "line" > < a name = "l06480" > < / a > < span class = "lineno" > 6480< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (MakeLightElement(< / div >
< div class = "line" > < a name = "l06481" > < / a > < span class = "lineno" > 6481< / span >   solver, capacity_var, vehicle_var, capacity_lambda,< / div >
< div class = "line" > < a name = "l06482" > < / a > < span class = "lineno" > 6482< / span >   [< span class = "keyword" > this< / span > ]() { < span class = "keywordflow" > return< / span > model_-> enable_deep_serialization_; }));< / div >
< div class = "line" > < a name = "l06483" > < / a > < span class = "lineno" > 6483< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06484" > < / a > < span class = "lineno" > 6484< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372" > MakeEquality< / a > (< / div >
< div class = "line" > < a name = "l06485" > < / a > < span class = "lineno" > 6485< / span >   capacity_var,< / div >
< div class = "line" > < a name = "l06486" > < / a > < span class = "lineno" > 6486< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a0239c8843ea9e89736f6146c27bf71bf" > MakeElement< / a > (capacity_lambda, vehicle_var)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > ()));< / div >
< div class = "line" > < a name = "l06487" > < / a > < span class = "lineno" > 6487< / span >   }< / div >
< div class = "line" > < a name = "l06488" > < / a > < span class = "lineno" > 6488< / span >   }< / div >
< div class = "line" > < a name = "l06489" > < / a > < span class = "lineno" > 6489< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_solver.html#aa9726f5458b77973475a32178fe512b3" > Solver::IndexEvaluator1< / a > vehicle_class_function = [< span class = "keyword" > this< / span > ](< span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l06490" > < / a > < span class = "lineno" > 6490< / span >   < span class = "keywordflow" > return< / span > IthElementOrValue< -1> (vehicle_to_class_, < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l06491" > < / a > < span class = "lineno" > 6491< / span >   };< / div >
< div class = "line" > < a name = "l06492" > < / a > < span class = "lineno" > 6492< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < fixed_transits_.size(); ++i) {< / div >
< div class = "line" > < a name = "l06493" > < / a > < span class = "lineno" > 6493< / span >   IntVar* < span class = "keyword" > const< / span > next_var = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i);< / div >
< div class = "line" > < a name = "l06494" > < / a > < span class = "lineno" > 6494< / span >   IntVar* < span class = "keyword" > const< / span > fixed_transit = fixed_transits_[i];< / div >
< div class = "line" > < a name = "l06495" > < / a > < span class = "lineno" > 6495< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > transit_vehicle_evaluator = [< span class = "keyword" > this< / span > , i](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to,< / div >
< div class = "line" > < a name = "l06496" > < / a > < span class = "lineno" > 6496< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > eval_index) {< / div >
< div class = "line" > < a name = "l06497" > < / a > < span class = "lineno" > 6497< / span >   < span class = "keywordflow" > return< / span > eval_index > = 0 ? < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aae1962408e06dbb45f6e5ee67e530880" > transit_evaluator< / a > (eval_index)(i, to) : 0;< / div >
< div class = "line" > < a name = "l06498" > < / a > < span class = "lineno" > 6498< / span >   };< / div >
< div class = "line" > < a name = "l06499" > < / a > < span class = "lineno" > 6499< / span >   < span class = "keywordflow" > if< / span > (use_light_propagation) {< / div >
< div class = "line" > < a name = "l06500" > < / a > < span class = "lineno" > 6500< / span >   < span class = "keywordflow" > if< / span > (class_evaluators_.size() == 1) {< / div >
< div class = "line" > < a name = "l06501" > < / a > < span class = "lineno" > 6501< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > class_evaluator_index = class_evaluators_[0];< / div >
< div class = "line" > < a name = "l06502" > < / a > < span class = "lineno" > 6502< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & unary_callback =< / div >
< div class = "line" > < a name = "l06503" > < / a > < span class = "lineno" > 6503< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a44afcc03d5cb68c01acefa253de9edcf" > UnaryTransitCallbackOrNull< / a > (class_evaluator_index);< / div >
< div class = "line" > < a name = "l06504" > < / a > < span class = "lineno" > 6504< / span >   < span class = "keywordflow" > if< / span > (unary_callback == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06505" > < / a > < span class = "lineno" > 6505< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (MakeLightElement(< / div >
< div class = "line" > < a name = "l06506" > < / a > < span class = "lineno" > 6506< / span >   solver, fixed_transit, next_var,< / div >
< div class = "line" > < a name = "l06507" > < / a > < span class = "lineno" > 6507< / span >   [< span class = "keyword" > this< / span > , i](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to) {< / div >
< div class = "line" > < a name = "l06508" > < / a > < span class = "lineno" > 6508< / span >   < span class = "keywordflow" > return< / span > model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad558398f8c75f81d879f74d18ba5e7c3" > TransitCallback< / a > (class_evaluators_[0])(i, to);< / div >
< div class = "line" > < a name = "l06509" > < / a > < span class = "lineno" > 6509< / span >   },< / div >
< div class = "line" > < a name = "l06510" > < / a > < span class = "lineno" > 6510< / span >   [< span class = "keyword" > this< / span > ]() { < span class = "keywordflow" > return< / span > model_-> enable_deep_serialization_; }));< / div >
< div class = "line" > < a name = "l06511" > < / a > < span class = "lineno" > 6511< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06512" > < / a > < span class = "lineno" > 6512< / span >   fixed_transit-> SetValue(unary_callback(i));< / div >
< div class = "line" > < a name = "l06513" > < / a > < span class = "lineno" > 6513< / span >   }< / div >
< div class = "line" > < a name = "l06514" > < / a > < span class = "lineno" > 6514< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06515" > < / a > < span class = "lineno" > 6515< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (MakeLightElement2(< / div >
< div class = "line" > < a name = "l06516" > < / a > < span class = "lineno" > 6516< / span >   solver, fixed_transit, next_var, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (i),< / div >
< div class = "line" > < a name = "l06517" > < / a > < span class = "lineno" > 6517< / span >   transit_vehicle_evaluator,< / div >
< div class = "line" > < a name = "l06518" > < / a > < span class = "lineno" > 6518< / span >   [< span class = "keyword" > this< / span > ]() { < span class = "keywordflow" > return< / span > model_-> enable_deep_serialization_; }));< / div >
< div class = "line" > < a name = "l06519" > < / a > < span class = "lineno" > 6519< / span >   }< / div >
< div class = "line" > < a name = "l06520" > < / a > < span class = "lineno" > 6520< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06521" > < / a > < span class = "lineno" > 6521< / span >   < span class = "keywordflow" > if< / span > (class_evaluators_.size() == 1) {< / div >
< div class = "line" > < a name = "l06522" > < / a > < span class = "lineno" > 6522< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > class_evaluator_index = class_evaluators_[0];< / div >
< div class = "line" > < a name = "l06523" > < / a > < span class = "lineno" > 6523< / span >   < span class = "keyword" > const< / span > < span class = "keyword" > auto< / span > & unary_callback =< / div >
< div class = "line" > < a name = "l06524" > < / a > < span class = "lineno" > 6524< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a44afcc03d5cb68c01acefa253de9edcf" > UnaryTransitCallbackOrNull< / a > (class_evaluator_index);< / div >
< div class = "line" > < a name = "l06525" > < / a > < span class = "lineno" > 6525< / span >   < span class = "keywordflow" > if< / span > (unary_callback == < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06526" > < / a > < span class = "lineno" > 6526< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372" > MakeEquality< / a > (< / div >
< div class = "line" > < a name = "l06527" > < / a > < span class = "lineno" > 6527< / span >   fixed_transit, solver< / div >
< div class = "line" > < a name = "l06528" > < / a > < span class = "lineno" > 6528< / span >   -> < a class = "code" href = "classoperations__research_1_1_solver.html#a0239c8843ea9e89736f6146c27bf71bf" > MakeElement< / a > (< / div >
< div class = "line" > < a name = "l06529" > < / a > < span class = "lineno" > 6529< / span >   [< span class = "keyword" > this< / span > , i](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to) {< / div >
< div class = "line" > < a name = "l06530" > < / a > < span class = "lineno" > 6530< / span >   < span class = "keywordflow" > return< / span > model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ad558398f8c75f81d879f74d18ba5e7c3" > TransitCallback< / a > (< / div >
< div class = "line" > < a name = "l06531" > < / a > < span class = "lineno" > 6531< / span >   class_evaluators_[0])(i, to);< / div >
< div class = "line" > < a name = "l06532" > < / a > < span class = "lineno" > 6532< / span >   },< / div >
< div class = "line" > < a name = "l06533" > < / a > < span class = "lineno" > 6533< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > NextVar< / a > (i))< / div >
< div class = "line" > < a name = "l06534" > < / a > < span class = "lineno" > 6534< / span >   -> Var()));< / div >
< div class = "line" > < a name = "l06535" > < / a > < span class = "lineno" > 6535< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06536" > < / a > < span class = "lineno" > 6536< / span >   fixed_transit-> SetValue(unary_callback(i));< / div >
< div class = "line" > < a name = "l06537" > < / a > < span class = "lineno" > 6537< / span >   }< / div >
< div class = "line" > < a name = "l06538" > < / a > < span class = "lineno" > 6538< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06539" > < / a > < span class = "lineno" > 6539< / span >   IntVar* < span class = "keyword" > const< / span > vehicle_class_var =< / div >
< div class = "line" > < a name = "l06540" > < / a > < span class = "lineno" > 6540< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a0239c8843ea9e89736f6146c27bf71bf" > MakeElement< / a > (vehicle_class_function, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > VehicleVar< / a > (i))< / div >
< div class = "line" > < a name = "l06541" > < / a > < span class = "lineno" > 6541< / span >   -> Var();< / div >
< div class = "line" > < a name = "l06542" > < / a > < span class = "lineno" > 6542< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372" > MakeEquality< / a > (< / div >
< div class = "line" > < a name = "l06543" > < / a > < span class = "lineno" > 6543< / span >   fixed_transit, solver< / div >
< div class = "line" > < a name = "l06544" > < / a > < span class = "lineno" > 6544< / span >   -> < a class = "code" href = "classoperations__research_1_1_solver.html#a0239c8843ea9e89736f6146c27bf71bf" > MakeElement< / a > (transit_vehicle_evaluator,< / div >
< div class = "line" > < a name = "l06545" > < / a > < span class = "lineno" > 6545< / span >   next_var, vehicle_class_var)< / div >
< div class = "line" > < a name = "l06546" > < / a > < span class = "lineno" > 6546< / span >   -> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > ()));< / div >
< div class = "line" > < a name = "l06547" > < / a > < span class = "lineno" > 6547< / span >   }< / div >
< div class = "line" > < a name = "l06548" > < / a > < span class = "lineno" > 6548< / span >   }< / div >
< div class = "line" > < a name = "l06549" > < / a > < span class = "lineno" > 6549< / span >   }< / div >
< div class = "line" > < a name = "l06550" > < / a > < span class = "lineno" > 6550< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5" > HasBreakConstraints< / a > ()) {< / div >
< div class = "line" > < a name = "l06551" > < / a > < span class = "lineno" > 6551< / span >   GlobalVehicleBreaksConstraint* constraint =< / div >
< div class = "line" > < a name = "l06552" > < / a > < span class = "lineno" > 6552< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a35a576bb3ea6814f122593d44a3c391e" > model< / a > ()-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ()-> < a class = "code" href = "classoperations__research_1_1_solver.html#ab741cb25dd32d1cbe02fbfb36337d9bb" > RevAlloc< / a > (< span class = "keyword" > new< / span > GlobalVehicleBreaksConstraint(< span class = "keyword" > this< / span > ));< / div >
< div class = "line" > < a name = "l06553" > < / a > < span class = "lineno" > 6553< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > AddConstraint< / a > (constraint);< / div >
< div class = "line" > < a name = "l06554" > < / a > < span class = "lineno" > 6554< / span >   }< / div >
< div class = "line" > < a name = "l06555" > < / a > < span class = "lineno" > 6555< / span >   }< / div >
< div class = "line" > < a name = "l06556" > < / a > < span class = "lineno" > 6556< / span >   < / div >
< div class = "line" > < a name = "l06557" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a7ed584226a1930ec8663c3e4efe28a93" > 6557< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a7ed584226a1930ec8663c3e4efe28a93" > RoutingDimension::GetTransitValue< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from_index, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to_index,< / div >
< div class = "line" > < a name = "l06558" > < / a > < span class = "lineno" > 6558< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06559" > < / a > < span class = "lineno" > 6559< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aae1962408e06dbb45f6e5ee67e530880" > transit_evaluator< / a > (vehicle) != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06560" > < / a > < span class = "lineno" > 6560< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aae1962408e06dbb45f6e5ee67e530880" > transit_evaluator< / a > (vehicle)(from_index, to_index);< / div >
< div class = "line" > < a name = "l06561" > < / a > < span class = "lineno" > 6561< / span >   }< / div >
< div class = "line" > < a name = "l06562" > < / a > < span class = "lineno" > 6562< / span >   < / div >
< div class = "line" > < a name = "l06563" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#acf39f330b220a62bbb8fac9c8c1256b5" > 6563< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html" > SortedDisjointIntervalList< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#acf39f330b220a62bbb8fac9c8c1256b5" > RoutingDimension::GetAllowedIntervalsInRange< / a > (< / div >
< div class = "line" > < a name = "l06564" > < / a > < span class = "lineno" > 6564< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > min_value, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > max_value)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06565" > < / a > < span class = "lineno" > 6565< / span >   < a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html" > SortedDisjointIntervalList< / a > allowed;< / div >
< div class = "line" > < a name = "l06566" > < / a > < span class = "lineno" > 6566< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html" > SortedDisjointIntervalList< / a > & forbidden = forbidden_intervals_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l06567" > < / a > < span class = "lineno" > 6567< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * < span class = "keyword" > const< / span > cumul_var = cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l06568" > < / a > < span class = "lineno" > 6568< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > std::max< / a > (min_value, cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#ac4a4f30badcd311075302a4efcfaee0a" > Min< / a > ());< / div >
< div class = "line" > < a name = "l06569" > < / a > < span class = "lineno" > 6569< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > = < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > std::min< / a > (max_value, cumul_var-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > Max< / a > ());< / div >
< div class = "line" > < a name = "l06570" > < / a > < span class = "lineno" > 6570< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > next_start = < a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > ;< / div >
< div class = "line" > < a name = "l06571" > < / a > < span class = "lineno" > 6571< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a887fa442455fd18cac74b3039e442aeb" > SortedDisjointIntervalList::Iterator< / a > < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > =< / div >
< div class = "line" > < a name = "l06572" > < / a > < span class = "lineno" > 6572< / span >   forbidden.< a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#ac63f8d1453d2e8d7a2718bf978a88ecd" > FirstIntervalGreaterOrEqual< / a > (< a class = "code" href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > );< / div >
< div class = "line" > < a name = "l06573" > < / a > < span class = "lineno" > 6573< / span >   < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > != forbidden.< a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a69b6e2a03c835ca5d658a1f16acbaa9c" > end< / a > (); ++< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > ) {< / div >
< div class = "line" > < a name = "l06574" > < / a > < span class = "lineno" > 6574< / span >   < span class = "keywordflow" > if< / span > (next_start > < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > ) < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < a name = "l06575" > < / a > < span class = "lineno" > 6575< / span >   < span class = "keywordflow" > if< / span > (next_start < interval-> start) {< / div >
< div class = "line" > < a name = "l06576" > < / a > < span class = "lineno" > 6576< / span >   allowed.< a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a1f5c9edc9bee1ec65cb56db1f3ace7e7" > InsertInterval< / a > (next_start, < a class = "code" href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > CapSub< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> start, 1));< / div >
< div class = "line" > < a name = "l06577" > < / a > < span class = "lineno" > 6577< / span >   }< / div >
< div class = "line" > < a name = "l06578" > < / a > < span class = "lineno" > 6578< / span >   next_start = < a class = "code" href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > CapAdd< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> end, 1);< / div >
< div class = "line" > < a name = "l06579" > < / a > < span class = "lineno" > 6579< / span >   }< / div >
< div class = "line" > < a name = "l06580" > < / a > < span class = "lineno" > 6580< / span >   < span class = "keywordflow" > if< / span > (next_start < = < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > ) {< / div >
< div class = "line" > < a name = "l06581" > < / a > < span class = "lineno" > 6581< / span >   allowed.< a class = "code" href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a1f5c9edc9bee1ec65cb56db1f3ace7e7" > InsertInterval< / a > (next_start, < a class = "code" href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > );< / div >
< div class = "line" > < a name = "l06582" > < / a > < span class = "lineno" > 6582< / span >   }< / div >
< div class = "line" > < a name = "l06583" > < / a > < span class = "lineno" > 6583< / span >   < span class = "keywordflow" > return< / span > allowed;< / div >
< div class = "line" > < a name = "l06584" > < / a > < span class = "lineno" > 6584< / span >   }< / div >
< div class = "line" > < a name = "l06585" > < / a > < span class = "lineno" > 6585< / span >   < / div >
< div class = "line" > < a name = "l06586" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a360d9c53a26f994367971cb23c8697ff" > 6586< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a360d9c53a26f994367971cb23c8697ff" > RoutingDimension::SetSpanUpperBoundForVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > upper_bound,< / div >
< div class = "line" > < a name = "l06587" > < / a > < span class = "lineno" > 6587< / span >   < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l06588" > < / a > < span class = "lineno" > 6588< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (vehicle, 0);< / div >
< div class = "line" > < a name = "l06589" > < / a > < span class = "lineno" > 6589< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicle_span_upper_bounds_.size());< / div >
< div class = "line" > < a name = "l06590" > < / a > < span class = "lineno" > 6590< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (upper_bound, 0);< / div >
< div class = "line" > < a name = "l06591" > < / a > < span class = "lineno" > 6591< / span >   vehicle_span_upper_bounds_[vehicle] = upper_bound;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06592" > < / a > < span class = "lineno" > 6592< / span >   }< / div >
< div class = "line" > < a name = "l06593" > < / a > < span class = "lineno" > 6593< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06594" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aa98cc88bb33e9f703167cb030c093930" > 6594< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aa98cc88bb33e9f703167cb030c093930" > RoutingDimension::SetSpanCostCoefficientForVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ,< / div >
< div class = "line" > < a name = "l06595" > < / a > < span class = "lineno" > 6595< / span >   < span class = "keywordtype" > int< / span > vehicle) {< / div >
< div class = "line" > < a name = "l06596" > < / a > < span class = "lineno" > 6596< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (vehicle, 0);< / div >
< div class = "line" > < a name = "l06597" > < / a > < span class = "lineno" > 6597< / span >   < a class = "code" href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > (vehicle, vehicle_span_cost_coefficients_.size());< / div >
< div class = "line" > < a name = "l06598" > < / a > < span class = "lineno" > 6598< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (< a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > , 0);< / div >
< div class = "line" > < a name = "l06599" > < / a > < span class = "lineno" > 6599< / span >   vehicle_span_cost_coefficients_[vehicle] = < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ;< / div >
< div class = "line" > < a name = "l06600" > < / a > < span class = "lineno" > 6600< / span >   }< / div >
< div class = "line" > < a name = "l06601" > < / a > < span class = "lineno" > 6601< / span >   < / div >
< div class = "line" > < a name = "l06602" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a5d861ad3e93b404872633f359570f234" > 6602< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a5d861ad3e93b404872633f359570f234" > RoutingDimension::SetSpanCostCoefficientForAllVehicles< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ) {< / div >
< div class = "line" > < a name = "l06603" > < / a > < span class = "lineno" > 6603< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (< a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > , 0);< / div >
< div class = "line" > < a name = "l06604" > < / a > < span class = "lineno" > 6604< / span >   vehicle_span_cost_coefficients_.assign(model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (), < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > );< / div >
< div class = "line" > < a name = "l06605" > < / a > < span class = "lineno" > 6605< / span >   }< / div >
< div class = "line" > < a name = "l06606" > < / a > < span class = "lineno" > 6606< / span >   < / div >
< div class = "line" > < a name = "l06607" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ae961a8435c4bc4ac850fa06bff29b625" > 6607< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae961a8435c4bc4ac850fa06bff29b625" > RoutingDimension::SetGlobalSpanCostCoefficient< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ) {< / div >
< div class = "line" > < a name = "l06608" > < / a > < span class = "lineno" > 6608< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (< a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > , 0);< / div >
< div class = "line" > < a name = "l06609" > < / a > < span class = "lineno" > 6609< / span >   global_span_cost_coefficient_ = < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ;< / div >
< div class = "line" > < a name = "l06610" > < / a > < span class = "lineno" > 6610< / span >   }< / div >
< div class = "line" > < a name = "l06611" > < / a > < span class = "lineno" > 6611< / span >   < / div >
< div class = "line" > < a name = "l06612" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a052c958dd77221524f13f06d87960e63" > 6612< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a052c958dd77221524f13f06d87960e63" > RoutingDimension::SetCumulVarPiecewiseLinearCost< / a > (< / div >
< div class = "line" > < a name = "l06613" > < / a > < span class = "lineno" > 6613< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_piecewise_linear_function.html" > PiecewiseLinearFunction< / a > & < a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > ) {< / div >
< div class = "line" > < a name = "l06614" > < / a > < span class = "lineno" > 6614< / span >   < span class = "keywordflow" > if< / span > (!< a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > .IsNonDecreasing()) {< / div >
< div class = "line" > < a name = "l06615" > < / a > < span class = "lineno" > 6615< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " Only non-decreasing cost functions are supported." < / span > ;< / div >
< div class = "line" > < a name = "l06616" > < / a > < span class = "lineno" > 6616< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06617" > < / a > < span class = "lineno" > 6617< / span >   }< / div >
< div class = "line" > < a name = "l06618" > < / a > < span class = "lineno" > 6618< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > .Value(0) < 0) {< / div >
< div class = "line" > < a name = "l06619" > < / a > < span class = "lineno" > 6619< / span >   < a class = "code" href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > (< a class = "code" href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > ) < < < span class = "stringliteral" > " Only positive cost functions are supported." < / span > ;< / div >
< div class = "line" > < a name = "l06620" > < / a > < span class = "lineno" > 6620< / span >   < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06621" > < / a > < span class = "lineno" > 6621< / span >   }< / div >
< div class = "line" > < a name = "l06622" > < / a > < span class = "lineno" > 6622< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > > = cumul_var_piecewise_linear_cost_.size()) {< / div >
< div class = "line" > < a name = "l06623" > < / a > < span class = "lineno" > 6623< / span >   cumul_var_piecewise_linear_cost_.resize(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > + 1);< / div >
< div class = "line" > < a name = "l06624" > < / a > < span class = "lineno" > 6624< / span >   }< / div >
< div class = "line" > < a name = "l06625" > < / a > < span class = "lineno" > 6625< / span >   PiecewiseLinearCost& piecewise_linear_cost =< / div >
< div class = "line" > < a name = "l06626" > < / a > < span class = "lineno" > 6626< / span >   cumul_var_piecewise_linear_cost_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l06627" > < / a > < span class = "lineno" > 6627< / span >   piecewise_linear_cost.var = cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ];< / div >
< div class = "line" > < a name = "l06628" > < / a > < span class = "lineno" > 6628< / span >   piecewise_linear_cost.cost = absl::make_unique< PiecewiseLinearFunction> (< a class = "code" href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > );< / div >
< div class = "line" > < a name = "l06629" > < / a > < span class = "lineno" > 6629< / span >   }< / div >
< div class = "line" > < a name = "l06630" > < / a > < span class = "lineno" > 6630< / span >   < / div >
< div class = "line" > < a name = "l06631" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ae85d6e3327a52eb2e93195d1ba45884d" > 6631< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae85d6e3327a52eb2e93195d1ba45884d" > RoutingDimension::HasCumulVarPiecewiseLinearCost< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06632" > < / a > < span class = "lineno" > 6632< / span >   < span class = "keywordflow" > return< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_piecewise_linear_cost_.size() & & < / div >
< div class = "line" > < a name = "l06633" > < / a > < span class = "lineno" > 6633< / span >   cumul_var_piecewise_linear_cost_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06634" > < / a > < span class = "lineno" > 6634< / span >   }< / div >
< div class = "line" > < a name = "l06635" > < / a > < span class = "lineno" > 6635< / span >   < / div >
< div class = "line" > < a name = "l06636" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ab52c4b4818c89b7a7541faa4c63f02b5" > 6636< / a > < / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_piecewise_linear_function.html" > PiecewiseLinearFunction< / a > * < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ab52c4b4818c89b7a7541faa4c63f02b5" > RoutingDimension::GetCumulVarPiecewiseLinearCost< / a > (< / div >
< div class = "line" > < a name = "l06637" > < / a > < span class = "lineno" > 6637< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06638" > < / a > < span class = "lineno" > 6638< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_piecewise_linear_cost_.size() & & < / div >
< div class = "line" > < a name = "l06639" > < / a > < span class = "lineno" > 6639< / span >   cumul_var_piecewise_linear_cost_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06640" > < / a > < span class = "lineno" > 6640< / span >   < span class = "keywordflow" > return< / span > cumul_var_piecewise_linear_cost_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].cost.get();< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06641" > < / a > < span class = "lineno" > 6641< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06642" > < / a > < span class = "lineno" > 6642< / span >   < span class = "keywordflow" > return< / span > < span class = "keyword" > nullptr< / span > ;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06643" > < / a > < span class = "lineno" > 6643< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06644" > < / a > < span class = "lineno" > 6644< / span >   < / div >
< div class = "line" > < a name = "l06645" > < / a > < span class = "lineno" > 6645< / span >   < span class = "keyword" > namespace < / span > {< / div >
< div class = "line" > < a name = "l06646" > < / a > < span class = "lineno" > 6646< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * BuildVarFromExprAndIndexActiveState(< span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_model.html" > RoutingModel< / a > * < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > ,< / div >
< div class = "line" > < a name = "l06647" > < / a > < span class = "lineno" > 6647< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * expr, < span class = "keywordtype" > int< / span > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) {< / div >
< div class = "line" > < a name = "l06648" > < / a > < span class = "lineno" > 6648< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * < span class = "keyword" > const< / span > solver = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> solver();< / div >
< div class = "line" > < a name = "l06649" > < / a > < span class = "lineno" > 6649< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> IsStart(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ) || < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> IsEnd(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )) {< / div >
< div class = "line" > < a name = "l06650" > < / a > < span class = "lineno" > 6650< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > vehicle = < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> VehicleIndex(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > );< / div >
< div class = "line" > < a name = "l06651" > < / a > < span class = "lineno" > 6651< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (vehicle, 0);< / div >
< div class = "line" > < a name = "l06652" > < / a > < span class = "lineno" > 6652< / span >   < span class = "keywordflow" > return< / span > solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50" > MakeProd< / a > (expr, < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> VehicleCostsConsideredVar(vehicle))< / div >
< div class = "line" > < a name = "l06653" > < / a > < span class = "lineno" > 6653< / span >   -> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > ();< / div >
< div class = "line" > < a name = "l06654" > < / a > < span class = "lineno" > 6654< / span >   }< / div >
< div class = "line" > < a name = "l06655" > < / a > < span class = "lineno" > 6655< / span >   < span class = "keywordflow" > return< / span > solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50" > MakeProd< / a > (expr, < a class = "code" href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > -> ActiveVar(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ))-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > ();< / div >
< div class = "line" > < a name = "l06656" > < / a > < span class = "lineno" > 6656< / span >   }< / div >
< div class = "line" > < a name = "l06657" > < / a > < span class = "lineno" > 6657< / span >   } < span class = "comment" > // namespace< / span > < / div >
< div class = "line" > < a name = "l06658" > < / a > < span class = "lineno" > 6658< / span >   < / div >
< div class = "line" > < a name = "l06659" > < / a > < span class = "lineno" > 6659< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::SetupCumulVarPiecewiseLinearCosts(< / div >
< div class = "line" > < a name = "l06660" > < / a > < span class = "lineno" > 6660< / span >   std::vector< IntVar*> * cost_elements)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06661" > < / a > < span class = "lineno" > 6661< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06662" > < / a > < span class = "lineno" > 6662< / span >   Solver* < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06663" > < / a > < span class = "lineno" > 6663< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cumul_var_piecewise_linear_cost_.size(); ++i) {< / div >
< div class = "line" > < a name = "l06664" > < / a > < span class = "lineno" > 6664< / span >   < span class = "keyword" > const< / span > PiecewiseLinearCost& piecewise_linear_cost =< / div >
< div class = "line" > < a name = "l06665" > < / a > < span class = "lineno" > 6665< / span >   cumul_var_piecewise_linear_cost_[i];< / div >
< div class = "line" > < a name = "l06666" > < / a > < span class = "lineno" > 6666< / span >   < span class = "keywordflow" > if< / span > (piecewise_linear_cost.var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06667" > < / a > < span class = "lineno" > 6667< / span >   IntExpr* < span class = "keyword" > const< / span > expr = solver-> MakePiecewiseLinearExpr(< / div >
< div class = "line" > < a name = "l06668" > < / a > < span class = "lineno" > 6668< / span >   piecewise_linear_cost.var, *piecewise_linear_cost.cost);< / div >
< div class = "line" > < a name = "l06669" > < / a > < span class = "lineno" > 6669< / span >   IntVar* cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);< / div >
< div class = "line" > < a name = "l06670" > < / a > < span class = "lineno" > 6670< / span >   cost_elements-> push_back(cost_var);< / div >
< div class = "line" > < a name = "l06671" > < / a > < span class = "lineno" > 6671< / span >   < span class = "comment" > // TODO(user): Check if it wouldn' t be better to minimize< / span > < / div >
< div class = "line" > < a name = "l06672" > < / a > < span class = "lineno" > 6672< / span >   < span class = "comment" > // piecewise_linear_cost.var here.< / span > < / div >
< div class = "line" > < a name = "l06673" > < / a > < span class = "lineno" > 6673< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (cost_var, 0);< / div >
< div class = "line" > < a name = "l06674" > < / a > < span class = "lineno" > 6674< / span >   }< / div >
< div class = "line" > < a name = "l06675" > < / a > < span class = "lineno" > 6675< / span >   }< / div >
< div class = "line" > < a name = "l06676" > < / a > < span class = "lineno" > 6676< / span >   }< / div >
< div class = "line" > < a name = "l06677" > < / a > < span class = "lineno" > 6677< / span >   < / div >
< div class = "line" > < a name = "l06678" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ab4ee0772eb17ffba5e3a2f6f38026546" > 6678< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ab4ee0772eb17ffba5e3a2f6f38026546" > RoutingDimension::SetCumulVarSoftUpperBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > upper_bound,< / div >
< div class = "line" > < a name = "l06679" > < / a > < span class = "lineno" > 6679< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ) {< / div >
< div class = "line" > < a name = "l06680" > < / a > < span class = "lineno" > 6680< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > > = cumul_var_soft_upper_bound_.size()) {< / div >
< div class = "line" > < a name = "l06681" > < / a > < span class = "lineno" > 6681< / span >   cumul_var_soft_upper_bound_.resize(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > + 1, {< span class = "keyword" > nullptr< / span > , 0, 0});< / div >
< div class = "line" > < a name = "l06682" > < / a > < span class = "lineno" > 6682< / span >   }< / div >
< div class = "line" > < a name = "l06683" > < / a > < span class = "lineno" > 6683< / span >   cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = {cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], upper_bound,< / div >
< div class = "line" > < a name = "l06684" > < / a > < span class = "lineno" > 6684< / span >   < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > };< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l06685" > < / a > < span class = "lineno" > 6685< / span >   }< / div >
< div class = "line" > < a name = "l06686" > < / a > < span class = "lineno" > 6686< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06687" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aea64f6b7cb80887be5478c35609cab1c" > 6687< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aea64f6b7cb80887be5478c35609cab1c" > RoutingDimension::HasCumulVarSoftUpperBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06688" > < / a > < span class = "lineno" > 6688< / span >   < span class = "keywordflow" > return< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_upper_bound_.size() & & < / div >
< div class = "line" > < a name = "l06689" > < / a > < span class = "lineno" > 6689< / span >   cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06690" > < / a > < span class = "lineno" > 6690< / span >   }< / div >
< div class = "line" > < a name = "l06691" > < / a > < span class = "lineno" > 6691< / span >   < / div >
< div class = "line" > < a name = "l06692" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aacc17c3711ac030db624e72c5ae2394f" > 6692< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aacc17c3711ac030db624e72c5ae2394f" > RoutingDimension::GetCumulVarSoftUpperBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06693" > < / a > < span class = "lineno" > 6693< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_upper_bound_.size() & & < / div >
< div class = "line" > < a name = "l06694" > < / a > < span class = "lineno" > 6694< / span >   cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06695" > < / a > < span class = "lineno" > 6695< / span >   < span class = "keywordflow" > return< / span > cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].bound;< / div >
< div class = "line" > < a name = "l06696" > < / a > < span class = "lineno" > 6696< / span >   }< / div >
< div class = "line" > < a name = "l06697" > < / a > < span class = "lineno" > 6697< / span >   < span class = "keywordflow" > return< / span > cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> Max();< / div >
< div class = "line" > < a name = "l06698" > < / a > < span class = "lineno" > 6698< / span >   }< / div >
< div class = "line" > < a name = "l06699" > < / a > < span class = "lineno" > 6699< / span >   < / div >
< div class = "line" > < a name = "l06700" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#af362b70cab1a5a90703808e9575c2f54" > 6700< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#af362b70cab1a5a90703808e9575c2f54" > RoutingDimension::GetCumulVarSoftUpperBoundCoefficient< / a > (< / div >
< div class = "line" > < a name = "l06701" > < / a > < span class = "lineno" > 6701< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06702" > < / a > < span class = "lineno" > 6702< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_upper_bound_.size() & & < / div >
< div class = "line" > < a name = "l06703" > < / a > < span class = "lineno" > 6703< / span >   cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06704" > < / a > < span class = "lineno" > 6704< / span >   < span class = "keywordflow" > return< / span > cumul_var_soft_upper_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].coefficient;< / div >
< div class = "line" > < a name = "l06705" > < / a > < span class = "lineno" > 6705< / span >   }< / div >
< div class = "line" > < a name = "l06706" > < / a > < span class = "lineno" > 6706< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l06707" > < / a > < span class = "lineno" > 6707< / span >   }< / div >
< div class = "line" > < a name = "l06708" > < / a > < span class = "lineno" > 6708< / span >   < / div >
< div class = "line" > < a name = "l06709" > < / a > < span class = "lineno" > 6709< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::SetupCumulVarSoftUpperBoundCosts(< / div >
< div class = "line" > < a name = "l06710" > < / a > < span class = "lineno" > 6710< / span >   std::vector< IntVar*> * cost_elements)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06711" > < / a > < span class = "lineno" > 6711< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06712" > < / a > < span class = "lineno" > 6712< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06713" > < / a > < span class = "lineno" > 6713< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cumul_var_soft_upper_bound_.size(); ++i) {< / div >
< div class = "line" > < a name = "l06714" > < / a > < span class = "lineno" > 6714< / span >   < span class = "keyword" > const< / span > SoftBound& soft_bound = cumul_var_soft_upper_bound_[i];< / div >
< div class = "line" > < a name = "l06715" > < / a > < span class = "lineno" > 6715< / span >   < span class = "keywordflow" > if< / span > (soft_bound.var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06716" > < / a > < span class = "lineno" > 6716< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * < span class = "keyword" > const< / span > expr = solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ac34efc5a32ae3ef481d3c97796ecb899" > MakeSemiContinuousExpr< / a > (< / div >
< div class = "line" > < a name = "l06717" > < / a > < span class = "lineno" > 6717< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ac957f0efc6de9135512f60f80ba36083" > MakeSum< / a > (soft_bound.var, -soft_bound.bound), 0,< / div >
< div class = "line" > < a name = "l06718" > < / a > < span class = "lineno" > 6718< / span >   soft_bound.coefficient);< / div >
< div class = "line" > < a name = "l06719" > < / a > < span class = "lineno" > 6719< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);< / div >
< div class = "line" > < a name = "l06720" > < / a > < span class = "lineno" > 6720< / span >   cost_elements-> push_back(cost_var);< / div >
< div class = "line" > < a name = "l06721" > < / a > < span class = "lineno" > 6721< / span >   < span class = "comment" > // NOTE: We minimize the cost here instead of minimizing the cumul< / span > < / div >
< div class = "line" > < a name = "l06722" > < / a > < span class = "lineno" > 6722< / span >   < span class = "comment" > // variable, to avoid setting the cumul to earlier than necessary.< / span > < / div >
< div class = "line" > < a name = "l06723" > < / a > < span class = "lineno" > 6723< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (cost_var,< / div >
< div class = "line" > < a name = "l06724" > < / a > < span class = "lineno" > 6724< / span >   soft_bound.coefficient);< / div >
< div class = "line" > < a name = "l06725" > < / a > < span class = "lineno" > 6725< / span >   }< / div >
< div class = "line" > < a name = "l06726" > < / a > < span class = "lineno" > 6726< / span >   }< / div >
< div class = "line" > < a name = "l06727" > < / a > < span class = "lineno" > 6727< / span >   }< / div >
< div class = "line" > < a name = "l06728" > < / a > < span class = "lineno" > 6728< / span >   < / div >
< div class = "line" > < a name = "l06729" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#adc8bb803b3a5f74bd5e1c04d0154b03c" > 6729< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#adc8bb803b3a5f74bd5e1c04d0154b03c" > RoutingDimension::SetCumulVarSoftLowerBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > lower_bound,< / div >
< div class = "line" > < a name = "l06730" > < / a > < span class = "lineno" > 6730< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > ) {< / div >
< div class = "line" > < a name = "l06731" > < / a > < span class = "lineno" > 6731< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > > = cumul_var_soft_lower_bound_.size()) {< / div >
< div class = "line" > < a name = "l06732" > < / a > < span class = "lineno" > 6732< / span >   cumul_var_soft_lower_bound_.resize(< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > + 1, {< span class = "keyword" > nullptr< / span > , 0, 0});< / div >
< div class = "line" > < a name = "l06733" > < / a > < span class = "lineno" > 6733< / span >   }< / div >
< div class = "line" > < a name = "l06734" > < / a > < span class = "lineno" > 6734< / span >   cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ] = {cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ], lower_bound,< / div >
< div class = "line" > < a name = "l06735" > < / a > < span class = "lineno" > 6735< / span >   < a class = "code" href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > };< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l06736" > < / a > < span class = "lineno" > 6736< / span >   }< / div >
< div class = "line" > < a name = "l06737" > < / a > < span class = "lineno" > 6737< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06738" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a54e75670bdbf7abca93c9e02cfee83fe" > 6738< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a54e75670bdbf7abca93c9e02cfee83fe" > RoutingDimension::HasCumulVarSoftLowerBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06739" > < / a > < span class = "lineno" > 6739< / span >   < span class = "keywordflow" > return< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_lower_bound_.size() & & < / div >
< div class = "line" > < a name = "l06740" > < / a > < span class = "lineno" > 6740< / span >   cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06741" > < / a > < span class = "lineno" > 6741< / span >   }< / div >
< div class = "line" > < a name = "l06742" > < / a > < span class = "lineno" > 6742< / span >   < / div >
< div class = "line" > < a name = "l06743" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a607df50e6bc0dc54fbe811e96155ee95" > 6743< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a607df50e6bc0dc54fbe811e96155ee95" > RoutingDimension::GetCumulVarSoftLowerBound< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06744" > < / a > < span class = "lineno" > 6744< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_lower_bound_.size() & & < / div >
< div class = "line" > < a name = "l06745" > < / a > < span class = "lineno" > 6745< / span >   cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06746" > < / a > < span class = "lineno" > 6746< / span >   < span class = "keywordflow" > return< / span > cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].bound;< / div >
< div class = "line" > < a name = "l06747" > < / a > < span class = "lineno" > 6747< / span >   }< / div >
< div class = "line" > < a name = "l06748" > < / a > < span class = "lineno" > 6748< / span >   < span class = "keywordflow" > return< / span > cumuls_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ]-> Min();< / div >
< div class = "line" > < a name = "l06749" > < / a > < span class = "lineno" > 6749< / span >   }< / div >
< div class = "line" > < a name = "l06750" > < / a > < span class = "lineno" > 6750< / span >   < / div >
< div class = "line" > < a name = "l06751" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a51eadbd617f6658396e5ba790f6b0c19" > 6751< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a51eadbd617f6658396e5ba790f6b0c19" > RoutingDimension::GetCumulVarSoftLowerBoundCoefficient< / a > (< / div >
< div class = "line" > < a name = "l06752" > < / a > < span class = "lineno" > 6752< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > )< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06753" > < / a > < span class = "lineno" > 6753< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < cumul_var_soft_lower_bound_.size() & & < / div >
< div class = "line" > < a name = "l06754" > < / a > < span class = "lineno" > 6754< / span >   cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06755" > < / a > < span class = "lineno" > 6755< / span >   < span class = "keywordflow" > return< / span > cumul_var_soft_lower_bound_[< a class = "code" href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > ].coefficient;< / div >
< div class = "line" > < a name = "l06756" > < / a > < span class = "lineno" > 6756< / span >   }< / div >
< div class = "line" > < a name = "l06757" > < / a > < span class = "lineno" > 6757< / span >   < span class = "keywordflow" > return< / span > 0;< / div >
< div class = "line" > < a name = "l06758" > < / a > < span class = "lineno" > 6758< / span >   }< / div >
< div class = "line" > < a name = "l06759" > < / a > < span class = "lineno" > 6759< / span >   < / div >
< div class = "line" > < a name = "l06760" > < / a > < span class = "lineno" > 6760< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::SetupCumulVarSoftLowerBoundCosts(< / div >
< div class = "line" > < a name = "l06761" > < / a > < span class = "lineno" > 6761< / span >   std::vector< IntVar*> * cost_elements)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06762" > < / a > < span class = "lineno" > 6762< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06763" > < / a > < span class = "lineno" > 6763< / span >   < a class = "code" href = "classoperations__research_1_1_solver.html" > Solver< / a > * < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06764" > < / a > < span class = "lineno" > 6764< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < cumul_var_soft_lower_bound_.size(); ++i) {< / div >
< div class = "line" > < a name = "l06765" > < / a > < span class = "lineno" > 6765< / span >   < span class = "keyword" > const< / span > SoftBound& soft_bound = cumul_var_soft_lower_bound_[i];< / div >
< div class = "line" > < a name = "l06766" > < / a > < span class = "lineno" > 6766< / span >   < span class = "keywordflow" > if< / span > (soft_bound.var != < span class = "keyword" > nullptr< / span > ) {< / div >
< div class = "line" > < a name = "l06767" > < / a > < span class = "lineno" > 6767< / span >   < a class = "code" href = "classoperations__research_1_1_int_expr.html" > IntExpr< / a > * < span class = "keyword" > const< / span > expr = solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#ac34efc5a32ae3ef481d3c97796ecb899" > MakeSemiContinuousExpr< / a > (< / div >
< div class = "line" > < a name = "l06768" > < / a > < span class = "lineno" > 6768< / span >   solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a988e122844528e222326bd327a5d60fd" > MakeDifference< / a > (soft_bound.bound, soft_bound.var), 0,< / div >
< div class = "line" > < a name = "l06769" > < / a > < span class = "lineno" > 6769< / span >   soft_bound.coefficient);< / div >
< div class = "line" > < a name = "l06770" > < / a > < span class = "lineno" > 6770< / span >   < a class = "code" href = "classoperations__research_1_1_int_var.html" > IntVar< / a > * cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);< / div >
< div class = "line" > < a name = "l06771" > < / a > < span class = "lineno" > 6771< / span >   cost_elements-> push_back(cost_var);< / div >
< div class = "line" > < a name = "l06772" > < / a > < span class = "lineno" > 6772< / span >   < span class = "comment" > // NOTE: We minimize the cost here instead of maximizing the cumul< / span > < / div >
< div class = "line" > < a name = "l06773" > < / a > < span class = "lineno" > 6773< / span >   < span class = "comment" > // variable, to avoid setting the cumul to later than necessary.< / span > < / div >
< div class = "line" > < a name = "l06774" > < / a > < span class = "lineno" > 6774< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (cost_var,< / div >
< div class = "line" > < a name = "l06775" > < / a > < span class = "lineno" > 6775< / span >   soft_bound.coefficient);< / div >
< div class = "line" > < a name = "l06776" > < / a > < span class = "lineno" > 6776< / span >   }< / div >
< div class = "line" > < a name = "l06777" > < / a > < span class = "lineno" > 6777< / span >   }< / div >
< div class = "line" > < a name = "l06778" > < / a > < span class = "lineno" > 6778< / span >   }< / div >
< div class = "line" > < a name = "l06779" > < / a > < span class = "lineno" > 6779< / span >   < / div >
< div class = "line" > < a name = "l06780" > < / a > < span class = "lineno" > 6780< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::SetupGlobalSpanCost(< / div >
< div class = "line" > < a name = "l06781" > < / a > < span class = "lineno" > 6781< / span >   std::vector< IntVar*> * cost_elements)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06782" > < / a > < span class = "lineno" > 6782< / span >   < a class = "code" href = "base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274" > CHECK< / a > (cost_elements != < span class = "keyword" > nullptr< / span > );< / div >
< div class = "line" > < a name = "l06783" > < / a > < span class = "lineno" > 6783< / span >   Solver* < span class = "keyword" > const< / span > solver = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > solver< / a > ();< / div >
< div class = "line" > < a name = "l06784" > < / a > < span class = "lineno" > 6784< / span >   < span class = "keywordflow" > if< / span > (global_span_cost_coefficient_ != 0) {< / div >
< div class = "line" > < a name = "l06785" > < / a > < span class = "lineno" > 6785< / span >   std::vector< IntVar*> end_cumuls;< / div >
< div class = "line" > < a name = "l06786" > < / a > < span class = "lineno" > 6786< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l06787" > < / a > < span class = "lineno" > 6787< / span >   end_cumuls.push_back(solver< / div >
< div class = "line" > < a name = "l06788" > < / a > < span class = "lineno" > 6788< / span >   -> MakeProd(model_-> vehicle_costs_considered_[i],< / div >
< div class = "line" > < a name = "l06789" > < / a > < span class = "lineno" > 6789< / span >   cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (i)])< / div >
< div class = "line" > < a name = "l06790" > < / a > < span class = "lineno" > 6790< / span >   -> Var());< / div >
< div class = "line" > < a name = "l06791" > < / a > < span class = "lineno" > 6791< / span >   }< / div >
< div class = "line" > < a name = "l06792" > < / a > < span class = "lineno" > 6792< / span >   IntVar* < span class = "keyword" > const< / span > max_end_cumul = solver-> < a class = "code" href = "classoperations__research_1_1_solver.html#a934e08f84e590e48ab860fcd97ca7130" > MakeMax< / a > (end_cumuls)-> < a class = "code" href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > Var< / a > ();< / div >
< div class = "line" > < a name = "l06793" > < / a > < span class = "lineno" > 6793< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (< / div >
< div class = "line" > < a name = "l06794" > < / a > < span class = "lineno" > 6794< / span >   max_end_cumul, global_span_cost_coefficient_);< / div >
< div class = "line" > < a name = "l06795" > < / a > < span class = "lineno" > 6795< / span >   std::vector< IntVar*> start_cumuls;< / div >
< div class = "line" > < a name = "l06796" > < / a > < span class = "lineno" > 6796< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l06797" > < / a > < span class = "lineno" > 6797< / span >   IntVar* global_span_cost_start_cumul = solver-> MakeIntVar(0, < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l06798" > < / a > < span class = "lineno" > 6798< / span >   solver-> AddConstraint(solver-> MakeIfThenElseCt(< / div >
< div class = "line" > < a name = "l06799" > < / a > < span class = "lineno" > 6799< / span >   model_-> vehicle_costs_considered_[i], cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (i)],< / div >
< div class = "line" > < a name = "l06800" > < / a > < span class = "lineno" > 6800< / span >   max_end_cumul, global_span_cost_start_cumul));< / div >
< div class = "line" > < a name = "l06801" > < / a > < span class = "lineno" > 6801< / span >   start_cumuls.push_back(global_span_cost_start_cumul);< / div >
< div class = "line" > < a name = "l06802" > < / a > < span class = "lineno" > 6802< / span >   }< / div >
< div class = "line" > < a name = "l06803" > < / a > < span class = "lineno" > 6803< / span >   IntVar* < span class = "keyword" > const< / span > min_start_cumul = solver-> MakeMin(start_cumuls)-> Var();< / div >
< div class = "line" > < a name = "l06804" > < / a > < span class = "lineno" > 6804< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (< / div >
< div class = "line" > < a name = "l06805" > < / a > < span class = "lineno" > 6805< / span >   min_start_cumul, global_span_cost_coefficient_);< / div >
< div class = "line" > < a name = "l06806" > < / a > < span class = "lineno" > 6806< / span >   < span class = "comment" > // If there is a single vehicle, model the cost as the sum of its transits< / span > < / div >
< div class = "line" > < a name = "l06807" > < / a > < span class = "lineno" > 6807< / span >   < span class = "comment" > // to avoid slow (infinite) propagation loops.< / span > < / div >
< div class = "line" > < a name = "l06808" > < / a > < span class = "lineno" > 6808< / span >   < span class = "comment" > // TODO(user): Avoid slow propagation in the path constraints.< / span > < / div >
< div class = "line" > < a name = "l06809" > < / a > < span class = "lineno" > 6809< / span >   < span class = "keywordflow" > if< / span > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () == 1) {< / div >
< div class = "line" > < a name = "l06810" > < / a > < span class = "lineno" > 6810< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > var_index = 0; var_index < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > Size< / a > (); ++var_index) {< / div >
< div class = "line" > < a name = "l06811" > < / a > < span class = "lineno" > 6811< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > AddWeightedVariableMinimizedByFinalizer< / a > (< / div >
< div class = "line" > < a name = "l06812" > < / a > < span class = "lineno" > 6812< / span >   slacks_[var_index], global_span_cost_coefficient_);< / div >
< div class = "line" > < a name = "l06813" > < / a > < span class = "lineno" > 6813< / span >   cost_elements-> push_back(< / div >
< div class = "line" > < a name = "l06814" > < / a > < span class = "lineno" > 6814< / span >   solver< / div >
< div class = "line" > < a name = "l06815" > < / a > < span class = "lineno" > 6815< / span >   -> MakeProd(< / div >
< div class = "line" > < a name = "l06816" > < / a > < span class = "lineno" > 6816< / span >   model_-> vehicle_costs_considered_[0],< / div >
< div class = "line" > < a name = "l06817" > < / a > < span class = "lineno" > 6817< / span >   solver-> MakeProd(< / div >
< div class = "line" > < a name = "l06818" > < / a > < span class = "lineno" > 6818< / span >   solver-> MakeProd(< / div >
< div class = "line" > < a name = "l06819" > < / a > < span class = "lineno" > 6819< / span >   solver-> MakeSum(transits_[var_index],< / div >
< div class = "line" > < a name = "l06820" > < / a > < span class = "lineno" > 6820< / span >   dependent_transits_[var_index]),< / div >
< div class = "line" > < a name = "l06821" > < / a > < span class = "lineno" > 6821< / span >   global_span_cost_coefficient_),< / div >
< div class = "line" > < a name = "l06822" > < / a > < span class = "lineno" > 6822< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > ActiveVar< / a > (var_index)))< / div >
< div class = "line" > < a name = "l06823" > < / a > < span class = "lineno" > 6823< / span >   -> Var());< / div >
< div class = "line" > < a name = "l06824" > < / a > < span class = "lineno" > 6824< / span >   }< / div >
< div class = "line" > < a name = "l06825" > < / a > < span class = "lineno" > 6825< / span >   } < span class = "keywordflow" > else< / span > {< / div >
< div class = "line" > < a name = "l06826" > < / a > < span class = "lineno" > 6826< / span >   IntVar* < span class = "keyword" > const< / span > end_range =< / div >
< div class = "line" > < a name = "l06827" > < / a > < span class = "lineno" > 6827< / span >   solver-> MakeDifference(max_end_cumul, min_start_cumul)-> Var();< / div >
< div class = "line" > < a name = "l06828" > < / a > < span class = "lineno" > 6828< / span >   end_range-> SetMin(0);< / div >
< div class = "line" > < a name = "l06829" > < / a > < span class = "lineno" > 6829< / span >   cost_elements-> push_back(< / div >
< div class = "line" > < a name = "l06830" > < / a > < span class = "lineno" > 6830< / span >   solver-> MakeProd(end_range, global_span_cost_coefficient_)-> Var());< / div >
< div class = "line" > < a name = "l06831" > < / a > < span class = "lineno" > 6831< / span >   }< / div >
< div class = "line" > < a name = "l06832" > < / a > < span class = "lineno" > 6832< / span >   }< / div >
< div class = "line" > < a name = "l06833" > < / a > < span class = "lineno" > 6833< / span >   }< / div >
< div class = "line" > < a name = "l06834" > < / a > < span class = "lineno" > 6834< / span >   < / div >
< div class = "line" > < a name = "l06835" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ae0ff0210afb5c8d829a9d2158833c50f" > 6835< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > RoutingDimension::SetBreakIntervalsOfVehicle< / a > (< / div >
< div class = "line" > < a name = "l06836" > < / a > < span class = "lineno" > 6836< / span >   std::vector< IntervalVar*> breaks, < span class = "keywordtype" > int< / span > vehicle,< / div >
< div class = "line" > < a name = "l06837" > < / a > < span class = "lineno" > 6837< / span >   std::vector< int64> node_visit_transits) {< / div >
< div class = "line" > < a name = "l06838" > < / a > < span class = "lineno" > 6838< / span >   < span class = "keywordflow" > if< / span > (breaks.empty()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06839" > < / a > < span class = "lineno" > 6839< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > visit_evaluator = < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a35a576bb3ea6814f122593d44a3c391e" > model< / a > ()-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > (< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l06840" > < / a > < span class = "lineno" > 6840< / span >   [node_visit_transits = std::move(node_visit_transits)](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to) {< / div >
< div class = "line" > < a name = "l06841" > < / a > < span class = "lineno" > 6841< / span >   < span class = "keywordflow" > return< / span > node_visit_transits[from];< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06842" > < / a > < span class = "lineno" > 6842< / span >   });< / div >
< div class = "line" > < a name = "l06843" > < / a > < span class = "lineno" > 6843< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > SetBreakIntervalsOfVehicle< / a > (std::move(breaks), vehicle, visit_evaluator, -1);< / div >
< div class = "line" > < a name = "l06844" > < / a > < span class = "lineno" > 6844< / span >   }< / div >
< div class = "line" > < a name = "l06845" > < / a > < span class = "lineno" > 6845< / span >   < / div >
< div class = "line" > < a name = "l06846" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aaeb9ca33221eed94b86c8270abb8bc53" > 6846< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > RoutingDimension::SetBreakIntervalsOfVehicle< / a > (< / div >
< div class = "line" > < a name = "l06847" > < / a > < span class = "lineno" > 6847< / span >   std::vector< IntervalVar*> breaks, < span class = "keywordtype" > int< / span > vehicle,< / div >
< div class = "line" > < a name = "l06848" > < / a > < span class = "lineno" > 6848< / span >   std::vector< int64> node_visit_transits,< / div >
< div class = "line" > < a name = "l06849" > < / a > < span class = "lineno" > 6849< / span >   std::function< < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > , < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > )> delays) {< / div >
< div class = "line" > < a name = "l06850" > < / a > < span class = "lineno" > 6850< / span >   < span class = "keywordflow" > if< / span > (breaks.empty()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06851" > < / a > < span class = "lineno" > 6851< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > visit_evaluator = < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a35a576bb3ea6814f122593d44a3c391e" > model< / a > ()-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > (< / div >
2021-02-26 14:48:18 +01:00
< div class = "line" > < a name = "l06852" > < / a > < span class = "lineno" > 6852< / span >   [node_visit_transits](< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > from, < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > to) {< / div >
< div class = "line" > < a name = "l06853" > < / a > < span class = "lineno" > 6853< / span >   < span class = "keywordflow" > return< / span > node_visit_transits[from];< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06854" > < / a > < span class = "lineno" > 6854< / span >   });< / div >
< div class = "line" > < a name = "l06855" > < / a > < span class = "lineno" > 6855< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > delay_evaluator =< / div >
< div class = "line" > < a name = "l06856" > < / a > < span class = "lineno" > 6856< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a35a576bb3ea6814f122593d44a3c391e" > model< / a > ()-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > RegisterTransitCallback< / a > (std::move(delays));< / div >
< div class = "line" > < a name = "l06857" > < / a > < span class = "lineno" > 6857< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > SetBreakIntervalsOfVehicle< / a > (std::move(breaks), vehicle, visit_evaluator,< / div >
< div class = "line" > < a name = "l06858" > < / a > < span class = "lineno" > 6858< / span >   delay_evaluator);< / div >
< div class = "line" > < a name = "l06859" > < / a > < span class = "lineno" > 6859< / span >   }< / div >
< div class = "line" > < a name = "l06860" > < / a > < span class = "lineno" > 6860< / span >   < / div >
< div class = "line" > < a name = "l06861" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > 6861< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > RoutingDimension::SetBreakIntervalsOfVehicle< / a > (< / div >
< div class = "line" > < a name = "l06862" > < / a > < span class = "lineno" > 6862< / span >   std::vector< IntervalVar*> breaks, < span class = "keywordtype" > int< / span > vehicle, < span class = "keywordtype" > int< / span > pre_travel_evaluator,< / div >
< div class = "line" > < a name = "l06863" > < / a > < span class = "lineno" > 6863< / span >   < span class = "keywordtype" > int< / span > post_travel_evaluator) {< / div >
< div class = "line" > < a name = "l06864" > < / a > < span class = "lineno" > 6864< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
< div class = "line" > < a name = "l06865" > < / a > < span class = "lineno" > 6865< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ());< / div >
< div class = "line" > < a name = "l06866" > < / a > < span class = "lineno" > 6866< / span >   < span class = "keywordflow" > if< / span > (breaks.empty()) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06867" > < / a > < span class = "lineno" > 6867< / span >   < span class = "keywordflow" > if< / span > (!break_constraints_are_initialized_) < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947" > InitializeBreaks< / a > ();< / div >
< div class = "line" > < a name = "l06868" > < / a > < span class = "lineno" > 6868< / span >   vehicle_break_intervals_[vehicle] = std::move(breaks);< / div >
< div class = "line" > < a name = "l06869" > < / a > < span class = "lineno" > 6869< / span >   vehicle_pre_travel_evaluators_[vehicle] = pre_travel_evaluator;< / div >
< div class = "line" > < a name = "l06870" > < / a > < span class = "lineno" > 6870< / span >   vehicle_post_travel_evaluators_[vehicle] = post_travel_evaluator;< / div >
< div class = "line" > < a name = "l06871" > < / a > < span class = "lineno" > 6871< / span >   < span class = "comment" > // Breaks intervals must be fixed by search.< / span > < / div >
< div class = "line" > < a name = "l06872" > < / a > < span class = "lineno" > 6872< / span >   < span class = "keywordflow" > for< / span > (< a class = "code" href = "classoperations__research_1_1_interval_var.html" > IntervalVar< / a > * < span class = "keyword" > const< / span > < a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > : vehicle_break_intervals_[vehicle]) {< / div >
< div class = "line" > < a name = "l06873" > < / a > < span class = "lineno" > 6873< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61" > AddIntervalToAssignment< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > );< / div >
< div class = "line" > < a name = "l06874" > < / a > < span class = "lineno" > 6874< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> MayBePerformed() & & !< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> MustBePerformed()) {< / div >
< div class = "line" > < a name = "l06875" > < / a > < span class = "lineno" > 6875< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> PerformedExpr()-> Var(), 0);< / div >
< div class = "line" > < a name = "l06876" > < / a > < span class = "lineno" > 6876< / span >   }< / div >
< div class = "line" > < a name = "l06877" > < / a > < span class = "lineno" > 6877< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeStartExpr(0)-> Var(),< / div >
< div class = "line" > < a name = "l06878" > < / a > < span class = "lineno" > 6878< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l06879" > < / a > < span class = "lineno" > 6879< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > -> SafeDurationExpr(0)-> Var(),< / div >
< div class = "line" > < a name = "l06880" > < / a > < span class = "lineno" > 6880< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l06881" > < / a > < span class = "lineno" > 6881< / span >   }< / div >
< div class = "line" > < a name = "l06882" > < / a > < span class = "lineno" > 6882< / span >   < span class = "comment" > // When a vehicle has breaks, if its start and end are fixed,< / span > < / div >
< div class = "line" > < a name = "l06883" > < / a > < span class = "lineno" > 6883< / span >   < span class = "comment" > // then propagation keeps the cumuls min and max on its path feasible.< / span > < / div >
< div class = "line" > < a name = "l06884" > < / a > < span class = "lineno" > 6884< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l06885" > < / a > < span class = "lineno" > 6885< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l06886" > < / a > < span class = "lineno" > 6886< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l06887" > < / a > < span class = "lineno" > 6887< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06888" > < / a > < span class = "lineno" > 6888< / span >   }< / div >
< div class = "line" > < a name = "l06889" > < / a > < span class = "lineno" > 6889< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06890" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947" > 6890< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947" > RoutingDimension::InitializeBreaks< / a > () {< / div >
< div class = "line" > < a name = "l06891" > < / a > < span class = "lineno" > 6891< / span >   < a class = "code" href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > (!break_constraints_are_initialized_);< / div >
< div class = "line" > < a name = "l06892" > < / a > < span class = "lineno" > 6892< / span >   < span class = "keyword" > const< / span > < span class = "keywordtype" > int< / span > num_vehicles = model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ();< / div >
< div class = "line" > < a name = "l06893" > < / a > < span class = "lineno" > 6893< / span >   vehicle_break_intervals_.resize(num_vehicles);< / div >
< div class = "line" > < a name = "l06894" > < / a > < span class = "lineno" > 6894< / span >   vehicle_pre_travel_evaluators_.resize(num_vehicles, -1);< / div >
< div class = "line" > < a name = "l06895" > < / a > < span class = "lineno" > 6895< / span >   vehicle_post_travel_evaluators_.resize(num_vehicles, -1);< / div >
< div class = "line" > < a name = "l06896" > < / a > < span class = "lineno" > 6896< / span >   vehicle_break_distance_duration_.resize(num_vehicles);< / div >
< div class = "line" > < a name = "l06897" > < / a > < span class = "lineno" > 6897< / span >   break_constraints_are_initialized_ = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06898" > < / a > < span class = "lineno" > 6898< / span >   }< / div >
< div class = "line" > < a name = "l06899" > < / a > < span class = "lineno" > 6899< / span >   < / div >
< div class = "line" > < a name = "l06900" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5" > 6900< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5" > RoutingDimension::HasBreakConstraints< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06901" > < / a > < span class = "lineno" > 6901< / span >   < span class = "keywordflow" > return< / span > break_constraints_are_initialized_;< / div >
< div class = "line" > < a name = "l06902" > < / a > < span class = "lineno" > 6902< / span >   }< / div >
< div class = "line" > < a name = "l06903" > < / a > < span class = "lineno" > 6903< / span >   < / div >
< div class = "line" > < a name = "l06904" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700" > 6904< / a > < / span >   < span class = "keyword" > const< / span > std::vector< IntervalVar*> & < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700" > RoutingDimension::GetBreakIntervalsOfVehicle< / a > (< / div >
< div class = "line" > < a name = "l06905" > < / a > < span class = "lineno" > 6905< / span >   < span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06906" > < / a > < span class = "lineno" > 6906< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
< div class = "line" > < a name = "l06907" > < / a > < span class = "lineno" > 6907< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, vehicle_break_intervals_.size());< / div >
< div class = "line" > < a name = "l06908" > < / a > < span class = "lineno" > 6908< / span >   < span class = "keywordflow" > return< / span > vehicle_break_intervals_[vehicle];< / div >
< div class = "line" > < a name = "l06909" > < / a > < span class = "lineno" > 6909< / span >   }< / div >
< div class = "line" > < a name = "l06910" > < / a > < span class = "lineno" > 6910< / span >   < / div >
< div class = "line" > < a name = "l06911" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a" > 6911< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a" > RoutingDimension::GetPreTravelEvaluatorOfVehicle< / a > (< span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06912" > < / a > < span class = "lineno" > 6912< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06913" > < / a > < span class = "lineno" > 6913< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, vehicle_pre_travel_evaluators_.size());< / div >
< div class = "line" > < a name = "l06914" > < / a > < span class = "lineno" > 6914< / span >   < span class = "keywordflow" > return< / span > vehicle_pre_travel_evaluators_[vehicle];< / div >
< div class = "line" > < a name = "l06915" > < / a > < span class = "lineno" > 6915< / span >   }< / div >
< div class = "line" > < a name = "l06916" > < / a > < span class = "lineno" > 6916< / span >   < / div >
< div class = "line" > < a name = "l06917" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac" > 6917< / a > < / span >   < span class = "keywordtype" > int< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac" > RoutingDimension::GetPostTravelEvaluatorOfVehicle< / a > (< span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06918" > < / a > < span class = "lineno" > 6918< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
< div class = "line" > < a name = "l06919" > < / a > < span class = "lineno" > 6919< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, vehicle_post_travel_evaluators_.size());< / div >
< div class = "line" > < a name = "l06920" > < / a > < span class = "lineno" > 6920< / span >   < span class = "keywordflow" > return< / span > vehicle_post_travel_evaluators_[vehicle];< / div >
< div class = "line" > < a name = "l06921" > < / a > < span class = "lineno" > 6921< / span >   }< / div >
< div class = "line" > < a name = "l06922" > < / a > < span class = "lineno" > 6922< / span >   < / div >
< div class = "line" > < a name = "l06923" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a68c42bd26c7f0a2f1a0247e51a45aab5" > 6923< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a68c42bd26c7f0a2f1a0247e51a45aab5" > RoutingDimension::SetBreakDistanceDurationOfVehicle< / a > (< a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > distance,< / div >
< div class = "line" > < a name = "l06924" > < / a > < span class = "lineno" > 6924< / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > duration,< / div >
< div class = "line" > < a name = "l06925" > < / a > < span class = "lineno" > 6925< / span >   < span class = "keywordtype" > int< / span > vehicle) {< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06926" > < / a > < span class = "lineno" > 6926< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06927" > < / a > < span class = "lineno" > 6927< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > ());< / div >
< div class = "line" > < a name = "l06928" > < / a > < span class = "lineno" > 6928< / span >   < span class = "keywordflow" > if< / span > (!break_constraints_are_initialized_) < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947" > InitializeBreaks< / a > ();< / div >
< div class = "line" > < a name = "l06929" > < / a > < span class = "lineno" > 6929< / span >   vehicle_break_distance_duration_[vehicle].emplace_back(distance, duration);< / div >
< div class = "line" > < a name = "l06930" > < / a > < span class = "lineno" > 6930< / span >   < span class = "comment" > // When a vehicle has breaks, if its start and end are fixed,< / span > < / div >
< div class = "line" > < a name = "l06931" > < / a > < span class = "lineno" > 6931< / span >   < span class = "comment" > // then propagation keeps the cumuls min and max on its path feasible.< / span > < / div >
< div class = "line" > < a name = "l06932" > < / a > < span class = "lineno" > 6932< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l06933" > < / a > < span class = "lineno" > 6933< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l06934" > < / a > < span class = "lineno" > 6934< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (< a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > CumulVar< / a > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (vehicle)),< / div >
< div class = "line" > < a name = "l06935" > < / a > < span class = "lineno" > 6935< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l06936" > < / a > < span class = "lineno" > 6936< / span >   }< / div >
< div class = "line" > < a name = "l06937" > < / a > < span class = "lineno" > 6937< / span >   < / div >
< div class = "line" > < a name = "l06938" > < / a > < span class = "lineno" > 6938< / span >   < span class = "keyword" > const< / span > std::vector< std::pair< int64, int64> > & < / div >
< div class = "line" > < a name = "l06939" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a20cb44a14b6119a99fdcef3b594629e8" > 6939< / a > < / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a20cb44a14b6119a99fdcef3b594629e8" > RoutingDimension::GetBreakDistanceDurationOfVehicle< / a > (< span class = "keywordtype" > int< / span > vehicle)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06940" > < / a > < span class = "lineno" > 6940< / span >   < a class = "code" href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > (0, vehicle);< / div >
< div class = "line" > < a name = "l06941" > < / a > < span class = "lineno" > 6941< / span >   < a class = "code" href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > (vehicle, vehicle_break_distance_duration_.size());< / div >
< div class = "line" > < a name = "l06942" > < / a > < span class = "lineno" > 6942< / span >   < span class = "keywordflow" > return< / span > vehicle_break_distance_duration_[vehicle];< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06943" > < / a > < span class = "lineno" > 6943< / span >   }< / div >
< div class = "line" > < a name = "l06944" > < / a > < span class = "lineno" > 6944< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06945" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4" > 6945< / a > < / span >   < span class = "keywordtype" > void< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4" > RoutingDimension::SetPickupToDeliveryLimitFunctionForPair< / a > (< / div >
< div class = "line" > < a name = "l06946" > < / a > < span class = "lineno" > 6946< / span >   < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a64f4e1f55b71a9f9a0d7e3ef7033ade7" > PickupToDeliveryLimitFunction< / a > limit_function, < span class = "keywordtype" > int< / span > pair_index) {< / div >
< div class = "line" > < a name = "l06947" > < / a > < span class = "lineno" > 6947< / span >   < a class = "code" href = "base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9" > CHECK_GE< / a > (pair_index, 0);< / div >
< div class = "line" > < a name = "l06948" > < / a > < span class = "lineno" > 6948< / span >   < span class = "keywordflow" > if< / span > (pair_index > = pickup_to_delivery_limits_per_pair_index_.size()) {< / div >
< div class = "line" > < a name = "l06949" > < / a > < span class = "lineno" > 6949< / span >   pickup_to_delivery_limits_per_pair_index_.resize(pair_index + 1);< / div >
< div class = "line" > < a name = "l06950" > < / a > < span class = "lineno" > 6950< / span >   }< / div >
< div class = "line" > < a name = "l06951" > < / a > < span class = "lineno" > 6951< / span >   pickup_to_delivery_limits_per_pair_index_[pair_index] =< / div >
< div class = "line" > < a name = "l06952" > < / a > < span class = "lineno" > 6952< / span >   std::move(limit_function);< / div >
< div class = "line" > < a name = "l06953" > < / a > < span class = "lineno" > 6953< / span >   }< / div >
< div class = "line" > < a name = "l06954" > < / a > < span class = "lineno" > 6954< / span >   < / div >
< div class = "line" > < a name = "l06955" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d" > 6955< / a > < / span >   < span class = "keywordtype" > bool< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d" > RoutingDimension::HasPickupToDeliveryLimits< / a > ()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06956" > < / a > < span class = "lineno" > 6956< / span >   < span class = "keywordflow" > return< / span > !pickup_to_delivery_limits_per_pair_index_.empty();< / div >
< div class = "line" > < a name = "l06957" > < / a > < span class = "lineno" > 6957< / span >   }< / div >
< div class = "line" > < a name = "l06958" > < / a > < span class = "lineno" > 6958< / span >   < / div >
< div class = "line" > < a name = "l06959" > < / a > < span class = "lineno" > < a class = "line" href = "classoperations__research_1_1_routing_dimension.html#aa70f385bdf5fc31eec8a848dea13b357" > 6959< / a > < / span >   < a class = "code" href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#aa70f385bdf5fc31eec8a848dea13b357" > RoutingDimension::GetPickupToDeliveryLimitForPair< / a > (< span class = "keywordtype" > int< / span > pair_index,< / div >
< div class = "line" > < a name = "l06960" > < / a > < span class = "lineno" > 6960< / span >   < span class = "keywordtype" > int< / span > pickup,< / div >
< div class = "line" > < a name = "l06961" > < / a > < span class = "lineno" > 6961< / span >   < span class = "keywordtype" > int< / span > delivery)< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06962" > < / a > < span class = "lineno" > 6962< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (pair_index, 0);< / div >
2020-12-29 22:27:47 +01:00
< div class = "line" > < a name = "l06963" > < / a > < span class = "lineno" > 6963< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06964" > < / a > < span class = "lineno" > 6964< / span >   < span class = "keywordflow" > if< / span > (pair_index > = pickup_to_delivery_limits_per_pair_index_.size()) {< / div >
< div class = "line" > < a name = "l06965" > < / a > < span class = "lineno" > 6965< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l06966" > < / a > < span class = "lineno" > 6966< / span >   }< / div >
< div class = "line" > < a name = "l06967" > < / a > < span class = "lineno" > 6967< / span >   < span class = "keyword" > const< / span > < a class = "code" href = "classoperations__research_1_1_routing_dimension.html#a64f4e1f55b71a9f9a0d7e3ef7033ade7" > PickupToDeliveryLimitFunction< / a > & pickup_to_delivery_limit_function =< / div >
< div class = "line" > < a name = "l06968" > < / a > < span class = "lineno" > 6968< / span >   pickup_to_delivery_limits_per_pair_index_[pair_index];< / div >
< div class = "line" > < a name = "l06969" > < / a > < span class = "lineno" > 6969< / span >   < span class = "keywordflow" > if< / span > (!pickup_to_delivery_limit_function) {< / div >
< div class = "line" > < a name = "l06970" > < / a > < span class = "lineno" > 6970< / span >   < span class = "comment" > // No limit function set for this pair.< / span > < / div >
< div class = "line" > < a name = "l06971" > < / a > < span class = "lineno" > 6971< / span >   < span class = "keywordflow" > return< / span > < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > ;< / div >
< div class = "line" > < a name = "l06972" > < / a > < span class = "lineno" > 6972< / span >   }< / div >
< div class = "line" > < a name = "l06973" > < / a > < span class = "lineno" > 6973< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (pickup, 0);< / div >
< div class = "line" > < a name = "l06974" > < / a > < span class = "lineno" > 6974< / span >   < a class = "code" href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > (delivery, 0);< / div >
< div class = "line" > < a name = "l06975" > < / a > < span class = "lineno" > 6975< / span >   < span class = "keywordflow" > return< / span > pickup_to_delivery_limit_function(pickup, delivery);< / div >
< div class = "line" > < a name = "l06976" > < / a > < span class = "lineno" > 6976< / span >   }< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l06977" > < / a > < span class = "lineno" > 6977< / span >   < / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l06978" > < / a > < span class = "lineno" > 6978< / span >   < span class = "keywordtype" > void< / span > RoutingDimension::SetupSlackAndDependentTransitCosts()< span class = "keyword" > const < / span > {< / div >
< div class = "line" > < a name = "l06979" > < / a > < span class = "lineno" > 6979< / span >   < span class = "keywordflow" > if< / span > (model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > () == 0) < span class = "keywordflow" > return< / span > ;< / div >
< div class = "line" > < a name = "l06980" > < / a > < span class = "lineno" > 6980< / span >   < span class = "comment" > // Figure out whether all vehicles have the same span cost coefficient or not.< / span > < / div >
< div class = "line" > < a name = "l06981" > < / a > < span class = "lineno" > 6981< / span >   < span class = "keywordtype" > bool< / span > all_vehicle_span_costs_are_equal = < span class = "keyword" > true< / span > ;< / div >
< div class = "line" > < a name = "l06982" > < / a > < span class = "lineno" > 6982< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 1; i < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l06983" > < / a > < span class = "lineno" > 6983< / span >   all_vehicle_span_costs_are_equal & = vehicle_span_cost_coefficients_[i] ==< / div >
< div class = "line" > < a name = "l06984" > < / a > < span class = "lineno" > 6984< / span >   vehicle_span_cost_coefficients_[0];< / div >
< div class = "line" > < a name = "l06985" > < / a > < span class = "lineno" > 6985< / span >   }< / div >
< div class = "line" > < a name = "l06986" > < / a > < span class = "lineno" > 6986< / span >   < / div >
< div class = "line" > < a name = "l06987" > < / a > < span class = "lineno" > 6987< / span >   < span class = "keywordflow" > if< / span > (all_vehicle_span_costs_are_equal & & < / div >
< div class = "line" > < a name = "l06988" > < / a > < span class = "lineno" > 6988< / span >   vehicle_span_cost_coefficients_[0] == 0) {< / div >
< div class = "line" > < a name = "l06989" > < / a > < span class = "lineno" > 6989< / span >   < span class = "keywordflow" > return< / span > ; < span class = "comment" > // No vehicle span cost.< / span > < / div >
< div class = "line" > < a name = "l06990" > < / a > < span class = "lineno" > 6990< / span >   }< / div >
< div class = "line" > < a name = "l06991" > < / a > < span class = "lineno" > 6991< / span >   < / div >
< div class = "line" > < a name = "l06992" > < / a > < span class = "lineno" > 6992< / span >   < span class = "comment" > // Make sure that the vehicle' s start cumul will be maximized in the end;< / span > < / div >
< div class = "line" > < a name = "l06993" > < / a > < span class = "lineno" > 6993< / span >   < span class = "comment" > // and that the vehicle' s end cumul and the node' s slacks will be minimized.< / span > < / div >
< div class = "line" > < a name = "l06994" > < / a > < span class = "lineno" > 6994< / span >   < span class = "comment" > // Note that we don' t do that if there was no span cost (see the return< / span > < / div >
< div class = "line" > < a name = "l06995" > < / a > < span class = "lineno" > 6995< / span >   < span class = "comment" > // clause above), because in that case we want the dimension cumul to< / span > < / div >
< div class = "line" > < a name = "l06996" > < / a > < span class = "lineno" > 6996< / span >   < span class = "comment" > // remain unconstrained. Since transitions depend on base dimensions, we< / span > < / div >
< div class = "line" > < a name = "l06997" > < / a > < span class = "lineno" > 6997< / span >   < span class = "comment" > // have to make sure the slacks of base dimensions are taken care of.< / span > < / div >
< div class = "line" > < a name = "l06998" > < / a > < span class = "lineno" > 6998< / span >   < span class = "comment" > // Also, it makes more sense to make decisions from the root of the tree< / span > < / div >
< div class = "line" > < a name = "l06999" > < / a > < span class = "lineno" > 6999< / span >   < span class = "comment" > // towards to leaves, and hence the slacks are pushed in reverse order.< / span > < / div >
< div class = "line" > < a name = "l07000" > < / a > < span class = "lineno" > 7000< / span >   std::vector< const RoutingDimension*> dimensions_with_relevant_slacks = {< span class = "keyword" > this< / span > };< / div >
< div class = "line" > < a name = "l07001" > < / a > < span class = "lineno" > 7001< / span >   < span class = "keywordflow" > while< / span > (< span class = "keyword" > true< / span > ) {< / div >
< div class = "line" > < a name = "l07002" > < / a > < span class = "lineno" > 7002< / span >   < span class = "keyword" > const< / span > RoutingDimension* < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > =< / div >
< div class = "line" > < a name = "l07003" > < / a > < span class = "lineno" > 7003< / span >   dimensions_with_relevant_slacks.back()-> base_dimension_;< / div >
< div class = "line" > < a name = "l07004" > < / a > < span class = "lineno" > 7004< / span >   < span class = "keywordflow" > if< / span > (< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > == < span class = "keyword" > nullptr< / span > || < a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > == dimensions_with_relevant_slacks.back()) {< / div >
< div class = "line" > < a name = "l07005" > < / a > < span class = "lineno" > 7005< / span >   < span class = "keywordflow" > break< / span > ;< / div >
2021-01-26 11:28:50 +01:00
< div class = "line" > < a name = "l07006" > < / a > < span class = "lineno" > 7006< / span >   }< / div >
2021-02-16 18:34:57 +01:00
< div class = "line" > < a name = "l07007" > < / a > < span class = "lineno" > 7007< / span >   dimensions_with_relevant_slacks.push_back(< a class = "code" href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > );< / div >
< div class = "line" > < a name = "l07008" > < / a > < span class = "lineno" > 7008< / span >   }< / div >
< div class = "line" > < a name = "l07009" > < / a > < span class = "lineno" > 7009< / span >   < / div >
< div class = "line" > < a name = "l07010" > < / a > < span class = "lineno" > 7010< / span >   < span class = "keywordflow" > for< / span > (< span class = "keyword" > auto< / span > it = dimensions_with_relevant_slacks.rbegin();< / div >
< div class = "line" > < a name = "l07011" > < / a > < span class = "lineno" > 7011< / span >   it != dimensions_with_relevant_slacks.rend(); ++it) {< / div >
< div class = "line" > < a name = "l07012" > < / a > < span class = "lineno" > 7012< / span >   < span class = "keywordflow" > for< / span > (< span class = "keywordtype" > int< / span > i = 0; i < model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > vehicles< / a > (); ++i) {< / div >
< div class = "line" > < a name = "l07013" > < / a > < span class = "lineno" > 7013< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > ((*it)-> cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > End< / a > (i)],< / div >
< div class = "line" > < a name = "l07014" > < / a > < span class = "lineno" > 7014< / span >   < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l07015" > < / a > < span class = "lineno" > 7015< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > ((*it)-> cumuls_[model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > Start< / a > (i)],< / div >
< div class = "line" > < a name = "l07016" > < / a > < span class = "lineno" > 7016< / span >   < a class = "code" href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > );< / div >
< div class = "line" > < a name = "l07017" > < / a > < span class = "lineno" > 7017< / span >   }< / div >
< div class = "line" > < a name = "l07018" > < / a > < span class = "lineno" > 7018< / span >   < span class = "keywordflow" > for< / span > (IntVar* < span class = "keyword" > const< / span > slack : (*it)-> slacks_) {< / div >
< div class = "line" > < a name = "l07019" > < / a > < span class = "lineno" > 7019< / span >   model_-> < a class = "code" href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > AddVariableTargetToFinalizer< / a > (slack, < a class = "code" href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > );< / div >
< div class = "line" > < a name = "l07020" > < / a > < span class = "lineno" > 7020< / span >   }< / div >
< div class = "line" > < a name = "l07021" > < / a > < span class = "lineno" > 7021< / span >   }< / div >
< div class = "line" > < a name = "l07022" > < / a > < span class = "lineno" > 7022< / span >   }< / div >
< div class = "line" > < a name = "l07023" > < / a > < span class = "lineno" > 7023< / span >   } < span class = "comment" > // namespace operations_research< / span > < / div >
2020-09-02 09:42:51 +02:00
< div class = "ttc" id = "aalldiff__cst_8cc_html_a021e695f54a13bd809c34b2f4ca87c37" > < div class = "ttname" > < a href = "alldiff__cst_8cc.html#a021e695f54a13bd809c34b2f4ca87c37" > min< / a > < / div > < div class = "ttdeci" > int64 min< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "alldiff__cst_8cc_source.html#l00138" > alldiff_cst.cc:138< / a > < / div > < / div >
< div class = "ttc" id = "aalldiff__cst_8cc_html_a9d0c202d5fdd62f4fa2c613339ff168a" > < div class = "ttname" > < a href = "alldiff__cst_8cc.html#a9d0c202d5fdd62f4fa2c613339ff168a" > max< / a > < / div > < div class = "ttdeci" > int64 max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "alldiff__cst_8cc_source.html#l00139" > alldiff_cst.cc:139< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< 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_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_a4395e95bab44e222cb2e77251017a0e2" > < div class = "ttname" > < a href = "base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2" > DCHECK_LE< / a > < / div > < div class = "ttdeci" > #define DCHECK_LE(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00887" > base/logging.h:887< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_a4bd2e815ca2f702a4b6aa744b1ff3b82" > < div class = "ttname" > < a href = "base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82" > CHECK_LT< / a > < / div > < div class = "ttdeci" > #define CHECK_LT(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00700" > base/logging.h:700< / 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#l00697" > base/logging.h:697< / 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#l00701" > base/logging.h:701< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_aae2dc65d9ea248d54bf39daa986dd295" > < div class = "ttname" > < a href = "base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295" > DCHECK_GE< / a > < / div > < div class = "ttdeci" > #define DCHECK_GE(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00889" > base/logging.h:889< / 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#l00698" > base/logging.h:698< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_ab4f56aa24c4c9cddc47a6abd2d747f9a" > < div class = "ttname" > < a href = "base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a" > DCHECK_GT< / a > < / div > < div class = "ttdeci" > #define DCHECK_GT(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00890" > base/logging.h:890< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_ab62f5ed8f2d48e29802be0cbbcd1359a" > < div class = "ttname" > < a href = "base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a" > DCHECK_LT< / a > < / div > < div class = "ttdeci" > #define DCHECK_LT(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00888" > base/logging.h:888< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "abase_2logging_8h_html_accad43a85d781d53381cd53a9894b6ae" > < div class = "ttname" > < a href = "base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae" > LOG< / a > < / div > < div class = "ttdeci" > #define LOG(severity)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00420" > base/logging.h:420< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "abase_2logging_8h_html_ae17f8119c108cf3070bad3449c7e0006" > < div class = "ttname" > < a href = "base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006" > DCHECK< / a > < / div > < div class = "ttdeci" > #define DCHECK(condition)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00884" > base/logging.h:884< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_ae4db23f10f5d4aad6d735f5a74cd6f8c" > < div class = "ttname" > < a href = "base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c" > CHECK_LE< / a > < / div > < div class = "ttdeci" > #define CHECK_LE(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00699" > base/logging.h:699< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_ae89df3243bbb8341130c7b3f44145ea0" > < div class = "ttname" > < a href = "base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0" > DCHECK_EQ< / a > < / div > < div class = "ttdeci" > #define DCHECK_EQ(val1, val2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00885" > base/logging.h:885< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_aeef651f886eb5252c08835194213efe2" > < div class = "ttname" > < a href = "base_2logging_8h.html#aeef651f886eb5252c08835194213efe2" > ABSL_DIE_IF_NULL< / a > < / div > < div class = "ttdeci" > #define ABSL_DIE_IF_NULL< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00039" > base/logging.h:39< / a > < / div > < / div >
< div class = "ttc" id = "abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927" > < div class = "ttname" > < a href = "base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927" > VLOG< / a > < / div > < div class = "ttdeci" > #define VLOG(verboselevel)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "base_2logging_8h_source.html#l00978" > base/logging.h:978< / 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_dense_connected_components_finder_html" > < div class = "ttname" > < a href = "class_dense_connected_components_finder.html" > DenseConnectedComponentsFinder< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "connected__components_8h_source.html#l00081" > connected_components.h:81< / 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 >
2020-12-07 17:47:46 +01:00
< 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 >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassabsl_1_1_strong_vector_html_a644718bb2fb240de962dc3c9a1fdf0dc" > < div class = "ttname" > < a href = "classabsl_1_1_strong_vector.html#a644718bb2fb240de962dc3c9a1fdf0dc" > absl::StrongVector::empty< / a > < / div > < div class = "ttdeci" > bool empty() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "strong__vector_8h_source.html#l00156" > strong_vector.h:156< / a > < / div > < / div >
< div class = "ttc" id = "aclassabsl_1_1_strong_vector_html_a9263000d449fdccb6cb70b303063e60b" > < div class = "ttname" > < a href = "classabsl_1_1_strong_vector.html#a9263000d449fdccb6cb70b303063e60b" > absl::StrongVector::push_back< / a > < / div > < div class = "ttdeci" > void push_back(const value_type & x)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "strong__vector_8h_source.html#l00158" > strong_vector.h:158< / 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#l05038" > constraint_solver.h:5038< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a0db03cadd37e821f6c41924575188d72" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a0db03cadd37e821f6c41924575188d72" > operations_research::Assignment::Value< / a > < / div > < div class = "ttdeci" > int64 Value(const IntVar *const var) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00659" > constraint_solver/assignment.cc:659< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a1896fe755b612dbebd2c46638f8977a2" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a1896fe755b612dbebd2c46638f8977a2" > operations_research::Assignment::Restore< / a > < / div > < div class = "ttdeci" > void Restore()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00434" > constraint_solver/assignment.cc:434< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a4ffd516bcdda189f37da20040fba290e" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a4ffd516bcdda189f37da20040fba290e" > operations_research::Assignment::Load< / a > < / div > < div class = "ttdeci" > bool Load(const std::string & filename)< / div > < div class = "ttdoc" > Loads an assignment from a file; does not add variables to the assignment (only the variables contain...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00481" > constraint_solver/assignment.cc:481< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a6099fe146d0d68c48a02ab793f2c2e54" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a6099fe146d0d68c48a02ab793f2c2e54" > operations_research::Assignment::Min< / a > < / div > < div class = "ttdeci" > int64 Min(const IntVar *const var) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00651" > constraint_solver/assignment.cc:651< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a60e7fa8388801a72e31391e8203a9464" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464" > operations_research::Assignment::Contains< / a > < / div > < div class = "ttdeci" > bool Contains(const IntVar *const var) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00987" > constraint_solver/assignment.cc:987< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a6b181a6b49df0fa3c31f492c53693174" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a6b181a6b49df0fa3c31f492c53693174" > operations_research::Assignment::Save< / a > < / div > < div class = "ttdeci" > bool Save(const std::string & filename) const< / div > < div class = "ttdoc" > Saves the assignment to a file.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00557" > constraint_solver/assignment.cc:557< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a86601a2dad7a051d7b387ffa789898ff" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff" > operations_research::Assignment::AddObjective< / a > < / div > < div class = "ttdeci" > void AddObjective(IntVar *const v)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00872" > constraint_solver/assignment.cc:872< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a872ff9f9b519eb2dc7a519739b51985d" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a872ff9f9b519eb2dc7a519739b51985d" > operations_research::Assignment::ObjectiveValue< / a > < / div > < div class = "ttdeci" > int64 ObjectiveValue() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00894" > constraint_solver/assignment.cc:894< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_a91d07f8a9a47e81538a524eecf210a82" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#a91d07f8a9a47e81538a524eecf210a82" > operations_research::Assignment::Max< / a > < / div > < div class = "ttdeci" > int64 Max(const IntVar *const var) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00655" > constraint_solver/assignment.cc:655< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_aa71d36872f416feaa853788a7a7a7ef8" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#aa71d36872f416feaa853788a7a7a7ef8" > operations_research::Assignment::Clear< / a > < / div > < div class = "ttdeci" > void Clear()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00418" > constraint_solver/assignment.cc:418< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_aad86dd69d5664ce8e16198be929fd941" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941" > operations_research::Assignment::CopyIntersection< / a > < / div > < div class = "ttdeci" > void CopyIntersection(const Assignment *assignment)< / div > < div class = "ttdoc" > Copies the intersection of the two assignments to the current assignment.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00999" > constraint_solver/assignment.cc:999< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_ac462499a646c751d153e599b22f1d782" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#ac462499a646c751d153e599b22f1d782" > operations_research::Assignment::SetValue< / a > < / div > < div class = "ttdeci" > void SetValue(const IntVar *const var, int64 value)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00679" > constraint_solver/assignment.cc:679< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_ac97eab84adb6cc33ae0124c944a4f8c7" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#ac97eab84adb6cc33ae0124c944a4f8c7" > operations_research::Assignment::Copy< / a > < / div > < div class = "ttdeci" > void Copy(const Assignment *assignment)< / div > < div class = "ttdoc" > Copies 'assignment' to the current assignment, clearing its previous content.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l01008" > constraint_solver/assignment.cc:1008< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_ae8ff1d18d50b93a2499ccd7130addecb" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb" > operations_research::Assignment::Add< / a > < / div > < div class = "ttdeci" > IntVarElement * Add(IntVar *const var)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00637" > constraint_solver/assignment.cc:637< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_assignment_html_aecf5d63faebdaeda9dca52f916576459" > < div class = "ttname" > < a href = "classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459" > operations_research::Assignment::Bound< / a > < / div > < div class = "ttdeci" > bool Bound(const IntVar *const var) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l00663" > constraint_solver/assignment.cc:663< / a > < / div > < / div >
2020-10-09 12:00:09 +02:00
< div class = "ttc" id = "aclassoperations__research_1_1_base_int_expr_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_base_int_expr.html" > operations_research::BaseIntExpr< / a > < / div > < div class = "ttdoc" > This is the base class for all expressions that are not variables.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00109" > constraint_solveri.h:109< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_constraint_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_constraint.html" > operations_research::Constraint< / a > < / div > < div class = "ttdoc" > A constraint is the main modeling object.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03584" > constraint_solver.h:3584< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_decision_builder_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_decision_builder.html" > operations_research::DecisionBuilder< / a > < / div > < div class = "ttdoc" > A DecisionBuilder is responsible for creating the search tree.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03268" > constraint_solver.h:3268< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_decision_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_decision.html" > operations_research::Decision< / a > < / div > < div class = "ttdoc" > A Decision represents a choice point in the search tree.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03228" > constraint_solver.h:3228< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_demon_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_demon.html" > operations_research::Demon< / a > < / div > < div class = "ttdoc" > A Demon is the base element of a propagation queue.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03301" > constraint_solver.h:3301< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_demon_html_a0c1ff1e86b1eb08d0f87eab2943dac2a" > < div class = "ttname" > < a href = "classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a" > operations_research::Demon::inhibit< / a > < / div > < div class = "ttdeci" > void inhibit(Solver *const s)< / div > < div class = "ttdoc" > This method inhibits the demon in the search tree below the current position.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l00199" > constraint_solver.cc:199< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_ebert_graph_base_html_a7b505ba4a01bce342d049f5a8674da72" > < div class = "ttname" > < a href = "classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72" > operations_research::EbertGraphBase::AddArc< / a > < / div > < div class = "ttdeci" > ArcIndexType AddArc(NodeIndexType tail, NodeIndexType head)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "ebert__graph_8h_source.html#l01001" > ebert_graph.h:1001< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_forward_ebert_graph_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_forward_ebert_graph.html" > operations_research::ForwardEbertGraph< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "ebert__graph_8h_source.html#l01562" > ebert_graph.h:1564< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_global_dimension_cumul_optimizer_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_global_dimension_cumul_optimizer.html" > operations_research::GlobalDimensionCumulOptimizer< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__lp__scheduling_8h_source.html#l00680" > routing_lp_scheduling.h:680< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_init_and_get_values_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_init_and_get_values.html" > operations_research::InitAndGetValues< / a > < / div > < div class = "ttdoc" > Utility class to encapsulate an IntVarIterator and use it in a range-based loop.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03941" > constraint_solver.h:3941< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_expr_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_expr.html" > operations_research::IntExpr< / a > < / div > < div class = "ttdoc" > The class IntExpr is the base of all integer expressions in constraint programming.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03836" > constraint_solver.h:3836< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_expr_html_a07173db6ca3b22fdb35ad963831a962b" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_expr.html#a07173db6ca3b22fdb35ad963831a962b" > operations_research::IntExpr::Var< / a > < / div > < div class = "ttdeci" > virtual IntVar * Var()=0< / div > < div class = "ttdoc" > Creates a variable from the expression.< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_expr_html_a1d04569b37cb7fe6ed0956ab71e08bc9" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9" > operations_research::IntExpr::Bound< / a > < / div > < div class = "ttdeci" > virtual bool Bound() const< / div > < div class = "ttdoc" > Returns true if the min and the max of the expression are equal.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03862" > constraint_solver.h:3862< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_expr_html_a6dc4d5cdc2ed0da18452a65c5bf69e0d" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_expr.html#a6dc4d5cdc2ed0da18452a65c5bf69e0d" > operations_research::IntExpr::Max< / a > < / div > < div class = "ttdeci" > virtual int64 Max() const =0< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_expr_html_ac4a4f30badcd311075302a4efcfaee0a" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_expr.html#ac4a4f30badcd311075302a4efcfaee0a" > operations_research::IntExpr::Min< / a > < / div > < div class = "ttdeci" > virtual int64 Min() const =0< / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_filtered_decision_builder_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var_filtered_decision_builder.html" > operations_research::IntVarFilteredDecisionBuilder< / a > < / div > < div class = "ttdoc" > Decision builder building a solution using heuristics with local search filters to evaluate its feasi...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02977" > routing.h:2977< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_filtered_decision_builder_html_ab35b677ad56dbdc2521d9bb28a68f566" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var_filtered_decision_builder.html#ab35b677ad56dbdc2521d9bb28a68f566" > operations_research::IntVarFilteredDecisionBuilder::number_of_rejects< / a > < / div > < div class = "ttdeci" > int64 number_of_rejects() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02868" > routing_search.cc:2868< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_filtered_decision_builder_html_ab9cbb9e796806062460be9c7a4033e80" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var_filtered_decision_builder.html#ab9cbb9e796806062460be9c7a4033e80" > operations_research::IntVarFilteredDecisionBuilder::number_of_decisions< / a > < / div > < div class = "ttdeci" > int64 number_of_decisions() const< / div > < div class = "ttdoc" > Returns statistics from its underlying heuristic.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02864" > routing_search.cc:2864< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var.html" > operations_research::IntVar< / a > < / div > < div class = "ttdoc" > The class IntVar is a subset of IntExpr.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03997" > constraint_solver.h:3997< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_html_a6e33a313eaf507bae0eb7068455a5bdc" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc" > operations_research::IntVar::WhenBound< / a > < / div > < div class = "ttdeci" > virtual void WhenBound(Demon *d)=0< / div > < div class = "ttdoc" > This method attaches a demon that will be awakened when the variable is bound.< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_html_a7005edfb93d09a9ca1ecb989a9bc6733" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var.html#a7005edfb93d09a9ca1ecb989a9bc6733" > operations_research::IntVar::Contains< / a > < / div > < div class = "ttdeci" > virtual bool Contains(int64 v) const =0< / div > < div class = "ttdoc" > This method returns whether the value 'v' is in the domain of the variable.< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_html_ac067bc2252cc65b1eb004d5285e5fdb2" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var.html#ac067bc2252cc65b1eb004d5285e5fdb2" > operations_research::IntVar::Value< / a > < / div > < div class = "ttdeci" > virtual int64 Value() const =0< / div > < div class = "ttdoc" > This method returns the value of the variable.< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_int_var_html_accbd81450997e4b279396e56ab44c0b4" > < div class = "ttname" > < a href = "classoperations__research_1_1_int_var.html#accbd81450997e4b279396e56ab44c0b4" > operations_research::IntVar::Size< / a > < / div > < div class = "ttdeci" > virtual uint64 Size() const =0< / div > < div class = "ttdoc" > This method returns the number of values in the domain of the variable.< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_interval_var_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_interval_var.html" > operations_research::IntervalVar< / a > < / div > < div class = "ttdoc" > Interval variables are often used in scheduling.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l04394" > constraint_solver.h:4394< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_linear_sum_assignment_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_linear_sum_assignment.html" > operations_research::LinearSumAssignment< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "linear__assignment_8h_source.html#l00226" > linear_assignment.h:226< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_linear_sum_assignment_html_a5afb9dde1c31f5f053cc83bf6e594db0" > < div class = "ttname" > < a href = "classoperations__research_1_1_linear_sum_assignment.html#a5afb9dde1c31f5f053cc83bf6e594db0" > operations_research::LinearSumAssignment::GetCost< / a > < / div > < div class = "ttdeci" > CostValue GetCost() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "linear__assignment_8h_source.html#l01473" > linear_assignment.h:1473< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_linear_sum_assignment_html_a63b3d12e721188086870cc42cc46a258" > < div class = "ttname" > < a href = "classoperations__research_1_1_linear_sum_assignment.html#a63b3d12e721188086870cc42cc46a258" > operations_research::LinearSumAssignment::ComputeAssignment< / a > < / div > < div class = "ttdeci" > bool ComputeAssignment()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "linear__assignment_8h_source.html#l01448" > linear_assignment.h:1448< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_linear_sum_assignment_html_a77a0519df5fb71834593bb661b72921c" > < div class = "ttname" > < a href = "classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c" > operations_research::LinearSumAssignment::SetArcCost< / a > < / div > < div class = "ttdeci" > void SetArcCost(ArcIndex arc, CostValue cost)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "linear__assignment_8h_source.html#l01009" > linear_assignment.h:1009< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_local_dimension_cumul_optimizer_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_local_dimension_cumul_optimizer.html" > operations_research::LocalDimensionCumulOptimizer< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__lp__scheduling_8h_source.html#l00635" > routing_lp_scheduling.h:635< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_local_search_operator_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_local_search_operator.html" > operations_research::LocalSearchOperator< / a > < / div > < div class = "ttdoc" > The base class for all local search operators.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00798" > constraint_solveri.h:798< / a > < / div > < / div >
2020-10-09 12:00:09 +02:00
< div class = "ttc" id = "aclassoperations__research_1_1_math_util_html_aec89d533eea50ada5268533f068f97ec" > < div class = "ttname" > < a href = "classoperations__research_1_1_math_util.html#aec89d533eea50ada5268533f068f97ec" > operations_research::MathUtil::FastInt64Round< / a > < / div > < div class = "ttdeci" > static int64 FastInt64Round(double x)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "mathutil_8h_source.html#l00138" > mathutil.h:138< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html" > operations_research::ModelVisitor< / a > < / div > < div class = "ttdoc" > Model visitor.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03334" > constraint_solver.h:3334< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a18ba1952015fae2770ace40c811c2efb" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a18ba1952015fae2770ace40c811c2efb" > operations_research::ModelVisitor::kIndex2Argument< / a > < / div > < div class = "ttdeci" > static const char kIndex2Argument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03456" > constraint_solver.h:3456< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a1a1c411b20f73c324361e8eff94f12bd" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a1a1c411b20f73c324361e8eff94f12bd" > operations_research::ModelVisitor::kMinArgument< / a > < / div > < div class = "ttdeci" > static const char kMinArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03466" > constraint_solver.h:3466< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a489f38dd601db8d045efae4d9ae7d754" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754" > operations_research::ModelVisitor::kTargetArgument< / a > < / div > < div class = "ttdeci" > static const char kTargetArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03487" > constraint_solver.h:3487< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a5f9d5cd2badcf4361bfebd07c9cb63d8" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a5f9d5cd2badcf4361bfebd07c9cb63d8" > operations_research::ModelVisitor::kMaxArgument< / a > < / div > < div class = "ttdeci" > static const char kMaxArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03464" > constraint_solver.h:3464< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a764c2bb6842cf7a1a5aedac877295b46" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46" > operations_research::ModelVisitor::kLessOrEqual< / a > < / div > < div class = "ttdeci" > static const char kLessOrEqual[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03379" > constraint_solver.h:3379< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_a8e24c7d309e4aaa23eca1c75bd42bdc5" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#a8e24c7d309e4aaa23eca1c75bd42bdc5" > operations_research::ModelVisitor::kLeftArgument< / a > < / div > < div class = "ttdeci" > static const char kLeftArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03463" > constraint_solver.h:3463< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_aa9175e7f7c9d2598d26293435ecd89ce" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#aa9175e7f7c9d2598d26293435ecd89ce" > operations_research::ModelVisitor::kVarsArgument< / a > < / div > < div class = "ttdeci" > static const char kVarsArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03494" > constraint_solver.h:3494< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_aaeff643bea5491c9055dc67124d5d3d2" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#aaeff643bea5491c9055dc67124d5d3d2" > operations_research::ModelVisitor::kRightArgument< / a > < / div > < div class = "ttdeci" > static const char kRightArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03475" > constraint_solver.h:3475< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_adc9534f3f00f5aa6046609988d38967b" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#adc9534f3f00f5aa6046609988d38967b" > operations_research::ModelVisitor::kValuesArgument< / a > < / div > < div class = "ttdeci" > static const char kValuesArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03492" > constraint_solver.h:3492< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_model_visitor_html_af490af7f25d4b57c9b088a61001f6a1e" > < div class = "ttname" > < a href = "classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e" > operations_research::ModelVisitor::kIndexArgument< / a > < / div > < div class = "ttdeci" > static const char kIndexArgument[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03457" > constraint_solver.h:3457< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_piecewise_linear_function_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_piecewise_linear_function.html" > operations_research::PiecewiseLinearFunction< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "piecewise__linear__function_8h_source.html#l00101" > piecewise_linear_function.h:101< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_propagation_base_object_html_a173cbf153462b14f9b57362d2c45638a" > < div class = "ttname" > < a href = "classoperations__research_1_1_propagation_base_object.html#a173cbf153462b14f9b57362d2c45638a" > operations_research::PropagationBaseObject::EnqueueDelayedDemon< / a > < / div > < div class = "ttdeci" > void EnqueueDelayedDemon(Demon *const d)< / div > < div class = "ttdoc" > This method pushes the demon onto the propagation queue.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03192" > constraint_solver.h:3192< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_propagation_base_object_html_a5f32c22c620c811754ba7b6f977db864" > < div class = "ttname" > < a href = "classoperations__research_1_1_propagation_base_object.html#a5f32c22c620c811754ba7b6f977db864" > operations_research::PropagationBaseObject::solver< / a > < / div > < div class = "ttdeci" > Solver * solver() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03179" > constraint_solver.h:3179< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_propagation_base_object_html_ad5260b9627048b854b45d05ed34adc22" > < div class = "ttname" > < a href = "classoperations__research_1_1_propagation_base_object.html#ad5260b9627048b854b45d05ed34adc22" > operations_research::PropagationBaseObject::set_name< / a > < / div > < div class = "ttdeci" > void set_name(const std::string & name)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l02509" > constraint_solver.cc:2509< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_range_int_to_int_function_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_range_int_to_int_function.html" > operations_research::RangeIntToIntFunction< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "range__query__function_8h_source.html#l00028" > range_query_function.h:28< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_regular_limit_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_regular_limit.html" > operations_research::RegularLimit< / a > < / div > < div class = "ttdoc" > Usual limit based on wall_time, number of explored branches and number of failures in the search tree...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l04281" > constraint_solver.h:4281< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_regular_limit_html_ac27d43b8547c5bee9c7e0fdbdb98a80e" > < div class = "ttname" > < a href = "classoperations__research_1_1_regular_limit.html#ac27d43b8547c5bee9c7e0fdbdb98a80e" > operations_research::RegularLimit::UpdateLimits< / a > < / div > < div class = "ttdeci" > void UpdateLimits(absl::Duration time, int64 branches, int64 failures, int64 solutions)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "search_8cc_source.html#l04031" > search.cc:4031< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_rev_switch_html_aba56f30d7550dc96d418c689e3ea41f0" > < div class = "ttname" > < a href = "classoperations__research_1_1_rev_switch.html#aba56f30d7550dc96d418c689e3ea41f0" > operations_research::RevSwitch::Switch< / a > < / div > < div class = "ttdeci" > void Switch(Solver *const solver)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00395" > constraint_solveri.h:395< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_rev_switch_html_acd90006e99a15f7e9df2aee5cf46549c" > < div class = "ttname" > < a href = "classoperations__research_1_1_rev_switch.html#acd90006e99a15f7e9df2aee5cf46549c" > operations_research::RevSwitch::Switched< / a > < / div > < div class = "ttdeci" > bool Switched() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00393" > constraint_solveri.h:393< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_route_constructor_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_route_constructor.html" > operations_research::RouteConstructor< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02489" > routing.cc:2489< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_route_constructor_html_a0a7e51a3bae37dc4882a6661f78bf91d" > < div class = "ttname" > < a href = "classoperations__research_1_1_route_constructor.html#a0a7e51a3bae37dc4882a6661f78bf91d" > operations_research::RouteConstructor::~RouteConstructor< / a > < / div > < div class = "ttdeci" > ~RouteConstructor()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02520" > routing.cc:2520< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_route_constructor_html_a47bfb11c6bb18ede9c4d3b92f58d23f3" > < div class = "ttname" > < a href = "classoperations__research_1_1_route_constructor.html#a47bfb11c6bb18ede9c4d3b92f58d23f3" > operations_research::RouteConstructor::RouteConstructor< / a > < / div > < div class = "ttdeci" > RouteConstructor(Assignment *const assignment, RoutingModel *const model, bool check_assignment, int64 num_indices, const std::vector< Link > & links_list)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02491" > routing.cc:2491< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_route_constructor_html_a9af72b216eb95e320f0f261d9497c5c1" > < div class = "ttname" > < a href = "classoperations__research_1_1_route_constructor.html#a9af72b216eb95e320f0f261d9497c5c1" > operations_research::RouteConstructor::Construct< / a > < / div > < div class = "ttdeci" > void Construct()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02522" > routing.cc:2522< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_route_constructor_html_acffbbc021acff5d6f60c3985dfe716b0" > < div class = "ttname" > < a href = "classoperations__research_1_1_route_constructor.html#acffbbc021acff5d6f60c3985dfe716b0" > operations_research::RouteConstructor::final_routes< / a > < / div > < div class = "ttdeci" > const std::vector< std::vector< int > > & final_routes() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02644" > routing.cc:2644< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html" > operations_research::RoutingDimension< / a > < / div > < div class = "ttdoc" > Dimensions represent quantities accumulated at nodes along the routes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02368" > routing.h:2368< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a052c958dd77221524f13f06d87960e63" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a052c958dd77221524f13f06d87960e63" > operations_research::RoutingDimension::SetCumulVarPiecewiseLinearCost< / a > < / div > < div class = "ttdeci" > void SetCumulVarPiecewiseLinearCost(int64 index, const PiecewiseLinearFunction & cost)< / div > < div class = "ttdoc" > Sets a piecewise linear cost on the cumul variable of a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06612" > routing.cc:6612< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a1b6f521fdc9dff38b7e065c838fa54a3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a1b6f521fdc9dff38b7e065c838fa54a3" > operations_research::RoutingDimension::cumuls< / a > < / div > < div class = "ttdeci" > const std::vector< IntVar * > & cumuls() const< / div > < div class = "ttdoc" > Like CumulVar(), TransitVar(), SlackVar() but return the whole variable vectors instead (indexed by i...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02394" > routing.h:2394< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a20cb44a14b6119a99fdcef3b594629e8" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a20cb44a14b6119a99fdcef3b594629e8" > operations_research::RoutingDimension::GetBreakDistanceDurationOfVehicle< / a > < / div > < div class = "ttdeci" > const std::vector< std::pair< int64, int64 > > & GetBreakDistanceDurationOfVehicle(int vehicle) const< / div > < div class = "ttdoc" > Returns the pairs (distance, duration) specified by break distance constraints.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06939" > routing.cc:6939< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a35a576bb3ea6814f122593d44a3c391e" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a35a576bb3ea6814f122593d44a3c391e" > operations_research::RoutingDimension::model< / a > < / div > < div class = "ttdeci" > RoutingModel * model() const< / div > < div class = "ttdoc" > Returns the model on which the dimension was created.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02372" > routing.h:2372< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a360d9c53a26f994367971cb23c8697ff" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a360d9c53a26f994367971cb23c8697ff" > operations_research::RoutingDimension::SetSpanUpperBoundForVehicle< / a > < / div > < div class = "ttdeci" > void SetSpanUpperBoundForVehicle(int64 upper_bound, int vehicle)< / div > < div class = "ttdoc" > !defined(SWIGCSHARP) & & !defined(SWIGJAVA) !defined(SWIGPYTHON)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06586" > routing.cc:6586< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a36f4aa60ff1b8c1dd5fc1180199cad8d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d" > operations_research::RoutingDimension::HasPickupToDeliveryLimits< / a > < / div > < div class = "ttdeci" > bool HasPickupToDeliveryLimits() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06955" > routing.cc:6955< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a4d87db39b37a97bcf6669448a67f0356" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a4d87db39b37a97bcf6669448a67f0356" > operations_research::RoutingDimension::CumulVar< / a > < / div > < div class = "ttdeci" > IntVar * CumulVar(int64 index) const< / div > < div class = "ttdoc" > Get the cumul, transit and slack variables for the given node (given as int64 var index).< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02386" > routing.h:2386< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a51eadbd617f6658396e5ba790f6b0c19" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a51eadbd617f6658396e5ba790f6b0c19" > operations_research::RoutingDimension::GetCumulVarSoftLowerBoundCoefficient< / a > < / div > < div class = "ttdeci" > int64 GetCumulVarSoftLowerBoundCoefficient(int64 index) const< / div > < div class = "ttdoc" > Returns the cost coefficient of the soft lower bound of a cumul variable for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06751" > routing.cc:6751< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a54e75670bdbf7abca93c9e02cfee83fe" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a54e75670bdbf7abca93c9e02cfee83fe" > operations_research::RoutingDimension::HasCumulVarSoftLowerBound< / a > < / div > < div class = "ttdeci" > bool HasCumulVarSoftLowerBound(int64 index) const< / div > < div class = "ttdoc" > Returns true if a soft lower bound has been set for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06738" > routing.cc:6738< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a5d861ad3e93b404872633f359570f234" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a5d861ad3e93b404872633f359570f234" > operations_research::RoutingDimension::SetSpanCostCoefficientForAllVehicles< / a > < / div > < div class = "ttdeci" > void SetSpanCostCoefficientForAllVehicles(int64 coefficient)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06602" > routing.cc:6602< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a607df50e6bc0dc54fbe811e96155ee95" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a607df50e6bc0dc54fbe811e96155ee95" > operations_research::RoutingDimension::GetCumulVarSoftLowerBound< / a > < / div > < div class = "ttdeci" > int64 GetCumulVarSoftLowerBound(int64 index) const< / div > < div class = "ttdoc" > Returns the soft lower bound of a cumul variable for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06743" > routing.cc:6743< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a64f4e1f55b71a9f9a0d7e3ef7033ade7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a64f4e1f55b71a9f9a0d7e3ef7033ade7" > operations_research::RoutingDimension::PickupToDeliveryLimitFunction< / a > < / div > < div class = "ttdeci" > std::function< int64(int, int)> PickupToDeliveryLimitFunction< / div > < div class = "ttdoc" > Limits, in terms of maximum difference between the cumul variables, between the pickup and delivery a...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02637" > routing.h:2637< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a68c42bd26c7f0a2f1a0247e51a45aab5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a68c42bd26c7f0a2f1a0247e51a45aab5" > operations_research::RoutingDimension::SetBreakDistanceDurationOfVehicle< / a > < / div > < div class = "ttdeci" > void SetBreakDistanceDurationOfVehicle(int64 distance, int64 duration, int vehicle)< / div > < div class = "ttdoc" > With breaks supposed to be consecutive, this forces the distance between breaks of size at least mini...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06923" > routing.cc:6923< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a6debc638c02bfb2b4afe0afccdd98ca5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5" > operations_research::RoutingDimension::HasBreakConstraints< / a > < / div > < div class = "ttdeci" > bool HasBreakConstraints() const< / div > < div class = "ttdoc" > Returns true if any break interval or break distance was defined.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06900" > routing.cc:6900< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a76645042dd00fd9a97a9c4a395927947" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947" > operations_research::RoutingDimension::InitializeBreaks< / a > < / div > < div class = "ttdeci" > void InitializeBreaks()< / div > < div class = "ttdoc" > Sets up vehicle_break_intervals_, vehicle_break_distance_duration_, pre_travel_evaluators and post_tr...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06890" > routing.cc:6890< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a7ed584226a1930ec8663c3e4efe28a93" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a7ed584226a1930ec8663c3e4efe28a93" > operations_research::RoutingDimension::GetTransitValue< / a > < / div > < div class = "ttdeci" > int64 GetTransitValue(int64 from_index, int64 to_index, int64 vehicle) const< / div > < div class = "ttdoc" > Returns the transition value for a given pair of nodes (as var index); this value is the one taken by...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06557" > routing.cc:6557< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a8e93e99ce491f2779c0d2e5e7de5a98a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a" > operations_research::RoutingDimension::GetPreTravelEvaluatorOfVehicle< / a > < / div > < div class = "ttdeci" > int GetPreTravelEvaluatorOfVehicle(int vehicle) const< / div > < div class = "ttdoc" > !defined(SWIGPYTHON)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06911" > routing.cc:6911< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_a91b8a6eb7cf5ab0ebc74ddced140d700" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700" > operations_research::RoutingDimension::GetBreakIntervalsOfVehicle< / a > < / div > < div class = "ttdeci" > const std::vector< IntervalVar * > & GetBreakIntervalsOfVehicle(int vehicle) const< / div > < div class = "ttdoc" > Returns the break intervals set by SetBreakIntervalsOfVehicle().< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06904" > routing.cc:6904< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aa21323f8eeaa9c502d6cfb92109a73d4" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4" > operations_research::RoutingDimension::SetPickupToDeliveryLimitFunctionForPair< / a > < / div > < div class = "ttdeci" > void SetPickupToDeliveryLimitFunctionForPair(PickupToDeliveryLimitFunction limit_function, int pair_index)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06945" > routing.cc:6945< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aa70f385bdf5fc31eec8a848dea13b357" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aa70f385bdf5fc31eec8a848dea13b357" > operations_research::RoutingDimension::GetPickupToDeliveryLimitForPair< / a > < / div > < div class = "ttdeci" > int64 GetPickupToDeliveryLimitForPair(int pair_index, int pickup, int delivery) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06959" > routing.cc:6959< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aa98cc88bb33e9f703167cb030c093930" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aa98cc88bb33e9f703167cb030c093930" > operations_research::RoutingDimension::SetSpanCostCoefficientForVehicle< / a > < / div > < div class = "ttdeci" > void SetSpanCostCoefficientForVehicle(int64 coefficient, int vehicle)< / div > < div class = "ttdoc" > Sets a cost proportional to the dimension span on a given vehicle, or on all vehicles at once.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06594" > routing.cc:6594< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aacc17c3711ac030db624e72c5ae2394f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aacc17c3711ac030db624e72c5ae2394f" > operations_research::RoutingDimension::GetCumulVarSoftUpperBound< / a > < / div > < div class = "ttdeci" > int64 GetCumulVarSoftUpperBound(int64 index) const< / div > < div class = "ttdoc" > Returns the soft upper bound of a cumul variable for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06692" > routing.cc:6692< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aae1962408e06dbb45f6e5ee67e530880" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aae1962408e06dbb45f6e5ee67e530880" > operations_research::RoutingDimension::transit_evaluator< / a > < / div > < div class = "ttdeci" > const RoutingModel::TransitCallback2 & transit_evaluator(int vehicle) const< / div > < div class = "ttdoc" > Returns the callback evaluating the transit value between two node indices for a given vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02449" > routing.h:2449< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ab4ee0772eb17ffba5e3a2f6f38026546" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ab4ee0772eb17ffba5e3a2f6f38026546" > operations_research::RoutingDimension::SetCumulVarSoftUpperBound< / a > < / div > < div class = "ttdeci" > void SetCumulVarSoftUpperBound(int64 index, int64 upper_bound, int64 coefficient)< / div > < div class = "ttdoc" > Sets a soft upper bound to the cumul variable of a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06678" > routing.cc:6678< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ab52c4b4818c89b7a7541faa4c63f02b5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ab52c4b4818c89b7a7541faa4c63f02b5" > operations_research::RoutingDimension::GetCumulVarPiecewiseLinearCost< / a > < / div > < div class = "ttdeci" > const PiecewiseLinearFunction * GetCumulVarPiecewiseLinearCost(int64 index) const< / div > < div class = "ttdoc" > Returns the piecewise linear cost of a cumul variable for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06636" > routing.cc:6636< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_acf39f330b220a62bbb8fac9c8c1256b5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#acf39f330b220a62bbb8fac9c8c1256b5" > operations_research::RoutingDimension::GetAllowedIntervalsInRange< / a > < / div > < div class = "ttdeci" > SortedDisjointIntervalList GetAllowedIntervalsInRange(int64 index, int64 min_value, int64 max_value) const< / div > < div class = "ttdoc" > Returns allowed intervals for a given node in a given interval.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06563" > routing.cc:6563< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ad8227ba86a01f26e4f173cd5e219d5d1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ad8227ba86a01f26e4f173cd5e219d5d1" > operations_research::RoutingDimension::name< / a > < / div > < div class = "ttdeci" > const std::string & name() const< / div > < div class = "ttdoc" > Returns the name of the dimension.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02619" > routing.h:2619< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_adc8bb803b3a5f74bd5e1c04d0154b03c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#adc8bb803b3a5f74bd5e1c04d0154b03c" > operations_research::RoutingDimension::SetCumulVarSoftLowerBound< / a > < / div > < div class = "ttdeci" > void SetCumulVarSoftLowerBound(int64 index, int64 lower_bound, int64 coefficient)< / div > < div class = "ttdoc" > Sets a soft lower bound to the cumul variable of a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06729" > routing.cc:6729< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ae34995163df20f89961e907ac3b25532" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532" > operations_research::RoutingDimension::SetBreakIntervalsOfVehicle< / a > < / div > < div class = "ttdeci" > void SetBreakIntervalsOfVehicle(std::vector< IntervalVar * > breaks, int vehicle, int pre_travel_evaluator, int post_travel_evaluator)< / div > < div class = "ttdoc" > Sets the breaks for a given vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06861" > routing.cc:6861< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ae85d6e3327a52eb2e93195d1ba45884d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ae85d6e3327a52eb2e93195d1ba45884d" > operations_research::RoutingDimension::HasCumulVarPiecewiseLinearCost< / a > < / div > < div class = "ttdeci" > bool HasCumulVarPiecewiseLinearCost(int64 index) const< / div > < div class = "ttdoc" > Returns true if a piecewise linear cost has been set for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06631" > routing.cc:6631< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_ae961a8435c4bc4ac850fa06bff29b625" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#ae961a8435c4bc4ac850fa06bff29b625" > operations_research::RoutingDimension::SetGlobalSpanCostCoefficient< / a > < / div > < div class = "ttdeci" > void SetGlobalSpanCostCoefficient(int64 coefficient)< / div > < div class = "ttdoc" > Sets a cost proportional to the global dimension span, that is the difference between the largest val...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06607" > routing.cc:6607< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_aea64f6b7cb80887be5478c35609cab1c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#aea64f6b7cb80887be5478c35609cab1c" > operations_research::RoutingDimension::HasCumulVarSoftUpperBound< / a > < / div > < div class = "ttdeci" > bool HasCumulVarSoftUpperBound(int64 index) const< / div > < div class = "ttdoc" > Returns true if a soft upper bound has been set for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06687" > routing.cc:6687< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_af362b70cab1a5a90703808e9575c2f54" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#af362b70cab1a5a90703808e9575c2f54" > operations_research::RoutingDimension::GetCumulVarSoftUpperBoundCoefficient< / a > < / div > < div class = "ttdeci" > int64 GetCumulVarSoftUpperBoundCoefficient(int64 index) const< / div > < div class = "ttdoc" > Returns the cost coefficient of the soft upper bound of a cumul variable for a given variable index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06700" > routing.cc:6700< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_af42a5771d18b334091cc0f786219fe04" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04" > operations_research::RoutingDimension::~RoutingDimension< / a > < / div > < div class = "ttdeci" > ~RoutingDimension()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05960" > routing.cc:5960< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_dimension_html_afb4c32e76561cad95bd8be2777d8f1ac" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac" > operations_research::RoutingDimension::GetPostTravelEvaluatorOfVehicle< / a > < / div > < div class = "ttdeci" > int GetPostTravelEvaluatorOfVehicle(int vehicle) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06917" > routing.cc:6917< / a > < / div > < / div >
2020-10-09 12:00:09 +02:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html" > operations_research::RoutingIndexManager< / a > < / div > < div class = "ttdoc" > Manager for any NodeIndex < -> variable index conversion.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00048" > routing_index_manager.h:48< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_a3bb0169ed51340380c189a23a9416ee1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#a3bb0169ed51340380c189a23a9416ee1" > operations_research::RoutingIndexManager::GetIndexToNodeMap< / a > < / div > < div class = "ttdeci" > std::vector< NodeIndex > GetIndexToNodeMap() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00100" > routing_index_manager.h:100< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_a43a3b21b32a5c173a34d9c3128554818" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#a43a3b21b32a5c173a34d9c3128554818" > operations_research::RoutingIndexManager::GetEndIndex< / a > < / div > < div class = "ttdeci" > int64 GetEndIndex(int vehicle) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00074" > routing_index_manager.h:74< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_a77ea1e8bec366bf225bad6732c7eec63" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#a77ea1e8bec366bf225bad6732c7eec63" > operations_research::RoutingIndexManager::num_unique_depots< / a > < / div > < div class = "ttdeci" > int num_unique_depots() const< / div > < div class = "ttdoc" > complete.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00099" > routing_index_manager.h:99< / a > < / div > < / div >
2020-10-09 12:00:09 +02:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_ad422f8593b66956120c8a5b1959b2623" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#ad422f8593b66956120c8a5b1959b2623" > operations_research::RoutingIndexManager::num_vehicles< / a > < / div > < div class = "ttdeci" > int num_vehicles() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00069" > routing_index_manager.h:69< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_ada73580fd3d3c404db3c437da0410ced" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#ada73580fd3d3c404db3c437da0410ced" > operations_research::RoutingIndexManager::IndexToNode< / a > < / div > < div class = "ttdeci" > NodeIndex IndexToNode(int64 index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00088" > routing_index_manager.h:88< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_ae7309bcc0f1a1e238ad7501f1b553ef2" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2" > operations_research::RoutingIndexManager::num_indices< / a > < / div > < div class = "ttdeci" > int num_indices() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00071" > routing_index_manager.h:71< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_index_manager_html_afdff7b98df32a8859b0b69dc4c412803" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_index_manager.html#afdff7b98df32a8859b0b69dc4c412803" > operations_research::RoutingIndexManager::GetStartIndex< / a > < / div > < div class = "ttdeci" > int64 GetStartIndex(int vehicle) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__index__manager_8h_source.html#l00073" > routing_index_manager.h:73< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html" > operations_research::RoutingModel< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00213" > routing.h:213< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a00141bd90e555aea59a9e98cfbcda6eb" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a00141bd90e555aea59a9e98cfbcda6eb" > operations_research::RoutingModel::RoutingModelInspector< / a > < / div > < div class = "ttdeci" > friend class RoutingModelInspector< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01937" > routing.h:1937< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0446229ea281bc2be5055b79825b9a9c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0446229ea281bc2be5055b79825b9a9c" > operations_research::RoutingModel::AddDimensionWithVehicleTransitAndCapacity< / a > < / div > < div class = "ttdeci" > bool AddDimensionWithVehicleTransitAndCapacity(const std::vector< int > & evaluator_indices, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00903" > routing.cc:903< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a04bd106a61d493872cabb0f41f7f118f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a04bd106a61d493872cabb0f41f7f118f" > operations_research::RoutingModel::GetNumberOfDecisionsInFirstSolution< / a > < / div > < div class = "ttdeci" > int64 GetNumberOfDecisionsInFirstSolution(const RoutingSearchParameters & search_parameters) const< / div > < div class = "ttdoc" > Returns statistics on first solution search, number of decisions sent to filters, number of decisions...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03621" > routing.cc:3621< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a07b796e9f91ee5b4c5e99c7f23e2f743" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a07b796e9f91ee5b4c5e99c7f23e2f743" > operations_research::RoutingModel::SetFixedCostOfAllVehicles< / a > < / div > < div class = "ttdeci" > void SetFixedCostOfAllVehicles(int64 cost)< / div > < div class = "ttdoc" > Sets the fixed cost of all vehicle routes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01204" > routing.cc:1204< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a086605d9650ce3c576d8a9c45ce0b9fc" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc" > operations_research::RoutingModel::AddAtSolutionCallback< / a > < / div > < div class = "ttdeci" > void AddAtSolutionCallback(std::function< void()> callback)< / div > < div class = "ttdoc" > Adds a callback called each time a solution is found during the search.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03126" > routing.cc:3126< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a08f0e7114d9118eafc2b3e3f96878014" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a08f0e7114d9118eafc2b3e3f96878014" > operations_research::RoutingModel::GetPrimaryConstrainedDimension< / a > < / div > < div class = "ttdeci" > const std::string & GetPrimaryConstrainedDimension() const< / div > < div class = "ttdoc" > Get the primary constrained dimension, or an empty string if it is unset.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00608" > routing.h:608< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0a69fba2cad4f27c71a0c552ab7503f3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0a69fba2cad4f27c71a0c552ab7503f3" > operations_research::RoutingModel::AddConstantDimensionWithSlack< / a > < / div > < div class = "ttdeci" > std::pair< int, bool > AddConstantDimensionWithSlack(int64 value, int64 capacity, int64 slack_max, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdoc" > Creates a dimension where the transit variable is constrained to be equal to 'value'; 'capacity' is t...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00952" > routing.cc:952< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0d3987c3df07976d19f3165788fc97a9" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9" > operations_research::RoutingModel::RestoreAssignment< / a > < / div > < div class = "ttdeci" > Assignment * RestoreAssignment(const Assignment & solution)< / div > < div class = "ttdoc" > Restores an assignment as a solution in the routing model and returns the new solution.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03655" > routing.cc:3655< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0e106a97f0156868f1d1c741b283793e" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0e106a97f0156868f1d1c741b283793e" > operations_research::RoutingModel::GetTabuVarsCallback< / a > < / div > < div class = "ttdeci" > std::function< std::vector< operations_research::IntVar * > (RoutingModel *)> GetTabuVarsCallback< / div > < div class = "ttdoc" > Sets the callback returning the variable to use for the Tabu Search metaheuristic.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01367" > routing.h:1368< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0e23be986e4c3b96a50c8798aa5f536d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d" > operations_research::RoutingModel::AddSearchMonitor< / a > < / div > < div class = "ttdeci" > void AddSearchMonitor(SearchMonitor *const monitor)< / div > < div class = "ttdoc" > Adds a search monitor to the search used to solve the routing model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03107" > routing.cc:3107< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a0f38add802397fef1f57b7d90ccd5aef" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a0f38add802397fef1f57b7d90ccd5aef" > operations_research::RoutingModel::nodes< / a > < / div > < div class = "ttdeci" > int nodes() const< / div > < div class = "ttdoc" > Sizes and indices Returns the number of nodes in the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01343" > routing.h:1343< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a1048b3f7ef92f0d7747f93c8586ea1cc" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a1048b3f7ef92f0d7747f93c8586ea1cc" > operations_research::RoutingModel::ArcIsMoreConstrainedThanArc< / a > < / div > < div class = "ttdeci" > bool ArcIsMoreConstrainedThanArc(int64 from, int64 to1, int64 to2)< / div > < div class = "ttdoc" > Returns whether the arc from-> to1 is more constrained than from-> to2, taking into account,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03972" > routing.cc:3972< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a1156fa8214dba09e2a2a94862244aa1f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f" > operations_research::RoutingModel::AddLocalSearchOperator< / a > < / div > < div class = "ttdeci" > void AddLocalSearchOperator(LocalSearchOperator *ls_operator)< / div > < div class = "ttdoc" > Adds a local search operator to the set of operators used to solve the vehicle routing problem.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01781" > routing.cc:1781< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a12e98c90493eed1ffd6dba61eeb719a3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a12e98c90493eed1ffd6dba61eeb719a3" > operations_research::RoutingModel::ReadAssignmentFromRoutes< / a > < / div > < div class = "ttdeci" > Assignment * ReadAssignmentFromRoutes(const std::vector< std::vector< int64 > > & routes, bool ignore_inactive_indices)< / div > < div class = "ttdoc" > Restores the routes as the current solution.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03789" > routing.cc:3789< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a1739a41268c21cfc401d870f05b93536" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a1739a41268c21cfc401d870f05b93536" > operations_research::RoutingModel::AddVariableTargetToFinalizer< / a > < / div > < div class = "ttdeci" > void AddVariableTargetToFinalizer(IntVar *var, int64 target)< / div > < div class = "ttdoc" > Add a variable to set the closest possible to the target value in the solution finalizer.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05569" > routing.cc:5569< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a1dc8d32892f78532c8ee7a7186158e07" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a1dc8d32892f78532c8ee7a7186158e07" > operations_research::RoutingModel::End< / a > < / div > < div class = "ttdeci" > int64 End(int vehicle) const< / div > < div class = "ttdoc" > Returns the variable index of the ending node of a vehicle route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01182" > routing.h:1182< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a1e783e12fa9a756c3f96ef9bb09cb972" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972" > operations_research::RoutingModel::GetPairIndicesOfType< / a > < / div > < div class = "ttdeci" > const std::vector< int > & GetPairIndicesOfType(int type) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04083" > routing.cc:4083< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a204041e5264282d54dfd198011e776d3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3" > operations_research::RoutingModel::TransitCallback1< / a > < / div > < div class = "ttdeci" > RoutingTransitCallback1 TransitCallback1< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00242" > routing.h:242< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a20e9006ff9b8dc8ce89a8239a092b0c7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7" > operations_research::RoutingModel::GetTemporalTypeIncompatibilitiesOfType< / a > < / div > < div class = "ttdeci" > const absl::flat_hash_set< int > & GetTemporalTypeIncompatibilitiesOfType(int type) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04129" > routing.cc:4129< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a23c20278f29df4b683b589958ab3a187" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a23c20278f29df4b683b589958ab3a187" > operations_research::RoutingModel::AddPickupAndDelivery< / a > < / div > < div class = "ttdeci" > void AddPickupAndDelivery(int64 pickup, int64 delivery)< / div > < div class = "ttdoc" > Notifies that index1 and index2 form a pair of nodes which should belong to the same route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01671" > routing.cc:1671< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a25d079aaf52ffdf6d547384b523ff018" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018" > operations_research::RoutingModel::DebugOutputAssignment< / a > < / div > < div class = "ttdeci" > std::string DebugOutputAssignment(const Assignment & solution_assignment, const std::string & dimension_to_print) const< / div > < div class = "ttdoc" > Print some debugging information about an assignment, including the feasible intervals of the CumulVa...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04241" > routing.cc:4241< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a2c5397c69eec560d911892a7c1642bdd" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd" > operations_research::RoutingModel::GetRequiredTypeAlternativesWhenRemovingType< / a > < / div > < div class = "ttdeci" > const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenRemovingType(int type) const< / div > < div class = "ttdoc" > Returns the set of requirement alternatives when removing the given type.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04218" > routing.cc:4218< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a32bba655accbd7dc8e23d30bf679b880" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a32bba655accbd7dc8e23d30bf679b880" > operations_research::RoutingModel::GetCostClassIndexOfVehicle< / a > < / div > < div class = "ttdeci" > CostClassIndex GetCostClassIndexOfVehicle(int64 vehicle) const< / div > < div class = "ttdoc" > Get the cost class index of the given vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01251" > routing.h:1251< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a34ab0d5fa45360b5e6a42b9a78cfe5a8" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8" > operations_research::RoutingModel::GetVehicleClassesCount< / a > < / div > < div class = "ttdeci" > int GetVehicleClassesCount() const< / div > < div class = "ttdoc" > Returns the number of different vehicle classes in the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01278" > routing.h:1278< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a351611d23877598dbf426f4235b68112" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112" > operations_research::RoutingModel::GetPickupAndDeliveryPolicyOfVehicle< / a > < / div > < div class = "ttdeci" > PickupAndDeliveryPolicy GetPickupAndDeliveryPolicyOfVehicle(int vehicle) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01734" > routing.cc:1734< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a354dd8c252cf59b748602b342db6019d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a354dd8c252cf59b748602b342db6019d" > operations_research::RoutingModel::Size< / a > < / div > < div class = "ttdeci" > int64 Size() const< / div > < div class = "ttdoc" > Returns the number of next variables in the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01347" > routing.h:1347< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a3600327c657a0c83430d7bd9566e9ab6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a3600327c657a0c83430d7bd9566e9ab6" > operations_research::RoutingModel::UnperformedPenalty< / a > < / div > < div class = "ttdeci" > int64 UnperformedPenalty(int64 var_index) const< / div > < div class = "ttdoc" > Get the " unperformed" penalty of a node.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04224" > routing.cc:4224< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a3656e594d89a44fb6b35ba8f2d395624" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624" > operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles< / a > < / div > < div class = "ttdeci" > void SetPickupAndDeliveryPolicyOfAllVehicles(PickupAndDeliveryPolicy policy)< / div > < div class = "ttdoc" > Sets the Pickup and delivery policy of all vehicles.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01725" > routing.cc:1725< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a3d81f16de798be60f56cf03cd9b907cf" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf" > operations_research::RoutingModel::ReadAssignment< / a > < / div > < div class = "ttdeci" > Assignment * ReadAssignment(const std::string & file_name)< / div > < div class = "ttdoc" > Reads an assignment from a file and returns the current solution.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03646" > routing.cc:3646< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a3ea07f9778e02e7160c30bfb0f08736b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b" > operations_research::RoutingModel::CompactAssignment< / a > < / div > < div class = "ttdeci" > Assignment * CompactAssignment(const Assignment & assignment) const< / div > < div class = "ttdoc" > Returns a compacted version of the given assignment, in which all vehicles with id lower or equal to ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03503" > routing.cc:3503< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a410f7da30cf944b7874eebe57eebe41a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a410f7da30cf944b7874eebe57eebe41a" > operations_research::RoutingModel::ApplyLocksToAllVehicles< / a > < / div > < div class = "ttdeci" > bool ApplyLocksToAllVehicles(const std::vector< std::vector< int64 > > & locks, bool close_routes)< / div > < div class = "ttdoc" > Applies lock chains to all vehicles to the next search, such that locks[p] is the lock chain for rout...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03615" > routing.cc:3615< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a422ce2898045c53fc90d21d8633d4af7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7" > operations_research::RoutingModel::RegisterStateDependentTransitCallback< / a > < / div > < div class = "ttdeci" > int RegisterStateDependentTransitCallback(VariableIndexEvaluator2 callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00851" > routing.cc:851< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a437ae499bef0aa64f2753166a000f5bd" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd" > operations_research::RoutingModel::AddToAssignment< / a > < / div > < div class = "ttdeci" > void AddToAssignment(IntVar *const var)< / div > < div class = "ttdoc" > Adds an extra variable to the vehicle routing assignment.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05590" > routing.cc:5590< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a43c49fc1660ae71cdb30ae93bcac80d7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a43c49fc1660ae71cdb30ae93bcac80d7" > operations_research::RoutingModel::IsVehicleAllowedForIndex< / a > < / div > < div class = "ttdeci" > bool IsVehicleAllowedForIndex(int vehicle, int64 index)< / div > < div class = "ttdoc" > Returns true if a vehicle is allowed to visit a given node.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00694" > routing.h:694< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a44afcc03d5cb68c01acefa253de9edcf" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a44afcc03d5cb68c01acefa253de9edcf" > operations_research::RoutingModel::UnaryTransitCallbackOrNull< / a > < / div > < div class = "ttdeci" > const TransitCallback1 & UnaryTransitCallbackOrNull(int callback_index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00417" > routing.h:417< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a46a69d9769aa92122c7e5e20f49e3da3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a46a69d9769aa92122c7e5e20f49e3da3" > operations_research::RoutingModel::Next< / a > < / div > < div class = "ttdeci" > int64 Next(const Assignment & assignment, int64 index) const< / div > < div class = "ttdoc" > Assignment inspection Returns the variable index of the node directly after the node corresponding to...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03910" > routing.cc:3910< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a4768ba91c34c542eddec212a68d79473" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473" > operations_research::RoutingModel::AddVariableMinimizedByFinalizer< / a > < / div > < div class = "ttdeci" > void AddVariableMinimizedByFinalizer(IntVar *var)< / div > < div class = "ttdoc" > Adds a variable to minimize in the solution finalizer.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05580" > routing.cc:5580< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059" > operations_research::RoutingModel::VisitTypePolicy< / a > < / div > < div class = "ttdeci" > VisitTypePolicy< / div > < div class = "ttdoc" > Set the node visit types and incompatibilities/requirements between the types (see below).< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00773" > routing.h:773< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a" > operations_research::RoutingModel::TYPE_ADDED_TO_VEHICLE< / a > < / div > < div class = "ttdeci" > @ TYPE_ADDED_TO_VEHICLE< / div > < div class = "ttdoc" > When visited, the number of types 'T' on the vehicle increases by one.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00775" > routing.h:775< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab" > operations_research::RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE< / a > < / div > < div class = "ttdeci" > @ ADDED_TYPE_REMOVED_FROM_VEHICLE< / div > < div class = "ttdoc" > When visited, one instance of type 'T' previously added to the route (TYPE_ADDED_TO_VEHICLE),...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00780" > routing.h:780< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1" > operations_research::RoutingModel::TYPE_ON_VEHICLE_UP_TO_VISIT< / a > < / div > < div class = "ttdeci" > @ TYPE_ON_VEHICLE_UP_TO_VISIT< / div > < div class = "ttdoc" > With the following policy, the visit enforces that type 'T' is considered on the route from its start...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00783" > routing.h:783< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7" > operations_research::RoutingModel::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / a > < / div > < div class = "ttdeci" > @ TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED< / div > < div class = "ttdoc" > The visit doesn't have an impact on the number of types 'T' on the route, as it's (virtually) added a...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00789" > routing.h:788< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a496abfcf54eb77d6a82dc03954ee527d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a496abfcf54eb77d6a82dc03954ee527d" > operations_research::RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity< / a > < / div > < div class = "ttdeci" > bool AddDimensionDependentDimensionWithVehicleCapacity(const std::vector< int > & pure_transits, const std::vector< int > & dependent_transits, const RoutingDimension *base_dimension, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdoc" > Creates a dimension with transits depending on the cumuls of another dimension.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00510" > routing.h:510< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a4aaace80d8b54b0314f29ae619c627b4" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a4aaace80d8b54b0314f29ae619c627b4" > operations_research::RoutingModel::MakeStateDependentTransit< / a > < / div > < div class = "ttdeci" > static RoutingModel::StateDependentTransit MakeStateDependentTransit(const std::function< int64(int64)> & f, int64 domain_start, int64 domain_end)< / div > < div class = "ttdoc" > Creates a cached StateDependentTransit from an std::function.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01111" > routing.cc:1111< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a4bab641f5b9bf8de266adad29558b4c2" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a4bab641f5b9bf8de266adad29558b4c2" > operations_research::RoutingModel::GetFixedCostOfVehicle< / a > < / div > < div class = "ttdeci" > int64 GetFixedCostOfVehicle(int vehicle) const< / div > < div class = "ttdoc" > Returns the route fixed cost taken into account if the route of the vehicle is not empty,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01210" > routing.cc:1210< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a4e8f5b5f090cf084347eda6eb803813a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a4e8f5b5f090cf084347eda6eb803813a" > operations_research::RoutingModel::SetFixedCostOfVehicle< / a > < / div > < div class = "ttdeci" > void SetFixedCostOfVehicle(int64 cost, int vehicle)< / div > < div class = "ttdoc" > Sets the fixed cost of one vehicle route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01215" > routing.cc:1215< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a4ffedcd1ce5dc6b224edff0b417aad5c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c" > operations_research::RoutingModel::MakePathSpansAndTotalSlacks< / a > < / div > < div class = "ttdeci" > Constraint * MakePathSpansAndTotalSlacks(const RoutingDimension *dimension, std::vector< IntVar * > spans, std::vector< IntVar * > total_slacks)< / div > < div class = "ttdoc" > For every vehicle of the routing model:< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05927" > routing.cc:5927< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a50ba9dd11704e0be7edaa9e9f24142ff" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff" > operations_research::RoutingModel::RoutingDimension< / a > < / div > < div class = "ttdeci" > friend class RoutingDimension< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01936" > routing.h:1936< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a50dd6fccc1cca84aa10efc8f3ece396c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a50dd6fccc1cca84aa10efc8f3ece396c" > operations_research::RoutingModel::GetArcCostForVehicle< / a > < / div > < div class = "ttdeci" > int64 GetArcCostForVehicle(int64 from_index, int64 to_index, int64 vehicle) const< / div > < div class = "ttdoc" > Returns the cost of the transit arc between two nodes for a given vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03918" > routing.cc:3918< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a54dbca44a148f9d6d37d4938d686b838" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838" > operations_research::RoutingModel::GetMutableLocalCumulOptimizer< / a > < / div > < div class = "ttdeci" > LocalDimensionCumulOptimizer * GetMutableLocalCumulOptimizer(const RoutingDimension & dimension) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01142" > routing.cc:1142< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a56d36a8ace500aa67983ea7cbf4e97e7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7" > operations_research::RoutingModel::GetSameVehicleRequiredTypeAlternativesOfType< / a > < / div > < div class = "ttdeci" > const std::vector< absl::flat_hash_set< int > > & GetSameVehicleRequiredTypeAlternativesOfType(int type) const< / div > < div class = "ttdoc" > Returns the set of same-vehicle requirement alternatives for the given type.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04203" > routing.cc:4203< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a57cfea273f9a4d2bacc0cc1e626cb3e1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1" > operations_research::RoutingModel::GetMutableDimension< / a > < / div > < div class = "ttdeci" > RoutingDimension * GetMutableDimension(const std::string & dimension_name) const< / div > < div class = "ttdoc" > Returns a dimension from its name.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01181" > routing.cc:1181< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a5b629ec63dd2723180eaaf6668a9f118" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a5b629ec63dd2723180eaaf6668a9f118" > operations_research::RoutingModel::GetRoutesFromAssignment< / a > < / div > < div class = "ttdeci" > std::vector< std::vector< int64 > > GetRoutesFromAssignment(const Assignment & assignment)< / div > < div class = "ttdoc" > Converts the solution in the given assignment to routes for all vehicles.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03836" > routing.cc:3836< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a5e3f4c6871f7b2c67fd5b1ad6c94d891" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891" > operations_research::RoutingModel::HasTemporalTypeRequirements< / a > < / div > < div class = "ttdeci" > bool HasTemporalTypeRequirements() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00870" > routing.h:870< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a5f32c22c620c811754ba7b6f977db864" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a5f32c22c620c811754ba7b6f977db864" > operations_research::RoutingModel::solver< / a > < / div > < div class = "ttdeci" > Solver * solver() const< / div > < div class = "ttdoc" > Returns the underlying constraint solver.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01327" > routing.h:1327< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a5f404ec17ed0917a6ac3711ac53e60f1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1" > operations_research::RoutingModel::AddPickupAndDeliverySets< / a > < / div > < div class = "ttdeci" > void AddPickupAndDeliverySets(DisjunctionIndex pickup_disjunction, DisjunctionIndex delivery_disjunction)< / div > < div class = "ttdoc" > Same as AddPickupAndDelivery but notifying that the performed node from the disjunction of index 'pic...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01676" > routing.cc:1676< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a5fa8aee5b0c67072dbbb03f1899ec60a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a" > operations_research::RoutingModel::TransitCallback2< / a > < / div > < div class = "ttdeci" > RoutingTransitCallback2 TransitCallback2< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00243" > routing.h:243< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a635aac580cbeb4bcde72c9464f33ac06" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a635aac580cbeb4bcde72c9464f33ac06" > operations_research::RoutingModel::GetDimensions< / a > < / div > < div class = "ttdeci" > const std::vector< RoutingDimension * > & GetDimensions() const< / div > < div class = "ttdoc" > Returns all dimensions of the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00559" > routing.h:559< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a644ab247b579b93e9a3b1ecd96ba415c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c" > operations_research::RoutingModel::GetAllDimensionNames< / a > < / div > < div class = "ttdeci" > std::vector< std::string > GetAllDimensionNames() const< / div > < div class = "ttdoc" > Outputs the names of all dimensions added to the routing engine.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01121" > routing.cc:1121< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a6569b0ea25fa25c91c2b8b63bedeacc6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a6569b0ea25fa25c91c2b8b63bedeacc6" > operations_research::RoutingModel::GetArcCostForFirstSolution< / a > < / div > < div class = "ttdeci" > int64 GetArcCostForFirstSolution(int64 from_index, int64 to_index) const< / div > < div class = "ttdoc" > Returns the cost of the arc in the context of the first solution strategy.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03939" > routing.cc:3939< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a66b87fec514d648c751ad9d4df09d05b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a66b87fec514d648c751ad9d4df09d05b" > operations_research::RoutingModel::AddDimensionWithVehicleTransits< / a > < / div > < div class = "ttdeci" > bool AddDimensionWithVehicleTransits(const std::vector< int > & evaluator_indices, int64 slack_max, int64 capacity, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00885" > routing.cc:885< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a66fb44c05f9875685e9c332fbdfb643b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a66fb44c05f9875685e9c332fbdfb643b" > operations_research::RoutingModel::NextVar< / a > < / div > < div class = "ttdeci" > IntVar * NextVar(int64 index) const< / div > < div class = "ttdoc" > !defined(SWIGPYTHON)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01207" > routing.h:1207< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a6719229c28ba88ce65968989bb85616b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a6719229c28ba88ce65968989bb85616b" > operations_research::RoutingModel::VariableIndexEvaluator2< / a > < / div > < div class = "ttdeci" > std::function< StateDependentTransit(int64, int64)> VariableIndexEvaluator2< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00269" > routing.h:269< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a674ab7782c46ba72034c73932b1dbd38" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38" > operations_research::RoutingModel::SolveFromAssignmentWithParameters< / a > < / div > < div class = "ttdeci" > const Assignment * SolveFromAssignmentWithParameters(const Assignment *assignment, const RoutingSearchParameters & search_parameters, std::vector< const Assignment * > *solutions=nullptr)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03201" > routing.cc:3201< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e" > operations_research::RoutingModel::ROUTING_SUCCESS< / a > < / div > < div class = "ttdeci" > @ ROUTING_SUCCESS< / div > < div class = "ttdoc" > Problem solved successfully after calling RoutingModel::Solve().< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00220" > routing.h:220< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd" > operations_research::RoutingModel::ROUTING_FAIL< / a > < / div > < div class = "ttdeci" > @ ROUTING_FAIL< / div > < div class = "ttdoc" > No solution found to the problem after calling RoutingModel::Solve().< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00222" > routing.h:222< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b" > operations_research::RoutingModel::ROUTING_INVALID< / a > < / div > < div class = "ttdeci" > @ ROUTING_INVALID< / div > < div class = "ttdoc" > Model, model parameters or flags are not valid.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00227" > routing.h:226< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3" > operations_research::RoutingModel::ROUTING_FAIL_TIMEOUT< / a > < / div > < div class = "ttdeci" > @ ROUTING_FAIL_TIMEOUT< / div > < div class = "ttdoc" > Time limit reached before finding a solution with RoutingModel::Solve().< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00224" > routing.h:224< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a6e0fb2d4d5bbda1cad6bf795152cbe13" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13" > operations_research::RoutingModel::GetDimensionsWithSoftOrSpanCosts< / a > < / div > < div class = "ttdeci" > std::vector< RoutingDimension * > GetDimensionsWithSoftOrSpanCosts() const< / div > < div class = "ttdoc" > Returns dimensions with soft or vehicle span costs.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04996" > routing.cc:4996< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a7086a908f1890a7e1550c97b774e6384" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384" > operations_research::RoutingModel::AddTemporalTypeIncompatibility< / a > < / div > < div class = "ttdeci" > void AddTemporalTypeIncompatibility(int type1, int type2)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04112" > routing.cc:4112< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a70ae4458698c8e4089af40c5d15cfdf3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a70ae4458698c8e4089af40c5d15cfdf3" > operations_research::RoutingModel::GetPerfectBinaryDisjunctions< / a > < / div > < div class = "ttdeci" > std::vector< std::pair< int64, int64 > > GetPerfectBinaryDisjunctions() const< / div > < div class = "ttdoc" > Returns the list of all perfect binary disjunctions, as pairs of variable indices: a disjunction is " ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01591" > routing.cc:1591< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a71815ec83f6605bddb11578ebb835aae" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a71815ec83f6605bddb11578ebb835aae" > operations_research::RoutingModel::sweep_arranger< / a > < / div > < div class = "ttdeci" > SweepArranger * sweep_arranger() const< / div > < div class = "ttdoc" > Returns the sweep arranger to be used by routing heuristics.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01162" > routing.h:1162< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a72d627d4d3da5f1b59256eb9ebf503b5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5" > operations_research::RoutingModel::GetSingleNodesOfType< / a > < / div > < div class = "ttdeci" > const std::vector< int > & GetSingleNodesOfType(int type) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04078" > routing.cc:4078< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a77320442b8568aad01f668c2f9eb6f07" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a77320442b8568aad01f668c2f9eb6f07" > operations_research::RoutingModel::SetVisitType< / a > < / div > < div class = "ttdeci" > void SetVisitType(int64 index, int type, VisitTypePolicy type_policy)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04065" > routing.cc:4065< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a780dc49f977070d8f061d82550b8ca82" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82" > operations_research::RoutingModel::GetRequiredTypeAlternativesWhenAddingType< / a > < / div > < div class = "ttdeci" > const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenAddingType(int type) const< / div > < div class = "ttdoc" > Returns the set of requirement alternatives when adding the given type.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04211" > routing.cc:4211< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a78f7f1cb8b08b7ec1d477a14447bd8d4" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a78f7f1cb8b08b7ec1d477a14447bd8d4" > operations_research::RoutingModel::RoutesToAssignment< / a > < / div > < div class = "ttdeci" > bool RoutesToAssignment(const std::vector< std::vector< int64 > > & routes, bool ignore_inactive_indices, bool close_routes, Assignment *const assignment) const< / div > < div class = "ttdoc" > Fills an assignment from a specification of the routes of the vehicles.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03677" > routing.cc:3677< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a796b4eed03ed53bbbaed642f4ae94952" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952" > operations_research::RoutingModel::AddHardTypeIncompatibility< / a > < / div > < div class = "ttdeci" > void AddHardTypeIncompatibility(int type1, int type2)< / div > < div class = "ttdoc" > Incompatibilities: Two nodes with " hard" incompatible types cannot share the same route at all,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04103" > routing.cc:4103< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a7a8e134df97e40d1fc498f7f985c33ec" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a7a8e134df97e40d1fc498f7f985c33ec" > operations_research::RoutingModel::GetVehicleClassIndexOfVehicle< / a > < / div > < div class = "ttdeci" > VehicleClassIndex GetVehicleClassIndexOfVehicle(int64 vehicle) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01273" > routing.h:1273< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a7dd3d77b26ddfc5e981637ee8b83c1ed" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed" > operations_research::RoutingModel::RegisterPositiveUnaryTransitCallback< / a > < / div > < div class = "ttdeci" > int RegisterPositiveUnaryTransitCallback(TransitCallback1 callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00810" > routing.cc:810< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a7e2d405cde11bc4a08d752d0e669912c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c" > operations_research::RoutingModel::SetTabuVarsCallback< / a > < / div > < div class = "ttdeci" > void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05476" > routing.cc:5476< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a822458cc9a9a6fa02e86af3e3a1e5c89" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89" > operations_research::RoutingModel::CloseVisitTypes< / a > < / div > < div class = "ttdeci" > void CloseVisitTypes()< / div > < div class = "ttdoc" > This function should be called once all node visit types have been set and prior to adding any incomp...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04094" > routing.cc:4094< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8969bceed6043461feec372d8324b14d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8969bceed6043461feec372d8324b14d" > operations_research::RoutingModel::AddVectorDimension< / a > < / div > < div class = "ttdeci" > std::pair< int, bool > AddVectorDimension(std::vector< int64 > values, int64 capacity, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdoc" > Creates a dimension where the transit variable is constrained to be equal to 'values[i]' for node i; ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00963" > routing.cc:963< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a89b2c610c22a3223f1cac10233d7992d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a89b2c610c22a3223f1cac10233d7992d" > operations_research::RoutingModel::GetDisjunctionIndices< / a > < / div > < div class = "ttdeci" > const std::vector< DisjunctionIndex > & GetDisjunctionIndices(int64 index) const< / div > < div class = "ttdoc" > Returns the indices of the disjunctions to which an index belongs.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00631" > routing.h:631< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a89db28c1da47c5aef8a0aa380a1800ec" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a89db28c1da47c5aef8a0aa380a1800ec" > operations_research::RoutingModel::kNoPenalty< / a > < / div > < div class = "ttdeci" > static const int64 kNoPenalty< / div > < div class = "ttdoc" > Constant used to express a hard constraint instead of a soft penalty.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00384" > routing.h:384< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8b9a513f402e84f4c71436cf430f248a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a" > operations_research::RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero< / a > < / div > < div class = "ttdeci" > void IgnoreDisjunctionsAlreadyForcedToZero()< / div > < div class = "ttdoc" > SPECIAL: Makes the solver ignore all the disjunctions whose active variables are all trivially zero (...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01608" > routing.cc:1608< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8bd5bf6b0d1d0c1c5e2470c5f4882a62" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62" > operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfVehicle< / a > < / div > < div class = "ttdeci" > void SetPickupAndDeliveryPolicyOfVehicle(PickupAndDeliveryPolicy policy, int vehicle)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01719" > routing.cc:1719< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8c5267a8f35e062c163b61bcae31857b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b" > operations_research::RoutingModel::SolveWithParameters< / a > < / div > < div class = "ttdeci" > const Assignment * SolveWithParameters(const RoutingSearchParameters & search_parameters, std::vector< const Assignment * > *solutions=nullptr)< / div > < div class = "ttdoc" > Solves the current routing model with the given parameters.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03136" > routing.cc:3136< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8c58bbbfc090a581f02d76fabf465b3e" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e" > operations_research::RoutingModel::RegisterTransitCallback< / a > < / div > < div class = "ttdeci" > int RegisterTransitCallback(TransitCallback2 callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00818" > routing.cc:818< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a8cded3d3d6746c179a8ec0eddad24342" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a8cded3d3d6746c179a8ec0eddad24342" > operations_research::RoutingModel::VehicleVar< / a > < / div > < div class = "ttdeci" > IntVar * VehicleVar(int64 index) const< / div > < div class = "ttdoc" > Returns the vehicle variable of the node corresponding to index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01222" > routing.h:1222< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a90c35f02b0901acc9822020297e313e7" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7" > operations_research::RoutingModel::PackCumulsOfOptimizerDimensionsFromAssignment< / a > < / div > < div class = "ttdeci" > const Assignment * PackCumulsOfOptimizerDimensionsFromAssignment(const Assignment *original_assignment, absl::Duration duration_limit)< / div > < div class = "ttdoc" > For every dimension in the model with an optimizer in local/global_dimension_optimizers_,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00390" > routing.cc:390< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a92d7882c311f7d9d0c55c4def34150dd" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a92d7882c311f7d9d0c55c4def34150dd" > operations_research::RoutingModel::GetArcCostForClass< / a > < / div > < div class = "ttdeci" > int64 GetArcCostForClass(int64 from_index, int64 to_index, int64 cost_class_index) const< / div > < div class = "ttdoc" > Returns the cost of the segment between two nodes for a given cost class.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03928" > routing.cc:3928< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a939aa2ef2afec0337b0f9d4dcb1c2db8" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a939aa2ef2afec0337b0f9d4dcb1c2db8" > operations_research::RoutingModel::AddWeightedVariableMinimizedByFinalizer< / a > < / div > < div class = "ttdeci" > void AddWeightedVariableMinimizedByFinalizer(IntVar *var, int64 cost)< / div > < div class = "ttdoc" > Adds a variable to minimize in the solution finalizer, with a weighted priority: the higher the more ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05556" > routing.cc:5556< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a95886cce213f51091399427b4728a6b2" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a95886cce213f51091399427b4728a6b2" > operations_research::RoutingModel::GetVisitType< / a > < / div > < div class = "ttdeci" > int GetVisitType(int64 index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04073" > routing.cc:4073< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a966f3010581e2a82e0b1e550667d8bce" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce" > operations_research::RoutingModel::DimensionIndex< / a > < / div > < div class = "ttdeci" > RoutingDimensionIndex DimensionIndex< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00239" > routing.h:239< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a97d152b7049084186342b719eee6fa15" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a97d152b7049084186342b719eee6fa15" > operations_research::RoutingModel::AssignmentToRoutes< / a > < / div > < div class = "ttdeci" > void AssignmentToRoutes(const Assignment & assignment, std::vector< std::vector< int64 > > *const routes) const< / div > < div class = "ttdoc" > Converts the solution in the given assignment to routes for all vehicles.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03802" > routing.cc:3802< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a994bcaa8b63247dee303d91f75b4a88c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a994bcaa8b63247dee303d91f75b4a88c" > operations_research::RoutingModel::AddMatrixDimension< / a > < / div > < div class = "ttdeci" > std::pair< int, bool > AddMatrixDimension(std::vector< std::vector< int64 > > values, int64 capacity, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdoc" > Creates a dimension where the transit variable is constrained to be equal to 'values[i][next(i)]' for...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00972" > routing.cc:972< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a9986c84a6cab9f2f14b2b6c13432367b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a9986c84a6cab9f2f14b2b6c13432367b" > operations_research::RoutingModel::ApplyLocks< / a > < / div > < div class = "ttdeci" > IntVar * ApplyLocks(const std::vector< int64 > & locks)< / div > < div class = "ttdoc" > Applies a lock chain to the next search.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03594" > routing.cc:3594< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a99abd877fd9b2325d408f30ec8b38e48" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a99abd877fd9b2325d408f30ec8b38e48" > operations_research::RoutingModel::AddDisjunction< / a > < / div > < div class = "ttdeci" > DisjunctionIndex AddDisjunction(const std::vector< int64 > & indices, int64 penalty=kNoPenalty, int64 max_cardinality=1)< / div > < div class = "ttdoc" > Adds a disjunction constraint on the indices: exactly 'max_cardinality' of the indices are active.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01575" > routing.cc:1575< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a9a9f45350da93a613c6226f7d09d4353" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353" > operations_research::RoutingModel::CompactAndCheckAssignment< / a > < / div > < div class = "ttdeci" > Assignment * CompactAndCheckAssignment(const Assignment & assignment) const< / div > < div class = "ttdoc" > Same as CompactAssignment() but also checks the validity of the final compact solution; if it is not ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03508" > routing.cc:3508< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a9b09ef1fec581652f66de933154b78e4" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a9b09ef1fec581652f66de933154b78e4" > operations_research::RoutingModel::AddSoftSameVehicleConstraint< / a > < / div > < div class = "ttdeci" > void AddSoftSameVehicleConstraint(const std::vector< int64 > & indices, int64 cost)< / div > < div class = "ttdoc" > Adds a soft constraint to force a set of variable indices to be on the same vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01650" > routing.cc:1650< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a9b9a92ffb451f19ec773b0543b3f2497" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497" > operations_research::RoutingModel::GetMutableLocalCumulMPOptimizer< / a > < / div > < div class = "ttdeci" > LocalDimensionCumulOptimizer * GetMutableLocalCumulMPOptimizer(const RoutingDimension & dimension) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01154" > routing.cc:1154< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_a9c58894df747f5498c335a3a8c5c0c88" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#a9c58894df747f5498c335a3a8c5c0c88" > operations_research::RoutingModel::HasHardTypeIncompatibilities< / a > < / div > < div class = "ttdeci" > bool HasHardTypeIncompatibilities() const< / div > < div class = "ttdoc" > Returns true iff any hard (resp.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00822" > routing.h:822< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa11b7e0480c2cfed29972adef0d3fa74" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74" > operations_research::RoutingModel::AddRequiredTypeAlternativesWhenRemovingType< / a > < / div > < div class = "ttdeci" > void AddRequiredTypeAlternativesWhenRemovingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)< / div > < div class = "ttdoc" > The following requirements apply when visiting dependent nodes that remove their type from the route,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04180" > routing.cc:4180< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa1bbc9c58d70daeb04078ea9c9b5dca9" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa1bbc9c58d70daeb04078ea9c9b5dca9" > operations_research::RoutingModel::GetCumulBounds< / a > < / div > < div class = "ttdeci" > std::vector< std::vector< std::pair< int64, int64 > > > GetCumulBounds(const Assignment & solution_assignment, const RoutingDimension & dimension)< / div > < div class = "ttdoc" > Returns a vector cumul_bounds, for which cumul_bounds[i][j] is a pair containing the minimum and maxi...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04314" > routing.cc:4314< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa241abc19460575d250a5788f03afbf6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa241abc19460575d250a5788f03afbf6" > operations_research::RoutingModel::GetHomogeneousCost< / a > < / div > < div class = "ttdeci" > int64 GetHomogeneousCost(int64 from_index, int64 to_index) const< / div > < div class = "ttdoc" > Returns the cost of the segment between two nodes supposing all vehicle costs are the same (returns t...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01236" > routing.h:1236< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa540a1068aef75c041330a2eafccd623" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623" > operations_research::RoutingModel::RegisterPositiveTransitCallback< / a > < / div > < div class = "ttdeci" > int RegisterPositiveTransitCallback(TransitCallback2 callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00844" > routing.cc:844< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83" > operations_research::RoutingModel::PickupAndDeliveryPolicy< / a > < / div > < div class = "ttdeci" > PickupAndDeliveryPolicy< / div > < div class = "ttdoc" > Types of precedence policy applied to pickup and delivery pairs.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00230" > routing.h:230< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8" > operations_research::RoutingModel::PICKUP_AND_DELIVERY_LIFO< / a > < / div > < div class = "ttdeci" > @ PICKUP_AND_DELIVERY_LIFO< / div > < div class = "ttdoc" > Deliveries must be performed in reverse order of pickups.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00234" > routing.h:234< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955" > operations_research::RoutingModel::PICKUP_AND_DELIVERY_NO_ORDER< / a > < / div > < div class = "ttdeci" > @ PICKUP_AND_DELIVERY_NO_ORDER< / div > < div class = "ttdoc" > Any precedence is accepted.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00232" > routing.h:232< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a" > operations_research::RoutingModel::PICKUP_AND_DELIVERY_FIFO< / a > < / div > < div class = "ttdeci" > @ PICKUP_AND_DELIVERY_FIFO< / div > < div class = "ttdoc" > Deliveries must be performed in the same order as pickups.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00237" > routing.h:236< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa79f8d482de4dd0ef86a1b54999686af" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af" > operations_research::RoutingModel::CloseModelWithParameters< / a > < / div > < div class = "ttdeci" > void CloseModelWithParameters(const RoutingSearchParameters & search_parameters)< / div > < div class = "ttdoc" > Same as above taking search parameters (as of 10/2015 some the parameters have to be set when closing...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02062" > routing.cc:2062< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aa9e7ba89833775f29889744fe9480d29" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29" > operations_research::RoutingModel::vehicles< / a > < / div > < div class = "ttdeci" > int vehicles() const< / div > < div class = "ttdoc" > Returns the number of vehicle routes in the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01345" > routing.h:1345< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aabdcf3bd412a5a61d811ef85e115e5ff" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff" > operations_research::RoutingModel::AddVariableMaximizedByFinalizer< / a > < / div > < div class = "ttdeci" > void AddVariableMaximizedByFinalizer(IntVar *var)< / div > < div class = "ttdoc" > Adds a variable to maximize in the solution finalizer (see above for information on the solution fina...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05576" > routing.cc:5576< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aad154b31953d2b467bbac3e4ac696cd6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aad154b31953d2b467bbac3e4ac696cd6" > operations_research::RoutingModel::Nexts< / a > < / div > < div class = "ttdeci" > const std::vector< IntVar * > & Nexts() const< / div > < div class = "ttdoc" > Returns all next variables of the model, such that Nexts(i) is the next variable of the node correspo...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01200" > routing.h:1200< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab313d84a56c5e9b1b8f28da70b8d4045" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045" > operations_research::RoutingModel::HasTypeRegulations< / a > < / div > < div class = "ttdeci" > bool HasTypeRegulations() const< / div > < div class = "ttdoc" > Returns true iff the model has any incompatibilities or requirements set on node types.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00876" > routing.h:876< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab6aae3927f3537c446ac33f2c6ecb922" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922" > operations_research::RoutingModel::VehicleClassIndex< / a > < / div > < div class = "ttdeci" > RoutingVehicleClassIndex VehicleClassIndex< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00241" > routing.h:241< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab6f52a34eec59c1b1895d960ff446af1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab6f52a34eec59c1b1895d960ff446af1" > operations_research::RoutingModel::RegisterUnaryTransitVector< / a > < / div > < div class = "ttdeci" > int RegisterUnaryTransitVector(std::vector< int64 > values)< / div > < div class = "ttdoc" > Registers 'callback' and returns its index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00772" > routing.cc:772< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab76cd57b0490eb4253fd1bf792e23f16" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab76cd57b0490eb4253fd1bf792e23f16" > operations_research::RoutingModel::AddDimension< / a > < / div > < div class = "ttdeci" > bool AddDimension(int evaluator_index, int64 slack_max, int64 capacity, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdoc" > Model creation.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00875" > routing.cc:875< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab878a81ace850e3ecd26e95966409f61" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61" > operations_research::RoutingModel::AddIntervalToAssignment< / a > < / div > < div class = "ttdeci" > void AddIntervalToAssignment(IntervalVar *const interval)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l05594" > routing.cc:5594< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ab8d61705aa4291d2cd437ba0a7dfccbf" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf" > operations_research::RoutingModel::SetArcCostEvaluatorOfAllVehicles< / a > < / div > < div class = "ttdeci" > void SetArcCostEvaluatorOfAllVehicles(int evaluator_index)< / div > < div class = "ttdoc" > Sets the cost function of the model such that the cost of a segment of a route between node 'from' an...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01190" > routing.cc:1190< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aba87f36c7b4e0bdd5e4e8e334b3e27fa" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aba87f36c7b4e0bdd5e4e8e334b3e27fa" > operations_research::RoutingModel::SetAmortizedCostFactorsOfAllVehicles< / a > < / div > < div class = "ttdeci" > void SetAmortizedCostFactorsOfAllVehicles(int64 linear_cost_factor, int64 quadratic_cost_factor)< / div > < div class = "ttdoc" > The following methods set the linear and quadratic cost factors of vehicles (must be positive values)...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01221" > routing.cc:1221< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_abac1ff6e7eaa5e1ec6e86e726cce3d90" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90" > operations_research::RoutingModel::GetMutableGlobalCumulOptimizer< / a > < / div > < div class = "ttdeci" > GlobalDimensionCumulOptimizer * GetMutableGlobalCumulOptimizer(const RoutingDimension & dimension) const< / div > < div class = "ttdoc" > Returns the global/local dimension cumul optimizer for a given dimension, or nullptr if there is none...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01130" > routing.cc:1130< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_abc101a64a3c876dcdf1b7176d59bd2c9" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#abc101a64a3c876dcdf1b7176d59bd2c9" > operations_research::RoutingModel::HasSameVehicleTypeRequirements< / a > < / div > < div class = "ttdeci" > bool HasSameVehicleTypeRequirements() const< / div > < div class = "ttdoc" > Returns true iff any same-route (resp.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00867" > routing.h:867< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_abcbe77312783c0a5aa4926ace764533b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#abcbe77312783c0a5aa4926ace764533b" > operations_research::RoutingModel::CostVar< / a > < / div > < div class = "ttdeci" > IntVar * CostVar() const< / div > < div class = "ttdoc" > Returns the global cost variable which is being minimized.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01224" > routing.h:1224< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac0772bdc4f47e45edccd5a5c25154993" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac0772bdc4f47e45edccd5a5c25154993" > operations_research::RoutingModel::StateDependentTransitCallback< / a > < / div > < div class = "ttdeci" > const VariableIndexEvaluator2 & StateDependentTransitCallback(int callback_index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00421" > routing.h:421< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac1a2ab630f6b13644ca6853c7893f413" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413" > operations_research::RoutingModel::SetAssignmentFromOtherModelAssignment< / a > < / div > < div class = "ttdeci" > void SetAssignmentFromOtherModelAssignment(Assignment *target_assignment, const RoutingModel *source_model, const Assignment *source_assignment)< / div > < div class = "ttdoc" > Given a " source_model" and its " source_assignment" , resets " target_assignment" with the IntVar variab...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03321" > routing.cc:3321< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac22e9cfd1fbf1b4af4f8a9be46ec88a1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1" > operations_research::RoutingModel::AddSameVehicleRequiredTypeAlternatives< / a > < / div > < div class = "ttdeci" > void AddSameVehicleRequiredTypeAlternatives(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)< / div > < div class = "ttdoc" > Requirements: NOTE: As of 2019-04, cycles in the requirement graph are not supported,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04137" > routing.cc:4137< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac26167700ef3e2bf5e595e2150d1f895" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895" > operations_research::RoutingModel::GetHardTypeIncompatibilitiesOfType< / a > < / div > < div class = "ttdeci" > const absl::flat_hash_set< int > & GetHardTypeIncompatibilitiesOfType(int type) const< / div > < div class = "ttdoc" > Returns visit types incompatible with a given type.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04122" > routing.cc:4122< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac3eda2d546d3908c490fda5cea849a8d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac3eda2d546d3908c490fda5cea849a8d" > operations_research::RoutingModel::RegisterTransitMatrix< / a > < / div > < div class = "ttdeci" > int RegisterTransitMatrix(std::vector< std::vector< int64 > > values)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00791" > routing.cc:791< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ac8347e84488d1b5eb7b5e6972fb32be3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ac8347e84488d1b5eb7b5e6972fb32be3" > operations_research::RoutingModel::IsMatchingModel< / a > < / div > < div class = "ttdeci" > bool IsMatchingModel() const< / div > < div class = "ttdoc" > Returns true if a vehicle/node matching problem is detected.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__flow_8cc_source.html#l00034" > routing_flow.cc:34< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aca85cf6d63540a9ed592a1d7b3236d2d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aca85cf6d63540a9ed592a1d7b3236d2d" > operations_research::RoutingModel::AddDimensionWithVehicleCapacity< / a > < / div > < div class = "ttdeci" > bool AddDimensionWithVehicleCapacity(int evaluator_index, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string & name)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00894" > routing.cc:894< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_acbab635c68d8a6e0961afae0f606590b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b" > operations_research::RoutingModel::RegisterUnaryTransitCallback< / a > < / div > < div class = "ttdeci" > int RegisterUnaryTransitCallback(TransitCallback1 callback)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00783" > routing.cc:783< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_acbdbdfc9491ef0586459d38cc5ef4cb8" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#acbdbdfc9491ef0586459d38cc5ef4cb8" > operations_research::RoutingModel::Start< / a > < / div > < div class = "ttdeci" > int64 Start(int vehicle) const< / div > < div class = "ttdoc" > Model inspection.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01180" > routing.h:1180< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_acca75b5d3bfe2433c5805b049815f533" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#acca75b5d3bfe2433c5805b049815f533" > operations_research::RoutingModel::GetDepot< / a > < / div > < div class = "ttdeci" > int64 GetDepot() const< / div > < div class = "ttdoc" > Returns the variable index of the first starting or ending node of all routes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01785" > routing.cc:1785< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_acfcef421e8c8cd243157543f741d6a73" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73" > operations_research::RoutingModel::WriteAssignment< / a > < / div > < div class = "ttdeci" > bool WriteAssignment(const std::string & file_name) const< / div > < div class = "ttdoc" > Writes the current solution to a file containing an AssignmentProto.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03637" > routing.cc:3637< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad13ad202092298b43c9099b212c54d3d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d" > operations_research::RoutingModel::CostClassIndex< / a > < / div > < div class = "ttdeci" > RoutingCostClassIndex CostClassIndex< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00238" > routing.h:238< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad19492313b68e5a963af3793aaec8d90" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad19492313b68e5a963af3793aaec8d90" > operations_research::RoutingModel::HasTemporalTypeIncompatibilities< / a > < / div > < div class = "ttdeci" > bool HasTemporalTypeIncompatibilities() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00825" > routing.h:825< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad3b144985c2b4b24cf39b839dbd9c16d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d" > operations_research::RoutingModel::GetCostClassesCount< / a > < / div > < div class = "ttdeci" > int GetCostClassesCount() const< / div > < div class = "ttdoc" > Returns the number of different cost classes in the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01268" > routing.h:1268< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad558398f8c75f81d879f74d18ba5e7c3" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad558398f8c75f81d879f74d18ba5e7c3" > operations_research::RoutingModel::TransitCallback< / a > < / div > < div class = "ttdeci" > const TransitCallback2 & TransitCallback(int callback_index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00413" > routing.h:413< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad62f14646fa4da5b6836a2ae505706d2" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2" > operations_research::RoutingModel::GetNumOfSingletonNodes< / a > < / div > < div class = "ttdeci" > int GetNumOfSingletonNodes() const< / div > < div class = "ttdoc" > Returns the number of non-start/end nodes which do not appear in a pickup/delivery pair.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01739" > routing.cc:1739< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ad7dbf1150b65fa6495a6cf4a6ab9dd3b" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b" > operations_research::RoutingModel::AddRequiredTypeAlternativesWhenAddingType< / a > < / div > < div class = "ttdeci" > void AddRequiredTypeAlternativesWhenAddingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)< / div > < div class = "ttdoc" > If type_D depends on type_R when adding type_D, any node_D of type_D and VisitTypePolicy TYPE_ADDED_T...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04159" > routing.cc:4159< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_adca8397d2ad8dfc3bcd2a768bf3e12a2" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2" > operations_research::RoutingModel::~RoutingModel< / a > < / div > < div class = "ttdeci" > ~RoutingModel()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00738" > routing.cc:738< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_add71470f4175a0859e6e3d69c2a53988" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988" > operations_research::RoutingModel::CloseModel< / a > < / div > < div class = "ttdeci" > void CloseModel()< / div > < div class = "ttdoc" > Closes the current routing model; after this method is called, no modification to the model can be do...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01884" > routing.cc:1884< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae00630e36d2d8a2fa7eb4743a65e80d1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1" > operations_research::RoutingModel::kNoDimension< / a > < / div > < div class = "ttdeci" > static const DimensionIndex kNoDimension< / div > < div class = "ttdoc" > Constant used to express the " no dimension" index, returned when a dimension name does not correspond...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00392" > routing.h:392< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae0c21c6d4e99cb309b8b298d280e4853" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853" > operations_research::RoutingModel::CostsAreHomogeneousAcrossVehicles< / a > < / div > < div class = "ttdeci" > bool CostsAreHomogeneousAcrossVehicles() const< / div > < div class = "ttdoc" > Whether costs are homogeneous across all vehicles.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01231" > routing.h:1231< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae1acdfe3dcf892d108d2a2ecab94e936" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae1acdfe3dcf892d108d2a2ecab94e936" > operations_research::RoutingModel::SetAmortizedCostFactorsOfVehicle< / a > < / div > < div class = "ttdeci" > void SetAmortizedCostFactorsOfVehicle(int64 linear_cost_factor, int64 quadratic_cost_factor, int vehicle)< / div > < div class = "ttdoc" > Sets the linear and quadratic cost factor of the given vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01229" > routing.cc:1229< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae1adbc353c105572655ae866124c61b6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae1adbc353c105572655ae866124c61b6" > operations_research::RoutingModel::IsStart< / a > < / div > < div class = "ttdeci" > bool IsStart(int64 index) const< / div > < div class = "ttdoc" > Returns true if 'index' represents the first node of a route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03896" > routing.cc:3896< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae2530e17cabaf267e12929ca0ee1bee0" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae2530e17cabaf267e12929ca0ee1bee0" > operations_research::RoutingModel::IsEnd< / a > < / div > < div class = "ttdeci" > bool IsEnd(int64 index) const< / div > < div class = "ttdoc" > Returns true if 'index' represents the last node of a route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01186" > routing.h:1186< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae3bb9f7055b5dabd24e2ea7c6a377a6a" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a" > operations_research::RoutingModel::Solve< / a > < / div > < div class = "ttdeci" > const Assignment * Solve(const Assignment *assignment=nullptr)< / div > < div class = "ttdoc" > Solves the current routing model; closes the current model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03131" > routing.cc:3131< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae5a61ca8a5a897aa6c4ce5c466e8f45f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f" > operations_research::RoutingModel::kNoDisjunction< / a > < / div > < div class = "ttdeci" > static const DisjunctionIndex kNoDisjunction< / div > < div class = "ttdoc" > Constant used to express the " no disjunction" index, returned when a node does not appear in any disj...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00388" > routing.h:388< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae75d9f49c157b7784fc8baa7d623ee35" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35" > operations_research::RoutingModel::SetArcCostEvaluatorOfVehicle< / a > < / div > < div class = "ttdeci" > void SetArcCostEvaluatorOfVehicle(int evaluator_index, int vehicle)< / div > < div class = "ttdoc" > Sets the cost function for a given vehicle route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01197" > routing.cc:1197< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae82492179600550970bd0b0dccf0b3f1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae82492179600550970bd0b0dccf0b3f1" > operations_research::RoutingModel::GetPickupIndexPairs< / a > < / div > < div class = "ttdeci" > const std::vector< std::pair< int, int > > & GetPickupIndexPairs(int64 node_index) const< / div > < div class = "ttdoc" > Returns pairs for which the node is a pickup; the first element of each pair is the index in the pick...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01707" > routing.cc:1707< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae8364b53d49a5b46e994d41124c4ffd6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae8364b53d49a5b46e994d41124c4ffd6" > operations_research::RoutingModel::UnperformedPenaltyOrValue< / a > < / div > < div class = "ttdeci" > int64 UnperformedPenaltyOrValue(int64 default_value, int64 var_index) const< / div > < div class = "ttdoc" > Same as above except that it returns default_value instead of 0 when penalty is not well defined (def...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04228" > routing.cc:4228< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_ae9b2404a26ab1e6acf562b8261eeba38" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#ae9b2404a26ab1e6acf562b8261eeba38" > operations_research::RoutingModel::ComputeLowerBound< / a > < / div > < div class = "ttdeci" > int64 ComputeLowerBound()< / div > < div class = "ttdoc" > Computes a lower bound to the routing problem solving a linear assignment problem.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03359" > routing.cc:3359< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aea90b377b2cc45917a08d519be784009" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009" > operations_research::RoutingModel::HasDimension< / a > < / div > < div class = "ttdeci" > bool HasDimension(const std::string & dimension_name) const< / div > < div class = "ttdoc" > Returns true if a dimension exists for a given dimension name.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01166" > routing.cc:1166< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aedb8dca94b15e5465fef1667d1a81db6" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6" > operations_research::RoutingModel::IsVehicleUsed< / a > < / div > < div class = "ttdeci" > bool IsVehicleUsed(const Assignment & assignment, int vehicle) const< / div > < div class = "ttdoc" > Returns true if the route of 'vehicle' is non empty in 'assignment'.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03900" > routing.cc:3900< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aefff345740a5db07caea065ec14ec52f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aefff345740a5db07caea065ec14ec52f" > operations_research::RoutingModel::GetNumberOfRejectsInFirstSolution< / a > < / div > < div class = "ttdeci" > int64 GetNumberOfRejectsInFirstSolution(const RoutingSearchParameters & search_parameters) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03629" > routing.cc:3629< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_af12674b693b7b7cfe271e5b066e10bff" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff" > operations_research::RoutingModel::RoutingModel< / a > < / div > < div class = "ttdeci" > RoutingModel(const RoutingIndexManager & index_manager)< / div > < div class = "ttdoc" > Constructor taking an index manager.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00645" > routing.cc:645< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_afa7cbbd4db2dd5d0bec3393efc9ebac1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1" > operations_research::RoutingModel::DisjunctionIndex< / a > < / div > < div class = "ttdeci" > RoutingDisjunctionIndex DisjunctionIndex< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00240" > routing.h:240< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_afad671d4876daa753d520bf2adceafbd" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#afad671d4876daa753d520bf2adceafbd" > operations_research::RoutingModel::GetDeliveryIndexPairs< / a > < / div > < div class = "ttdeci" > const std::vector< std::pair< int, int > > & GetDeliveryIndexPairs(int64 node_index) const< / div > < div class = "ttdoc" > Same as above for deliveries.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01713" > routing.cc:1713< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_afadc1348f0318e9bc8cebb75b2fc4234" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#afadc1348f0318e9bc8cebb75b2fc4234" > operations_research::RoutingModel::ActiveVar< / a > < / div > < div class = "ttdeci" > IntVar * ActiveVar(int64 index) const< / div > < div class = "ttdoc" > Returns the active variable of the node corresponding to index.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01209" > routing.h:1209< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_afb44a005674a48ac88da66f7c9b7b000" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#afb44a005674a48ac88da66f7c9b7b000" > operations_research::RoutingModel::GetVisitTypePolicy< / a > < / div > < div class = "ttdeci" > VisitTypePolicy GetVisitTypePolicy(int64 index) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04088" > routing.cc:4088< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_afdd0e9e72af498399358bd22c591ae5c" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#afdd0e9e72af498399358bd22c591ae5c" > operations_research::RoutingModel::SetAllowedVehiclesForIndex< / a > < / div > < div class = "ttdeci" > void SetAllowedVehiclesForIndex(const std::vector< int > & vehicles, int64 index)< / div > < div class = "ttdoc" > Sets the vehicles which can visit a given node.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01662" > routing.cc:1662< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_html_aff7724c6a1de20cd5369108e3db5fc76" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76" > operations_research::RoutingModel::GetDimensionOrDie< / a > < / div > < div class = "ttdeci" > const RoutingDimension & GetDimensionOrDie(const std::string & dimension_name) const< / div > < div class = "ttdoc" > Returns a dimension from its name. Dies if the dimension does not exist.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01176" > routing.cc:1176< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html" > operations_research::RoutingModelInspector< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01888" > routing.cc:1888< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_a0523ce908e2fa6b2958084a5b05a88c1" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1" > operations_research::RoutingModelInspector::RoutingModelInspector< / a > < / div > < div class = "ttdeci" > RoutingModelInspector(RoutingModel *model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01890" > routing.cc:1890< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_a8ed69e6d44dd4141c434a1784120382f" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f" > operations_research::RoutingModelInspector::EndVisitConstraint< / a > < / div > < div class = "ttdeci" > void EndVisitConstraint(const std::string & type_name, const Constraint *const constraint) override< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01918" > routing.cc:1918< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_a93b849189eca7118a5db04c2fe8aa901" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901" > operations_research::RoutingModelInspector::EndVisitModel< / a > < / div > < div class = "ttdeci" > void EndVisitModel(const std::string & solver_name) override< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01906" > routing.cc:1906< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_a98cecd8eead2c232b65629ea0abb43e5" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5" > operations_research::RoutingModelInspector::~RoutingModelInspector< / a > < / div > < div class = "ttdeci" > ~RoutingModelInspector() override< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01905" > routing.cc:1905< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_aa1998d48caaa0f39dd647267356ffcb9" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#aa1998d48caaa0f39dd647267356ffcb9" > operations_research::RoutingModelInspector::VisitIntegerArrayArgument< / a > < / div > < div class = "ttdeci" > void VisitIntegerArrayArgument(const std::string & arg_name, const std::vector< int64 > & values) override< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01927" > routing.cc:1927< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_inspector_html_adee845e0e33b4eb085f916eb47246eaa" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa" > operations_research::RoutingModelInspector::VisitIntegerExpressionArgument< / a > < / div > < div class = "ttdeci" > void VisitIntegerExpressionArgument(const std::string & type_name, IntExpr *const expr) override< / div > < div class = "ttdoc" > Visit integer expression argument.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01922" > routing.cc:1922< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_visitor_html_a0ce138792ec79a561f17dd17b2c0610d" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d" > operations_research::RoutingModelVisitor::kLightElement2< / a > < / div > < div class = "ttdeci" > static const char kLightElement2[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01947" > routing.h:1947< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_visitor_html_a22cceffdff8afb41f5d2422ed014d4d0" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0" > operations_research::RoutingModelVisitor::kRemoveValues< / a > < / div > < div class = "ttdeci" > static const char kRemoveValues[]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01948" > routing.h:1948< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_routing_model_visitor_html_a3408a1e02997042597b7499dad0cb343" > < div class = "ttname" > < a href = "classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343" > operations_research::RoutingModelVisitor::kLightElement< / a > < / div > < div class = "ttdeci" > static const char kLightElement[]< / div > < div class = "ttdoc" > Constraint types.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l01946" > routing.h:1946< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_search_monitor_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_search_monitor.html" > operations_research::SearchMonitor< / a > < / div > < div class = "ttdoc" > A search monitor is a simple set of callbacks to monitor all search events.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03635" > constraint_solver.h:3635< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_solution_collector_html_a5aeabb40e6e7550c805534764b3076fa" > < div class = "ttname" > < a href = "classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa" > operations_research::SolutionCollector::solution_count< / a > < / div > < div class = "ttdeci" > int solution_count() const< / div > < div class = "ttdoc" > Returns how many solutions were stored during the search.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "search_8cc_source.html#l02325" > search.cc:2325< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_solution_collector_html_a97be81e7520315f04f648537dd06bff5" > < div class = "ttname" > < a href = "classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5" > operations_research::SolutionCollector::solution< / a > < / div > < div class = "ttdeci" > Assignment * solution(int n) const< / div > < div class = "ttdoc" > Returns the nth solution.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "search_8cc_source.html#l02320" > search.cc:2320< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html" > operations_research::Solver< / a > < / div > < div class = "ttdoc" > Solver Class.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00253" > constraint_solver.h:253< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a0239c8843ea9e89736f6146c27bf71bf" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a0239c8843ea9e89736f6146c27bf71bf" > operations_research::Solver::MakeElement< / a > < / div > < div class = "ttdeci" > IntExpr * MakeElement(const std::vector< int64 > & values, IntVar *const index)< / div > < div class = "ttdoc" > values[index]< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "element_8cc_source.html#l00647" > element.cc:647< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a2085a8965de86fa4cf3aa76331331372" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372" > operations_research::Solver::MakeEquality< / a > < / div > < div class = "ttdeci" > Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)< / div > < div class = "ttdoc" > left == right< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "range__cst_8cc_source.html#l00512" > range_cst.cc:512< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a3094f1982f455fd97342c64b7c0b3ccf" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a3094f1982f455fd97342c64b7c0b3ccf" > operations_research::Solver::VariableValueComparator< / a > < / div > < div class = "ttdeci" > std::function< bool(int64, int64, int64)> VariableValueComparator< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00756" > constraint_solver.h:756< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886" > operations_research::Solver::ASSIGN_MIN_VALUE< / a > < / div > < div class = "ttdeci" > @ ASSIGN_MIN_VALUE< / div > < div class = "ttdoc" > Selects the min value of the selected variable.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00363" > constraint_solver.h:363< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a5931080c9bfda8dedfef0e3adf313ab3" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3" > operations_research::Solver::AddConstraint< / a > < / div > < div class = "ttdeci" > void AddConstraint(Constraint *const c)< / div > < div class = "ttdoc" > Adds the constraint 'c' to the model.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l01657" > constraint_solver.cc:1657< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a" > operations_research::Solver::FULLPATHLNS< / a > < / div > < div class = "ttdeci" > @ FULLPATHLNS< / div > < div class = "ttdoc" > Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00538" > constraint_solver.h:538< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704" > operations_research::Solver::OROPT< / a > < / div > < div class = "ttdeci" > @ OROPT< / div > < div class = "ttdoc" > Relocate: OROPT and RELOCATE.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00460" > constraint_solver.h:460< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3" > operations_research::Solver::PATHLNS< / a > < / div > < div class = "ttdeci" > @ PATHLNS< / div > < div class = "ttdoc" > Operator which relaxes two sub-chains of three consecutive arcs each.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00534" > constraint_solver.h:534< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408" > operations_research::Solver::UNACTIVELNS< / a > < / div > < div class = "ttdeci" > @ UNACTIVELNS< / div > < div class = "ttdoc" > Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00543" > constraint_solver.h:543< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1" > operations_research::Solver::CHOOSE_STATIC_GLOBAL_BEST< / a > < / div > < div class = "ttdeci" > @ CHOOSE_STATIC_GLOBAL_BEST< / div > < div class = "ttdoc" > Pairs are compared at the first call of the selector, and results are cached.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00400" > constraint_solver.h:400< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a934e08f84e590e48ab860fcd97ca7130" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a934e08f84e590e48ab860fcd97ca7130" > operations_research::Solver::MakeMax< / a > < / div > < div class = "ttdeci" > IntExpr * MakeMax(const std::vector< IntVar * > & vars)< / div > < div class = "ttdoc" > std::max(vars)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expr__array_8cc_source.html#l03321" > expr_array.cc:3321< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_a988e122844528e222326bd327a5d60fd" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#a988e122844528e222326bd327a5d60fd" > operations_research::Solver::MakeDifference< / a > < / div > < div class = "ttdeci" > IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)< / div > < div class = "ttdoc" > left - right< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expressions_8cc_source.html#l06634" > expressions.cc:6634< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_aa9726f5458b77973475a32178fe512b3" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#aa9726f5458b77973475a32178fe512b3" > operations_research::Solver::IndexEvaluator1< / a > < / div > < div class = "ttdeci" > std::function< int64(int64)> IndexEvaluator1< / div > < div class = "ttdoc" > Callback typedefs.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00743" > constraint_solver.h:743< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_aaa825d53a4aec98b8e8d5694b99a0c33" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#aaa825d53a4aec98b8e8d5694b99a0c33" > operations_research::Solver::DefaultSolverParameters< / a > < / div > < div class = "ttdeci" > static ConstraintSolverParameters DefaultSolverParameters()< / div > < div class = "ttdoc" > Create a ConstraintSolverParameters proto with all the default values.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l00118" > constraint_solver.cc:118< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ab741cb25dd32d1cbe02fbfb36337d9bb" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ab741cb25dd32d1cbe02fbfb36337d9bb" > operations_research::Solver::RevAlloc< / a > < / div > < div class = "ttdeci" > T * RevAlloc(T *object)< / div > < div class = "ttdoc" > Registers the given object as being reversible.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00796" > constraint_solver.h:796< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9" > operations_research::Solver::CHOOSE_FIRST_UNBOUND< / a > < / div > < div class = "ttdeci" > @ CHOOSE_FIRST_UNBOUND< / div > < div class = "ttdoc" > Select the first unbound variable.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00284" > constraint_solver.h:284< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d" > operations_research::Solver::CHOOSE_PATH< / a > < / div > < div class = "ttdeci" > @ CHOOSE_PATH< / div > < div class = "ttdoc" > Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00349" > constraint_solver.h:349< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_abb24034fec2804ac3c0172f043087321" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#abb24034fec2804ac3c0172f043087321" > operations_research::Solver::IndexEvaluator2< / a > < / div > < div class = "ttdeci" > std::function< int64(int64, int64)> IndexEvaluator2< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00744" > constraint_solver.h:744< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ac34efc5a32ae3ef481d3c97796ecb899" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ac34efc5a32ae3ef481d3c97796ecb899" > operations_research::Solver::MakeSemiContinuousExpr< / a > < / div > < div class = "ttdeci" > IntExpr * MakeSemiContinuousExpr(IntExpr *const expr, int64 fixed_charge, int64 step)< / div > < div class = "ttdoc" > Semi continuous Expression (x < = 0 -> f(x) = 0; x > 0 -> f(x) = ax + b) a > = 0 and b > = 0.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expressions_8cc_source.html#l07136" > expressions.cc:7136< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ac957f0efc6de9135512f60f80ba36083" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ac957f0efc6de9135512f60f80ba36083" > operations_research::Solver::MakeSum< / a > < / div > < div class = "ttdeci" > IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)< / div > < div class = "ttdoc" > left + right.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expressions_8cc_source.html#l06531" > expressions.cc:6531< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ad45ddc54149c5954c2bbd4e2657f9148" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ad45ddc54149c5954c2bbd4e2657f9148" > operations_research::Solver::MakeAssignment< / a > < / div > < div class = "ttdeci" > Assignment * MakeAssignment()< / div > < div class = "ttdoc" > This method creates an empty assignment.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l01037" > constraint_solver/assignment.cc:1037< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_ae88d696e499f29968ad16dcf587fff50" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50" > operations_research::Solver::MakeProd< / a > < / div > < div class = "ttdeci" > IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)< / div > < div class = "ttdoc" > left * right< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expressions_8cc_source.html#l06836" > expressions.cc:6836< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_aeb92d4addb41255c9732cacfcb54f795" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#aeb92d4addb41255c9732cacfcb54f795" > operations_research::Solver::Fail< / a > < / div > < div class = "ttdeci" > void Fail()< / div > < div class = "ttdoc" > Abandon the current branch in the search tree. A backtrack will follow.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l02416" > constraint_solver.cc:2416< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4" > operations_research::Solver::EvaluatorLocalSearchOperators< / a > < / div > < div class = "ttdeci" > EvaluatorLocalSearchOperators< / div > < div class = "ttdoc" > This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00572" > constraint_solver.h:572< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87" > operations_research::Solver::TSPOPT< / a > < / div > < div class = "ttdeci" > @ TSPOPT< / div > < div class = "ttdoc" > Sliding TSP operator.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00585" > constraint_solver.h:585< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e" > operations_research::Solver::LK< / a > < / div > < div class = "ttdeci" > @ LK< / div > < div class = "ttdoc" > Lin-Kernighan local search.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00577" > constraint_solver.h:577< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1" > operations_research::Solver::TSPLNS< / a > < / div > < div class = "ttdeci" > @ TSPLNS< / div > < div class = "ttdoc" > TSP-base LNS.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00594" > constraint_solver.h:593< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_solver_html_afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61" > < div class = "ttname" > < a href = "classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61" > operations_research::Solver::LE< / a > < / div > < div class = "ttdeci" > @ LE< / div > < div class = "ttdoc" > Move is accepted when the current objective value < = objective.Max.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l00604" > constraint_solver.h:604< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sorted_disjoint_interval_list_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_sorted_disjoint_interval_list.html" > operations_research::SortedDisjointIntervalList< / a > < / div > < div class = "ttdoc" > This class represents a sorted list of disjoint, closed intervals.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sorted__interval__list_8h_source.html#l00390" > sorted_interval_list.h:390< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a1f5c9edc9bee1ec65cb56db1f3ace7e7" > < div class = "ttname" > < a href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a1f5c9edc9bee1ec65cb56db1f3ace7e7" > operations_research::SortedDisjointIntervalList::InsertInterval< / a > < / div > < div class = "ttdeci" > Iterator InsertInterval(int64 start, int64 end)< / div > < div class = "ttdoc" > Adds the interval [start..end] to the list, and merges overlapping or immediately adjacent intervals ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sorted__interval__list_8cc_source.html#l00601" > sorted_interval_list.cc:601< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a69b6e2a03c835ca5d658a1f16acbaa9c" > < div class = "ttname" > < a href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a69b6e2a03c835ca5d658a1f16acbaa9c" > operations_research::SortedDisjointIntervalList::end< / a > < / div > < div class = "ttdeci" > ConstIterator end() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sorted__interval__list_8h_source.html#l00484" > sorted_interval_list.h:484< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a887fa442455fd18cac74b3039e442aeb" > < div class = "ttname" > < a href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#a887fa442455fd18cac74b3039e442aeb" > operations_research::SortedDisjointIntervalList::Iterator< / a > < / div > < div class = "ttdeci" > IntervalSet::iterator Iterator< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sorted__interval__list_8h_source.html#l00398" > sorted_interval_list.h:398< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sorted_disjoint_interval_list_html_ac63f8d1453d2e8d7a2718bf978a88ecd" > < div class = "ttname" > < a href = "classoperations__research_1_1_sorted_disjoint_interval_list.html#ac63f8d1453d2e8d7a2718bf978a88ecd" > operations_research::SortedDisjointIntervalList::FirstIntervalGreaterOrEqual< / a > < / div > < div class = "ttdeci" > Iterator FirstIntervalGreaterOrEqual(int64 value) const< / div > < div class = "ttdoc" > Returns an iterator to either:< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sorted__interval__list_8cc_source.html#l00726" > sorted_interval_list.cc:726< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_arranger_html_a133670b40a6a45c547654d9107a4a603" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_arranger.html#a133670b40a6a45c547654d9107a4a603" > operations_research::SweepArranger::ArrangeIndices< / a > < / div > < div class = "ttdeci" > void ArrangeIndices(std::vector< int64 > *indices)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02986" > routing.cc:2986< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_arranger_html_a3dfcea8a02b5d4ec8576e41859e92b28" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_arranger.html#a3dfcea8a02b5d4ec8576e41859e92b28" > operations_research::SweepArranger::SweepArranger< / a > < / div > < div class = "ttdeci" > SweepArranger(const std::vector< std::pair< int64, int64 > > & points)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02976" > routing.cc:2976< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_arranger_html_abdec0f71a4b3263e9ed49e1d2b4726f2" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_arranger.html#abdec0f71a4b3263e9ed49e1d2b4726f2" > operations_research::SweepArranger::SetSectors< / a > < / div > < div class = "ttdeci" > void SetSectors(int sectors)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02874" > routing.h:2874< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_builder_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_builder.html" > operations_research::SweepBuilder< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03026" > routing.cc:3026< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_builder_html_a0353fa7a09f5b17b37b1e9bf933fc48b" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_builder.html#a0353fa7a09f5b17b37b1e9bf933fc48b" > operations_research::SweepBuilder::~SweepBuilder< / a > < / div > < div class = "ttdeci" > ~SweepBuilder() override< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03030" > routing.cc:3030< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_builder_html_a5251132b6ab1df4f1ccd864f239f1d9b" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_builder.html#a5251132b6ab1df4f1ccd864f239f1d9b" > operations_research::SweepBuilder::Next< / a > < / div > < div class = "ttdeci" > Decision * Next(Solver *const solver) override< / div > < div class = "ttdoc" > This is the main method of the decision builder class.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03032" > routing.cc:3032< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_sweep_builder_html_a8a7ce510e251b4fa2533fec825773e97" > < div class = "ttname" > < a href = "classoperations__research_1_1_sweep_builder.html#a8a7ce510e251b4fa2533fec825773e97" > operations_research::SweepBuilder::SweepBuilder< / a > < / div > < div class = "ttdeci" > SweepBuilder(RoutingModel *const model, bool check_assignment)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l03028" > routing.cc:3028< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_incompatibility_checker_html_a0e62f00f807fac1ac7e9d14e00fb8394" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394" > operations_research::TypeIncompatibilityChecker::TypeIncompatibilityChecker< / a > < / div > < div class = "ttdeci" > TypeIncompatibilityChecker(const RoutingModel & model, bool check_hard_incompatibilities)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06310" > routing.cc:6310< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html" > operations_research::TypeRegulationsChecker< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02160" > routing.h:2160< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a1698ad93b76ebfc58a0e1a2771e4b75c" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a1698ad93b76ebfc58a0e1a2771e4b75c" > operations_research::TypeRegulationsChecker::HasRegulationsToCheck< / a > < / div > < div class = "ttdeci" > virtual bool HasRegulationsToCheck() const =0< / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a4d6ef97994588af94176c027b321bcb6" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a4d6ef97994588af94176c027b321bcb6" > operations_research::TypeRegulationsChecker::CheckTypeRegulations< / a > < / div > < div class = "ttdeci" > virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos)=0< / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a68fa0aaa5c8d8dbead32a6b04463722e" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a68fa0aaa5c8d8dbead32a6b04463722e" > operations_research::TypeRegulationsChecker::CheckVehicle< / a > < / div > < div class = "ttdeci" > bool CheckVehicle(int vehicle, const std::function< int64(int64)> & next_accessor)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06228" > routing.cc:6228< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a72ee439843f75a7dc189962f5561ad97" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a72ee439843f75a7dc189962f5561ad97" > operations_research::TypeRegulationsChecker::OnInitializeCheck< / a > < / div > < div class = "ttdeci" > virtual void OnInitializeCheck()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02206" > routing.h:2206< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a7745da6edcf25f61956a75b5bb3a7080" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080" > operations_research::TypeRegulationsChecker::TypeRegulationsChecker< / a > < / div > < div class = "ttdeci" > TypeRegulationsChecker(const RoutingModel & model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06225" > routing.cc:6225< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_a7a699c6ed63d424d0c3c322eb7161ace" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#a7a699c6ed63d424d0c3c322eb7161ace" > operations_research::TypeRegulationsChecker::FinalizeCheck< / a > < / div > < div class = "ttdeci" > virtual bool FinalizeCheck() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02210" > routing.h:2210< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_ae8ea938d5980cf2079ded7ea1dcd38e7" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7" > operations_research::TypeRegulationsChecker::TypeCurrentlyOnRoute< / a > < / div > < div class = "ttdeci" > bool TypeCurrentlyOnRoute(int type, int pos) const< / div > < div class = "ttdoc" > Returns true iff there's at least one instance of the given type on the route when scanning the route...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06303" > routing.cc:6303< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_aeb246ac61d4eadd6abf6dbdb6ce134f5" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5" > operations_research::TypeRegulationsChecker::model_< / a > < / div > < div class = "ttdeci" > const RoutingModel & model_< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02212" > routing.h:2212< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_af0019df09332cbcb2c4f37bc30d9a055" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#af0019df09332cbcb2c4f37bc30d9a055" > operations_research::TypeRegulationsChecker::InitializeCheck< / a > < / div > < div class = "ttdeci" > void InitializeCheck(int vehicle, const std::function< int64(int64)> & next_accessor)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06272" > routing.cc:6272< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_checker_html_afcb22d4d3273e1f4153f851e1bddf417" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417" > operations_research::TypeRegulationsChecker::TypeOccursOnRoute< / a > < / div > < div class = "ttdeci" > bool TypeOccursOnRoute(int type) const< / div > < div class = "ttdoc" > Returns true iff any occurrence of the given type was seen on the route, i.e.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06297" > routing.cc:6297< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_constraint_html" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_constraint.html" > operations_research::TypeRegulationsConstraint< / a > < / div > < div class = "ttdoc" > The following constraint ensures that incompatibilities and requirements between types are respected.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02300" > routing.h:2300< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_constraint_html_a19d94d32f3bde30deeebb883c6f71f84" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84" > operations_research::TypeRegulationsConstraint::Post< / a > < / div > < div class = "ttdeci" > void Post() override< / div > < div class = "ttdoc" > This method is called when the constraint is processed by the solver.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06450" > routing.cc:6450< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_constraint_html_a36d844f2722273b190ed9a069dd25938" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938" > operations_research::TypeRegulationsConstraint::InitialPropagate< / a > < / div > < div class = "ttdeci" > void InitialPropagate() override< / div > < div class = "ttdoc" > This method performs the initial propagation of the constraint.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06465" > routing.cc:6465< / a > < / div > < / div >
< div class = "ttc" id = "aclassoperations__research_1_1_type_regulations_constraint_html_ac45256999b51546027c5f81897ee4b46" > < div class = "ttname" > < a href = "classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46" > operations_research::TypeRegulationsConstraint::TypeRegulationsConstraint< / a > < / div > < div class = "ttdeci" > TypeRegulationsConstraint(const RoutingModel & model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06417" > routing.cc:6417< / a > < / div > < / div >
< div class = "ttc" id = "aclassutil_1_1_base_graph_html_a8a40f2c75615a26ba71e94dd7d42f481" > < div class = "ttname" > < a href = "classutil_1_1_base_graph.html#a8a40f2c75615a26ba71e94dd7d42f481" > util::BaseGraph::AllNodes< / a > < / div > < div class = "ttdeci" > IntegerRange< NodeIndex > AllNodes() const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "graph_8h_source.html#l00935" > graph.h:935< / a > < / div > < / div >
< div class = "ttc" id = "aclassutil_1_1_reverse_arc_list_graph_html" > < div class = "ttname" > < a href = "classutil_1_1_reverse_arc_list_graph.html" > util::ReverseArcListGraph< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "graph_8h_source.html#l00460" > graph.h:461< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "acommandlineflags_8h_html" > < div class = "ttname" > < a href = "commandlineflags_8h.html" > commandlineflags.h< / a > < / div > < / div >
< div class = "ttc" id = "aconnected__components_8h_html" > < div class = "ttname" > < a href = "connected__components_8h.html" > connected_components.h< / a > < / div > < / div >
< div class = "ttc" id = "aconstraint__solver_2table_8cc_html_a344010e26426d6a13411648d988bc9b6" > < div class = "ttname" > < a href = "constraint__solver_2table_8cc.html#a344010e26426d6a13411648d988bc9b6" > b< / a > < / div > < div class = "ttdeci" > int64 b< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2table_8cc_source.html#l00043" > constraint_solver/table.cc:43< / a > < / div > < / div >
< div class = "ttc" id = "aconstraint__solver_2table_8cc_html_af730895c6c6ef6e03caaf6251192dfd2" > < div class = "ttname" > < a href = "constraint__solver_2table_8cc.html#af730895c6c6ef6e03caaf6251192dfd2" > a< / a > < / div > < div class = "ttdeci" > int64 a< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2table_8cc_source.html#l00042" > constraint_solver/table.cc:42< / a > < / div > < / div >
< div class = "ttc" id = "aconstraint__solver_8cc_html_a395f613555f398dd389670bb4c2a4599" > < div class = "ttname" > < a href = "constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599" > next< / a > < / div > < div class = "ttdeci" > Block * next< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8cc_source.html#l00674" > constraint_solver.cc:674< / a > < / div > < / div >
< div class = "ttc" id = "aconstraint__solver_8h_html" > < div class = "ttname" > < a href = "constraint__solver_8h.html" > constraint_solver.h< / a > < / div > < / div >
< div class = "ttc" id = "acp__model__fz__solver_8cc_html_a10a1eab179b472c030bdc2a2efef7219" > < div class = "ttname" > < a href = "cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219" > parameters< / a > < / div > < div class = "ttdeci" > SatParameters parameters< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "cp__model__fz__solver_8cc_source.html#l00108" > cp_model_fz_solver.cc:108< / a > < / div > < / div >
< div class = "ttc" id = "adefault__search_8cc_html_ac673bc430bdc3fdaa09f7becf98ef267" > < div class = "ttname" > < a href = "default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267" > name< / a > < / div > < div class = "ttdeci" > const std::string name< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "default__search_8cc_source.html#l00808" > default_search.cc:808< / a > < / div > < / div >
< div class = "ttc" id = "ademon__profiler_8cc_html_a21edc7ca4cc5802c8779d68556bc09cf" > < div class = "ttname" > < a href = "demon__profiler_8cc.html#a21edc7ca4cc5802c8779d68556bc09cf" > value< / a > < / div > < div class = "ttdeci" > int64 value< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "demon__profiler_8cc_source.html#l00043" > demon_profiler.cc:43< / a > < / div > < / div >
< div class = "ttc" id = "aelement_8cc_html_a2dac2393bef148b7c15723ef0770d558" > < div class = "ttname" > < a href = "element_8cc.html#a2dac2393bef148b7c15723ef0770d558" > expr_< / a > < / div > < div class = "ttdeci" > IntVar *const expr_< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "element_8cc_source.html#l00085" > element.cc:85< / a > < / div > < / div >
< div class = "ttc" id = "aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465" > < div class = "ttname" > < a href = "expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465" > var< / a > < / div > < div class = "ttdeci" > IntVar * var< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "expr__array_8cc_source.html#l01858" > expr_array.cc:1858< / a > < / div > < / div >
< div class = "ttc" id = "agraph__constraints_8cc_html_ada20fc3a4c70c79d8b02df6b8c2413f5" > < div class = "ttname" > < a href = "graph__constraints_8cc.html#ada20fc3a4c70c79d8b02df6b8c2413f5" > cumuls_< / a > < / div > < div class = "ttdeci" > const std::vector< IntVar * > cumuls_< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "graph__constraints_8cc_source.html#l00670" > graph_constraints.cc:670< / a > < / div > < / div >
< div class = "ttc" id = "agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf" > < div class = "ttname" > < a href = "gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf" > model< / a > < / div > < div class = "ttdeci" > GRBmodel * model< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "gurobi__interface_8cc_source.html#l00272" > gurobi_interface.cc:272< / a > < / div > < / div >
< div class = "ttc" id = "agurobi__interface_8cc_html_a6627a3800ac768bb5528ef54c9cace36" > < div class = "ttname" > < a href = "gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36" > callback< / a > < / div > < div class = "ttdeci" > MPCallback * callback< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "gurobi__interface_8cc_source.html#l00513" > gurobi_interface.cc:513< / a > < / div > < / div >
< div class = "ttc" id = "ahash_8h_html" > < div class = "ttname" > < a href = "hash_8h.html" > hash.h< / 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 >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aintegral__types_8h_html_a74ea76ea27f48fb1b6e148e1577b3719" > < div class = "ttname" > < a href = "integral__types_8h.html#a74ea76ea27f48fb1b6e148e1577b3719" > kint64max< / a > < / div > < div class = "ttdeci" > static const int64 kint64max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "integral__types_8h_source.html#l00053" > integral_types.h:53< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "aintegral__types_8h_html_a7cde0074dfd288f2d70c0e035dacb28a" > < div class = "ttname" > < a href = "integral__types_8h.html#a7cde0074dfd288f2d70c0e035dacb28a" > int64< / a > < / div > < div class = "ttdeci" > int64_t int64< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "integral__types_8h_source.html#l00034" > integral_types.h:34< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "aintegral__types_8h_html_af458164b470cbba416d5ed579e00ff60" > < div class = "ttname" > < a href = "integral__types_8h.html#af458164b470cbba416d5ed579e00ff60" > kint64min< / a > < / div > < div class = "ttdeci" > static const int64 kint64min< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "integral__types_8h_source.html#l00052" > integral_types.h:52< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "alinear__assignment_8h_html" > < div class = "ttname" > < a href = "linear__assignment_8h.html" > linear_assignment.h< / a > < / div > < / div >
< div class = "ttc" id = "alog__severity_8h_html_a50e5762f38854b37ee3e2851bc1bb0e7" > < div class = "ttname" > < a href = "log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7" > WARNING< / a > < / div > < div class = "ttdeci" > const int WARNING< / 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 = "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 = "alog__severity_8h_html_ac9bcbe19995a8140cd4ec61773cd6e67" > < div class = "ttname" > < a href = "log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67" > ERROR< / a > < / div > < div class = "ttdeci" > const int ERROR< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "log__severity_8h_source.html#l00032" > log_severity.h:32< / a > < / div > < / div >
< div class = "ttc" id = "alp__data_8h_html" > < div class = "ttname" > < a href = "lp__data_8h.html" > lp_data.h< / a > < / div > < / div >
< div class = "ttc" id = "alp__types_8h_html" > < div class = "ttname" > < a href = "lp__types_8h.html" > lp_types.h< / a > < / div > < / div >
< div class = "ttc" id = "amap__util_8h_html" > < div class = "ttname" > < a href = "map__util_8h.html" > map_util.h< / a > < / div > < / div >
< div class = "ttc" id = "amathutil_8h_html" > < div class = "ttname" > < a href = "mathutil_8h.html" > mathutil.h< / a > < / div > < / div >
< div class = "ttc" id = "amin__cost__flow_8h_html" > < div class = "ttname" > < a href = "min__cost__flow_8h.html" > min_cost_flow.h< / a > < / div > < / div >
2020-09-02 09:42:51 +02:00
< div class = "ttc" id = "anamespaceabsl_html" > < div class = "ttname" > < a href = "namespaceabsl.html" > absl< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "cleanup_8h_source.html#l00022" > cleanup.h:22< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_a4ee3db0c4acaa0f277a0d7006f5ad1e6" > < div class = "ttname" > < a href = "namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6" > gtl::STLDeleteElements< / a > < / div > < div class = "ttdeci" > void STLDeleteElements(T *container)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "stl__util_8h_source.html#l00372" > stl_util.h:372< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespacegtl_html_a5c0d4dea208db4deaa285c06b78d8181" > < div class = "ttname" > < a href = "namespacegtl.html#a5c0d4dea208db4deaa285c06b78d8181" > gtl::InsertOrDie< / a > < / div > < div class = "ttdeci" > void InsertOrDie(Collection *const collection, const typename Collection::value_type & value)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00135" > map_util.h:135< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_a6a4238d2e35cf819a8e83d60d331ea64" > < div class = "ttname" > < a href = "namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64" > gtl::FindCopy< / a > < / div > < div class = "ttdeci" > bool FindCopy(const Collection & collection, const Key & key, Value *const value)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00155" > map_util.h:155< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_a7a0f8dc4187504b814d8a8be463b517c" > < div class = "ttname" > < a href = "namespacegtl.html#a7a0f8dc4187504b814d8a8be463b517c" > gtl::LookupOrInsert< / a > < / div > < div class = "ttdeci" > Collection::value_type::second_type & LookupOrInsert(Collection *const collection, const typename Collection::value_type::first_type & key, const typename Collection::value_type::second_type & value)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00207" > map_util.h:207< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_aae28e97bd1fa93cb0032642550da7455" > < div class = "ttname" > < a href = "namespacegtl.html#aae28e97bd1fa93cb0032642550da7455" > gtl::ContainsKey< / a > < / div > < div class = "ttdeci" > bool ContainsKey(const Collection & collection, const Key & key)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00170" > map_util.h:170< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_ab9e05694d7776f2eef357feca8b9d647" > < div class = "ttname" > < a href = "namespacegtl.html#ab9e05694d7776f2eef357feca8b9d647" > gtl::FindOrNull< / a > < / div > < div class = "ttdeci" > const Collection::value_type::second_type * FindOrNull(const Collection & collection, const typename Collection::value_type::first_type & key)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00041" > map_util.h:41< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_abc18f60961e36340e64e428827c0e38e" > < div class = "ttname" > < a href = "namespacegtl.html#abc18f60961e36340e64e428827c0e38e" > gtl::FindWithDefault< / a > < / div > < div class = "ttdeci" > const Collection::value_type::second_type & FindWithDefault(const Collection & collection, const typename Collection::value_type::first_type & key, const typename Collection::value_type::second_type & value)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00026" > map_util.h:26< / a > < / div > < / div >
< div class = "ttc" id = "anamespacegtl_html_abce27d097bc5680207b294bdad75f59f" > < div class = "ttname" > < a href = "namespacegtl.html#abce27d097bc5680207b294bdad75f59f" > gtl::FindOrDie< / a > < / div > < div class = "ttdeci" > const Collection::value_type::second_type & FindOrDie(const Collection & collection, const typename Collection::value_type::first_type & key)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "map__util_8h_source.html#l00176" > map_util.h:176< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_1_1sat_html_a3f1a1b8a7a1a488e263a2e74f45d2a59" > < div class = "ttname" > < a href = "namespaceoperations__research_1_1sat.html#a3f1a1b8a7a1a488e263a2e74f45d2a59" > operations_research::sat::Value< / a > < / div > < div class = "ttdeci" > std::function< int64(const Model & )> Value(IntegerVariable v)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "integer_8h_source.html#l01487" > integer.h:1487< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html" > < div class = "ttname" > < a href = "namespaceoperations__research.html" > operations_research< / a > < / div > < div class = "ttdoc" > The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "dense__doubly__linked__list_8h_source.html#l00021" > dense_doubly_linked_list.h:21< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a009f247167f32509baf749083e4bc984" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a009f247167f32509baf749083e4bc984" > operations_research::Zero< / a > < / div > < div class = "ttdeci" > int64 Zero()< / div > < div class = "ttdoc" > NOLINT.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03144" > constraint_solver.h:3144< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a082573f2b119f85031afcc6b9096b102" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a082573f2b119f85031afcc6b9096b102" > operations_research::SolveModelWithSat< / a > < / div > < div class = "ttdeci" > bool SolveModelWithSat(const RoutingModel & model, const RoutingSearchParameters & search_parameters, const Assignment *initial_solution, Assignment *solution)< / div > < div class = "ttdoc" > Attempts to solve the model using the cp-sat solver.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__sat_8cc_source.html#l00505" > routing_sat.cc:505< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a0e3e4445c55d0c59ef4edbaf7acbd3a8" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a0e3e4445c55d0c59ef4edbaf7acbd3a8" > operations_research::AppendDimensionCumulFilters< / a > < / div > < div class = "ttdeci" > void AppendDimensionCumulFilters(const std::vector< RoutingDimension * > & dimensions, const RoutingSearchParameters & parameters, bool filter_objective_cost, std::vector< LocalSearchFilterManager::FilterEvent > *filters)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02185" > routing_search.cc:2185< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a11f4a7dbafd8e00a36b892a82e44445f" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a11f4a7dbafd8e00a36b892a82e44445f" > operations_research::MakeDelayedConstraintDemon1< / a > < / div > < div class = "ttdeci" > Demon * MakeDelayedConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string & name, P param1)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00724" > constraint_solveri.h:724< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a228fe84d99348c2b62bb4f70a6371d9b" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a228fe84d99348c2b62bb4f70a6371d9b" > operations_research::CapSub< / a > < / div > < div class = "ttdeci" > int64 CapSub(int64 x, int64 y)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "saturated__arithmetic_8h_source.html#l00154" > saturated_arithmetic.h:154< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a288aa8299841c0561fbe3505220f708a" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a" > operations_research::FirstSolutionStrategy_Value_Value_ARRAYSIZE< / a > < / div > < div class = "ttdeci" > constexpr int FirstSolutionStrategy_Value_Value_ARRAYSIZE< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__enums_8pb_8h_source.html#l00094" > routing_enums.pb.h:94< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a2fb66556abf59bfcf2fc1b87789d2a8e" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a2fb66556abf59bfcf2fc1b87789d2a8e" > operations_research::DefaultRoutingModelParameters< / a > < / div > < div class = "ttdeci" > RoutingModelParameters DefaultRoutingModelParameters()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__parameters_8cc_source.html#l00031" > routing_parameters.cc:31< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_a3ea6af6581e6922832918c97753146a7" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a3ea6af6581e6922832918c97753146a7" > operations_research::MakeConstraintDemon0< / a > < / div > < div class = "ttdeci" > Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string & name)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00525" > constraint_solveri.h:525< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_a447588dfd4d5f539ec22f403e21ca668" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a447588dfd4d5f539ec22f403e21ca668" > operations_research::MakeVehicleBreaksFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeVehicleBreaksFilter(const RoutingModel & routing_model, const RoutingDimension & dimension)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__breaks_8cc_source.html#l01060" > routing_breaks.cc:1060< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a4955428bea2f2202769a58fdd47a126d" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a4955428bea2f2202769a58fdd47a126d" > operations_research::FindErrorInRoutingSearchParameters< / a > < / div > < div class = "ttdeci" > std::string FindErrorInRoutingSearchParameters(const RoutingSearchParameters & search_parameters)< / div > < div class = "ttdoc" > Returns an empty std::string if the routing search parameters are valid, and a non-empty,...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__parameters_8cc_source.html#l00137" > routing_parameters.cc:137< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a4bbb86ef97d259aabe86e0abde4759e3" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a4bbb86ef97d259aabe86e0abde4759e3" > operations_research::MakeVehicleAmortizedCostFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeVehicleAmortizedCostFilter(const RoutingModel & routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l00669" > routing_search.cc:669< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a4fb750da00c784e5ffd1763fd3ce88f7" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a4fb750da00c784e5ffd1763fd3ce88f7" > operations_research::MakeConstraintDemon1< / a > < / div > < div class = "ttdeci" > Demon * MakeConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string & name, P param1)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solveri_8h_source.html#l00566" > constraint_solveri.h:566< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a531a38e3526ca5036724e679f720dfb0" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a531a38e3526ca5036724e679f720dfb0" > operations_research::SweepIndexAngleComparator< / a > < / div > < div class = "ttdeci" > struct operations_research::SweepIndexSortAngle SweepIndexAngleComparator< / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_a57f1befcdc8fc2b6f9741369a1beb136" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136" > operations_research::SetAssignmentFromAssignment< / a > < / div > < div class = "ttdeci" > void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > & target_vars, const Assignment *source_assignment, const std::vector< IntVar * > & source_vars)< / div > < div class = "ttdoc" > NOLINT.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_2assignment_8cc_source.html#l01016" > constraint_solver/assignment.cc:1016< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_a6a24a85a196ecfb2b799a0409ef757c6" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a6a24a85a196ecfb2b799a0409ef757c6" > operations_research::MakeCPFeasibilityFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeCPFeasibilityFilter(RoutingModel *routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02747" > routing_search.cc:2747< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a8627f242a0332f34d29d85b6c57f1224" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a8627f242a0332f34d29d85b6c57f1224" > operations_research::ThoroughHash< / a > < / div > < div class = "ttdeci" > uint64 ThoroughHash(const char *bytes, size_t len)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "thorough__hash_8h_source.html#l00033" > thorough_hash.h:33< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_a99264812cf177270e521f226a5c012c3" > < div class = "ttname" > < a href = "namespaceoperations__research.html#a99264812cf177270e521f226a5c012c3" > operations_research::CapAdd< / a > < / div > < div class = "ttdeci" > int64 CapAdd(int64 x, int64 y)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "saturated__arithmetic_8h_source.html#l00124" > saturated_arithmetic.h:124< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8" > operations_research::DimensionSchedulingStatus< / a > < / div > < div class = "ttdeci" > DimensionSchedulingStatus< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__lp__scheduling_8h_source.html#l00126" > routing_lp_scheduling.h:126< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93" > operations_research::DimensionSchedulingStatus::INFEASIBLE< / a > < / div > < div class = "ttdeci" > @ INFEASIBLE< / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293" > operations_research::DimensionSchedulingStatus::OPTIMAL< / a > < / div > < div class = "ttdeci" > @ OPTIMAL< / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285" > operations_research::DimensionSchedulingStatus::RELAXED_OPTIMAL_ONLY< / a > < / div > < div class = "ttdeci" > @ RELAXED_OPTIMAL_ONLY< / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa2347e154737220869f298587dfb3dc0" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa2347e154737220869f298587dfb3dc0" > operations_research::SweepIndexDistanceComparator< / a > < / div > < div class = "ttdeci" > struct operations_research::SweepIndexSortDistance SweepIndexDistanceComparator< / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa2ef113e19924b88159b114a929b3358" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa2ef113e19924b88159b114a929b3358" > operations_research::MakeMaxActiveVehiclesFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeMaxActiveVehiclesFilter(const RoutingModel & routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l00111" > routing_search.cc:111< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aa96bb5a28dd9c1ccc864b1587e8e1a98" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aa96bb5a28dd9c1ccc864b1587e8e1a98" > operations_research::One< / a > < / div > < div class = "ttdeci" > int64 One()< / div > < div class = "ttdoc" > This method returns 1.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "constraint__solver_8h_source.html#l03147" > constraint_solver.h:3147< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_aad0164bf7f3d748207f45a47495def06" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aad0164bf7f3d748207f45a47495def06" > operations_research::LinkComparator< / a > < / div > < div class = "ttdeci" > struct operations_research::LinkSort LinkComparator< / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0" > operations_research::BOOL_TRUE< / a > < / div > < div class = "ttdeci" > @ BOOL_TRUE< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "optional__boolean_8pb_8h_source.html#l00062" > optional_boolean.pb.h:62< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2" > operations_research::BOOL_FALSE< / a > < / div > < div class = "ttdeci" > @ BOOL_FALSE< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "optional__boolean_8pb_8h_source.html#l00061" > optional_boolean.pb.h:61< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ab216763dccd16f5060d2fbcfb08173fb" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab216763dccd16f5060d2fbcfb08173fb" > operations_research::CapProd< / a > < / div > < div class = "ttdeci" > int64 CapProd(int64 x, int64 y)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "saturated__arithmetic_8h_source.html#l00231" > saturated_arithmetic.h:231< / a > < / div > < / div >
2020-09-02 09:42:51 +02:00
< div class = "ttc" id = "anamespaceoperations__research_html_ab35e9f27307e9c5273c9d77fcf30de0e" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab35e9f27307e9c5273c9d77fcf30de0e" > operations_research::RoutingTransitCallback2< / a > < / div > < div class = "ttdeci" > std::function< int64(int64, int64)> RoutingTransitCallback2< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__types_8h_source.html#l00042" > routing_types.h:42< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_ab59d4ce2b572e1ae576d2aa181433187" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187" > operations_research::DefaultRoutingSearchParameters< / a > < / div > < div class = "ttdeci" > RoutingSearchParameters DefaultRoutingSearchParameters()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__parameters_8cc_source.html#l00044" > routing_parameters.cc:44< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ab962de016b1a14868457ac876eadf008" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ab962de016b1a14868457ac876eadf008" > operations_research::MakeVehicleVarFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeVehicleVarFilter(const RoutingModel & routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02520" > routing_search.cc:2520< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_abec0698c301a7fe57265985e2d30e7c7" > < div class = "ttname" > < a href = "namespaceoperations__research.html#abec0698c301a7fe57265985e2d30e7c7" > operations_research::RoutingTransitCallback1< / a > < / div > < div class = "ttdeci" > std::function< int64(int64)> RoutingTransitCallback1< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__types_8h_source.html#l00041" > routing_types.h:41< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ac888be0894b841a25bb416358c1ae8ef" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ac888be0894b841a25bb416358c1ae8ef" > operations_research::MakeCachedRangeMinMaxIndexFunction< / a > < / div > < div class = "ttdeci" > RangeMinMaxIndexFunction * MakeCachedRangeMinMaxIndexFunction(const std::function< int64(int64)> & f, int64 domain_start, int64 domain_end)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "range__query__function_8cc_source.html#l00222" > range_query_function.cc:222< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_acb92bdbce12d475f965f6db3c5f5b7b5" > < div class = "ttname" > < a href = "namespaceoperations__research.html#acb92bdbce12d475f965f6db3c5f5b7b5" > operations_research::MemoryUsage< / a > < / div > < div class = "ttdeci" > std::string MemoryUsage()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "stats_8cc_source.html#l00025" > stats.cc:25< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ad03cbd2a51a0688c1fd08d3a7c1754c9" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ad03cbd2a51a0688c1fd08d3a7c1754c9" > operations_research::MakePickupDeliveryFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakePickupDeliveryFilter(const RoutingModel & routing_model, const RoutingModel::IndexPairs & pairs, const std::vector< RoutingModel::PickupAndDeliveryPolicy > & vehicle_policies)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02447" > routing_search.cc:2447< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_ad13d20d0a1737677a4757bd6ef8a95b3" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ad13d20d0a1737677a4757bd6ef8a95b3" > operations_research::FillPathEvaluation< / a > < / div > < div class = "ttdeci" > void FillPathEvaluation(const std::vector< int64 > & path, const RoutingModel::TransitCallback2 & evaluator, std::vector< int64 > *values)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l06215" > routing.cc:6215< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_ad90a9fc7d16bb2c98a088a4162bbbc9d" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d" > operations_research::ArcIndex< / a > < / div > < div class = "ttdeci" > int32 ArcIndex< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "ebert__graph_8h_source.html#l00201" > ebert_graph.h:201< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ada7da4059546f5ef90de0b2f8bada19a" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ada7da4059546f5ef90de0b2f8bada19a" > operations_research::MakeTypeRegulationsFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeTypeRegulationsFilter(const RoutingModel & routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l00818" > routing_search.cc:818< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_adc5e06b587829ed7c5e02c1d95293378" > < div class = "ttname" > < a href = "namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378" > operations_research::HasUnaryDimension< / a > < / div > < div class = "ttdeci" > bool HasUnaryDimension(const std::vector< RoutingDimension * > & dimensions)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04724" > routing.cc:4724< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_adf85b9c9e168660e5f36d735d88f3955" > < div class = "ttname" > < a href = "namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955" > operations_research::kUnassigned< / a > < / div > < div class = "ttdeci" > static const int kUnassigned< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00638" > routing.cc:638< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ae150982b493d89f5fe9f7bf606978da7" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ae150982b493d89f5fe9f7bf606978da7" > operations_research::MakeCachedIntToIntFunction< / a > < / div > < div class = "ttdeci" > RangeIntToIntFunction * MakeCachedIntToIntFunction(const std::function< int64(int64)> & f, int64 domain_start, int64 domain_end)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "range__query__function_8cc_source.html#l00216" > range_query_function.cc:216< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ae1de0a1f7cf121d53ee230f794ce51f5" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ae1de0a1f7cf121d53ee230f794ce51f5" > operations_research::MakePathStateFilter< / a > < / div > < div class = "ttdeci" > LocalSearchFilter * MakePathStateFilter(Solver *solver, std::unique_ptr< PathState > path_state, const std::vector< IntVar * > & nexts)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "local__search_8cc_source.html#l02953" > local_search.cc:2953< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_ae2219dbffeee11e9bca17cc1e8217747" > < div class = "ttname" > < a href = "namespaceoperations__research.html#ae2219dbffeee11e9bca17cc1e8217747" > operations_research::AppendLightWeightDimensionFilters< / a > < / div > < div class = "ttdeci" > void AppendLightWeightDimensionFilters(const PathState *path_state, const std::vector< RoutingDimension * > & dimensions, std::vector< LocalSearchFilterManager::FilterEvent > *filters)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l02123" > routing_search.cc:2123< / a > < / div > < / div >
2020-12-29 22:27:47 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_aeb15e4444582a925522843bb414de9c3" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aeb15e4444582a925522843bb414de9c3" > operations_research::MakeNodeDisjunctionFilter< / a > < / div > < div class = "ttdeci" > IntVarLocalSearchFilter * MakeNodeDisjunctionFilter(const RoutingModel & routing_model)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l00284" > routing_search.cc:284< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "anamespaceoperations__research_html_aee97ac67f280d35acdef2c5d461a85c3" > < div class = "ttname" > < a href = "namespaceoperations__research.html#aee97ac67f280d35acdef2c5d461a85c3" > operations_research::CostValue< / a > < / div > < div class = "ttdeci" > int64 CostValue< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "ebert__graph_8h_source.html#l00203" > ebert_graph.h:203< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceoperations__research_html_afc5fb4c667b6bfb245eb96188d7365e9" > < div class = "ttname" > < a href = "namespaceoperations__research.html#afc5fb4c667b6bfb245eb96188d7365e9" > operations_research::MakeSetValuesFromTargets< / a > < / div > < div class = "ttdeci" > DecisionBuilder * MakeSetValuesFromTargets(Solver *solver, std::vector< IntVar * > variables, std::vector< int64 > targets)< / div > < div class = "ttdoc" > A decision builder which tries to assign values to variables as close as possible to target values fi...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l00143" > routing.cc:143< / a > < / div > < / div >
< div class = "ttc" id = "anamespaceutil__time_html_a7c8c9c3cc5c68f173f38b0237da3abc9" > < div class = "ttname" > < a href = "namespaceutil__time.html#a7c8c9c3cc5c68f173f38b0237da3abc9" > util_time::DecodeGoogleApiProto< / a > < / div > < div class = "ttdeci" > inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration & proto)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "protoutil_8h_source.html#l00040" > protoutil.h:40< / a > < / div > < / div >
< div class = "ttc" id = "aoptional__boolean_8pb_8h_html" > < div class = "ttname" > < a href = "optional__boolean_8pb_8h.html" > optional_boolean.pb.h< / a > < / div > < / div >
< div class = "ttc" id = "apack_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0" > < div class = "ttname" > < a href = "pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0" > index< / a > < / div > < div class = "ttdeci" > int index< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "pack_8cc_source.html#l00508" > pack.cc:508< / a > < / div > < / div >
< div class = "ttc" id = "aparser_8yy_8cc_html_a5a634cf4429798b1c921a81de8250051" > < div class = "ttname" > < a href = "parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051" > input< / a > < / div > < div class = "ttdeci" > static int input(yyscan_t yyscanner)< / div > < / div >
< div class = "ttc" id = "aprotoutil_8h_html" > < div class = "ttname" > < a href = "protoutil_8h.html" > protoutil.h< / a > < / div > < / div >
< div class = "ttc" id = "aresource_8cc_html_a29fb0dd9484d890b12b280c41c150e20" > < div class = "ttname" > < a href = "resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20" > demand< / a > < / div > < div class = "ttdeci" > int64 demand< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "resource_8cc_source.html#l00123" > resource.cc:123< / a > < / div > < / div >
< div class = "ttc" id = "aresource_8cc_html_af92a8383a05fdf586a52263d358f5ada" > < div class = "ttname" > < a href = "resource_8cc.html#af92a8383a05fdf586a52263d358f5ada" > interval< / a > < / div > < div class = "ttdeci" > IntervalVar * interval< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "resource_8cc_source.html#l00098" > resource.cc:98< / a > < / div > < / div >
2020-11-18 14:53:30 +01:00
< div class = "ttc" id = "arouting_8cc_html_a1672e1017f4a78d0f4979681b5693470" > < div class = "ttname" > < a href = "routing_8cc.html#a1672e1017f4a78d0f4979681b5693470" > ABSL_FLAG< / a > < / div > < div class = "ttdeci" > ABSL_FLAG(int64, sweep_sectors, 1, " The number of sectors the space is divided before it is sweeped " " by the ray." )< / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "arouting_8cc_html_a29befb522070fbb60d7eac99962701e8" > < div class = "ttname" > < a href = "routing_8cc.html#a29befb522070fbb60d7eac99962701e8" > CP_ROUTING_PUSH_OPERATOR< / a > < / div > < div class = "ttdeci" > #define CP_ROUTING_PUSH_OPERATOR(operator_type, operator_method, operators)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l04582" > routing.cc:4582< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "arouting_8h_html" > < div class = "ttname" > < a href = "routing_8h.html" > routing.h< / a > < / div > < / div >
< div class = "ttc" id = "arouting__enums_8pb_8h_html" > < div class = "ttname" > < a href = "routing__enums_8pb_8h.html" > routing_enums.pb.h< / a > < / div > < / div >
< div class = "ttc" id = "arouting__flow_8cc_html_a10b672faee4b99c6a02feb0e343f3b0f" > < div class = "ttname" > < a href = "routing__flow_8cc.html#a10b672faee4b99c6a02feb0e343f3b0f" > tail< / a > < / div > < div class = "ttdeci" > int64 tail< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__flow_8cc_source.html#l00127" > routing_flow.cc:127< / a > < / div > < / div >
< div class = "ttc" id = "arouting__flow_8cc_html_a26a8cbbc7bcf4117c2bf65104b4a54b4" > < div class = "ttname" > < a href = "routing__flow_8cc.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > cost< / a > < / div > < div class = "ttdeci" > int64 cost< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__flow_8cc_source.html#l00130" > routing_flow.cc:130< / a > < / div > < / div >
< div class = "ttc" id = "arouting__flow_8cc_html_ac891d9f514e55ec8ee1212757a147888" > < div class = "ttname" > < a href = "routing__flow_8cc.html#ac891d9f514e55ec8ee1212757a147888" > head< / a > < / div > < div class = "ttdeci" > int64 head< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__flow_8cc_source.html#l00128" > routing_flow.cc:128< / a > < / div > < / div >
< div class = "ttc" id = "arouting__flow_8cc_html_adf3be22c64f10c0783c0cf277e857adf" > < div class = "ttname" > < a href = "routing__flow_8cc.html#adf3be22c64f10c0783c0cf277e857adf" > capacity< / a > < / div > < div class = "ttdeci" > int64 capacity< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__flow_8cc_source.html#l00129" > routing_flow.cc:129< / a > < / div > < / div >
< div class = "ttc" id = "arouting__lp__scheduling_8h_html" > < div class = "ttname" > < a href = "routing__lp__scheduling_8h.html" > routing_lp_scheduling.h< / a > < / div > < / div >
< div class = "ttc" id = "arouting__neighborhoods_8h_html" > < div class = "ttname" > < a href = "routing__neighborhoods_8h.html" > routing_neighborhoods.h< / a > < / div > < / div >
< div class = "ttc" id = "arouting__parameters_8h_html" > < div class = "ttname" > < a href = "routing__parameters_8h.html" > routing_parameters.h< / a > < / div > < / div >
< div class = "ttc" id = "arouting__search_8cc_html_ab66ad179c8a6fcf1adb958cb51f4c7cb" > < div class = "ttname" > < a href = "routing__search_8cc.html#ab66ad179c8a6fcf1adb958cb51f4c7cb" > coefficient< / a > < / div > < div class = "ttdeci" > int64 coefficient< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing__search_8cc_source.html#l00973" > routing_search.cc:973< / a > < / div > < / div >
< div class = "ttc" id = "asat_2lp__utils_8cc_html_a742ae1554f2decd63d35be3e6ff4f58d" > < div class = "ttname" > < a href = "sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d" > var_indices< / a > < / div > < div class = "ttdeci" > std::vector< int > var_indices< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sat_2lp__utils_8cc_source.html#l00495" > sat/lp_utils.cc:495< / a > < / div > < / div >
< div class = "ttc" id = "asaturated__arithmetic_8h_html" > < div class = "ttname" > < a href = "saturated__arithmetic_8h.html" > saturated_arithmetic.h< / a > < / div > < / div >
< div class = "ttc" id = "asched__constraints_8cc_html_a16edac3fa04d9ba10ff012b5fb8add05" > < div class = "ttname" > < a href = "sched__constraints_8cc.html#a16edac3fa04d9ba10ff012b5fb8add05" > end_min< / a > < / div > < div class = "ttdeci" > Rev< int64 > end_min< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sched__constraints_8cc_source.html#l00243" > sched_constraints.cc:243< / a > < / div > < / div >
< div class = "ttc" id = "asched__constraints_8cc_html_a3db7a45809ea7c6000b10a58f003b331" > < div class = "ttname" > < a href = "sched__constraints_8cc.html#a3db7a45809ea7c6000b10a58f003b331" > end_max< / a > < / div > < div class = "ttdeci" > Rev< int64 > end_max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sched__constraints_8cc_source.html#l00244" > sched_constraints.cc:244< / a > < / div > < / div >
< div class = "ttc" id = "asched__constraints_8cc_html_a7c8133c50ba59755e2162ad1a9478da7" > < div class = "ttname" > < a href = "sched__constraints_8cc.html#a7c8133c50ba59755e2162ad1a9478da7" > start_max< / a > < / div > < div class = "ttdeci" > Rev< int64 > start_max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sched__constraints_8cc_source.html#l00242" > sched_constraints.cc:242< / a > < / div > < / div >
< div class = "ttc" id = "asched__constraints_8cc_html_ab2188791e61e013dc8b28e66b31041cd" > < div class = "ttname" > < a href = "sched__constraints_8cc.html#ab2188791e61e013dc8b28e66b31041cd" > start_min< / a > < / div > < div class = "ttdeci" > Rev< int64 > start_min< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "sched__constraints_8cc_source.html#l00241" > sched_constraints.cc:241< / a > < / div > < / div >
< div class = "ttc" id = "astats_8h_html" > < div class = "ttname" > < a href = "stats_8h.html" > stats.h< / a > < / div > < / div >
< div class = "ttc" id = "astl__util_8h_html" > < div class = "ttname" > < a href = "stl__util_8h.html" > stl_util.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 >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "astructoperations__research_1_1_link_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html" > operations_research::Link< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02461" > routing.cc:2461< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a1a01a2753d74fedd87264d8bd34a12df" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a1a01a2753d74fedd87264d8bd34a12df" > operations_research::Link::vehicle_class< / a > < / div > < div class = "ttdeci" > int vehicle_class< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02473" > routing.cc:2473< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a21edc7ca4cc5802c8779d68556bc09cf" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a21edc7ca4cc5802c8779d68556bc09cf" > operations_research::Link::value< / a > < / div > < div class = "ttdeci" > int64 value< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02472" > routing.cc:2472< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a2b6c85429ae38a687fbffb017cc773b9" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a2b6c85429ae38a687fbffb017cc773b9" > operations_research::Link::~Link< / a > < / div > < div class = "ttdeci" > ~Link()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02469" > routing.cc:2469< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a67568687431f7a4dde8d07a0d67e35c7" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a67568687431f7a4dde8d07a0d67e35c7" > operations_research::Link::Link< / a > < / div > < div class = "ttdeci" > Link(std::pair< int, int > link, double value, int vehicle_class, int64 start_depot, int64 end_depot)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02462" > routing.cc:2462< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a6824c3bafe148ed277f7c1f8013ab022" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a6824c3bafe148ed277f7c1f8013ab022" > operations_research::Link::link< / a > < / div > < div class = "ttdeci" > std::pair< int, int > link< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02471" > routing.cc:2471< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_a985654c31a0a3433b27d0bd14cebb602" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#a985654c31a0a3433b27d0bd14cebb602" > operations_research::Link::end_depot< / a > < / div > < div class = "ttdeci" > int64 end_depot< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02475" > routing.cc:2475< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_html_ae99c447e10fd9e8a300603575183cd64" > < div class = "ttname" > < a href = "structoperations__research_1_1_link.html#ae99c447e10fd9e8a300603575183cd64" > operations_research::Link::start_depot< / a > < / div > < div class = "ttdeci" > int64 start_depot< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02474" > routing.cc:2474< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_sort_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_link_sort.html" > operations_research::LinkSort< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02478" > routing.cc:2478< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_link_sort_html_a3eb6a1704c248c52096ee8f21c911d3a" > < div class = "ttname" > < a href = "structoperations__research_1_1_link_sort.html#a3eb6a1704c248c52096ee8f21c911d3a" > operations_research::LinkSort::operator()< / a > < / div > < div class = "ttdeci" > bool operator()(const Link & link1, const Link & link2) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02479" > routing.cc:2479< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_dimension_1_1_node_precedence_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_dimension_1_1_node_precedence.html" > operations_research::RoutingDimension::NodePrecedence< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02647" > routing.h:2647< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_cost_class_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_cost_class.html" > operations_research::RoutingModel::CostClass< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00273" > routing.h:273< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_cost_class_html_aecd5ad315b3f45eef0d567ad99008eaf" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_cost_class.html#aecd5ad315b3f45eef0d567ad99008eaf" > operations_research::RoutingModel::CostClass::LessThan< / a > < / div > < div class = "ttdeci" > static bool LessThan(const CostClass & a, const CostClass & b)< / div > < div class = "ttdoc" > Comparator for STL containers and algorithms.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00315" > routing.h:315< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_state_dependent_transit_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html" > operations_research::RoutingModel::StateDependentTransit< / a > < / div > < div class = "ttdoc" > What follows is relevant for models with time/state dependent transits.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00264" > routing.h:264< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html" > operations_research::RoutingModel::VehicleClass< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00324" > routing.h:324< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_a0e6f382c1edda3cf2469aff3f8f5b43d" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a0e6f382c1edda3cf2469aff3f8f5b43d" > operations_research::RoutingModel::VehicleClass::fixed_cost< / a > < / div > < div class = "ttdeci" > int64 fixed_cost< / div > < div class = "ttdoc" > Contrarily to CostClass, here we need strict equivalence.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00328" > routing.h:328< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_a249df6aa5bd9c90924e5e5b0012786e4" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a249df6aa5bd9c90924e5e5b0012786e4" > operations_research::RoutingModel::VehicleClass::dimension_capacities< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_capacities< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00343" > routing.h:343< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_a3bfe49204f799d059f70a2c016973a12" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a3bfe49204f799d059f70a2c016973a12" > operations_research::RoutingModel::VehicleClass::dimension_evaluator_classes< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_evaluator_classes< / div > < div class = "ttdoc" > dimension_evaluators[d]-> Run(from, to) is the transit value of arc from-> to for a dimension d.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00346" > routing.h:346< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_a9f7fbf98fe796946fe0be2ca5c8b4e50" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#a9f7fbf98fe796946fe0be2ca5c8b4e50" > operations_research::RoutingModel::VehicleClass::start_equivalence_class< / a > < / div > < div class = "ttdeci" > int start_equivalence_class< / div > < div class = "ttdoc" > Vehicle start and end equivalence classes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00335" > routing.h:335< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_aae36a2ea4a1377bb08a7b3610868ab0b" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#aae36a2ea4a1377bb08a7b3610868ab0b" > operations_research::RoutingModel::VehicleClass::dimension_start_cumuls_min< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_start_cumuls_min< / div > < div class = "ttdoc" > Bounds of cumul variables at start and end vehicle nodes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00339" > routing.h:339< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ab9b7cbea1e22c00a42d9d053fe43dcc6" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ab9b7cbea1e22c00a42d9d053fe43dcc6" > operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_min< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_end_cumuls_min< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00341" > routing.h:341< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_abf408711522975c20e4ce1c37033e12e" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#abf408711522975c20e4ce1c37033e12e" > operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_max< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_end_cumuls_max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00342" > routing.h:342< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ac4332ba473c0913b24289e3a71522b2c" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ac4332ba473c0913b24289e3a71522b2c" > operations_research::RoutingModel::VehicleClass::end_equivalence_class< / a > < / div > < div class = "ttdeci" > int end_equivalence_class< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00336" > routing.h:336< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ad0f12c443e4158fdb27375de6fe0fb95" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad0f12c443e4158fdb27375de6fe0fb95" > operations_research::RoutingModel::VehicleClass::unvisitable_nodes_fprint< / a > < / div > < div class = "ttdeci" > uint64 unvisitable_nodes_fprint< / div > < div class = "ttdoc" > Fingerprint of unvisitable non-start/end nodes.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00348" > routing.h:348< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ad42f0b03bf2ec344fa3ab98832a020f6" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6" > operations_research::RoutingModel::VehicleClass::LessThan< / a > < / div > < div class = "ttdeci" > static bool LessThan(const VehicleClass & a, const VehicleClass & b)< / div > < div class = "ttdoc" > Comparator for STL containers and algorithms.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l01324" > routing.cc:1324< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ae9ab15c58c9e4de66d043fb151c50535" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ae9ab15c58c9e4de66d043fb151c50535" > operations_research::RoutingModel::VehicleClass::dimension_start_cumuls_max< / a > < / div > < div class = "ttdeci" > absl::StrongVector< DimensionIndex, int64 > dimension_start_cumuls_max< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00340" > routing.h:340< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_af626487fbe89510613df5f35bdf9a002" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_class.html#af626487fbe89510613df5f35bdf9a002" > operations_research::RoutingModel::VehicleClass::cost_class_index< / a > < / div > < div class = "ttdeci" > CostClassIndex cost_class_index< / div > < div class = "ttdoc" > The cost class of the vehicle.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00326" > routing.h:326< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_type_container_html_a9608c6da44ffbf91a3d1ca2c5d873bc7" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#a9608c6da44ffbf91a3d1ca2c5d873bc7" > operations_research::RoutingModel::VehicleTypeContainer::type_index_of_vehicle< / a > < / div > < div class = "ttdeci" > std::vector< int > type_index_of_vehicle< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00376" > routing.h:376< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_type_container_html_ab04b34ed94012cf2d892d6e9347ee9f6" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#ab04b34ed94012cf2d892d6e9347ee9f6" > operations_research::RoutingModel::VehicleTypeContainer::sorted_vehicle_classes_per_type< / a > < / div > < div class = "ttdeci" > std::vector< std::set< VehicleClassEntry > > sorted_vehicle_classes_per_type< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00378" > routing.h:378< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_routing_model_1_1_vehicle_type_container_html_ad39f5508cc37e45b2d759832d343c177" > < div class = "ttname" > < a href = "structoperations__research_1_1_routing_model_1_1_vehicle_type_container.html#ad39f5508cc37e45b2d759832d343c177" > operations_research::RoutingModel::VehicleTypeContainer::vehicles_per_vehicle_class< / a > < / div > < div class = "ttdeci" > std::vector< std::deque< int > > vehicles_per_vehicle_class< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l00379" > routing.h:379< / a > < / div > < / div >
2021-02-16 18:34:57 +01:00
< div class = "ttc" id = "astructoperations__research_1_1_simple_bound_costs_1_1_bound_cost_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html" > operations_research::SimpleBoundCosts::BoundCost< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02331" > routing.h:2331< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_simple_bound_costs_1_1_bound_cost_html_a26a8cbbc7bcf4117c2bf65104b4a54b4" > < div class = "ttname" > < a href = "structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a26a8cbbc7bcf4117c2bf65104b4a54b4" > operations_research::SimpleBoundCosts::BoundCost::cost< / a > < / div > < div class = "ttdeci" > int64 cost< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02333" > routing.h:2333< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html" > operations_research::SweepIndex< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02954" > routing.cc:2954< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html_a6b5aa39d7a1754c7efcb8528177a8e41" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html#a6b5aa39d7a1754c7efcb8528177a8e41" > operations_research::SweepIndex::index< / a > < / div > < div class = "ttdeci" > int64 index< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02959" > routing.cc:2959< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html_a79b8e036dca6911e3295a47d99f21f43" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html#a79b8e036dca6911e3295a47d99f21f43" > operations_research::SweepIndex::distance< / a > < / div > < div class = "ttdeci" > double distance< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02961" > routing.cc:2961< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html_a79dea7ed146af26ff4a0ba4bf5c83eee" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html#a79dea7ed146af26ff4a0ba4bf5c83eee" > operations_research::SweepIndex::angle< / a > < / div > < div class = "ttdeci" > double angle< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02960" > routing.cc:2960< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html_a8d29e8bfd15b4d40384e988a725755a3" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html#a8d29e8bfd15b4d40384e988a725755a3" > operations_research::SweepIndex::SweepIndex< / a > < / div > < div class = "ttdeci" > SweepIndex(const int64 index, const double angle, const double distance)< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02955" > routing.cc:2955< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_html_aa743d92bc830367191a21b56d6095ef6" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index.html#aa743d92bc830367191a21b56d6095ef6" > operations_research::SweepIndex::~SweepIndex< / a > < / div > < div class = "ttdeci" > ~SweepIndex()< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02957" > routing.cc:2957< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_sort_angle_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index_sort_angle.html" > operations_research::SweepIndexSortAngle< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02964" > routing.cc:2964< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_sort_angle_html_a3ba0d3c08fd12dee1c1b8d2def0259aa" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index_sort_angle.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > operations_research::SweepIndexSortAngle::operator()< / a > < / div > < div class = "ttdeci" > bool operator()(const SweepIndex & node1, const SweepIndex & node2) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02965" > routing.cc:2965< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_sort_distance_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index_sort_distance.html" > operations_research::SweepIndexSortDistance< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02970" > routing.cc:2970< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_sweep_index_sort_distance_html_a3ba0d3c08fd12dee1c1b8d2def0259aa" > < div class = "ttname" > < a href = "structoperations__research_1_1_sweep_index_sort_distance.html#a3ba0d3c08fd12dee1c1b8d2def0259aa" > operations_research::SweepIndexSortDistance::operator()< / a > < / div > < div class = "ttdeci" > bool operator()(const SweepIndex & node1, const SweepIndex & node2) const< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8cc_source.html#l02971" > routing.cc:2971< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html" > < div class = "ttname" > < a href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html" > operations_research::TypeRegulationsChecker::TypePolicyOccurrence< / a > < / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02173" > routing.h:2173< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_a7acae15ab204f3f24e65ad1d10729bb9" > < div class = "ttname" > < a href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9" > operations_research::TypeRegulationsChecker::TypePolicyOccurrence::position_of_last_type_on_vehicle_up_to_visit< / a > < / div > < div class = "ttdeci" > int position_of_last_type_on_vehicle_up_to_visit< / div > < div class = "ttdoc" > Position of the last node of policy TYPE_ON_VEHICLE_UP_TO_VISIT visited on the route.< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02188" > routing.h:2188< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_aa0bf1d67fe0a2224b3ce02286a032c3e" > < div class = "ttname" > < a href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e" > operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_added_to_vehicle< / a > < / div > < div class = "ttdeci" > int num_type_added_to_vehicle< / div > < div class = "ttdoc" > Number of TYPE_ADDED_TO_VEHICLE and TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED node type policies seen on ...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02177" > routing.h:2177< / a > < / div > < / div >
< div class = "ttc" id = "astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_abb92435061d2042b268fb2041c8e2754" > < div class = "ttname" > < a href = "structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#abb92435061d2042b268fb2041c8e2754" > operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_removed_from_vehicle< / a > < / div > < div class = "ttdeci" > int num_type_removed_from_vehicle< / div > < div class = "ttdoc" > Number of ADDED_TYPE_REMOVED_FROM_VEHICLE (effectively removing a type from the route) and TYPE_SIMUL...< / div > < div class = "ttdef" > < b > Definition:< / b > < a href = "routing_8h_source.html#l02183" > routing.h:2183< / a > < / div > < / div >
2021-01-26 11:28:50 +01:00
< div class = "ttc" id = "athorough__hash_8h_html" > < div class = "ttname" > < a href = "thorough__hash_8h.html" > thorough_hash.h< / a > < / div > < / div >
< div class = "ttc" id = "atopologicalsorter_8h_html" > < div class = "ttname" > < a href = "topologicalsorter_8h.html" > topologicalsorter.h< / a > < / div > < / div >
< / div > <!-- fragment --> < / div > <!-- contents -->
< / div > <!-- doc - content -->
2020-09-02 09:42:51 +02:00
<!-- 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_afbb39f66221aac28bbdefd1dca2b2b0.html" > constraint_solver< / a > < / li > < li class = "navelem" > < a class = "el" href = "routing_8cc.html" > routing.cc< / a > < / li >
< li class = "footer" > Generated by
< a href = "http://www.doxygen.org/index.html" >
2021-01-26 11:28:50 +01:00
< img class = "footer" src = "doxygen.png" alt = "doxygen" / > < / a > 1.9.1 < / li >
2020-09-02 09:42:51 +02:00
< / ul >
< / div >
< / body >
< / html >