206 lines
597 KiB
HTML
206 lines
597 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<title>OR-Tools</title>
|
|
<meta http-equiv="Content-Type" content="text/html;"/>
|
|
<meta charset="utf-8"/>
|
|
<!--<link rel='stylesheet' type='text/css' href="https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>-->
|
|
<link rel="stylesheet" type="text/css" href="ortools.css" title="default" media="screen,print" />
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="banner-container">
|
|
<div id="banner">
|
|
<span id="sfml">OR-Tools 7.1@</span>
|
|
</div>
|
|
</div>
|
|
<div id="content">
|
|
<!-- Generated by Doxygen 1.8.15 -->
|
|
<div id="navrow1" class="tabs">
|
|
<ul class="tablist">
|
|
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
<li><a href="pages.html"><span>Related Pages</span></a></li>
|
|
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
|
<li><a href="annotated.html"><span>Classes</span></a></li>
|
|
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
|
</ul>
|
|
</div>
|
|
<div id="navrow2" class="tabs2">
|
|
<ul class="tablist">
|
|
<li><a href="files.html"><span>File List</span></a></li>
|
|
<li><a href="globals.html"><span>File Members</span></a></li>
|
|
</ul>
|
|
</div>
|
|
<div id="nav-path" class="navpath">
|
|
<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> </ul>
|
|
</div>
|
|
</div><!-- top -->
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">routing.h</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="routing_8h.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="comment">// The vehicle routing library lets one model and solve generic vehicle routing</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// problems ranging from the Traveling Salesman Problem to more complex</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// problems such as the Capacitated Vehicle Routing Problem with Time Windows.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment">//</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// The objective of a vehicle routing problem is to build routes covering a set</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// of nodes minimizing the overall cost of the routes (usually proportional to</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">// the sum of the lengths of each segment of the routes) while respecting some</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">// problem-specific constraints (such as the length of a route). A route is</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">// equivalent to a path connecting nodes, starting/ending at specific</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">// starting/ending nodes.</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">//</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment">// The term "vehicle routing" is historical and the category of problems solved</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">// is not limited to the routing of vehicles: any problem involving finding</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment">// routes visiting a given number of nodes optimally falls under this category</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment">// of problems, such as finding the optimal sequence in a playlist.</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment">// The literature around vehicle routing problems is extremely dense but one</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment">// can find some basic introductions in the following links:</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment">// - http://en.wikipedia.org/wiki/Travelling_salesman_problem</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment">// - http://www.tsp.gatech.edu/history/index.html</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment">// - http://en.wikipedia.org/wiki/Vehicle_routing_problem</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment">//</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment">// The vehicle routing library is a vertical layer above the constraint</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment">// programming library (ortools/constraint_programming:cp).</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment">// One has access to all underlying constrained variables of the vehicle</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">// routing model which can therefore be enriched by adding any constraint</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">// available in the constraint programming library.</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">//</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">// There are two sets of variables available:</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// - path variables:</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment">// * "next(i)" variables representing the immediate successor of the node</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">// corresponding to i; use IndexToNode() to get the node corresponding to</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment">// a "next" variable value; note that node indices are strongly typed</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment">// integers (cf. ortools/base/int_type.h);</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment">// * "vehicle(i)" variables representing the vehicle route to which the</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment">// node corresponding to i belongs;</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment">// * "active(i)" boolean variables, true if the node corresponding to i is</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment">// visited and false if not; this can be false when nodes are either</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment">// optional or part of a disjunction;</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment">// * The following relationships hold for all i:</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment">// active(i) == 0 <=> next(i) == i <=> vehicle(i) == -1,</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment">// next(i) == j => vehicle(j) == vehicle(i).</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment">// - dimension variables, used when one is accumulating quantities along routes,</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment">// such as weight or volume carried, distance or time:</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment">// * "cumul(i,d)" variables representing the quantity of dimension d when</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment">// arriving at the node corresponding to i;</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// * "transit(i,d)" variables representing the quantity of dimension d added</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// after visiting the node corresponding to i.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment">// * The following relationship holds for all (i,d):</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment">// next(i) == j => cumul(j,d) == cumul(i,d) + transit(i,d).</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// Solving the vehicle routing problems is mainly done using approximate methods</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment">// (namely local search,</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment">// cf. http://en.wikipedia.org/wiki/Local_search_(optimization) ), potentially</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment">// combined with exact techniques based on dynamic programming and exhaustive</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment">// tree search.</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// TODO(user): Add a section on costs (vehicle arc costs, span costs,</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="comment">// disjunctions costs).</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="comment">//</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment">// Advanced tips: Flags are available to tune the search used to solve routing</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment">// problems. Here is a quick overview of the ones one might want to modify:</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment">// - Limiting the search for solutions:</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment">// * routing_solution_limit (default: kint64max): stop the search after</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment">// finding 'routing_solution_limit' improving solutions;</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment">// * routing_time_limit (default: kint64max): stop the search after</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment">// 'routing_time_limit' milliseconds;</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment">// - Customizing search:</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment">// * routing_first_solution (default: select the first node with an unbound</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment">// successor and connect it to the first available node): selects the</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment">// heuristic to build a first solution which will then be improved by local</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="comment">// search; possible values are GlobalCheapestArc (iteratively connect two</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="comment">// nodes which produce the cheapest route segment), LocalCheapestArc (select</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="comment">// the first node with an unbound successor and connect it to the node</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="comment">// which produces the cheapest route segment), PathCheapestArc (starting</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="comment">// from a route "start" node, connect it to the node which produces the</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="comment">// cheapest route segment, then extend the route by iterating on the last</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="comment">// node added to the route).</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="comment">// * Local search neighborhoods:</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment">// - routing_no_lns (default: false): forbids the use of Large Neighborhood</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="comment">// Search (LNS); LNS can find good solutions but is usually very slow.</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="comment">// Refer to the description of PATHLNS in the LocalSearchOperators enum</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="comment">// in constraint_solver.h for more information.</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="comment">// - routing_no_tsp (default: true): forbids the use of exact methods to</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="comment">// solve "sub"-traveling salesman problems (TSPs) of the current model</span></div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment">// (such as sub-parts of a route, or one route in a multiple route</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="comment">// problem). Uses dynamic programming to solve such TSPs with a maximum</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="comment">// size (in number of nodes) up to cp_local_search_tsp_opt_size (flag with</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="comment">// a default value of 13 nodes). It is not activated by default because it</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="comment">// can slow down the search.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="comment">// * Meta-heuristics: used to guide the search out of local minima found by</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="comment">// local search. Note that, in general, a search with metaheuristics</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="comment">// activated never stops, therefore one must specify a search limit.</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="comment">// Several types of metaheuristics are provided:</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="comment">// - routing_guided_local_search (default: false): activates guided local</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment">// search (cf. http://en.wikipedia.org/wiki/Guided_Local_Search);</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment">// this is generally the most efficient metaheuristic for vehicle</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="comment">// routing;</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="comment">// - routing_simulated_annealing (default: false): activates simulated</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="comment">// annealing (cf. http://en.wikipedia.org/wiki/Simulated_annealing);</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="comment">// - routing_tabu_search (default: false): activates tabu search (cf.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment">// http://en.wikipedia.org/wiki/Tabu_search).</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment">//</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment">// Code sample:</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment">// Here is a simple example solving a traveling salesman problem given a cost</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment">// function callback (returns the cost of a route segment):</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment">//</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment">// - Define a custom distance/cost function from an index to another; in this</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="comment">// example just returns the sum of the indices:</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="comment">//</span></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="comment">// int64 MyDistance(int64 from, int64 to) {</span></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="comment">// return from + to;</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="comment">// }</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="comment">//</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="comment">// - Create a routing model for a given problem size (int number of nodes) and</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="comment">// number of routes (here, 1):</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="comment">//</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="comment">// RoutingIndexManager manager(...number of nodes..., 1);</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment">// RoutingModel routing(manager);</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="comment">//</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="comment">// - Set the cost function by registering an std::function<int64(int64, int64)></span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="comment">// in the model and passing its index as the vehicle cost.</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="comment">//</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="comment">// const int cost = routing.RegisterTransitCallback(MyDistance);</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">// routing.SetArcCostEvaluatorOfAllVehicles(cost);</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="comment">//</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="comment">// - Find a solution using Solve(), returns a solution if any (owned by</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> <span class="comment">// routing):</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="comment">//</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="comment">// const Assignment* solution = routing.Solve();</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="comment">// CHECK(solution != nullptr);</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment">//</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="comment">// - Inspect the solution cost and route (only one route here):</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment">//</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment">// LOG(INFO) << "Cost " << solution->ObjectiveValue();</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment">// const int route_number = 0;</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="comment">// for (int64 node = routing.Start(route_number);</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment">// !routing.IsEnd(node);</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment">// node = solution->Value(routing.NextVar(node))) {</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="comment">// LOG(INFO) << routing.IndexToNode(node);</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> <span class="comment">// }</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="comment">//</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="comment">//</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="comment">// Keywords: Vehicle Routing, Traveling Salesman Problem, TSP, VRP, CVRPTW, PDP.</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="preprocessor">#ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="preprocessor">#define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="preprocessor">#include <cstddef></span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="preprocessor">#include <functional></span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="preprocessor">#include <queue></span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="preprocessor">#include <vector></span></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="preprocessor">#include "absl/container/flat_hash_map.h"</span></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="preprocessor">#include "absl/container/flat_hash_set.h"</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="preprocessor">#include "absl/hash/hash.h"</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#include "absl/time/time.h"</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="preprocessor">#include "ortools/base/adjustable_priority_queue-inl.h"</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="preprocessor">#include "ortools/base/adjustable_priority_queue.h"</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="preprocessor">#include "ortools/base/commandlineflags.h"</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="preprocessor">#include "ortools/base/hash.h"</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="preprocessor">#include "ortools/base/int_type_indexed_vector.h"</span></div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="preprocessor">#include "ortools/base/logging.h"</span></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="preprocessor">#include "ortools/base/macros.h"</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</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="l00179"></a><span class="lineno"> 179</span> <span class="preprocessor">#include "<a class="code" href="constraint__solveri_8h.html">ortools/constraint_solver/constraint_solveri.h</a>"</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="preprocessor">#include "<a class="code" href="routing__index__manager_8h.html">ortools/constraint_solver/routing_index_manager.h</a>"</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="preprocessor">#include "<a class="code" href="routing__parameters_8pb_8h.html">ortools/constraint_solver/routing_parameters.pb.h</a>"</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="preprocessor">#include "<a class="code" href="routing__types_8h.html">ortools/constraint_solver/routing_types.h</a>"</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="preprocessor">#include "ortools/glop/lp_solver.h"</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="preprocessor">#include "ortools/glop/parameters.pb.h"</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="preprocessor">#include "ortools/graph/graph.h"</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="preprocessor">#include "ortools/lp_data/lp_data.h"</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> <span class="preprocessor">#include "ortools/lp_data/lp_types.h"</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="preprocessor">#include "ortools/sat/theta_tree.h"</span></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <span class="preprocessor">#include "ortools/util/range_query_function.h"</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="preprocessor">#include "ortools/util/sorted_interval_list.h"</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">class </span>IntVarFilteredDecisionBuilder;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="keyword">class </span>LocalSearchOperator;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="keyword">class </span><a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">using</span> util::ReverseArcListGraph;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">class </span>SweepArranger;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="keyword">struct </span>SweepIndex;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">class </span>RoutingModel {</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="comment">// Status of the search.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keyword">enum</span> Status {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="comment">// Problem not solved yet (before calling RoutingModel::Solve()).</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  ROUTING_NOT_SOLVED,</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// Problem solved successfully after calling RoutingModel::Solve().</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  ROUTING_SUCCESS,</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// No solution found to the problem after calling RoutingModel::Solve().</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  ROUTING_FAIL,</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="comment">// Time limit reached before finding a solution with RoutingModel::Solve().</span></div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  ROUTING_FAIL_TIMEOUT,</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="comment">// Model, model parameters or flags are not valid.</span></div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  ROUTING_INVALID</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  };</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="comment">// Types of precedence policy applied to pickup and delivery pairs.</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keyword">enum</span> PickupAndDeliveryPolicy {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="comment">// Any precedence is accepted.</span></div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  PICKUP_AND_DELIVERY_NO_ORDER,</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// Deliveries must be performed in reverse order of pickups.</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  PICKUP_AND_DELIVERY_LIFO,</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="comment">// Deliveries must be performed in the same order as pickups.</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  PICKUP_AND_DELIVERY_FIFO</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  };</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keyword">typedef</span> RoutingCostClassIndex CostClassIndex;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keyword">typedef</span> RoutingDimensionIndex DimensionIndex;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keyword">typedef</span> RoutingDisjunctionIndex DisjunctionIndex;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keyword">typedef</span> RoutingVehicleClassIndex VehicleClassIndex;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceoperations__research.html#a40e66c7b62d7c023af6f08912fdc3f9c">RoutingTransitCallback1</a> TransitCallback1;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceoperations__research.html#ae7851f8d6518e3180b9d9f0ec69826e7">RoutingTransitCallback2</a> TransitCallback2;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="comment">// TODO(user): Remove all SWIG guards by adding the @ignore in .i.</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> <span class="preprocessor">#if !defined(SWIG)</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceoperations__research.html#a30af988d402f0f3d36640575ca87153c">RoutingIndexPair</a> IndexPair;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceoperations__research.html#a114ea14886b902c9cf9b988c4ef12672">RoutingIndexPairs</a> IndexPairs;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="preprocessor">#if !defined(SWIG)</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// What follows is relevant for models with time/state dependent transits.</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="comment">// Such transits, say from node A to node B, are functions f: int64->int64</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="comment">// of the cumuls of a dimension. The user is free to implement the abstract</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="comment">// RangeIntToIntFunction interface, but it is expected that the implementation</span></div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="comment">// of each method is quite fast. For performance-related reasons,</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="comment">// StateDependentTransit keeps an additional pointer to a</span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// RangeMinMaxIndexFunction, with similar functionality to</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="comment">// RangeIntToIntFunction, for g(x) = f(x)+x, where f is the transit from A to</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment">// B. In most situations the best solutions are problem-specific, but in case</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="comment">// of doubt the user may use the MakeStateDependentTransit function from the</span></div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="comment">// routing library, which works out-of-the-box, with very good running time,</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="comment">// but memory inefficient in some situations.</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">struct </span>StateDependentTransit {</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  RangeIntToIntFunction* transit; <span class="comment">// f(x)</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  RangeMinMaxIndexFunction* transit_plus_identity; <span class="comment">// g(x) = f(x) + x</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  };</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keyword">typedef</span> std::function<StateDependentTransit(int64, int64)></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  VariableIndexEvaluator2;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="preprocessor">#endif // SWIG</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> <span class="preprocessor">#if !defined(SWIG)</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keyword">struct </span>CostClass {</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// Index of the arc cost evaluator, registered in the RoutingModel class.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordtype">int</span> evaluator_index = 0;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> </div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="comment">// SUBTLE:</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment">// The vehicle's fixed cost is skipped on purpose here, because we</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">// can afford to do so:</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// - We don't really care about creating "strict" equivalence classes;</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="comment">// all we care about is to:</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// 1) compress the space of cost callbacks so that</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="comment">// we can cache them more efficiently.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment">// 2) have a smaller IntVar domain thanks to using a "cost class var"</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="comment">// instead of the vehicle var, so that we reduce the search space.</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="comment">// Both of these are an incentive for *fewer* cost classes. Ignoring</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="comment">// the fixed costs can only be good in that regard.</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="comment">// - The fixed costs are only needed when evaluating the cost of the</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="comment">// first arc of the route, in which case we know the vehicle, since we</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="comment">// have the route's start node.</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment">// Only dimensions that have non-zero cost evaluator and a non-zero cost</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="comment">// coefficient (in this cost class) are listed here. Since we only need</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="comment">// their transit evaluator (the raw version that takes var index, not Node</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="comment">// Index) and their span cost coefficient, we just store those.</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">// This is sorted by the natural operator < (and *not* by DimensionIndex).</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keyword">struct </span>DimensionCost {</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  int64 transit_evaluator_class;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  int64 cost_coefficient;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> DimensionCost& cost)<span class="keyword"> const </span>{</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">if</span> (transit_evaluator_class != cost.transit_evaluator_class) {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">return</span> transit_evaluator_class < cost.transit_evaluator_class;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordflow">return</span> cost_coefficient < cost.cost_coefficient;</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>  std::vector<DimensionCost></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  dimension_transit_evaluator_class_and_cost_coefficient;</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">explicit</span> CostClass(<span class="keywordtype">int</span> evaluator_index)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  : evaluator_index(evaluator_index) {}</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="comment">// Comparator for STL containers and algorithms.</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> LessThan(<span class="keyword">const</span> CostClass& a, <span class="keyword">const</span> CostClass& b) {</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">if</span> (a.evaluator_index != b.evaluator_index) {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keywordflow">return</span> a.evaluator_index < b.evaluator_index;</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>  <span class="keywordflow">return</span> a.dimension_transit_evaluator_class_and_cost_coefficient <</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  b.dimension_transit_evaluator_class_and_cost_coefficient;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  };</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keyword">struct </span>VehicleClass {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="comment">// The cost class of the vehicle.</span></div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  CostClassIndex cost_class_index;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="comment">// Contrarily to CostClass, here we need strict equivalence.</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  int64 fixed_cost;</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="comment">// Vehicle start and end equivalence classes. Currently if two vehicles have</span></div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="comment">// different start/end nodes which are "physically" located at the same</span></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="comment">// place, these two vehicles will be considered as non-equivalent unless the</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment">// two indices are in the same class.</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="comment">// TODO(user): Find equivalent start/end nodes wrt dimensions and</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="comment">// callbacks.</span></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordtype">int</span> start_equivalence_class;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordtype">int</span> end_equivalence_class;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="comment">// Bounds of cumul variables at start and end vehicle nodes.</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="comment">// dimension_{start,end}_cumuls_{min,max}[d] is the bound for dimension d.</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  gtl::ITIVector<DimensionIndex, int64> dimension_start_cumuls_min;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  gtl::ITIVector<DimensionIndex, int64> dimension_start_cumuls_max;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  gtl::ITIVector<DimensionIndex, int64> dimension_end_cumuls_min;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  gtl::ITIVector<DimensionIndex, int64> dimension_end_cumuls_max;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  gtl::ITIVector<DimensionIndex, int64> dimension_capacities;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="comment">// dimension_evaluators[d]->Run(from, to) is the transit value of arc</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="comment">// from->to for a dimension d.</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  gtl::ITIVector<DimensionIndex, int64> dimension_evaluator_classes;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="comment">// Fingerprint of unvisitable non-start/end nodes.</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  uint64 unvisitable_nodes_fprint;</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> </div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment">// Comparator for STL containers and algorithms.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> LessThan(<span class="keyword">const</span> VehicleClass& a, <span class="keyword">const</span> VehicleClass& b);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  };</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="preprocessor">#endif // defined(SWIG)</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> </div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="comment">// Constant used to express a hard constraint instead of a soft penalty.</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keyword">static</span> <span class="keyword">const</span> int64 kNoPenalty;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> </div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="comment">// Constant used to express the "no disjunction" index, returned when a node</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// does not appear in any disjunction.</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keyword">static</span> <span class="keyword">const</span> DisjunctionIndex kNoDisjunction;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> </div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="comment">// Constant used to express the "no dimension" index, returned when a</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="comment">// dimension name does not correspond to an actual dimension.</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <span class="keyword">static</span> <span class="keyword">const</span> DimensionIndex kNoDimension;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="comment">// Constructor taking an index manager. The version which does not take</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="comment">// RoutingModelParameters is equivalent to passing</span></div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="comment">// DefaultRoutingModelParameters().</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keyword">explicit</span> RoutingModel(<span class="keyword">const</span> RoutingIndexManager& index_manager);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  RoutingModel(<span class="keyword">const</span> RoutingIndexManager& index_manager,</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keyword">const</span> RoutingModelParameters& parameters);</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  ~RoutingModel();</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="comment">// Registers 'callback' and returns its index.</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordtype">int</span> RegisterUnaryTransitCallback(TransitCallback1 callback);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordtype">int</span> RegisterTransitCallback(TransitCallback2 callback);</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordtype">int</span> RegisterPositiveTransitCallback(TransitCallback2 callback);</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordtype">int</span> RegisterStateDependentTransitCallback(VariableIndexEvaluator2 callback);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keyword">const</span> TransitCallback2& TransitCallback(<span class="keywordtype">int</span> callback_index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  CHECK_LT(callback_index, transit_evaluators_.size());</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">return</span> transit_evaluators_[callback_index];</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="keyword">const</span> TransitCallback1& UnaryTransitCallbackOrNull(<span class="keywordtype">int</span> callback_index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  CHECK_LT(callback_index, unary_transit_evaluators_.size());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">return</span> unary_transit_evaluators_[callback_index];</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="keyword">const</span> VariableIndexEvaluator2& StateDependentTransitCallback(</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordtype">int</span> callback_index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  CHECK_LT(callback_index, state_dependent_transit_evaluators_.size());</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">return</span> state_dependent_transit_evaluators_[callback_index];</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="comment">// Model creation</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Methods to add dimensions to routes; dimensions represent quantities</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// accumulated at nodes along the routes. They represent quantities such as</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// weights or volumes carried along the route, or distance or times.</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// Quantities at a node are represented by "cumul" variables and the increase</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="comment">// or decrease of quantities between nodes are represented by "transit"</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="comment">// variables. These variables are linked as follows:</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="comment">// if j == next(i), cumul(j) = cumul(i) + transit(i) + slack(i)</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// where slack is a positive slack variable (can represent waiting times for</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="comment">// a time dimension).</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="comment">// Setting the value of fix_start_cumul_to_zero to true will force the "cumul"</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="comment">// variable of the start node of all vehicles to be equal to 0.</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> </div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// Creates a dimension where the transit variable is constrained to be</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="comment">// equal to evaluator(i, next(i)); 'slack_max' is the upper bound of the</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="comment">// slack variable and 'capacity' is the upper bound of the cumul variables.</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="comment">// 'name' is the name used to reference the dimension; this name is used to</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="comment">// get cumul and transit variables from the routing model.</span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// Returns false if a dimension with the same name has already been created</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="comment">// (and doesn't create the new dimension).</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="comment">// Takes ownership of the callback 'evaluator'.</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordtype">bool</span> AddDimension(<span class="keywordtype">int</span> evaluator_index, int64 slack_max, int64 capacity,</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordtype">bool</span> AddDimensionWithVehicleTransits(</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64 slack_max,</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  int64 capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">bool</span> AddDimensionWithVehicleCapacity(<span class="keywordtype">int</span> evaluator_index, int64 slack_max,</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  std::vector<int64> vehicle_capacities,</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordtype">bool</span> AddDimensionWithVehicleTransitAndCapacity(</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64 slack_max,</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  std::vector<int64> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="comment">// Creates a dimension where the transit variable is constrained to be</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="comment">// equal to 'value'; 'capacity' is the upper bound of the cumul variables.</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="comment">// 'name' is the name used to reference the dimension; this name is used to</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="comment">// get cumul and transit variables from the routing model.</span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="comment">// Returns false if a dimension with the same name has already been created</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="comment">// (and doesn't create the new dimension).</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keywordtype">bool</span> AddConstantDimensionWithSlack(int64 value, int64 capacity,</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  int64 slack_max,</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordtype">bool</span> AddConstantDimension(int64 value, int64 capacity,</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keyword">const</span> std::string& name) {</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">return</span> AddConstantDimensionWithSlack(value, capacity, 0,</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  fix_start_cumul_to_zero, name);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// Creates a dimension where the transit variable is constrained to be</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="comment">// equal to 'values[i]' for node i; 'capacity' is the upper bound of</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="comment">// the cumul variables. 'name' is the name used to reference the dimension;</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="comment">// this name is used to get cumul and transit variables from the routing</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="comment">// model.</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="comment">// Returns false if a dimension with the same name has already been created</span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="comment">// (and doesn't create the new dimension).</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordtype">bool</span> AddVectorDimension(std::vector<int64> values, int64 capacity,</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="comment">// Creates a dimension where the transit variable is constrained to be</span></div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="comment">// equal to 'values[i][next(i)]' for node i; 'capacity' is the upper bound of</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="comment">// the cumul variables. 'name' is the name used to reference the dimension;</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="comment">// this name is used to get cumul and transit variables from the routing</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="comment">// model.</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="comment">// Returns false if a dimension with the same name has already been created</span></div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="comment">// (and doesn't create the new dimension).</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordtype">bool</span> AddMatrixDimension(std::vector<std::vector<int64>> values,</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  int64 capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="comment">// Creates a dimension with transits depending on the cumuls of another</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="comment">// dimension. 'pure_transits' are the per-vehicle fixed transits as above.</span></div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="comment">// 'dependent_transits' is a vector containing for each vehicle an index to a</span></div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="comment">// registered state dependent transit callback. 'base_dimension' indicates the</span></div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="comment">// dimension from which the cumul variable is taken. If 'base_dimension' is</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="comment">// nullptr, then the newly created dimension is self-based.</span></div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">bool</span> AddDimensionDependentDimensionWithVehicleCapacity(</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keyword">const</span> std::vector<int>& pure_transits,</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keyword">const</span> std::vector<int>& dependent_transits,</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension, int64 slack_max,</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  std::vector<int64> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keyword">const</span> std::string& name) {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">return</span> AddDimensionDependentDimensionWithVehicleCapacityInternal(</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  pure_transits, dependent_transits, base_dimension, slack_max,</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  std::move(vehicle_capacities), fix_start_cumul_to_zero, name);</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// As above, but pure_transits are taken to be zero evaluators.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordtype">bool</span> AddDimensionDependentDimensionWithVehicleCapacity(</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="keyword">const</span> std::vector<int>& transits, <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension,</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  int64 slack_max, std::vector<int64> vehicle_capacities,</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="comment">// Homogeneous versions of the functions above.</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordtype">bool</span> AddDimensionDependentDimensionWithVehicleCapacity(</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordtype">int</span> transit, <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension, int64 slack_max,</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  int64 vehicle_capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordtype">bool</span> AddDimensionDependentDimensionWithVehicleCapacity(</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordtype">int</span> pure_transit, <span class="keywordtype">int</span> dependent_transit,</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension, int64 slack_max,</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  int64 vehicle_capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span> </div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="comment">// Creates a cached StateDependentTransit from an std::function.</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keyword">static</span> RoutingModel::StateDependentTransit MakeStateDependentTransit(</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keyword">const</span> std::function<int64(int64)>& f, int64 domain_start,</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  int64 domain_end);</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="comment">// For every vehicle of the routing model:</span></div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="comment">// - if total_slacks[vehicle] is not nullptr, constrains it to be the sum of</span></div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="comment">// slacks on that vehicle, that is,</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="comment">// dimension->CumulVar(end) - dimension->CumulVar(start) -</span></div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="comment">// sum_{node in path of vehicle} dimension->FixedTransitVar(node).</span></div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="comment">// - if spans[vehicle] is not nullptr, constrains it to be</span></div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="comment">// dimension->CumulVar(end) - dimension->CumulVar(start)</span></div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="comment">// This does stronger propagation than a decomposition, and takes breaks into</span></div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="comment">// account.</span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  Constraint* MakePathSpansAndTotalSlacks(<span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension,</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  std::vector<IntVar*> spans,</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  std::vector<IntVar*> total_slacks);</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span> </div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="comment">// Outputs the names of all dimensions added to the routing engine.</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="comment">// TODO(user): rename.</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  std::vector<::std::string> GetAllDimensionNames() <span class="keyword">const</span>;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="comment">// Returns all dimensions of the model.</span></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keyword">const</span> std::vector<RoutingDimension*>& GetDimensions()<span class="keyword"> const </span>{</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">return</span> dimensions_.get();</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// Returns dimensions with soft or vehicle span costs.</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  std::vector<RoutingDimension*> GetDimensionsWithSoftOrSpanCosts() <span class="keyword">const</span>;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="comment">// Returns dimensions_for_[global|local]_optimizer_ if the model has been</span></div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="comment">// closed, and empty vectors otherwise.</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keyword">const</span> std::vector<RoutingDimension*>& GetDimensionsForGlobalCumulOptimizers()<span class="keyword"></span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> <span class="keyword"> const </span>{</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordflow">return</span> dimensions_for_global_optimizer_;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keyword">const</span> std::vector<RoutingDimension*>& GetDimensionsForLocalCumulOptimizers()<span class="keyword"></span></div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span> <span class="keyword"> const </span>{</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">return</span> dimensions_for_local_optimizer_;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  }</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// Returns true if a dimension exists for a given dimension name.</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordtype">bool</span> HasDimension(<span class="keyword">const</span> std::string& dimension_name) <span class="keyword">const</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">// Returns a dimension from its name. Dies if the dimension does not exist.</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& GetDimensionOrDie(</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keyword">const</span> std::string& dimension_name) <span class="keyword">const</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="comment">// Returns a dimension from its name. Returns nullptr if the dimension does</span></div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="comment">// not exist.</span></div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* GetMutableDimension(</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="keyword">const</span> std::string& dimension_name) <span class="keyword">const</span>;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="comment">// Set the given dimension as "primary constrained". As of August 2013, this</span></div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="comment">// is only used by ArcIsMoreConstrainedThanArc().</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// "dimension" must be the name of an existing dimension, or be empty, in</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">// which case there will not be a primary dimension after this call.</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordtype">void</span> SetPrimaryConstrainedDimension(<span class="keyword">const</span> std::string& dimension_name) {</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  DCHECK(dimension_name.empty() || HasDimension(dimension_name));</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  primary_constrained_dimension_ = dimension_name;</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="comment">// Get the primary constrained dimension, or an empty std::string if it is</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="comment">// unset.</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keyword">const</span> std::string& GetPrimaryConstrainedDimension()<span class="keyword"> const </span>{</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keywordflow">return</span> primary_constrained_dimension_;</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="comment">// Adds a disjunction constraint on the indices: exactly 'max_cardinality' of</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="comment">// the indices are active. Start and end indices of any vehicle cannot be part</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="comment">// of a disjunction.</span></div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// If a penalty is given, at most 'max_cardinality' of the indices can be</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="comment">// active, and if less are active, 'penalty' is payed per inactive index.</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="comment">// This is equivalent to adding the constraint:</span></div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// p + Sum(i)active[i] == max_cardinality</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="comment">// where p is an integer variable, and the following cost to the cost</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="comment">// function:</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <span class="comment">// p * penalty.</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="comment">// 'penalty' must be positive to make the disjunction optional; a negative</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="comment">// penalty will force 'max_cardinality' indices of the disjunction to be</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="comment">// performed, and therefore p == 0.</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="comment">// Note: passing a vector with a single index will model an optional index</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="comment">// with a penalty cost if it is not visited.</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  DisjunctionIndex AddDisjunction(<span class="keyword">const</span> std::vector<int64>& indices,</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  int64 penalty = kNoPenalty,</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  int64 max_cardinality = 1);</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="comment">// Returns the indices of the disjunctions to which an index belongs.</span></div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keyword">const</span> std::vector<DisjunctionIndex>& GetDisjunctionIndices(</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  int64 index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordflow">return</span> index_to_disjunctions_[index];</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  }</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="comment">// Calls f for each variable index of indices in the same disjunctions as the</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="comment">// node corresponding to the variable index 'index'; only disjunctions of</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="comment">// cardinality 'cardinality' are considered.</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> F></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordtype">void</span> ForEachNodeInDisjunctionWithMaxCardinalityFromIndex(</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  int64 index, int64 max_cardinality, F f)<span class="keyword"> const </span>{</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> DisjunctionIndex disjunction : GetDisjunctionIndices(index)) {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordflow">if</span> (disjunctions_[disjunction].value.max_cardinality == max_cardinality) {</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> int64 d_index : disjunctions_[disjunction].indices) {</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  f(d_index);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  }</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="preprocessor">#if !defined(SWIGPYTHON)</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="comment">// Returns the variable indices of the nodes in the disjunction of index</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="comment">// 'index'.</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keyword">const</span> std::vector<int64>& GetDisjunctionIndices(</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  DisjunctionIndex index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">return</span> disjunctions_[index].indices;</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> <span class="preprocessor">#endif // !defined(SWIGPYTHON)</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="comment">// Returns the penalty of the node disjunction of index 'index'.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  int64 GetDisjunctionPenalty(DisjunctionIndex index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">return</span> disjunctions_[index].value.penalty;</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="comment">// Returns the maximum number of possible active nodes of the node disjunction</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="comment">// of index 'index'.</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  int64 GetDisjunctionMaxCardinality(DisjunctionIndex index)<span class="keyword"> const </span>{</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">return</span> disjunctions_[index].value.max_cardinality;</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>  <span class="comment">// Returns the number of node disjunctions in the model.</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordtype">int</span> GetNumberOfDisjunctions()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> disjunctions_.size(); }</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="comment">// Returns the list of all perfect binary disjunctions, as pairs of variable</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="comment">// indices: a disjunction is "perfect" when its variables do not appear in</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="comment">// any other disjunction. Each pair is sorted (lowest variable index first),</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="comment">// and the output vector is also sorted (lowest pairs first).</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  std::vector<std::pair<int64, int64>> GetPerfectBinaryDisjunctions() <span class="keyword">const</span>;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="comment">// SPECIAL: Makes the solver ignore all the disjunctions whose active</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="comment">// variables are all trivially zero (i.e. Max() == 0), by setting their</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="comment">// max_cardinality to 0.</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="comment">// This can be useful when using the BaseBinaryDisjunctionNeighborhood</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="comment">// operators, in the context of arc-based routing.</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordtype">void</span> IgnoreDisjunctionsAlreadyForcedToZero();</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> </div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="comment">// Adds a soft contraint to force a set of variable indices to be on the same</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="comment">// vehicle. If all nodes are not on the same vehicle, each extra vehicle used</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="comment">// adds 'cost' to the cost function.</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordtype">void</span> AddSoftSameVehicleConstraint(<span class="keyword">const</span> std::vector<int64>& indices,</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  int64 cost);</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> </div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="comment">// Sets the vehicles which can visit a given node. If the node is in a</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="comment">// disjunction, this will not prevent it from being unperformed.</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="comment">// Specifying an empty vector of vehicles has no effect (all vehicles</span></div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="comment">// will be allowed to visit the node).</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordtype">void</span> SetAllowedVehiclesForIndex(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>,</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  int64 index);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span> </div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="comment">// Returns true if a vehicle is allowed to visit a given node.</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordtype">bool</span> IsVehicleAllowedForIndex(<span class="keywordtype">int</span> vehicle, int64 index) {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keywordflow">return</span> allowed_vehicles_[index].empty() ||</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  allowed_vehicles_[index].find(vehicle) !=</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  allowed_vehicles_[index].end();</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</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>  <span class="comment">// Notifies that index1 and index2 form a pair of nodes which should belong</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="comment">// to the same route. This methods helps the search find better solutions,</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">// especially in the local search phase.</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="comment">// It should be called each time you have an equality constraint linking</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="comment">// the vehicle variables of two node (including for instance pickup and</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="comment">// delivery problems):</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="comment">// Solver* const solver = routing.solver();</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="comment">// int64 index1 = manager.NodeToIndex(node1);</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="comment">// int64 index2 = manager.NodeToIndex(node2);</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="comment">// solver->AddConstraint(solver->MakeEquality(</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="comment">// routing.VehicleVar(index1),</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="comment">// routing.VehicleVar(index2)));</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="comment">// routing.AddPickupAndDelivery(index1, index2);</span></div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="comment">//</span></div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="comment">// TODO(user): Remove this when model introspection detects linked nodes.</span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordtype">void</span> AddPickupAndDelivery(int64 pickup, int64 delivery);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="comment">// Same as AddPickupAndDelivery but notifying that the performed node from</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="comment">// the disjunction of index 'pickup_disjunction' is on the same route as the</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="comment">// performed node from the disjunction of index 'delivery_disjunction'.</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordtype">void</span> AddPickupAndDeliverySets(DisjunctionIndex pickup_disjunction,</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  DisjunctionIndex delivery_disjunction);</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="comment">// Returns pairs for which the node is a pickup; the first element of each</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="comment">// pair is the index in the pickup and delivery pairs list in which the pickup</span></div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="comment">// appears, the second element is its index in the pickups list.</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keyword">const</span> std::vector<std::pair<int, int> >&</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  GetPickupIndexPairs(int64 node_index) <span class="keyword">const</span>;</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="comment">// Same as above for deliveries.</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keyword">const</span> std::vector<std::pair<int, int> >&</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  GetDeliveryIndexPairs(int64 node_index) <span class="keyword">const</span>;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="comment">// Sets the Pickup and delivery policy of all vehicles. It is equivalent to</span></div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="comment">// calling SetPickupAndDeliveryPolicyOfVehicle on all vehicles.</span></div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordtype">void</span> SetPickupAndDeliveryPolicyOfAllVehicles(PickupAndDeliveryPolicy policy);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordtype">void</span> SetPickupAndDeliveryPolicyOfVehicle(PickupAndDeliveryPolicy policy,</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  PickupAndDeliveryPolicy GetPickupAndDeliveryPolicyOfVehicle(</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="comment">// Returns the number of non-start/end nodes which do not appear in a</span></div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="comment">// pickup/delivery pair.</span></div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span> </div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordtype">int</span> GetNumOfSingletonNodes() <span class="keyword">const</span>;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="comment">// Returns pickup and delivery pairs currently in the model.</span></div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keyword">const</span> IndexPairs& GetPickupAndDeliveryPairs()<span class="keyword"> const </span>{</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">return</span> pickup_delivery_pairs_;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  }</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keyword">const</span> std::vector<std::pair<DisjunctionIndex, DisjunctionIndex>>&</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  GetPickupAndDeliveryDisjunctions()<span class="keyword"> const </span>{</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordflow">return</span> pickup_delivery_disjunctions_;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  }</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="comment">// Set the node visit types and incompatibilities/requirements between the</span></div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="comment">// types (see below).</span></div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="comment">// NOTE: The visit type of a node must be positive, and all nodes belonging to</span></div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="comment">// the same pickup/delivery pair must have the same type (or no type at all).</span></div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="comment">// NOTE: Before adding any incompatibilities and/or requirements on types:</span></div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="comment">// 1) All corresponding node types must have been set.</span></div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="comment">// 2) CloseVisitTypes() must be called so all containers are resized</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="comment">// accordingly.</span></div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <span class="comment">// NOTE: These incompatibilities and requirements are only handled when each</span></div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="comment">// node index appears in at most one pickup/delivery pair, i.e. when the same</span></div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="comment">// node isn't a pickup and/or delivery in multiple pickup/delivery pairs.</span></div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="comment">// TODO(user): Support multiple visit types per node?</span></div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordtype">void</span> SetVisitType(int64 index, <span class="keywordtype">int</span> type);</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a874eb2862dd884ad47e30746e03627f5">GetVisitType</a>(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="comment">// This function should be called once all node visit types have been set and</span></div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="comment">// prior to adding any incompatibilities/requirements.</span></div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="comment">// TODO(user): Reconsider the logic and potentially remove the need to</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="comment">// "close" types.</span></div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a822458cc9a9a6fa02e86af3e3a1e5c89">CloseVisitTypes</a>();</div><div class="line"><a name="l00706"></a><span class="lineno"><a class="line" href="routing_8h.html#a24478803a7138d68852093b9c2743892"> 706</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a24478803a7138d68852093b9c2743892">GetNumberOfVisitTypes</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> num_visit_types_; }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="comment">// Incompatibilities:</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="comment">// Two nodes with "hard" incompatible types cannot share the same route at</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="comment">// all, while with a "temporal" incompatibility they can't be on the same</span></div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="comment">// route at the same time.</span></div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a796b4eed03ed53bbbaed642f4ae94952">AddHardTypeIncompatibility</a>(<span class="keywordtype">int</span> type1, <span class="keywordtype">int</span> type2);</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a7086a908f1890a7e1550c97b774e6384">AddTemporalTypeIncompatibility</a>(<span class="keywordtype">int</span> type1, <span class="keywordtype">int</span> type2);</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="comment">// Returns visit types incompatible with a given type.</span></div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keyword">const</span> absl::flat_hash_set<int>& <a class="code" href="routing_8h.html#a51fb0661acf38ed1442819e2cc452311">GetHardTypeIncompatibilitiesOfType</a>(</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keyword">const</span> absl::flat_hash_set<int>& <a class="code" href="routing_8h.html#a9d8ead500db4128d0d27f8066d1f8208">GetTemporalTypeIncompatibilitiesOfType</a>(</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  <span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="comment">// Returns true iff any hard (resp. temporal) type incompatibilities have been</span></div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="comment">// added to the model.</span></div><div class="line"><a name="l00720"></a><span class="lineno"><a class="line" href="routing_8h.html#a9c58894df747f5498c335a3a8c5c0c88"> 720</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a9c58894df747f5498c335a3a8c5c0c88">HasHardTypeIncompatibilities</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keywordflow">return</span> has_hard_type_incompatibilities_;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  }</div><div class="line"><a name="l00723"></a><span class="lineno"><a class="line" href="routing_8h.html#ad19492313b68e5a963af3793aaec8d90"> 723</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ad19492313b68e5a963af3793aaec8d90">HasTemporalTypeIncompatibilities</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">return</span> has_temporal_type_incompatibilities_;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  }</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">// Requirements:</span></div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="comment">// NOTE: As of 2019-04, cycles in the requirement graph are not supported,</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="comment">// and lead to the dependent nodes being skipped if possible (otherwise</span></div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="comment">// the model is considered infeasible).</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="comment">// The following functions specify that "dependent_type" requires at least</span></div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="comment">// one of the types in "required_type_alternatives".</span></div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="comment">//</span></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="comment">// For same-vehicle requirements, a node of dependent type type_D requires at</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="comment">// least one node of type type_R among the required alternatives on the same</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="comment">// route.</span></div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1">AddSameVehicleRequiredTypeAlternatives</a>(</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordtype">int</span> dependent_type, absl::flat_hash_set<int> required_type_alternatives);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="comment">// If type_D temporally depends on type_R, any non-delivery node_D of type_D</span></div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="comment">// requires at least one non-delivered node of type_R on its vehicle at the</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="comment">// time node_D is visited.</span></div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a92ee209f167d3974329301d784010b63">AddTemporalRequiredTypeAlternatives</a>(</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordtype">int</span> dependent_type, absl::flat_hash_set<int> required_type_alternatives);</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <span class="comment">// Returns the sets of same-vehicle/temporal requirement alternatives for the</span></div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <span class="comment">// given type.</span></div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keyword">const</span> std::vector<absl::flat_hash_set<int> >&</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <a class="code" href="routing_8h.html#ae350d70cb713a6772283e3753f4f2f7a">GetSameVehicleRequiredTypeAlternativesOfType</a>(<span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keyword">const</span> std::vector<absl::flat_hash_set<int> >&</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <a class="code" href="routing_8h.html#ab1652af55e9d83490d9c59d35d991ce9">GetTemporalRequiredTypeAlternativesOfType</a>(<span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="comment">// Returns true iff any same-route (resp. temporal) type requirements have</span></div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="comment">// been added to the model.</span></div><div class="line"><a name="l00753"></a><span class="lineno"><a class="line" href="routing_8h.html#abc101a64a3c876dcdf1b7176d59bd2c9"> 753</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#abc101a64a3c876dcdf1b7176d59bd2c9">HasSameVehicleTypeRequirements</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="keywordflow">return</span> has_same_vehicle_type_requirements_;</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  }</div><div class="line"><a name="l00756"></a><span class="lineno"><a class="line" href="routing_8h.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891"> 756</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891">HasTemporalTypeRequirements</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">return</span> has_temporal_type_requirements_;</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</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="comment">// Returns true iff the model has any incompatibilities or requirements set</span></div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="comment">// on node types.</span></div><div class="line"><a name="l00762"></a><span class="lineno"><a class="line" href="routing_8h.html#ab313d84a56c5e9b1b8f28da70b8d4045"> 762</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ab313d84a56c5e9b1b8f28da70b8d4045">HasTypeRegulations</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">return</span> <a class="code" href="routing_8h.html#ad19492313b68e5a963af3793aaec8d90">HasTemporalTypeIncompatibilities</a>() ||</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <a class="code" href="routing_8h.html#a9c58894df747f5498c335a3a8c5c0c88">HasHardTypeIncompatibilities</a>() || <a class="code" href="routing_8h.html#abc101a64a3c876dcdf1b7176d59bd2c9">HasSameVehicleTypeRequirements</a>() ||</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <a class="code" href="routing_8h.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891">HasTemporalTypeRequirements</a>();</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</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="comment">// Get the "unperformed" penalty of a node. This is only well defined if the</span></div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="comment">// node is only part of a single Disjunction involving only itself, and that</span></div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="comment">// disjunction has a penalty. In all other cases, including forced active</span></div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="comment">// nodes, this returns 0.</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  int64 <a class="code" href="routing_8h.html#a3600327c657a0c83430d7bd9566e9ab6">UnperformedPenalty</a>(int64 var_index) <span class="keyword">const</span>;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="comment">// Same as above except that it returns default_value instead of 0 when</span></div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="comment">// penalty is not well defined (default value is passed as first argument to</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="comment">// simplify the usage of the method in a callback).</span></div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  int64 <a class="code" href="routing_8h.html#ae8364b53d49a5b46e994d41124c4ffd6">UnperformedPenaltyOrValue</a>(int64 default_value, int64 var_index) <span class="keyword">const</span>;</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="comment">// Returns the variable index of the first starting or ending node of all</span></div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="comment">// routes. If all routes start and end at the same node (single depot), this</span></div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="comment">// is the node returned.</span></div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  int64 <a class="code" href="routing_8h.html#acca75b5d3bfe2433c5805b049815f533">GetDepot</a>() <span class="keyword">const</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>  <span class="comment">// Sets the cost function of the model such that the cost of a segment of a</span></div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="comment">// route between node 'from' and 'to' is evaluator(from, to), whatever the</span></div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="comment">// route or vehicle performing the route.</span></div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ab8d61705aa4291d2cd437ba0a7dfccbf">SetArcCostEvaluatorOfAllVehicles</a>(<span class="keywordtype">int</span> evaluator_index);</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="comment">// Sets the cost function for a given vehicle route.</span></div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ae75d9f49c157b7784fc8baa7d623ee35">SetArcCostEvaluatorOfVehicle</a>(<span class="keywordtype">int</span> evaluator_index, <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="comment">// Sets the fixed cost of all vehicle routes. It is equivalent to calling</span></div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <span class="comment">// SetFixedCostOfVehicle on all vehicle routes.</span></div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a07b796e9f91ee5b4c5e99c7f23e2f743">SetFixedCostOfAllVehicles</a>(int64 cost);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="comment">// Sets the fixed cost of one vehicle route.</span></div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a4e8f5b5f090cf084347eda6eb803813a">SetFixedCostOfVehicle</a>(int64 cost, <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="comment">// Returns the route fixed cost taken into account if the route of the</span></div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="comment">// vehicle is not empty, aka there's at least one node on the route other than</span></div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  <span class="comment">// the first and last nodes.</span></div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  int64 <a class="code" href="routing_8h.html#a4bab641f5b9bf8de266adad29558b4c2">GetFixedCostOfVehicle</a>(<span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span> </div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// The following methods set the linear and quadratic cost factors of vehicles</span></div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="comment">// (must be positive values). The default value of these parameters is zero</span></div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="comment">// for all vehicles.</span></div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="comment">// When set, the cost_ of the model will contain terms aiming at reducing the</span></div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="comment">// number of vehicles used in the model, by adding the following to the</span></div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  <span class="comment">// objective for every vehicle v:</span></div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="comment">// INDICATOR(v used in the model) *</span></div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="comment">// [linear_cost_factor_of_vehicle_[v]</span></div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <span class="comment">// - quadratic_cost_factor_of_vehicle_[v]*(square of length of route v)]</span></div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="comment">// i.e. for every used vehicle, we add the linear factor as fixed cost, and</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="comment">// subtract the square of the route length multiplied by the quadratic factor.</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="comment">// This second term aims at making the routes as dense as possible.</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="comment">//</span></div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  <span class="comment">// Sets the linear and quadratic cost factor of all vehicles.</span></div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#aa3d92ac74ce8d3e57551677e88e2c846">SetAmortizedCostFactorsOfAllVehicles</a>(int64 linear_cost_factor,</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  int64 quadratic_cost_factor);</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <span class="comment">// Sets the linear and quadratic cost factor of the given vehicle.</span></div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ae1acdfe3dcf892d108d2a2ecab94e936">SetAmortizedCostFactorsOfVehicle</a>(int64 linear_cost_factor,</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  int64 quadratic_cost_factor,</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="routing_8h.html#aa01519be299cb5ddef36111ee6f8a5cc"> 819</a></span>  <span class="keyword">const</span> std::vector<int64>& <a class="code" href="routing_8h.html#aa01519be299cb5ddef36111ee6f8a5cc">GetAmortizedLinearCostFactorOfVehicles</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  <span class="keywordflow">return</span> linear_cost_factor_of_vehicle_;</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  }</div><div class="line"><a name="l00822"></a><span class="lineno"><a class="line" href="routing_8h.html#aaeaf95383c1c03da6f22c522d119775b"> 822</a></span>  <span class="keyword">const</span> std::vector<int64>& <a class="code" href="routing_8h.html#aaeaf95383c1c03da6f22c522d119775b">GetAmortizedQuadraticCostFactorOfVehicles</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <span class="keywordflow">return</span> quadratic_cost_factor_of_vehicle_;</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  }</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span> </div><div class="line"><a name="l00826"></a><span class="lineno"><a class="line" href="routing_8h.html#a7ccaa3133378da76d3fd5cdb560038ae"> 826</a></span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a7ccaa3133378da76d3fd5cdb560038ae">ConsiderEmptyRouteCostsForVehicle</a>(<span class="keywordtype">bool</span> consider_costs, <span class="keywordtype">int</span> vehicle) {</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  DCHECK_LT(vehicle, vehicles_);</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  consider_empty_route_costs_[vehicle] = consider_costs;</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  }</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span> </div><div class="line"><a name="l00831"></a><span class="lineno"><a class="line" href="routing_8h.html#aed6760664a6e4f3427832ee3b7ba0602"> 831</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#aed6760664a6e4f3427832ee3b7ba0602">AreEmptyRouteCostsConsideredForVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  DCHECK_LT(vehicle, vehicles_);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="keywordflow">return</span> consider_empty_route_costs_[vehicle];</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</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="comment">// Search</span></div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span> <span class="comment">// Gets/sets the evaluator used during the search. Only relevant when</span></div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> <span class="comment">// RoutingSearchParameters.first_solution_strategy = EVALUATOR_STRATEGY.</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l00840"></a><span class="lineno"><a class="line" href="routing_8h.html#a660cb5477a6d3fbf146657aa7af73968"> 840</a></span>  <span class="keyword">const</span> <a class="code" href="classoperations__research_1_1Solver.html#a0243986dd2db4b6e1bda331329ae529b">Solver::IndexEvaluator2</a>& <a class="code" href="routing_8h.html#a660cb5477a6d3fbf146657aa7af73968">first_solution_evaluator</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keywordflow">return</span> first_solution_evaluator_;</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> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  <span class="comment">// Takes ownership of evaluator.</span></div><div class="line"><a name="l00845"></a><span class="lineno"><a class="line" href="routing_8h.html#ab69145472d51d341f82d3ad29e9c6be2"> 845</a></span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ab69145472d51d341f82d3ad29e9c6be2">SetFirstSolutionEvaluator</a>(<a class="code" href="classoperations__research_1_1Solver.html#a0243986dd2db4b6e1bda331329ae529b">Solver::IndexEvaluator2</a> evaluator) {</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  first_solution_evaluator_ = std::move(evaluator);</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  }</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="comment">// Adds a local search operator to the set of operators used to solve the</span></div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="comment">// vehicle routing problem.</span></div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a1156fa8214dba09e2a2a94862244aa1f">AddLocalSearchOperator</a>(LocalSearchOperator* ls_operator);</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  <span class="comment">// Adds a search monitor to the search used to solve the routing model.</span></div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a0e23be986e4c3b96a50c8798aa5f536d">AddSearchMonitor</a>(SearchMonitor* <span class="keyword">const</span> monitor);</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// Adds a callback called each time a solution is found during the search.</span></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="comment">// This is a shortcut to creating a monitor to call the callback on</span></div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// AtSolution() and adding it with AddSearchMonitor.</span></div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a086605d9650ce3c576d8a9c45ce0b9fc">AddAtSolutionCallback</a>(std::function<<span class="keywordtype">void</span>()> callback);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="comment">// Adds a variable to minimize in the solution finalizer. The solution</span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// finalizer is called each time a solution is found during the search and</span></div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// allows to instantiate secondary variables (such as dimension cumul</span></div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">// variables).</span></div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a4768ba91c34c542eddec212a68d79473">AddVariableMinimizedByFinalizer</a>(IntVar* var);</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="comment">// Adds a variable to maximize in the solution finalizer (see above for</span></div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// information on the solution finalizer).</span></div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#aabdcf3bd412a5a61d811ef85e115e5ff">AddVariableMaximizedByFinalizer</a>(IntVar* var);</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="comment">// Adds a variable to minimize in the solution finalizer, with a weighted</span></div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="comment">// priority: the higher the more priority it has.</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a939aa2ef2afec0337b0f9d4dcb1c2db8">AddWeightedVariableMinimizedByFinalizer</a>(IntVar* var, int64 cost);</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="comment">// Add a variable to set the closest possible to the target value in the</span></div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="comment">// solution finalizer.</span></div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a1739a41268c21cfc401d870f05b93536">AddVariableTargetToFinalizer</a>(IntVar* var, int64 target);</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="comment">// Closes the current routing model; after this method is called, no</span></div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">// modification to the model can be done, but RoutesToAssignment becomes</span></div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// available. Note that CloseModel() is automatically called by Solve() and</span></div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">// other methods that produce solution.</span></div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="comment">// This is equivalent to calling</span></div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="comment">// CloseModelWithParameters(DefaultRoutingSearchParameters()).</span></div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#add71470f4175a0859e6e3d69c2a53988">CloseModel</a>();</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">// Same as above taking search parameters (as of 10/2015 some the parameters</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="comment">// have to be set when closing the model).</span></div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#aa79f8d482de4dd0ef86a1b54999686af">CloseModelWithParameters</a>(</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="comment">// Solves the current routing model; closes the current model.</span></div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="comment">// This is equivalent to calling</span></div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <span class="comment">// SolveWithParameters(DefaultRoutingSearchParameters())</span></div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="comment">// or</span></div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="comment">// SolveFromAssignmentWithParameters(assignment,</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="comment">// DefaultRoutingSearchParameters()).</span></div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">const</span> Assignment* <a class="code" href="routing_8h.html#a562e4c0a80f7f4eda9573a482af288d1">Solve</a>(<span class="keyword">const</span> Assignment* assignment = <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="comment">// Solves the current routing model with the given parameters. If 'solutions'</span></div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="comment">// is specified, it will contain the k best solutions found during the search</span></div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="comment">// (from worst to best, including the one returned by this method), where k</span></div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="comment">// corresponds to the 'number_of_solutions_to_collect' in 'search_parameters'.</span></div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="comment">// Note that the Assignment returned by the method and the ones in solutions</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="comment">// are owned by the underlying solver and should not be deleted.</span></div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keyword">const</span> Assignment* <a class="code" href="routing_8h.html#af4e97be54c31d45d312d168ce1c8ba6f">SolveWithParameters</a>(</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters,</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  std::vector<const Assignment*>* solutions = <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keyword">const</span> Assignment* <a class="code" href="routing_8h.html#a56e06d63a6d3792ab5cd64e51724632b">SolveFromAssignmentWithParameters</a>(</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  <span class="keyword">const</span> Assignment* assignment,</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters,</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  std::vector<const Assignment*>* solutions = <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="comment">// Given a "source_model" and its "source_assignment", resets</span></div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="comment">// "target_assignment" with the IntVar variables (nexts_, and vehicle_vars_</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="comment">// if costs aren't homogeneous across vehicles) of "this" model, with the</span></div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="comment">// values set according to those in "other_assignment".</span></div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  <span class="comment">// The objective_element of target_assignment is set to this->cost_.</span></div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ac1a2ab630f6b13644ca6853c7893f413">SetAssignmentFromOtherModelAssignment</a>(</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  Assignment* target_assignment, <span class="keyword">const</span> RoutingModel* source_model,</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keyword">const</span> Assignment* source_assignment);</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="comment">// Computes a lower bound to the routing problem solving a linear assignment</span></div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="comment">// problem. The routing model must be closed before calling this method.</span></div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="comment">// Note that problems with node disjunction constraints (including optional</span></div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="comment">// nodes) and non-homogenous costs are not supported (the method returns 0 in</span></div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="comment">// these cases).</span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  <span class="comment">// TODO(user): Add support for non-homogeneous costs and disjunctions.</span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  int64 <a class="code" href="routing_8h.html#ae9b2404a26ab1e6acf562b8261eeba38">ComputeLowerBound</a>();</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <span class="comment">// Returns the current status of the routing model.</span></div><div class="line"><a name="l00918"></a><span class="lineno"><a class="line" href="routing_8h.html#adb1490a44086db009cdb51f854a02a65"> 918</a></span>  Status <a class="code" href="routing_8h.html#adb1490a44086db009cdb51f854a02a65">status</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> status_; }</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="comment">// Applies a lock chain to the next search. 'locks' represents an ordered</span></div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="comment">// vector of nodes representing a partial route which will be fixed during the</span></div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  <span class="comment">// next search; it will constrain next variables such that:</span></div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="comment">// next[locks[i]] == locks[i+1].</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="comment">// Returns the next variable at the end of the locked chain; this variable is</span></div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="comment">// not locked. An assignment containing the locks can be obtained by calling</span></div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="comment">// PreAssignment().</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  IntVar* <a class="code" href="routing_8h.html#aaf71584ad4bffea7a489dc53787fa6f8">ApplyLocks</a>(<span class="keyword">const</span> std::vector<int64>& locks);</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// Applies lock chains to all vehicles to the next search, such that locks[p]</span></div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="comment">// is the lock chain for route p. Returns false if the locks do not contain</span></div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="comment">// valid routes; expects that the routes do not contain the depots,</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="comment">// i.e. there are empty vectors in place of empty routes.</span></div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <span class="comment">// If close_routes is set to true, adds the end nodes to the route of each</span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="comment">// vehicle and deactivates other nodes.</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="comment">// An assignment containing the locks can be obtained by calling</span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="comment">// PreAssignment().</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a410f7da30cf944b7874eebe57eebe41a">ApplyLocksToAllVehicles</a>(<span class="keyword">const</span> std::vector<std::vector<int64>>& locks,</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="keywordtype">bool</span> close_routes);</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="comment">// Returns an assignment used to fix some of the variables of the problem.</span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  <span class="comment">// In practice, this assignment locks partial routes of the problem. This</span></div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <span class="comment">// can be used in the context of locking the parts of the routes which have</span></div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="comment">// already been driven in online routing problems.</span></div><div class="line"><a name="l00941"></a><span class="lineno"><a class="line" href="routing_8h.html#ae033bc458ffce1ecc4874f3e212896f7"> 941</a></span>  <span class="keyword">const</span> Assignment* <span class="keyword">const</span> <a class="code" href="routing_8h.html#ae033bc458ffce1ecc4874f3e212896f7">PreAssignment</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> preassignment_; }</div><div class="line"><a name="l00942"></a><span class="lineno"><a class="line" href="routing_8h.html#a3af1158b77552d60afc3f0473de3892d"> 942</a></span>  Assignment* <a class="code" href="routing_8h.html#a3af1158b77552d60afc3f0473de3892d">MutablePreAssignment</a>() { <span class="keywordflow">return</span> preassignment_; }</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <span class="comment">// Writes the current solution to a file containing an AssignmentProto.</span></div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="comment">// Returns false if the file cannot be opened or if there is no current</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="comment">// solution.</span></div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#acfcef421e8c8cd243157543f741d6a73">WriteAssignment</a>(<span class="keyword">const</span> std::string& file_name) <span class="keyword">const</span>;</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="comment">// Reads an assignment from a file and returns the current solution.</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="comment">// Returns nullptr if the file cannot be opened or if the assignment is not</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="comment">// valid.</span></div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  Assignment* <a class="code" href="routing_8h.html#a74e3de2ce73322e1860be0713c07c33e">ReadAssignment</a>(<span class="keyword">const</span> std::string& file_name);</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="comment">// Restores an assignment as a solution in the routing model and returns the</span></div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="comment">// new solution. Returns nullptr if the assignment is not valid.</span></div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  Assignment* <a class="code" href="routing_8h.html#a566ddf59563c1b37e8c178b1805aa0f4">RestoreAssignment</a>(<span class="keyword">const</span> Assignment& solution);</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="comment">// Restores the routes as the current solution. Returns nullptr if the</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="comment">// solution cannot be restored (routes do not contain a valid solution). Note</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="comment">// that calling this method will run the solver to assign values to the</span></div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="comment">// dimension variables; this may take considerable amount of time, especially</span></div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="comment">// when using dimensions with slack.</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  Assignment* <a class="code" href="routing_8h.html#a97dca877bb5083a72c147628a8439770">ReadAssignmentFromRoutes</a>(</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="keyword">const</span> std::vector<std::vector<int64>>& routes,</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keywordtype">bool</span> ignore_inactive_indices);</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="comment">// Fills an assignment from a specification of the routes of the</span></div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="comment">// vehicles. The routes are specified as lists of variable indices that appear</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="comment">// on the routes of the vehicles. The indices of the outer vector in</span></div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="comment">// 'routes' correspond to vehicles IDs, the inner vector contains the</span></div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="comment">// variable indices on the routes for the given vehicle. The inner vectors</span></div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="comment">// must not contain the start and end indices, as these are determined by the</span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  <span class="comment">// routing model. Sets the value of NextVars in the assignment, adding the</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  <span class="comment">// variables to the assignment if necessary. The method does not touch other</span></div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  <span class="comment">// variables in the assignment. The method can only be called after the model</span></div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="comment">// is closed. With ignore_inactive_indices set to false, this method will</span></div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="comment">// fail (return nullptr) in case some of the route contain indices that are</span></div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="comment">// deactivated in the model; when set to true, these indices will be</span></div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <span class="comment">// skipped. Returns true if routes were successfully</span></div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  <span class="comment">// loaded. However, such assignment still might not be a valid</span></div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <span class="comment">// solution to the routing problem due to more complex constraints;</span></div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="comment">// it is advisible to call solver()->CheckSolution() afterwards.</span></div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a78f7f1cb8b08b7ec1d477a14447bd8d4">RoutesToAssignment</a>(<span class="keyword">const</span> std::vector<std::vector<int64>>& routes,</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordtype">bool</span> ignore_inactive_indices, <span class="keywordtype">bool</span> close_routes,</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  Assignment* <span class="keyword">const</span> assignment) <span class="keyword">const</span>;</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="comment">// Converts the solution in the given assignment to routes for all vehicles.</span></div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  <span class="comment">// Expects that assignment contains a valid solution (i.e. routes for all</span></div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <span class="comment">// vehicles end with an end index for that vehicle).</span></div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a97d152b7049084186342b719eee6fa15">AssignmentToRoutes</a>(<span class="keyword">const</span> Assignment& assignment,</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  std::vector<std::vector<int64>>* <span class="keyword">const</span> routes) <span class="keyword">const</span>;</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <span class="comment">// Returns a compacted version of the given assignment, in which all vehicles</span></div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="comment">// with id lower or equal to some N have non-empty routes, and all vehicles</span></div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="comment">// with id greater than N have empty routes. Does not take ownership of the</span></div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="comment">// returned object.</span></div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="comment">// If found, the cost of the compact assignment is the same as in the</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  <span class="comment">// original assignment and it preserves the values of 'active' variables.</span></div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <span class="comment">// Returns nullptr if a compact assignment was not found.</span></div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="comment">// This method only works in homogenous mode, and it only swaps equivalent</span></div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="comment">// vehicles (vehicles with the same start and end nodes). When creating the</span></div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <span class="comment">// compact assignment, the empty plan is replaced by the route assigned to the</span></div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="comment">// compatible vehicle with the highest id. Note that with more complex</span></div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="comment">// constraints on vehicle variables, this method might fail even if a compact</span></div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <span class="comment">// solution exists.</span></div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <span class="comment">// This method changes the vehicle and dimension variables as necessary.</span></div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <span class="comment">// While compacting the solution, only basic checks on vehicle variables are</span></div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <span class="comment">// performed; if one of these checks fails no attempts to repair it are made</span></div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="comment">// (instead, the method returns nullptr).</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  Assignment* <a class="code" href="routing_8h.html#a1b7f20d14ae5261cb2f250c6e99f4383">CompactAssignment</a>(<span class="keyword">const</span> Assignment& assignment) <span class="keyword">const</span>;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="comment">// Same as CompactAssignment() but also checks the validity of the final</span></div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  <span class="comment">// compact solution; if it is not valid, no attempts to repair it are made</span></div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <span class="comment">// (instead, the method returns nullptr).</span></div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  Assignment* <a class="code" href="routing_8h.html#a3e87a7710617f6ac19dca14adad9c5a6">CompactAndCheckAssignment</a>(<span class="keyword">const</span> Assignment& assignment) <span class="keyword">const</span>;</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="comment">// Adds an extra variable to the vehicle routing assignment.</span></div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a437ae499bef0aa64f2753166a000f5bd">AddToAssignment</a>(IntVar* <span class="keyword">const</span> var);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#ab878a81ace850e3ecd26e95966409f61">AddIntervalToAssignment</a>(IntervalVar* <span class="keyword">const</span> interval);</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="comment">// For every dimension in the model's dimensions_for_local/global_optimizer_,</span></div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="comment">// this method tries to pack the cumul values of the dimension, such that:</span></div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  <span class="comment">// - The cumul costs (span costs, soft lower and upper bound costs, etc) are</span></div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <span class="comment">// minimized.</span></div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <span class="comment">// - The cumuls of the ends of the routes are minimized for this given minimal</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="comment">// cumul cost.</span></div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="comment">// - Given these minimal end cumuls, the route start cumuls are maximized.</span></div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <span class="comment">// Returns the assignment resulting from allocating these packed cumuls with</span></div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <span class="comment">// the solver, and nullptr if these cumuls could not be set by the solver.</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="keyword">const</span> Assignment* <a class="code" href="routing_8h.html#a5cc6e6b421a6dfc8650cc38e116fff03">PackCumulsOfOptimizerDimensionsFromAssignment</a>(</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <span class="keyword">const</span> Assignment* original_assignment, absl::Duration duration_limit);</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <span class="comment">// TODO(user): Revisit if coordinates are added to the RoutingModel class.</span></div><div class="line"><a name="l01024"></a><span class="lineno"><a class="line" href="routing_8h.html#a700982f228080c6278eb5a2f7f06f31d"> 1024</a></span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a700982f228080c6278eb5a2f7f06f31d">SetSweepArranger</a>(SweepArranger* <a class="code" href="routing_8h.html#a71815ec83f6605bddb11578ebb835aae">sweep_arranger</a>) {</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  sweep_arranger_.reset(<a class="code" href="routing_8h.html#a71815ec83f6605bddb11578ebb835aae">sweep_arranger</a>);</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  }</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <span class="comment">// Returns the sweep arranger to be used by routing heuristics.</span></div><div class="line"><a name="l01028"></a><span class="lineno"><a class="line" href="routing_8h.html#a71815ec83f6605bddb11578ebb835aae"> 1028</a></span>  SweepArranger* <a class="code" href="routing_8h.html#a71815ec83f6605bddb11578ebb835aae">sweep_arranger</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> sweep_arranger_.get(); }</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="comment">// Adds a custom local search filter to the list of filters used to speed up</span></div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <span class="comment">// local search by pruning unfeasible variable assignments.</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <span class="comment">// Calling this method after the routing model has been closed (CloseModel()</span></div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <span class="comment">// or Solve() has been called) has no effect.</span></div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  <span class="comment">// The routing model does not take ownership of the filter.</span></div><div class="line"><a name="l01035"></a><span class="lineno"><a class="line" href="routing_8h.html#a566384949e6395952f6f6b48603fd87f"> 1035</a></span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a566384949e6395952f6f6b48603fd87f">AddLocalSearchFilter</a>(LocalSearchFilter* filter) {</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  CHECK(filter != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keywordflow">if</span> (closed_) {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  LOG(WARNING) << <span class="stringliteral">"Model is closed, filter addition will be ignored."</span>;</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  }</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  extra_filters_.push_back(filter);</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>  <span class="comment">// Model inspection.</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  <span class="comment">// Returns the variable index of the starting node of a vehicle route.</span></div><div class="line"><a name="l01045"></a><span class="lineno"><a class="line" href="routing_8h.html#acbdbdfc9491ef0586459d38cc5ef4cb8"> 1045</a></span>  int64 <a class="code" href="routing_8h.html#acbdbdfc9491ef0586459d38cc5ef4cb8">Start</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> starts_[vehicle]; }</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <span class="comment">// Returns the variable index of the ending node of a vehicle route.</span></div><div class="line"><a name="l01047"></a><span class="lineno"><a class="line" href="routing_8h.html#a1dc8d32892f78532c8ee7a7186158e07"> 1047</a></span>  int64 <a class="code" href="routing_8h.html#a1dc8d32892f78532c8ee7a7186158e07">End</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ends_[vehicle]; }</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  <span class="comment">// Returns true if 'index' represents the first node of a route.</span></div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ae1adbc353c105572655ae866124c61b6">IsStart</a>(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// Returns true if 'index' represents the last node of a route.</span></div><div class="line"><a name="l01051"></a><span class="lineno"><a class="line" href="routing_8h.html#ae2530e17cabaf267e12929ca0ee1bee0"> 1051</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ae2530e17cabaf267e12929ca0ee1bee0">IsEnd</a>(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> index >= <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>(); }</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="comment">// Returns the vehicle of the given start/end index, and -1 if the given index</span></div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="comment">// is not a vehicle start/end.</span></div><div class="line"><a name="l01054"></a><span class="lineno"><a class="line" href="routing_8h.html#abd33c037942b971eeefad43c6022c20e"> 1054</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#abd33c037942b971eeefad43c6022c20e">VehicleIndex</a>(<span class="keywordtype">int</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> index_to_vehicle_[index]; }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="comment">// Assignment inspection</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <span class="comment">// Returns the variable index of the node directly after the node</span></div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="comment">// corresponding to 'index' in 'assignment'.</span></div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  int64 <a class="code" href="routing_8h.html#a46a69d9769aa92122c7e5e20f49e3da3">Next</a>(<span class="keyword">const</span> Assignment& assignment, int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="comment">// Returns true if the route of 'vehicle' is non empty in 'assignment'.</span></div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(<span class="keyword">const</span> Assignment& assignment, <span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> <span class="comment">// Variables</span></div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> <span class="preprocessor">#if !defined(SWIGPYTHON)</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="comment">// Returns all next variables of the model, such that Nexts(i) is the next</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="comment">// variable of the node corresponding to i.</span></div><div class="line"><a name="l01065"></a><span class="lineno"><a class="line" href="routing_8h.html#aad154b31953d2b467bbac3e4ac696cd6"> 1065</a></span>  <span class="keyword">const</span> std::vector<IntVar*>& <a class="code" href="routing_8h.html#aad154b31953d2b467bbac3e4ac696cd6">Nexts</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> nexts_; }</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <span class="comment">// Returns all vehicle variables of the model, such that VehicleVars(i) is</span></div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <span class="comment">// the vehicle variable of the node corresponding to i.</span></div><div class="line"><a name="l01068"></a><span class="lineno"><a class="line" href="routing_8h.html#a80572a238b48c2cefe38409e7544f161"> 1068</a></span>  <span class="keyword">const</span> std::vector<IntVar*>& <a class="code" href="routing_8h.html#a80572a238b48c2cefe38409e7544f161">VehicleVars</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vehicle_vars_; }</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> <span class="preprocessor">#endif // !defined(SWIGPYTHON)</span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="comment">// Returns the next variable of the node corresponding to index. Note that</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  <span class="comment">// NextVar(index) == index is equivalent to ActiveVar(index) == 0.</span></div><div class="line"><a name="l01072"></a><span class="lineno"><a class="line" href="routing_8h.html#a66fb44c05f9875685e9c332fbdfb643b"> 1072</a></span>  IntVar* <a class="code" href="routing_8h.html#a66fb44c05f9875685e9c332fbdfb643b">NextVar</a>(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> nexts_[index]; }</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <span class="comment">// Returns the active variable of the node corresponding to index.</span></div><div class="line"><a name="l01074"></a><span class="lineno"><a class="line" href="routing_8h.html#afadc1348f0318e9bc8cebb75b2fc4234"> 1074</a></span>  IntVar* <a class="code" href="routing_8h.html#afadc1348f0318e9bc8cebb75b2fc4234">ActiveVar</a>(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> active_[index]; }</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="comment">// Returns the variable specifying whether or not costs are considered for</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <span class="comment">// vehicle.</span></div><div class="line"><a name="l01077"></a><span class="lineno"><a class="line" href="routing_8h.html#a7c2d33eef73401442fd9f2e205056c73"> 1077</a></span>  IntVar* <a class="code" href="routing_8h.html#a7c2d33eef73401442fd9f2e205056c73">VehicleCostsConsideredVar</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="keywordflow">return</span> vehicle_costs_considered_[vehicle];</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  }</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  <span class="comment">// Returns the vehicle variable of the node corresponding to index. Note that</span></div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  <span class="comment">// VehicleVar(index) == -1 is equivalent to ActiveVar(index) == 0.</span></div><div class="line"><a name="l01082"></a><span class="lineno"><a class="line" href="routing_8h.html#a8cded3d3d6746c179a8ec0eddad24342"> 1082</a></span>  IntVar* <a class="code" href="routing_8h.html#a8cded3d3d6746c179a8ec0eddad24342">VehicleVar</a>(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vehicle_vars_[index]; }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  <span class="comment">// Returns the global cost variable which is being minimized.</span></div><div class="line"><a name="l01084"></a><span class="lineno"><a class="line" href="routing_8h.html#abcbe77312783c0a5aa4926ace764533b"> 1084</a></span>  IntVar* <a class="code" href="routing_8h.html#abcbe77312783c0a5aa4926ace764533b">CostVar</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cost_; }</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> </div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <span class="comment">// Returns the cost of the transit arc between two nodes for a given vehicle.</span></div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="comment">// Input are variable indices of node. This returns 0 if vehicle < 0.</span></div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  int64 <a class="code" href="routing_8h.html#a50dd6fccc1cca84aa10efc8f3ece396c">GetArcCostForVehicle</a>(int64 from_index, int64 to_index,</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  int64 vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <span class="comment">// Whether costs are homogeneous across all vehicles.</span></div><div class="line"><a name="l01091"></a><span class="lineno"><a class="line" href="routing_8h.html#ae0c21c6d4e99cb309b8b298d280e4853"> 1091</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="keywordflow">return</span> costs_are_homogeneous_across_vehicles_;</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  }</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  <span class="comment">// Returns the cost of the segment between two nodes supposing all vehicle</span></div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <span class="comment">// costs are the same (returns the cost for the first vehicle otherwise).</span></div><div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="routing_8h.html#aa241abc19460575d250a5788f03afbf6"> 1096</a></span>  int64 <a class="code" href="routing_8h.html#aa241abc19460575d250a5788f03afbf6">GetHomogeneousCost</a>(int64 from_index, int64 to_index)<span class="keyword"> const </span>{</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <span class="keywordflow">return</span> <a class="code" href="routing_8h.html#a50dd6fccc1cca84aa10efc8f3ece396c">GetArcCostForVehicle</a>(from_index, to_index, <span class="comment">/*vehicle=*/</span>0);</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  }</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="comment">// Returns the cost of the arc in the context of the first solution strategy.</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="comment">// This is typically a simplification of the actual cost; see the .cc.</span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  int64 <a class="code" href="routing_8h.html#a6569b0ea25fa25c91c2b8b63bedeacc6">GetArcCostForFirstSolution</a>(int64 from_index, int64 to_index) <span class="keyword">const</span>;</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  <span class="comment">// Returns the cost of the segment between two nodes for a given cost</span></div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  <span class="comment">// class. Input are variable indices of nodes and the cost class.</span></div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <span class="comment">// Unlike GetArcCostForVehicle(), if cost_class is kNoCost, then the</span></div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="comment">// returned cost won't necessarily be zero: only some of the components</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// of the cost that depend on the cost class will be omited. See the code</span></div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="comment">// for details.</span></div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  int64 <a class="code" href="routing_8h.html#a92d7882c311f7d9d0c55c4def34150dd">GetArcCostForClass</a>(int64 from_index, int64 to_index,</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  int64 <span class="comment">/*CostClassIndex*/</span> cost_class_index) <span class="keyword">const</span>;</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="comment">// Get the cost class index of the given vehicle.</span></div><div class="line"><a name="l01111"></a><span class="lineno"><a class="line" href="routing_8h.html#a32bba655accbd7dc8e23d30bf679b880"> 1111</a></span>  CostClassIndex <a class="code" href="routing_8h.html#a32bba655accbd7dc8e23d30bf679b880">GetCostClassIndexOfVehicle</a>(int64 vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  DCHECK(closed_);</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="keywordflow">return</span> cost_class_index_of_vehicle_[vehicle];</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  }</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  <span class="comment">// Returns true iff the model contains a vehicle with the given</span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  <span class="comment">// cost_class_index.</span></div><div class="line"><a name="l01117"></a><span class="lineno"><a class="line" href="routing_8h.html#a67e8d10adbcc563f428069f9b2c04b63"> 1117</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a67e8d10adbcc563f428069f9b2c04b63">HasVehicleWithCostClassIndex</a>(CostClassIndex cost_class_index)<span class="keyword"> const </span>{</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  DCHECK(closed_);</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <span class="keywordflow">if</span> (cost_class_index == kCostClassIndexOfZeroCost) {</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <span class="keywordflow">return</span> has_vehicle_with_zero_cost_class_;</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  }</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  <span class="keywordflow">return</span> cost_class_index < cost_classes_.size();</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  }</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  <span class="comment">// Returns the number of different cost classes in the model.</span></div><div class="line"><a name="l01125"></a><span class="lineno"><a class="line" href="routing_8h.html#ad3b144985c2b4b24cf39b839dbd9c16d"> 1125</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#ad3b144985c2b4b24cf39b839dbd9c16d">GetCostClassesCount</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cost_classes_.size(); }</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="comment">// Ditto, minus the 'always zero', built-in cost class.</span></div><div class="line"><a name="l01127"></a><span class="lineno"><a class="line" href="routing_8h.html#abaa74f74aefe075aedb6b16259a4404e"> 1127</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#abaa74f74aefe075aedb6b16259a4404e">GetNonZeroCostClassesCount</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="keywordflow">return</span> std::max(0, <a class="code" href="routing_8h.html#ad3b144985c2b4b24cf39b839dbd9c16d">GetCostClassesCount</a>() - 1);</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="routing_8h.html#a7a8e134df97e40d1fc498f7f985c33ec"> 1130</a></span>  VehicleClassIndex <a class="code" href="routing_8h.html#a7a8e134df97e40d1fc498f7f985c33ec">GetVehicleClassIndexOfVehicle</a>(int64 vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  DCHECK(closed_);</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  <span class="keywordflow">return</span> vehicle_class_index_of_vehicle_[vehicle];</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  }</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="comment">// Returns the number of different vehicle classes in the model.</span></div><div class="line"><a name="l01135"></a><span class="lineno"><a class="line" href="routing_8h.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8"> 1135</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8">GetVehicleClassesCount</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vehicle_classes_.size(); }</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  <span class="comment">// Returns variable indices of nodes constrained to be on the same route.</span></div><div class="line"><a name="l01137"></a><span class="lineno"><a class="line" href="routing_8h.html#a0f8c7a97b5465ae4ba4cb1a92c39b756"> 1137</a></span>  <span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#a0f8c7a97b5465ae4ba4cb1a92c39b756">GetSameVehicleIndicesOfIndex</a>(<span class="keywordtype">int</span> node)<span class="keyword"> const </span>{</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  DCHECK(closed_);</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordflow">return</span> same_vehicle_groups_[same_vehicle_group_[node]];</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>  <span class="comment">// Returns whether the arc from->to1 is more constrained than from->to2,</span></div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="comment">// taking into account, in order:</span></div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  <span class="comment">// - whether the destination node isn't an end node</span></div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  <span class="comment">// - whether the destination node is mandatory</span></div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  <span class="comment">// - whether the destination node is bound to the same vehicle as the source</span></div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="comment">// - the "primary constrained" dimension (see SetPrimaryConstrainedDimension)</span></div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="comment">// It then breaks ties using, in order:</span></div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="comment">// - the arc cost (taking unperformed penalties into account)</span></div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <span class="comment">// - the size of the vehicle vars of "to1" and "to2" (lowest size wins)</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  <span class="comment">// - the value: the lowest value of the indices to1 and to2 wins.</span></div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  <span class="comment">// See the .cc for details.</span></div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  <span class="comment">// The more constrained arc is typically preferable when building a</span></div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  <span class="comment">// first solution. This method is intended to be used as a callback for the</span></div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="comment">// BestValueByComparisonSelector value selector.</span></div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="comment">// Args:</span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  <span class="comment">// from: the variable index of the source node</span></div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  <span class="comment">// to1: the variable index of the first candidate destination node.</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  <span class="comment">// to2: the variable index of the second candidate destination node.</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a1048b3f7ef92f0d7747f93c8586ea1cc">ArcIsMoreConstrainedThanArc</a>(int64 from, int64 to1, int64 to2);</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="comment">// Print some debugging information about an assignment, including the</span></div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  <span class="comment">// feasible intervals of the CumulVar for dimension "dimension_to_print"</span></div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="comment">// at each step of the routes.</span></div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  <span class="comment">// If "dimension_to_print" is omitted, all dimensions will be printed.</span></div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  std::string <a class="code" href="routing_8h.html#a25d079aaf52ffdf6d547384b523ff018">DebugOutputAssignment</a>(</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  <span class="keyword">const</span> Assignment& solution_assignment,</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  <span class="keyword">const</span> std::string& dimension_to_print) <span class="keyword">const</span>;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> </div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <span class="comment">// Returns the underlying constraint solver. Can be used to add extra</span></div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="comment">// constraints and/or modify search algoithms.</span></div><div class="line"><a name="l01170"></a><span class="lineno"><a class="line" href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864"> 1170</a></span>  Solver* <a class="code" href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864">solver</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solver_.get(); }</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> </div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <span class="comment">// Returns true if the search limit has been crossed.</span></div><div class="line"><a name="l01173"></a><span class="lineno"><a class="line" href="routing_8h.html#a3f5d70fe48cb54cbc5d8f6bba55b007d"> 1173</a></span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#a3f5d70fe48cb54cbc5d8f6bba55b007d">CheckLimit</a>() {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  DCHECK(limit_ != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="keywordflow">return</span> limit_->Check();</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  }</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> </div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  <span class="comment">// Returns the time left in the search limit.</span></div><div class="line"><a name="l01179"></a><span class="lineno"><a class="line" href="routing_8h.html#adb0524e488894fa8f88764c74abb31f5"> 1179</a></span>  absl::Duration <a class="code" href="routing_8h.html#adb0524e488894fa8f88764c74abb31f5">RemainingTime</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  DCHECK(limit_ != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <span class="keywordflow">return</span> limit_->AbsoluteSolverDeadline() - solver_->Now();</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  }</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="comment">// Sizes and indices</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <span class="comment">// Returns the number of nodes in the model.</span></div><div class="line"><a name="l01186"></a><span class="lineno"><a class="line" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef"> 1186</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">nodes</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> nodes_; }</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <span class="comment">// Returns the number of vehicle routes in the model.</span></div><div class="line"><a name="l01188"></a><span class="lineno"><a class="line" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29"> 1188</a></span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vehicles_; }</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <span class="comment">// Returns the number of next variables in the model.</span></div><div class="line"><a name="l01190"></a><span class="lineno"><a class="line" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d"> 1190</a></span>  int64 <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> nodes_ + vehicles_ - start_end_count_; }</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> </div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <span class="comment">// Returns statistics on first solution search, number of decisions sent to</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  <span class="comment">// filters, number of decisions rejected by filters.</span></div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  int64 <a class="code" href="routing_8h.html#a04bd106a61d493872cabb0f41f7f118f">GetNumberOfDecisionsInFirstSolution</a>(</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  int64 <a class="code" href="routing_8h.html#aefff345740a5db07caea065ec14ec52f">GetNumberOfRejectsInFirstSolution</a>(</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> </div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <span class="comment">// Returns true if a vehicle/node matching problem is detected.</span></div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  <span class="keywordtype">bool</span> <a class="code" href="routing_8h.html#ac8347e84488d1b5eb7b5e6972fb32be3">IsMatchingModel</a>() <span class="keyword">const</span>;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> </div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="comment">// Sets the callback returning the variable to use for the Tabu Search</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <span class="comment">// metaheuristic.</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="keyword">using</span> <a class="code" href="routing_8h.html#a0e106a97f0156868f1d1c741b283793e">GetTabuVarsCallback</a> =</div><div class="line"><a name="l01206"></a><span class="lineno"><a class="line" href="routing_8h.html#a0e106a97f0156868f1d1c741b283793e"> 1206</a></span>  std::function<std::vector<operations_research::IntVar*>(RoutingModel*)>;</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>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#a7e2d405cde11bc4a08d752d0e669912c">SetTabuVarsCallback</a>(<a class="code" href="routing_8h.html#a0e106a97f0156868f1d1c741b283793e">GetTabuVarsCallback</a> tabu_var_callback);</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> </div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  <span class="comment">// The next few members are in the public section only for testing purposes.</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="comment">// TODO(user): Find a way to test and restrict the access at the same time.</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="comment">//</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// MakeGuidedSlackFinalizer creates a DecisionBuilder for the slacks of a</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <span class="comment">// dimension using a callback to choose which values to start with.</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  <span class="comment">// The finalizer works only when all next variables in the model have</span></div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="comment">// been fixed. It has the following two characteristics:</span></div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <span class="comment">// 1. It follows the routes defined by the nexts variables when choosing a</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="comment">// variable to make a decision on.</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <span class="comment">// 2. When it comes to choose a value for the slack of node i, the decision</span></div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <span class="comment">// builder first calls the callback with argument i, and supposingly the</span></div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="comment">// returned value is x it creates decisions slack[i] = x, slack[i] = x + 1,</span></div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <span class="comment">// slack[i] = x - 1, slack[i] = x + 2, etc.</span></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  DecisionBuilder* <a class="code" href="routing_8h.html#a20d0a3f5cec2e425c86f358e5f06b4a8">MakeGuidedSlackFinalizer</a>(</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension,</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  std::function<int64(int64)> initializer);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  <span class="comment">// TODO(user): MakeGreedyDescentLSOperator is too general for routing.h.</span></div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <span class="comment">// Perhaps move it to constraint_solver.h.</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="comment">// MakeGreedyDescentLSOperator creates a local search operator that tries to</span></div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="comment">// improve the initial assignment by moving a logarithmically decreasing step</span></div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  <span class="comment">// away in each possible dimension.</span></div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keyword">static</span> std::unique_ptr<LocalSearchOperator> <a class="code" href="routing_8h.html#aa1c45751ee316e0948ba32494262f006">MakeGreedyDescentLSOperator</a>(</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  std::vector<IntVar*> variables);</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> <span class="preprocessor">#endif // __SWIG__</span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <span class="comment">// MakeSelfDependentDimensionFinalizer is a finalizer for the slacks of a</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="comment">// self-dependent dimension. It makes an extensive use of the caches of the</span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <span class="comment">// state dependent transits.</span></div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="comment">// In detail, MakeSelfDependentDimensionFinalizer returns a composition of a</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="comment">// local search decision builder with a greedy descent operator for the cumul</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  <span class="comment">// of the start of each route and a guided slack finalizer. Provided there are</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <span class="comment">// no time windows and the maximum slacks are large enough, once the cumul of</span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  <span class="comment">// the start of route is fixed, the guided finalizer can find optimal values</span></div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="comment">// of the slacks for the rest of the route in time proportional to the length</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <span class="comment">// of the route. Therefore the composed finalizer generally works in time</span></div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  <span class="comment">// O(log(t)*n*m), where t is the latest possible departute time, n is the</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <span class="comment">// number of nodes in the network and m is the number of vehicles.</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  DecisionBuilder* <a class="code" href="routing_8h.html#a56c3abe7b321f4caf06a0a5e72586cac">MakeSelfDependentDimensionFinalizer</a>(</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension);</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>  <span class="keyword">private</span>:</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <span class="comment">// Local search move operator usable in routing.</span></div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="keyword">enum</span> RoutingLocalSearchOperator {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  RELOCATE = 0,</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  RELOCATE_PAIR,</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  LIGHT_RELOCATE_PAIR,</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  RELOCATE_NEIGHBORS,</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  EXCHANGE,</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  EXCHANGE_PAIR,</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  CROSS,</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  CROSS_EXCHANGE,</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  TWO_OPT,</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  OR_OPT,</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  RELOCATE_EXPENSIVE_CHAIN,</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  LIN_KERNIGHAN,</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  TSP_OPT,</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  MAKE_ACTIVE,</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  RELOCATE_AND_MAKE_ACTIVE,</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  MAKE_ACTIVE_AND_RELOCATE,</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  MAKE_INACTIVE,</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  MAKE_CHAIN_INACTIVE,</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  SWAP_ACTIVE,</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  EXTENDED_SWAP_ACTIVE,</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  NODE_PAIR_SWAP,</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  PATH_LNS,</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  FULL_PATH_LNS,</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  TSP_LNS,</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  INACTIVE_LNS,</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  EXCHANGE_RELOCATE_PAIR,</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  RELOCATE_SUBTRIP,</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  EXCHANGE_SUBTRIP,</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  LOCAL_SEARCH_OPERATOR_COUNTER</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  };</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">// Structure storing a value for a set of variable indices. Is used to store</span></div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="comment">// data for index disjunctions (variable indices, max_cardinality and penalty</span></div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  <span class="comment">// when unperformed).</span></div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  <span class="keyword">struct </span>ValuedNodes {</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  std::vector<int64> indices;</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  T value;</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  };</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  <span class="keyword">struct </span>DisjunctionValues {</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  int64 penalty;</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  int64 max_cardinality;</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  };</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="keyword">typedef</span> ValuedNodes<DisjunctionValues> Disjunction;</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> </div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  <span class="comment">// Storage of a cost cache element corresponding to a cost arc ending at</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <span class="comment">// node 'index' and on the cost class 'cost_class'.</span></div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  <span class="keyword">struct </span>CostCacheElement {</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="comment">// This is usually an int64, but using an int here decreases the RAM usage,</span></div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  <span class="comment">// and should be fine since in practice we never have more than 1<<31 vars.</span></div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <span class="comment">// Note(user): on 2013-11, microbenchmarks on the arc costs callbacks</span></div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  <span class="comment">// also showed a 2% speed-up thanks to using int rather than int64.</span></div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordtype">int</span> index;</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  CostClassIndex cost_class_index;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  int64 cost;</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  };</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="comment">// Internal methods.</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordtype">void</span> Initialize();</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <span class="keywordtype">void</span> AddNoCycleConstraintInternal();</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keywordtype">bool</span> AddDimensionWithCapacityInternal(</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64 slack_max,</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  std::vector<int64> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="keywordtype">bool</span> AddDimensionDependentDimensionWithVehicleCapacityInternal(</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keyword">const</span> std::vector<int>& pure_transits,</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <span class="keyword">const</span> std::vector<int>& dependent_transits,</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension, int64 slack_max,</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  std::vector<int64> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keyword">const</span> std::string& name);</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  <span class="keywordtype">bool</span> InitializeDimensionInternal(</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <span class="keyword">const</span> std::vector<int>& evaluator_indices,</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <span class="keyword">const</span> std::vector<int>& state_dependent_evaluator_indices,</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  int64 slack_max, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension);</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  DimensionIndex GetDimensionIndex(<span class="keyword">const</span> std::string& dimension_name) <span class="keyword">const</span>;</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> </div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  <span class="comment">// Stores dimensions for which global and local cumul optimizers may be used</span></div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="comment">// in the corresponding dimensions_for_[global|local]_optimizer_ vectors.</span></div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  <span class="comment">// This function also computes and stores the "offsets" for these dimensions,</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="comment">// used in the local/global optimizers to simplify LP computations.</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="comment">//</span></div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <span class="comment">// Note on the offsets computation:</span></div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="comment">// The global/local cumul offsets are used by the respective optimizers to</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  <span class="comment">// have smaller numbers, and therefore better numerical behavior in the LP.</span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  <span class="comment">// These offsets are used as a minimum value for the cumuls over the route (or</span></div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  <span class="comment">// globally), i.e. a value we consider all cumuls to be greater or equal to.</span></div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="comment">// When transits are all positive, the cumuls of every node on a route is</span></div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  <span class="comment">// necessarily greater than the cumul of its start. Therefore, the local</span></div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="comment">// offset for a vehicle can be set to the minimum of its start node's cumul,</span></div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="comment">// and for the global optimizers, to the min start cumul over all vehicles.</span></div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <span class="comment">// However, to be able to distinguish between infeasible nodes (i.e. nodes for</span></div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <span class="comment">// which the cumul upper bound is less than the min cumul of the vehicle's</span></div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <span class="comment">// start), we set the offset to "min_start_cumul" - 1. By doing so, all</span></div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="comment">// infeasible nodes described above will have bounds of [0, 0].</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// Example:</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  <span class="comment">// Start cumul bounds: [11, 20] --> offset = 11 - 1 = 10.</span></div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  <span class="comment">// Two nodes with cumul bounds. Node1: [5, 10], Node2: [7, 20]</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <span class="comment">// After applying the offset to the above windows, they become:</span></div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// Vehicle: [1, 10]. Node1: [0, 0] (infeasible). Node2: [0, 10].</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <span class="comment">//</span></div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// On the other hand, when transits on a route can be negative, no assumption</span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="comment">// can be made on the cumuls of nodes wrt the start cumuls, and the offset is</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="comment">// therefore set to 0.</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="keywordtype">void</span> StoreDimensionsForDimensionCumulOptimizers();</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> </div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordtype">void</span> ComputeCostClasses(<span class="keyword">const</span> RoutingSearchParameters& parameters);</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="keywordtype">void</span> ComputeVehicleClasses();</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  int64 GetArcCostForClassInternal(int64 from_index, int64 to_index,</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  CostClassIndex cost_class_index) <span class="keyword">const</span>;</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <span class="keywordtype">void</span> AppendHomogeneousArcCosts(<span class="keyword">const</span> RoutingSearchParameters& parameters,</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  <span class="keywordtype">int</span> node_index,</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  std::vector<IntVar*>* cost_elements);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordtype">void</span> AppendArcCosts(<span class="keyword">const</span> RoutingSearchParameters& parameters, <span class="keywordtype">int</span> node_index,</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  std::vector<IntVar*>* cost_elements);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  Assignment* DoRestoreAssignment();</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="keyword">static</span> <span class="keyword">const</span> CostClassIndex kCostClassIndexOfZeroCost;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  int64 SafeGetCostClassInt64OfVehicle(int64 vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  DCHECK_LT(0, vehicles_);</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="keywordflow">return</span> (vehicle >= 0 ? <a class="code" href="routing_8h.html#a32bba655accbd7dc8e23d30bf679b880">GetCostClassIndexOfVehicle</a>(vehicle)</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  : kCostClassIndexOfZeroCost)</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  .value();</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  }</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  int64 GetDimensionTransitCostSum(int64 i, int64 j,</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <span class="keyword">const</span> CostClass& cost_class) <span class="keyword">const</span>;</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="comment">// Returns nullptr if no penalty cost, otherwise returns penalty variable.</span></div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  IntVar* CreateDisjunction(DisjunctionIndex disjunction);</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="comment">// Sets up pickup and delivery sets.</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordtype">void</span> AddPickupAndDeliverySetsInternal(<span class="keyword">const</span> std::vector<int64>& pickups,</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <span class="keyword">const</span> std::vector<int64>& deliveries);</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="comment">// Returns the cost variable related to the soft same vehicle constraint of</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="comment">// index 'vehicle_index'.</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  IntVar* CreateSameVehicleCost(<span class="keywordtype">int</span> vehicle_index);</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <span class="comment">// Returns the first active variable index in 'indices' starting from index</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="comment">// + 1.</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  <span class="keywordtype">int</span> FindNextActive(<span class="keywordtype">int</span> index, <span class="keyword">const</span> std::vector<int64>& indices) <span class="keyword">const</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>  <span class="comment">// Checks that all nodes on the route starting at start_index (using the</span></div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="comment">// solution stored in assignment) can be visited by the given vehicle.</span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="keywordtype">bool</span> RouteCanBeUsedByVehicle(<span class="keyword">const</span> Assignment& assignment, <span class="keywordtype">int</span> start_index,</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  <span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="comment">// Replaces the route of unused_vehicle with the route of active_vehicle in</span></div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="comment">// compact_assignment. Expects that unused_vehicle is a vehicle with an empty</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="comment">// route and that the route of active_vehicle is non-empty. Also expects that</span></div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="comment">// 'assignment' contains the original assignment, from which</span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="comment">// compact_assignment was created.</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="comment">// Returns true if the vehicles were successfully swapped; otherwise, returns</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="comment">// false.</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  <span class="keywordtype">bool</span> ReplaceUnusedVehicle(<span class="keywordtype">int</span> unused_vehicle, <span class="keywordtype">int</span> active_vehicle,</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  Assignment* compact_assignment) <span class="keyword">const</span>;</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> </div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  <span class="keywordtype">void</span> QuietCloseModel();</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordtype">void</span> QuietCloseModelWithParameters(</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <span class="keyword">const</span> RoutingSearchParameters& parameters) {</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <span class="keywordflow">if</span> (!closed_) {</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  <a class="code" href="routing_8h.html#aa79f8d482de4dd0ef86a1b54999686af">CloseModelWithParameters</a>(parameters);</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  }</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  }</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> </div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="comment">// Solve matching problem with min-cost flow and store result in assignment.</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordtype">bool</span> SolveMatchingModel(Assignment* assignment);</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="comment">// Append an assignment to a vector of assignments if it is feasible.</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="keywordtype">bool</span> AppendAssignmentIfFeasible(</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="keyword">const</span> Assignment& assignment,</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  std::vector<std::unique_ptr<Assignment>>* assignments);</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="comment">// Log a solution.</span></div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <span class="keywordtype">void</span> LogSolution(<span class="keyword">const</span> RoutingSearchParameters& parameters,</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="keyword">const</span> std::string& description, int64 solution_cost,</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  int64 start_time_ms);</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  <span class="comment">// See CompactAssignment. Checks the final solution if</span></div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="comment">// check_compact_assignement is true.</span></div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  Assignment* CompactAssignmentInternal(<span class="keyword">const</span> Assignment& assignment,</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordtype">bool</span> check_compact_assignment) <span class="keyword">const</span>;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="comment">// Checks that the current search parameters are valid for the current model's</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  <span class="comment">// specific settings. This assumes that FindErrorInSearchParameters() from</span></div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  <span class="comment">// ./routing_flags.h caught no error.</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  std::string FindErrorInSearchParametersForModel(</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="comment">// Sets up search objects, such as decision builders and monitors.</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="keywordtype">void</span> SetupSearch(<span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="comment">// Set of auxiliary methods used to setup the search.</span></div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="comment">// TODO(user): Document each auxiliary method.</span></div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  Assignment* GetOrCreateAssignment();</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  Assignment* GetOrCreateTmpAssignment();</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  RegularLimit* GetOrCreateLimit();</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  RegularLimit* GetOrCreateLocalSearchLimit();</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  RegularLimit* GetOrCreateLargeNeighborhoodSearchLimit();</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  RegularLimit* GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  LocalSearchOperator* CreateInsertionOperator();</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  LocalSearchOperator* CreateMakeInactiveOperator();</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  <span class="keywordtype">void</span> CreateNeighborhoodOperators(<span class="keyword">const</span> RoutingSearchParameters& parameters);</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  LocalSearchOperator* GetNeighborhoodOperators(</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& GetOrCreateLocalSearchFilters();</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& GetOrCreateFeasibilityFilters();</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  DecisionBuilder* CreateSolutionFinalizer(SearchLimit* lns_limit);</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  DecisionBuilder* CreateFinalizerForMinimizedAndMaximizedVariables();</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  <span class="keywordtype">void</span> CreateFirstSolutionDecisionBuilders(</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  DecisionBuilder* GetFirstSolutionDecisionBuilder(</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  IntVarFilteredDecisionBuilder* GetFilteredFirstSolutionDecisionBuilderOrNull(</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keyword">const</span> RoutingSearchParameters& parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  LocalSearchPhaseParameters* CreateLocalSearchParameters(</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  DecisionBuilder* CreateLocalSearchDecisionBuilder(</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  <span class="keywordtype">void</span> SetupDecisionBuilders(<span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  <span class="keywordtype">void</span> SetupMetaheuristics(<span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="keywordtype">void</span> SetupAssignmentCollector(</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  <span class="keywordtype">void</span> SetupTrace(<span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keywordtype">void</span> SetupSearchMonitors(<span class="keyword">const</span> RoutingSearchParameters& search_parameters);</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordtype">bool</span> UsesLightPropagation(</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keyword">const</span> RoutingSearchParameters& search_parameters) <span class="keyword">const</span>;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <a class="code" href="routing_8h.html#a0e106a97f0156868f1d1c741b283793e">GetTabuVarsCallback</a> tabu_var_callback_;</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>  <span class="keywordtype">int</span> GetVehicleStartClass(int64 start) <span class="keyword">const</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>  <span class="keywordtype">void</span> InitSameVehicleGroups(<span class="keywordtype">int</span> number_of_groups) {</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  same_vehicle_group_.assign(<a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>(), 0);</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  same_vehicle_groups_.assign(number_of_groups, {});</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  }</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keywordtype">void</span> SetSameVehicleGroup(<span class="keywordtype">int</span> index, <span class="keywordtype">int</span> group) {</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  same_vehicle_group_[index] = group;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  same_vehicle_groups_[group].push_back(index);</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> </div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="comment">// Model</span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  std::unique_ptr<Solver> solver_;</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="keywordtype">int</span> nodes_;</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  <span class="keywordtype">int</span> vehicles_;</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  Constraint* no_cycle_constraint_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  <span class="comment">// Decision variables: indexed by int64 var index.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  std::vector<IntVar*> nexts_;</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  std::vector<IntVar*> vehicle_vars_;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  std::vector<IntVar*> active_;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  std::vector<IntVar*> vehicle_costs_considered_;</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  <span class="comment">// is_bound_to_end_[i] will be true iff the path starting at var #i is fully</span></div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  <span class="comment">// bound and reaches the end of a route, i.e. either:</span></div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  <span class="comment">// - IsEnd(i) is true</span></div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  <span class="comment">// - or nexts_[i] is bound and is_bound_to_end_[nexts_[i].Value()] is true.</span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  std::vector<IntVar*> is_bound_to_end_;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keyword">mutable</span> RevSwitch is_bound_to_end_ct_added_;</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="comment">// Dimensions</span></div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  absl::flat_hash_map<std::string, DimensionIndex> dimension_name_to_index_;</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  gtl::ITIVector<DimensionIndex, RoutingDimension*> dimensions_;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  std::vector<RoutingDimension*> dimensions_for_global_optimizer_;</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  std::vector<RoutingDimension*> dimensions_for_local_optimizer_;</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  std::string primary_constrained_dimension_;</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="comment">// Costs</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  IntVar* cost_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  std::vector<int> vehicle_to_transit_cost_;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  std::vector<int64> fixed_cost_of_vehicle_;</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  std::vector<CostClassIndex> cost_class_index_of_vehicle_;</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordtype">bool</span> has_vehicle_with_zero_cost_class_;</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  std::vector<int64> linear_cost_factor_of_vehicle_;</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  std::vector<int64> quadratic_cost_factor_of_vehicle_;</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keywordtype">bool</span> vehicle_amortized_cost_factors_set_;</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  <span class="comment">// consider_empty_route_costs_[vehicle] determines if "vehicle" should be</span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="comment">// taken into account for costs (arc costs, span costs, etc.) even when the</span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  <span class="comment">// route of the vehicle is empty (i.e. goes straight from its start to its</span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  <span class="comment">// end).</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="comment">// NOTE1: A vehicle's fixed cost is added iff the vehicle serves nodes on its</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="comment">// route, regardless of this variable's value.</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  <span class="comment">// NOTE2: The default value for this boolean is 'false' for all vehicles, i.e.</span></div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <span class="comment">// by default empty routes will not contribute to the cost.</span></div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  std::vector<bool> consider_empty_route_costs_;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  gtl::ITIVector<CostClassIndex, CostClass> cost_classes_;</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="keywordtype">bool</span> costs_are_homogeneous_across_vehicles_;</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keywordtype">bool</span> cache_callbacks_;</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="keyword">mutable</span> std::vector<CostCacheElement> cost_cache_; <span class="comment">// Index by source index.</span></div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  std::vector<VehicleClassIndex> vehicle_class_index_of_vehicle_;</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  gtl::ITIVector<VehicleClassIndex, VehicleClass> vehicle_classes_;</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  std::function<int(int64)> vehicle_start_class_callback_;</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  <span class="comment">// Disjunctions</span></div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  gtl::ITIVector<DisjunctionIndex, Disjunction> disjunctions_;</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  std::vector<std::vector<DisjunctionIndex>> index_to_disjunctions_;</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <span class="comment">// Same vehicle costs</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  std::vector<ValuedNodes<int64>> same_vehicle_costs_;</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  <span class="comment">// Allowed vehicles</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  std::vector<std::unordered_set<int>> allowed_vehicles_;</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <span class="comment">// Pickup and delivery</span></div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  IndexPairs pickup_delivery_pairs_;</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  std::vector<std::pair<DisjunctionIndex, DisjunctionIndex>></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  pickup_delivery_disjunctions_;</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="comment">// If node_index is a pickup, index_to_pickup_index_pairs_[node_index] is the</span></div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="comment">// vector of pairs {pair_index, pickup_index} such that</span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  <span class="comment">// (pickup_delivery_pairs_[pair_index].first)[pickup_index] == node_index</span></div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  std::vector<std::vector<std::pair<int, int> > > index_to_pickup_index_pairs_;</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  <span class="comment">// Same as above for deliveries.</span></div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  std::vector<std::vector<std::pair<int, int> > ></div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  index_to_delivery_index_pairs_;</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  std::vector<PickupAndDeliveryPolicy> vehicle_pickup_delivery_policy_;</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  <span class="comment">// Same vehicle group to which a node belongs.</span></div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  std::vector<int> same_vehicle_group_;</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  <span class="comment">// Same vehicle node groups.</span></div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  std::vector<std::vector<int>> same_vehicle_groups_;</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="comment">// Node visit types</span></div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  <span class="comment">// Variable index to visit type index.</span></div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  std::vector<int> index_to_visit_type_;</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  std::vector<absl::flat_hash_set<int> ></div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  hard_incompatible_types_per_type_index_;</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  <span class="keywordtype">bool</span> has_hard_type_incompatibilities_;</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  std::vector<absl::flat_hash_set<int> ></div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  temporal_incompatible_types_per_type_index_;</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  <span class="keywordtype">bool</span> has_temporal_type_incompatibilities_;</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>  std::vector<std::vector<absl::flat_hash_set<int> > ></div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  same_vehicle_required_type_alternatives_per_type_index_;</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keywordtype">bool</span> has_same_vehicle_type_requirements_;</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  std::vector<std::vector<absl::flat_hash_set<int> > ></div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  temporal_required_type_alternatives_per_type_index_;</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <span class="keywordtype">bool</span> has_temporal_type_requirements_;</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  absl::flat_hash_set<int> trivially_infeasible_visit_types_;</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <span class="keywordtype">int</span> num_visit_types_;</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <span class="comment">// Two indices are equivalent if they correspond to the same node (as given to</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <span class="comment">// the constructors taking a RoutingIndexManager).</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  std::vector<int> index_to_equivalence_class_;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  std::vector<int> index_to_vehicle_;</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  std::vector<int64> starts_;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  std::vector<int64> ends_;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="comment">// TODO(user): b/62478706 Once the port is done, this shouldn't be needed</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  <span class="comment">// anymore.</span></div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  RoutingIndexManager manager_;</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <span class="keywordtype">int</span> start_end_count_;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="comment">// Model status</span></div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordtype">bool</span> closed_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  Status status_ = ROUTING_NOT_SOLVED;</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  <span class="keywordtype">bool</span> enable_deep_serialization_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span> </div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  <span class="comment">// Search data</span></div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  std::vector<DecisionBuilder*> first_solution_decision_builders_;</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  std::vector<IntVarFilteredDecisionBuilder*></div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  first_solution_filtered_decision_builders_;</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <a class="code" href="classoperations__research_1_1Solver.html#a0243986dd2db4b6e1bda331329ae529b">Solver::IndexEvaluator2</a> first_solution_evaluator_;</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  std::vector<LocalSearchOperator*> local_search_operators_;</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  std::vector<SearchMonitor*> monitors_;</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  SolutionCollector* collect_assignments_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  SolutionCollector* collect_one_assignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  SolutionCollector* packed_dimensions_assignment_collector_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  DecisionBuilder* solve_db_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  DecisionBuilder* improve_db_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  DecisionBuilder* restore_assignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  DecisionBuilder* restore_tmp_assignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  Assignment* assignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  Assignment* preassignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  Assignment* tmp_assignment_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  std::vector<IntVar*> extra_vars_;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  std::vector<IntervalVar*> extra_intervals_;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  std::vector<LocalSearchOperator*> extra_operators_;</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  std::vector<LocalSearchFilter*> filters_;</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  std::vector<LocalSearchFilter*> feasibility_filters_;</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  std::vector<LocalSearchFilter*> extra_filters_;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  std::vector<std::pair<IntVar*, int64>> finalizer_variable_cost_pairs_;</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  std::vector<std::pair<IntVar*, int64>> finalizer_variable_target_pairs_;</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  absl::flat_hash_map<IntVar*, int> finalizer_variable_cost_index_;</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  absl::flat_hash_set<IntVar*> finalizer_variable_target_set_;</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  std::unique_ptr<SweepArranger> sweep_arranger_;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> </div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  RegularLimit* limit_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  RegularLimit* ls_limit_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  RegularLimit* lns_limit_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  RegularLimit* first_solution_lns_limit_ = <span class="keyword">nullptr</span>;</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">typedef</span> std::pair<int64, int64> CacheKey;</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="keyword">typedef</span> absl::flat_hash_map<CacheKey, int64> TransitCallbackCache;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  <span class="keyword">typedef</span> absl::flat_hash_map<CacheKey, StateDependentTransit></div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  StateDependentTransitCallbackCache;</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> </div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  std::vector<TransitCallback1> unary_transit_evaluators_;</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  std::vector<TransitCallback2> transit_evaluators_;</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="comment">// The following vector stores a boolean per transit_evaluator_, indicating</span></div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="comment">// whether the transits are all positive.</span></div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <span class="comment">// is_transit_evaluator_positive_ will be set to true only when registering a</span></div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  <span class="comment">// callback via RegisterPositiveTransitCallback(), and to false otherwise.</span></div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  <span class="comment">// The actual positivity of the transit values will only be checked in debug</span></div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  <span class="comment">// mode, when calling RegisterPositiveTransitCallback().</span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  <span class="comment">// Therefore, RegisterPositiveTransitCallback() should only be called when the</span></div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  <span class="comment">// transits are known to be positive, as the positivity of a callback will</span></div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  <span class="comment">// allow some improvements in the solver, but will entail in errors if the</span></div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="comment">// transits are falsely assumed positive.</span></div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  std::vector<bool> is_transit_evaluator_positive_;</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  std::vector<VariableIndexEvaluator2> state_dependent_transit_evaluators_;</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  std::vector<std::unique_ptr<StateDependentTransitCallbackCache>></div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  state_dependent_transit_evaluators_cache_;</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span> </div><div class="line"><a name="l01655"></a><span class="lineno"><a class="line" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff"> 1655</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>;</div><div class="line"><a name="l01656"></a><span class="lineno"><a class="line" href="routing_8h.html#a00141bd90e555aea59a9e98cfbcda6eb"> 1656</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="routing_8h.html#a00141bd90e555aea59a9e98cfbcda6eb">RoutingModelInspector</a>;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> </div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  DISALLOW_COPY_AND_ASSIGN(RoutingModel);</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> <span class="comment">// Routing model visitor.</span></div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span> <span class="keyword">class </span>RoutingModelVisitor : <span class="keyword">public</span> BaseObject {</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <span class="comment">// Constraint types.</span></div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kLightElement[];</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kLightElement2[];</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kRemoveValues[];</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> <span class="preprocessor">#if !defined(SWIG)</span></div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> <span class="comment">// This class acts like a CP propagator: it takes a set of tasks given by</span></div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span> <span class="comment">// their start/duration/end features, and reduces the range of possible values.</span></div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> <span class="keyword">class </span>DisjunctivePropagator {</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="comment">// A structure to hold tasks described by their features.</span></div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="comment">// The first num_chain_tasks are considered linked by a chain of precedences,</span></div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  <span class="comment">// i.e. if i < j < num_chain_tasks, then end(i) <= start(j).</span></div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="comment">// This occurs frequently in routing, and can be leveraged by</span></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  <span class="comment">// some variants of classic propagators.</span></div><div class="line"><a name="l01680"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html"> 1680</a></span>  <span class="keyword">struct </span><a class="code" href="structDisjunctivePropagator_1_1Tasks.html">Tasks</a> {</div><div class="line"><a name="l01681"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a7338766cc78015279cf631748bd27897"> 1681</a></span>  <span class="keywordtype">int</span> num_chain_tasks = 0;</div><div class="line"><a name="l01682"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#ae81bd9ed38788f7ab29ffa6b06c8780a"> 1682</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#ae81bd9ed38788f7ab29ffa6b06c8780a">start_min</a>;</div><div class="line"><a name="l01683"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#ad83f5b65e161e0c33b47c44ebe7a5486"> 1683</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#ad83f5b65e161e0c33b47c44ebe7a5486">start_max</a>;</div><div class="line"><a name="l01684"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a2dcba5165de6aec6cf5ab9dd3e703712"> 1684</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a2dcba5165de6aec6cf5ab9dd3e703712">duration_min</a>;</div><div class="line"><a name="l01685"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a646bf1d98f0bcb2b157072f8dca5661d"> 1685</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a646bf1d98f0bcb2b157072f8dca5661d">duration_max</a>;</div><div class="line"><a name="l01686"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a29e9e4b732a34a405f0f43b746ebc741"> 1686</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a29e9e4b732a34a405f0f43b746ebc741">end_min</a>;</div><div class="line"><a name="l01687"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#aa686b73e8435b6c0052b4e545db897ed"> 1687</a></span>  std::vector<int64> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#aa686b73e8435b6c0052b4e545db897ed">end_max</a>;</div><div class="line"><a name="l01688"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#aaa20225fc54638db1493c9ae0b2947f7"> 1688</a></span>  std::vector<bool> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#aaa20225fc54638db1493c9ae0b2947f7">is_preemptible</a>;</div><div class="line"><a name="l01689"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a480a1199c2254e1b14f5124b77a65fe9"> 1689</a></span>  std::vector<const SortedDisjointIntervalList*> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a480a1199c2254e1b14f5124b77a65fe9">forbidden_intervals</a>;</div><div class="line"><a name="l01690"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a78f61265441dff8a40873494e79e90bd"> 1690</a></span>  std::vector<std::pair<int64, int64>> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a78f61265441dff8a40873494e79e90bd">distance_duration</a>;</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> </div><div class="line"><a name="l01692"></a><span class="lineno"><a class="line" href="structDisjunctivePropagator_1_1Tasks.html#a020532a499977a36e38da249afc71230"> 1692</a></span>  <span class="keywordtype">void</span> <a class="code" href="structDisjunctivePropagator_1_1Tasks.html#a020532a499977a36e38da249afc71230">Clear</a>() {</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  start_min.clear();</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  start_max.clear();</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  duration_min.clear();</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  duration_max.clear();</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  end_min.clear();</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  end_max.clear();</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  is_preemptible.clear();</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  forbidden_intervals.clear();</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  distance_duration.clear();</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  }</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> </div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  <span class="comment">// Computes new bounds for all tasks, returns false if infeasible.</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  <span class="comment">// This does not compute a fixed point, so recalling it may filter more.</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  <span class="keywordtype">bool</span> Propagate(Tasks* tasks);</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> </div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  <span class="comment">// Propagates the deductions from the chain of precedences, if there is one.</span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  <span class="keywordtype">bool</span> Precedences(Tasks* tasks);</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  <span class="comment">// Transforms the problem with a time symmetry centered in 0. Returns true for</span></div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  <span class="comment">// convenience.</span></div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  <span class="keywordtype">bool</span> MirrorTasks(Tasks* tasks);</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  <span class="comment">// Does edge-finding deductions on all tasks.</span></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  <span class="keywordtype">bool</span> EdgeFinding(Tasks* tasks);</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <span class="comment">// Does detectable precedences deductions on tasks in the chain precedence,</span></div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="comment">// taking the time windows of nonchain tasks into account.</span></div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  <span class="keywordtype">bool</span> DetectablePrecedencesWithChain(Tasks* tasks);</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="comment">// Tasks might have holes in their domain, this enforces such holes.</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  <span class="keywordtype">bool</span> ForbiddenIntervals(Tasks* tasks);</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  <span class="keywordtype">bool</span> DistanceDuration(Tasks* tasks);</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span> </div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="comment">// The main algorithm uses Vilim's theta tree data structure.</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  <span class="comment">// See Petr Vilim's PhD thesis "Global Constraints in Scheduling".</span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  sat::ThetaLambdaTree<int64> theta_lambda_tree_;</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  <span class="comment">// Mappings between events and tasks.</span></div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  std::vector<int> tasks_by_start_min_;</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  std::vector<int> tasks_by_end_max_;</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  std::vector<int> event_of_task_;</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  std::vector<int> nonchain_tasks_by_start_max_;</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> </div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span> <span class="keywordtype">void</span> AppendTasksFromPath(<span class="keyword">const</span> std::vector<int64>& path,</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  <span class="keyword">const</span> std::vector<int64>& min_travels,</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  <span class="keyword">const</span> std::vector<int64>& max_travels,</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  <span class="keyword">const</span> std::vector<int64>& pre_travels,</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  <span class="keyword">const</span> std::vector<int64>& post_travels,</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension,</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  <a class="code" href="structDisjunctivePropagator_1_1Tasks.html">DisjunctivePropagator::Tasks</a>* tasks);</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> <span class="keywordtype">void</span> AppendTasksFromIntervals(<span class="keyword">const</span> std::vector<IntervalVar*>& intervals,</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  <a class="code" href="structDisjunctivePropagator_1_1Tasks.html">DisjunctivePropagator::Tasks</a>* tasks);</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span> <span class="keywordtype">void</span> FillPathEvaluation(<span class="keyword">const</span> std::vector<int64>& path,</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  <span class="keyword">const</span> RoutingModel::TransitCallback2& evaluator,</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  std::vector<int64>* values);</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span> <span class="preprocessor">#endif // !defined(SWIG)</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="comment">// GlobalVehicleBreaksConstraint ensures breaks constraints are enforced on</span></div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> <span class="comment">// all vehicles in the dimension passed to its constructor.</span></div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> <span class="comment">// It is intended to be used for dimensions representing time.</span></div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="comment">// A break constraint ensures break intervals fit on the route of a vehicle.</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="comment">// For a given vehicle, it forces break intervals to be disjoint from visit</span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> <span class="comment">// intervals, where visit intervals start at CumulVar(node) and last for</span></div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> <span class="comment">// node_visit_transit[node]. Moreover, it ensures that there is enough time</span></div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> <span class="comment">// between two consecutive nodes of a route to do transit and vehicle breaks,</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span> <span class="comment">// i.e. if Next(nodeA) = nodeB, CumulVar(nodeA) = tA and CumulVar(nodeB) = tB,</span></div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> <span class="comment">// then SlackVar(nodeA) >= sum_{breaks \subseteq [tA, tB)} duration(break).</span></div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span> <span class="keyword">class </span>GlobalVehicleBreaksConstraint : <span class="keyword">public</span> Constraint {</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <span class="keyword">explicit</span> GlobalVehicleBreaksConstraint(<span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension);</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>  <span class="keywordtype">void</span> Post() <span class="keyword">override</span>;</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="keywordtype">void</span> InitialPropagate() <span class="keyword">override</span>;</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span> </div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keywordtype">void</span> PropagateNode(<span class="keywordtype">int</span> node);</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keywordtype">void</span> PropagateVehicle(<span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keywordtype">void</span> PropagateMaxBreakDistance(<span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span> </div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <span class="keyword">const</span> RoutingModel* model_;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension_;</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  std::vector<Demon*> vehicle_demons_;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  std::vector<int64> path_;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> </div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  <span class="comment">// Sets path_ to be the longest sequence such that</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  <span class="comment">// _ path_[0] is the start of the vehicle</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="comment">// _ Next(path_[i-1]) is Bound() and has value path_[i],</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="comment">// followed by the end of the vehicle if the last node was not an end.</span></div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="keywordtype">void</span> FillPartialPathOfVehicle(<span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="keywordtype">void</span> FillPathTravels(<span class="keyword">const</span> std::vector<int64>& path);</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> </div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="comment">// This translates pruning information to solver variables.</span></div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  <span class="comment">// If constructed with an IntervalVar*, it follows the usual semantics of</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="comment">// IntervalVars. If constructed with an IntVar*, before_start and after_start,</span></div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  <span class="comment">// operations are translated to simulate an interval that starts at</span></div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  <span class="comment">// start - before_start and ends and start + after_start.</span></div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="comment">// If constructed with nothing, the TaskTranslator will do nothing.</span></div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="comment">// This class should have been an interface + subclasses,</span></div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  <span class="comment">// but that would force pointers in the user's task vector,</span></div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="comment">// which means dynamic allocation. With this union-like structure,</span></div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  <span class="comment">// a vector's reserved size will adjust to usage and eventually no more</span></div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  <span class="comment">// dynamic allocation will be made.</span></div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  <span class="keyword">class </span>TaskTranslator {</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  TaskTranslator(IntVar* start, int64 before_start, int64 after_start)</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  : start_(start),</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  before_start_(before_start),</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  after_start_(after_start) {}</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  <span class="keyword">explicit</span> TaskTranslator(IntervalVar* interval) : interval_(interval) {}</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  TaskTranslator() {}</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span> </div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  <span class="keywordtype">void</span> SetStartMin(int64 value) {</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  <span class="keywordflow">if</span> (start_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  start_->SetMin(CapAdd(before_start_, value));</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  interval_->SetStartMin(value);</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  }</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  <span class="keywordtype">void</span> SetStartMax(int64 value) {</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  <span class="keywordflow">if</span> (start_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  start_->SetMax(CapAdd(before_start_, value));</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  interval_->SetStartMax(value);</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>  }</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <span class="keywordtype">void</span> SetDurationMin(int64 value) {</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  <span class="keywordflow">if</span> (interval_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  interval_->SetDurationMin(value);</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  }</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  }</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  <span class="keywordtype">void</span> SetEndMin(int64 value) {</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="keywordflow">if</span> (start_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  start_->SetMin(CapSub(value, after_start_));</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  interval_->SetEndMin(value);</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  }</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  }</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  <span class="keywordtype">void</span> SetEndMax(int64 value) {</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  <span class="keywordflow">if</span> (start_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  start_->SetMax(CapSub(value, after_start_));</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (interval_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  interval_->SetEndMax(value);</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  }</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>  }</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> </div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  IntVar* start_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  int64 before_start_;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  int64 after_start_;</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  IntervalVar* interval_ = <span class="keyword">nullptr</span>;</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> </div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="comment">// Route and interval variables are normalized to the following values.</span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  std::vector<TaskTranslator> task_translators_;</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span> </div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  <span class="comment">// This is used to restrict bounds of tasks.</span></div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  DisjunctivePropagator disjunctive_propagator_;</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  <a class="code" href="structDisjunctivePropagator_1_1Tasks.html">DisjunctivePropagator::Tasks</a> tasks_;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> </div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  <span class="comment">// Fields used to help build tasks_ at each propagation.</span></div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  std::vector<int64> min_travel_;</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  std::vector<int64> max_travel_;</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  std::vector<int64> pre_travel_;</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  std::vector<int64> post_travel_;</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> };</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span> </div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span> <span class="keyword">class </span>TypeRegulationsChecker {</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="keyword">explicit</span> TypeRegulationsChecker(<span class="keyword">const</span> RoutingModel& <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>);</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  <span class="keyword">virtual</span> ~TypeRegulationsChecker() {}</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>  <span class="keywordtype">bool</span> CheckVehicle(<span class="keywordtype">int</span> vehicle,</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <span class="keyword">const</span> std::function<int64(int64)>& next_accessor);</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span> </div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  <span class="keyword">enum</span> PickupDeliveryStatus { PICKUP, DELIVERY, NONE };</div><div class="line"><a name="l01867"></a><span class="lineno"><a class="line" href="structTypeRegulationsChecker_1_1NodeCount.html"> 1867</a></span>  <span class="keyword">struct </span><a class="code" href="structTypeRegulationsChecker_1_1NodeCount.html">NodeCount</a> {</div><div class="line"><a name="l01868"></a><span class="lineno"><a class="line" href="structTypeRegulationsChecker_1_1NodeCount.html#a6a64057b17b849d8754db25d7965f836"> 1868</a></span>  <span class="keywordtype">int</span> non_pickup_delivery = 0;</div><div class="line"><a name="l01869"></a><span class="lineno"><a class="line" href="structTypeRegulationsChecker_1_1NodeCount.html#ad9174079c058a67a5df069784c5fd07a"> 1869</a></span>  <span class="keywordtype">int</span> pickup = 0;</div><div class="line"><a name="l01870"></a><span class="lineno"><a class="line" href="structTypeRegulationsChecker_1_1NodeCount.html#aa74c68fd1d813b7eb08667e1a0b0fc49"> 1870</a></span>  <span class="keywordtype">int</span> delivery = 0;</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> </div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  <span class="comment">// Returns the number of pickups and fixed nodes from counts_of_type_["type"].</span></div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  <span class="keywordtype">int</span> GetNonDeliveryCount(<span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <span class="comment">// Same as above, but substracting the number of deliveries of "type".</span></div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <span class="keywordtype">int</span> GetNonDeliveredCount(<span class="keywordtype">int</span> type) <span class="keyword">const</span>;</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span> </div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> HasRegulationsToCheck() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> InitializeCheck() {}</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CheckTypeRegulations(<span class="keywordtype">int</span> type) = 0;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> FinalizeCheck()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">true</span>; }</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>  <span class="keyword">const</span> RoutingModel& model_;</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span> </div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  std::vector<PickupDeliveryStatus> pickup_delivery_status_of_node_;</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  std::vector<NodeCount> counts_of_type_;</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span> };</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span> </div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> <span class="comment">// Checker for type incompatibilities.</span></div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> <span class="keyword">class </span>TypeIncompatibilityChecker : <span class="keyword">public</span> TypeRegulationsChecker {</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  TypeIncompatibilityChecker(<span class="keyword">const</span> RoutingModel& <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>,</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  <span class="keywordtype">bool</span> check_hard_incompatibilities);</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  ~TypeIncompatibilityChecker()<span class="keyword"> override </span>{}</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span> </div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  <span class="keywordtype">bool</span> HasRegulationsToCheck() <span class="keyword">const override</span>;</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  <span class="keywordtype">bool</span> CheckTypeRegulations(<span class="keywordtype">int</span> type) <span class="keyword">override</span>;</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  <span class="comment">// NOTE(user): As temporal incompatibilities are always verified with this</span></div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="comment">// checker, we only store 1 boolean indicating whether or not hard</span></div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="comment">// incompatibilities are also verified.</span></div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  <span class="keywordtype">bool</span> check_hard_incompatibilities_;</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span> };</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span> </div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> <span class="comment">// Checker for type requirements.</span></div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span> <span class="keyword">class </span>TypeRequirementChecker : <span class="keyword">public</span> TypeRegulationsChecker {</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <span class="keyword">explicit</span> TypeRequirementChecker(<span class="keyword">const</span> RoutingModel& <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>)</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  : TypeRegulationsChecker(<a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>) {}</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  ~TypeRequirementChecker()<span class="keyword"> override </span>{}</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span> </div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  <span class="keywordtype">bool</span> HasRegulationsToCheck() <span class="keyword">const override</span>;</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <span class="keywordtype">void</span> InitializeCheck()<span class="keyword"> override </span>{</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  types_with_same_vehicle_requirements_on_route_.clear();</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  }</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keywordtype">bool</span> CheckTypeRegulations(<span class="keywordtype">int</span> type) <span class="keyword">override</span>;</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  <span class="keywordtype">bool</span> FinalizeCheck() <span class="keyword">const override</span>;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span> </div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  absl::flat_hash_set<int> types_with_same_vehicle_requirements_on_route_;</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span> };</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span> </div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span> <span class="comment">// The following constraint ensures that incompatibilities and requirements</span></div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span> <span class="comment">// between types are respected.</span></div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span> <span class="comment">//</span></div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span> <span class="comment">// It verifies both "hard" and "temporal" incompatibilities.</span></div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span> <span class="comment">// Two nodes with hard incompatible types cannot be served by the same vehicle</span></div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span> <span class="comment">// at all, while with a temporal incompatibility they can't be on the same route</span></div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> <span class="comment">// at the same time.</span></div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span> <span class="comment">// For example, for three temporally incompatible types T1 T2 and T3, two</span></div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span> <span class="comment">// pickup/delivery pairs p1/d1 and p2/d2 of type T1 and T2 respectively, and a</span></div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span> <span class="comment">// non-pickup/delivery node n of type T3, the configuration</span></div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span> <span class="comment">// p1 --> d1 --> n --> p2 --> d2 is acceptable, whereas any configurations</span></div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span> <span class="comment">// with p1 --> p2 --> d1 --> ..., or p1 --> n --> d1 --> ... is not feasible.</span></div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span> <span class="comment">//</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span> <span class="comment">// It also verifies same-vehicle and temporal type requirements.</span></div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span> <span class="comment">// In the above example, if T1 is a requirement for T2:</span></div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span> <span class="comment">// - For a same-vehicle requirement, p1/d1 must be on the same vehicle as p2/d2.</span></div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span> <span class="comment">// - For a temporal requirement, p2 must be visited between p1 and d1.</span></div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span> <span class="keyword">class </span>TypeRegulationsConstraint : <span class="keyword">public</span> Constraint {</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keyword">explicit</span> TypeRegulationsConstraint(<span class="keyword">const</span> RoutingModel& <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>);</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>  <span class="keywordtype">void</span> Post() <span class="keyword">override</span>;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keywordtype">void</span> InitialPropagate() <span class="keyword">override</span>;</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>  <span class="keyword">private</span>:</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="keywordtype">void</span> PropagateNodeRegulations(<span class="keywordtype">int</span> node);</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="keywordtype">void</span> CheckRegulationsOnVehicle(<span class="keywordtype">int</span> vehicle);</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>  <span class="keyword">const</span> RoutingModel& model_;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  TypeIncompatibilityChecker incompatibility_checker_;</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  TypeRequirementChecker requirement_checker_;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  std::vector<Demon*> vehicle_demons_;</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span> };</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span> <span class="preprocessor">#if !defined SWIG</span></div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span> <span class="comment">// A structure meant to store soft bounds and associated violation constants.</span></div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> <span class="comment">// It is 'Simple' because it has one BoundCost per element,</span></div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span> <span class="comment">// in contrast to 'Multiple'. Design notes:</span></div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span> <span class="comment">// - it is meant to store model information to be shared through pointers,</span></div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span> <span class="comment">// so it disallows copy and assign to avoid accidental duplication.</span></div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span> <span class="comment">// - it keeps soft bounds as an array of structs to help cache,</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span> <span class="comment">// because code that uses such bounds typically use both bound and cost.</span></div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span> <span class="comment">// - soft bounds are named pairs, prevents some mistakes.</span></div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span> <span class="comment">// - using operator[] to access elements is not interesting,</span></div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span> <span class="comment">// because the structure will be accessed through pointers, moreover having</span></div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span> <span class="comment">// to type bound_cost reminds the user of the order if they do a copy</span></div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span> <span class="comment">// assignment of the element.</span></div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span> <span class="keyword">class </span>SimpleBoundCosts {</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01972"></a><span class="lineno"><a class="line" href="structSimpleBoundCosts_1_1BoundCost.html"> 1972</a></span>  <span class="keyword">struct </span><a class="code" href="structSimpleBoundCosts_1_1BoundCost.html">BoundCost</a> {</div><div class="line"><a name="l01973"></a><span class="lineno"><a class="line" href="structSimpleBoundCosts_1_1BoundCost.html#aafe091324086df78a56f418adf2dc202"> 1973</a></span>  int64 <a class="code" href="structSimpleBoundCosts_1_1BoundCost.html#aafe091324086df78a56f418adf2dc202">bound</a>;</div><div class="line"><a name="l01974"></a><span class="lineno"><a class="line" href="structSimpleBoundCosts_1_1BoundCost.html#a8e9bc21d85a15811daec7d1b03b50704"> 1974</a></span>  int64 <a class="code" href="structSimpleBoundCosts_1_1BoundCost.html#a8e9bc21d85a15811daec7d1b03b50704">cost</a>;</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  };</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  SimpleBoundCosts(<span class="keywordtype">int</span> num_bounds, <a class="code" href="structSimpleBoundCosts_1_1BoundCost.html">BoundCost</a> default_bound_cost)</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  : bound_costs_(num_bounds, default_bound_cost) {}</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  BoundCost& bound_cost(<span class="keywordtype">int</span> element) { <span class="keywordflow">return</span> bound_costs_[element]; }</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  BoundCost bound_cost(<span class="keywordtype">int</span> element)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> bound_costs_[element]; }</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>() { <span class="keywordflow">return</span> bound_costs_.size(); }</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  SimpleBoundCosts(<span class="keyword">const</span> SimpleBoundCosts&) = <span class="keyword">delete</span>;</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  SimpleBoundCosts operator=(<span class="keyword">const</span> SimpleBoundCosts&) = <span class="keyword">delete</span>;</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span> </div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  std::vector<BoundCost> bound_costs_;</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span> };</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span> <span class="preprocessor">#endif // !defined SWIG</span></div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span> </div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span> <span class="comment">// Dimensions represent quantities accumulated at nodes along the routes. They</span></div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span> <span class="comment">// represent quantities such as weights or volumes carried along the route, or</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span> <span class="comment">// distance or times.</span></div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span> <span class="comment">//</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span> <span class="comment">// Quantities at a node are represented by "cumul" variables and the increase</span></div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span> <span class="comment">// or decrease of quantities between nodes are represented by "transit"</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span> <span class="comment">// variables. These variables are linked as follows:</span></div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span> <span class="comment">//</span></div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span> <span class="comment">// if j == next(i),</span></div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span> <span class="comment">// cumuls(j) = cumuls(i) + transits(i) + slacks(i) + state_dependent_transits(i)</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span> <span class="comment">//</span></div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span> <span class="comment">// where slack is a positive slack variable (can represent waiting times for</span></div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span> <span class="comment">// a time dimension), and state_dependent_transits is a non-purely functional</span></div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span> <span class="comment">// version of transits_. Favour transits over state_dependent_transits when</span></div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> <span class="comment">// possible, because purely functional callbacks allow more optimisations and</span></div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span> <span class="comment">// make the model faster and easier to solve.</span></div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span> <span class="comment">// TODO(user): Break constraints need to know the service time of nodes</span></div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span> <span class="comment">// for a given vehicle, it is passed as an external vector, it would be better</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span> <span class="comment">// to have this information here.</span></div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span> <span class="keyword">class </span><a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a> {</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  ~<a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>();</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  <span class="comment">// Returns the model on which the dimension was created.</span></div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> model_; }</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="comment">// Returns the transition value for a given pair of nodes (as var index);</span></div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  <span class="comment">// this value is the one taken by the corresponding transit variable when</span></div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <span class="comment">// the 'next' variable for 'from_index' is bound to 'to_index'.</span></div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  int64 GetTransitValue(int64 from_index, int64 to_index, int64 vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  <span class="comment">// Same as above but taking a vehicle class of the dimension instead of a</span></div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  <span class="comment">// vehicle (the class of a vehicle can be obtained with vehicle_to_class()).</span></div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  int64 GetTransitValueFromClass(int64 from_index, int64 to_index,</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  int64 vehicle_class)<span class="keyword"> const </span>{</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="keywordflow">return</span> model_->TransitCallback(class_evaluators_[vehicle_class])(from_index,</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  to_index);</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">// Get the cumul, transit and slack variables for the given node (given as</span></div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="comment">// int64 var index).</span></div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  IntVar* CumulVar(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cumuls_[index]; }</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  IntVar* TransitVar(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> transits_[index]; }</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  IntVar* FixedTransitVar(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fixed_transits_[index]; }</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  IntVar* SlackVar(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> slacks_[index]; }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> </div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> <span class="preprocessor">#if !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="comment">// Like CumulVar(), TransitVar(), SlackVar() but return the whole variable</span></div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="comment">// vectors instead (indexed by int64 var index).</span></div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keyword">const</span> std::vector<IntVar*>& cumuls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cumuls_; }</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  <span class="keyword">const</span> std::vector<IntVar*>& fixed_transits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fixed_transits_; }</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <span class="keyword">const</span> std::vector<IntVar*>& transits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> transits_; }</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="keyword">const</span> std::vector<IntVar*>& slacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> slacks_; }</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span> <span class="preprocessor">#if !defined(SWIGCSHARP) && !defined(SWIGJAVA)</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="comment">// Returns forbidden intervals for each node.</span></div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="keyword">const</span> std::vector<SortedDisjointIntervalList>& forbidden_intervals()<span class="keyword"> const </span>{</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keywordflow">return</span> forbidden_intervals_;</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="comment">// Returns the capacities for all vehicles.</span></div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keyword">const</span> std::vector<int64>& vehicle_capacities()<span class="keyword"> const </span>{</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  <span class="keywordflow">return</span> vehicle_capacities_;</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  }</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <span class="comment">// Returns the callback evaluating the transit value between two node indices</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="comment">// for a given vehicle.</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  <span class="keyword">const</span> RoutingModel::TransitCallback2& transit_evaluator(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">return</span> model_->TransitCallback(</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  class_evaluators_[vehicle_to_class_[vehicle]]);</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>  <span class="comment">// Returns true iff the transit evaluator of 'vehicle' is positive for all</span></div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="comment">// arcs.</span></div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  <span class="keywordtype">bool</span> AreVehicleTransitsPositive(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  <span class="keywordflow">return</span> <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>()->is_transit_evaluator_positive_</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  [class_evaluators_[vehicle_to_class_[vehicle]]];</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  }</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keywordtype">int</span> vehicle_to_class(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vehicle_to_class_[vehicle]; }</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span> <span class="preprocessor">#endif // !defined(SWIGCSHARP) && !defined(SWIGJAVA)</span></div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span> <span class="preprocessor">#endif // !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  <span class="comment">// Sets an upper bound on the dimension span on a given vehicle. This is the</span></div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  <span class="comment">// preferred way to limit the "length" of the route of a vehicle according to</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  <span class="comment">// a dimension.</span></div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  <span class="keywordtype">void</span> SetSpanUpperBoundForVehicle(int64 upper_bound, <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  <span class="comment">// Sets a cost proportional to the dimension span on a given vehicle,</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  <span class="comment">// or on all vehicles at once. "coefficient" must be nonnegative.</span></div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  <span class="comment">// This is handy to model costs proportional to idle time when the dimension</span></div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="comment">// represents time.</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <span class="comment">// The cost for a vehicle is</span></div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  <span class="comment">// span_cost = coefficient * (dimension end value - dimension start value).</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  <span class="keywordtype">void</span> SetSpanCostCoefficientForVehicle(int64 coefficient, <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordtype">void</span> SetSpanCostCoefficientForAllVehicles(int64 coefficient);</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="comment">// Sets a cost proportional to the *global* dimension span, that is the</span></div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="comment">// difference between the largest value of route end cumul variables and</span></div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <span class="comment">// the smallest value of route start cumul variables.</span></div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  <span class="comment">// In other words:</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  <span class="comment">// global_span_cost =</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  <span class="comment">// coefficient * (Max(dimension end value) - Min(dimension start value)).</span></div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <span class="keywordtype">void</span> SetGlobalSpanCostCoefficient(int64 coefficient);</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span> </div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="comment">// Sets a piecewise linear cost on the cumul variable of a given variable</span></div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  <span class="comment">// index. If f is a piecewise linear function, the resulting cost at 'index'</span></div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  <span class="comment">// will be f(CumulVar(index)). As of 3/2017, only non-decreasing positive cost</span></div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  <span class="comment">// functions are supported.</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  <span class="keywordtype">void</span> SetCumulVarPiecewiseLinearCost(int64 index,</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="keyword">const</span> PiecewiseLinearFunction& cost);</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  <span class="comment">// Returns true if a piecewise linear cost has been set for a given variable</span></div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  <span class="comment">// index.</span></div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="keywordtype">bool</span> HasCumulVarPiecewiseLinearCost(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  <span class="comment">// Returns the piecewise linear cost of a cumul variable for a given variable</span></div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  <span class="comment">// index. The returned pointer has the same validity as this class.</span></div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="keyword">const</span> PiecewiseLinearFunction* GetCumulVarPiecewiseLinearCost(</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span> </div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  <span class="comment">// Sets a soft upper bound to the cumul variable of a given variable index. If</span></div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  <span class="comment">// the value of the cumul variable is greater than the bound, a cost</span></div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  <span class="comment">// proportional to the difference between this value and the bound is added to</span></div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  <span class="comment">// the cost function of the model:</span></div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  <span class="comment">// cumulVar <= upper_bound -> cost = 0</span></div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <span class="comment">// cumulVar > upper_bound -> cost = coefficient * (cumulVar - upper_bound)</span></div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="comment">// This is also handy to model tardiness costs when the dimension represents</span></div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  <span class="comment">// time.</span></div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  <span class="keywordtype">void</span> SetCumulVarSoftUpperBound(int64 index, int64 upper_bound,</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  int64 coefficient);</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <span class="comment">// Returns true if a soft upper bound has been set for a given variable index.</span></div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <span class="keywordtype">bool</span> HasCumulVarSoftUpperBound(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  <span class="comment">// Returns the soft upper bound of a cumul variable for a given variable</span></div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  <span class="comment">// index. The "hard" upper bound of the variable is returned if no soft upper</span></div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <span class="comment">// bound has been set.</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  int64 GetCumulVarSoftUpperBound(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="comment">// Returns the cost coefficient of the soft upper bound of a cumul variable</span></div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  <span class="comment">// for a given variable index. If no soft upper bound has been set, 0 is</span></div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  <span class="comment">// returned.</span></div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  int64 GetCumulVarSoftUpperBoundCoefficient(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> </div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="comment">// Sets a soft lower bound to the cumul variable of a given variable index. If</span></div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <span class="comment">// the value of the cumul variable is less than the bound, a cost proportional</span></div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  <span class="comment">// to the difference between this value and the bound is added to the cost</span></div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  <span class="comment">// function of the model:</span></div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="comment">// cumulVar > lower_bound -> cost = 0</span></div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <span class="comment">// cumulVar <= lower_bound -> cost = coefficient * (lower_bound - cumulVar).</span></div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  <span class="comment">// This is also handy to model earliness costs when the dimension represents</span></div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  <span class="comment">// time.</span></div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <span class="comment">// Note: Using soft lower and upper bounds or span costs together is, as of</span></div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="comment">// 6/2014, not well supported in the sense that an optimal schedule is not</span></div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  <span class="comment">// guaranteed.</span></div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  <span class="keywordtype">void</span> SetCumulVarSoftLowerBound(int64 index, int64 lower_bound,</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  int64 coefficient);</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  <span class="comment">// Returns true if a soft lower bound has been set for a given variable index.</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  <span class="keywordtype">bool</span> HasCumulVarSoftLowerBound(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  <span class="comment">// Returns the soft lower bound of a cumul variable for a given variable</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  <span class="comment">// index. The "hard" lower bound of the variable is returned if no soft lower</span></div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="comment">// bound has been set.</span></div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  int64 GetCumulVarSoftLowerBound(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  <span class="comment">// Returns the cost coefficient of the soft lower bound of a cumul variable</span></div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  <span class="comment">// for a given variable index. If no soft lower bound has been set, 0 is</span></div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  <span class="comment">// returned.</span></div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  int64 GetCumulVarSoftLowerBoundCoefficient(int64 index) <span class="keyword">const</span>;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  <span class="comment">// Sets the breaks for a given vehicle. Breaks are represented by</span></div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  <span class="comment">// IntervalVars. They may interrupt transits between nodes and increase</span></div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  <span class="comment">// the value of corresponding slack variables.</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="comment">// A break may take place before the start of a vehicle, after the end of</span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  <span class="comment">// a vehicle, or during a travel i -> j.</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  <span class="comment">// In that case, the interval [break.Start(), break.End()) must be a subset of</span></div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  <span class="comment">// [CumulVar(i) + pre_travel(i, j), CumulVar(j) - post_travel(i, j)).</span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  <span class="comment">// In other words, a break may not overlap any node n's visit, given by</span></div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  <span class="comment">// [CumulVar(n) - post_travel(_, n), CumulVar(n) + pre_travel(n, _)).</span></div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  <span class="comment">// This formula considers post_travel(_, start) and pre_travel(end, _) to be</span></div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <span class="comment">// 0; pre_travel will never be called on any (_, start) and post_travel will</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <span class="comment">// never we called on any (end, _). If pre_travel_evaluator or</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  <span class="comment">// post_travel_evaluator is -1, it will be taken as a function that always</span></div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="comment">// returns 0.</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  <span class="comment">// TODO(user): Remove if !defined when routing.i is repaired.</span></div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> <span class="preprocessor">#if !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <span class="keywordtype">void</span> SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle,</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="keywordtype">int</span> pre_travel_evaluator,</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="keywordtype">int</span> post_travel_evaluator);</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span> <span class="preprocessor">#endif // !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span> </div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <span class="comment">// Deprecated, sets pre_travel(i, j) = node_visit_transit[i].</span></div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <span class="keywordtype">void</span> SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle,</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  std::vector<int64> node_visit_transits);</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>  <span class="comment">// With breaks supposed to be consecutive, this forces the distance between</span></div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="comment">// breaks of size at least minimum_break_duration to be at least distance.</span></div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  <span class="comment">// This supposes that the time until route start and after route end are</span></div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  <span class="comment">// infinite breaks.</span></div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordtype">void</span> SetBreakDistanceDurationOfVehicle(int64 distance, int64 duration,</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <span class="keywordtype">int</span> vehicle);</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <span class="comment">// Sets up vehicle_break_intervals_, vehicle_break_distance_duration_,</span></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  <span class="comment">// pre_travel_evaluators and post_travel_evaluators.</span></div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  <span class="keywordtype">void</span> InitializeBreaks();</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <span class="comment">// Returns true if any break interval or break distance was defined.</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  <span class="keywordtype">bool</span> HasBreakConstraints() <span class="keyword">const</span>;</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span> <span class="preprocessor">#if !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="comment">// Deprecated, sets pre_travel(i, j) = node_visit_transit[i]</span></div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <span class="comment">// and post_travel(i, j) = group_delays(i, j).</span></div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  <span class="keywordtype">void</span> SetBreakIntervalsOfVehicle(</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle,</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  std::vector<int64> node_visit_transits,</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  std::function<int64(int64, int64)> group_delays);</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span> </div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  <span class="comment">// Returns the break intervals set by SetBreakIntervalsOfVehicle().</span></div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  <span class="keyword">const</span> std::vector<IntervalVar*>& GetBreakIntervalsOfVehicle(</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  <span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  <span class="comment">// Returns the pairs (distance, duration) specified by break distance</span></div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="comment">// constraints.</span></div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  <span class="keyword">const</span> std::vector<std::pair<int64, int64> >&</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  GetBreakDistanceDurationOfVehicle(<span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span> <span class="preprocessor">#endif // !defined(SWIGPYTHON)</span></div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  <span class="keywordtype">int</span> GetPreTravelEvaluatorOfVehicle(<span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="keywordtype">int</span> GetPostTravelEvaluatorOfVehicle(<span class="keywordtype">int</span> vehicle) <span class="keyword">const</span>;</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span> </div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="comment">// Returns the parent in the dependency tree if any or nullptr otherwise.</span></div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> base_dimension_; }</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  <span class="comment">// It makes sense to use the function only for self-dependent dimension.</span></div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <span class="comment">// For such dimensions the value of the slack of a node determines the</span></div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="comment">// transition cost of the next transit. Provided that</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="comment">// 1. cumul[node] is fixed,</span></div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <span class="comment">// 2. next[node] and next[next[node]] (if exists) are fixed,</span></div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="comment">// the value of slack[node] for which cumul[next[node]] + transit[next[node]]</span></div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="comment">// is minimized can be found in O(1) using this function.</span></div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  int64 ShortestTransitionSlack(int64 node) <span class="keyword">const</span>;</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span> </div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  <span class="comment">// Returns the name of the dimension.</span></div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="keyword">const</span> std::string& name()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> name_; }</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span> </div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  <span class="comment">// Accessors.</span></div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="keyword">const</span> ReverseArcListGraph<int, int>& GetPathPrecedenceGraph()<span class="keyword"> const </span>{</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="keywordflow">return</span> path_precedence_graph_;</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  }</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span> </div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  <span class="comment">// Limits, in terms of maximum difference between the cumul variables, between</span></div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="comment">// the pickup and delivery alternatives belonging to a single pickup/delivery</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  <span class="comment">// pair in the RoutingModel.</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  <span class="comment">// The indices passed to the function respectively correspond to the position</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  <span class="comment">// of the pickup in the vector of pickup alternatives, and delivery position</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  <span class="comment">// in the delivery alternatives for this pickup/delivery pair.</span></div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  <span class="comment">// These limits should only be set when each node index appears in at most one</span></div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  <span class="comment">// pickup/delivery pair, i.e. each pickup (delivery) index is in a single</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  <span class="comment">// pickup/delivery pair.first (pair.second).</span></div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="keyword">typedef</span> std::function<int64(<span class="keywordtype">int</span>, <span class="keywordtype">int</span>)> PickupToDeliveryLimitFunction;</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>  <span class="keywordtype">void</span> SetPickupToDeliveryLimitFunctionForPair(</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  PickupToDeliveryLimitFunction limit_function, <span class="keywordtype">int</span> pair_index);</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span> </div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  <span class="keywordtype">bool</span> HasPickupToDeliveryLimits() <span class="keyword">const</span>;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  int64 GetPickupToDeliveryLimitForPair(<span class="keywordtype">int</span> pair_index, <span class="keywordtype">int</span> pickup,</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  <span class="keywordtype">int</span> delivery) <span class="keyword">const</span>;</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span> </div><div class="line"><a name="l02239"></a><span class="lineno"><a class="line" href="structRoutingDimension_1_1NodePrecedence.html"> 2239</a></span>  <span class="keyword">struct </span><a class="code" href="structRoutingDimension_1_1NodePrecedence.html">NodePrecedence</a> {</div><div class="line"><a name="l02240"></a><span class="lineno"><a class="line" href="structRoutingDimension_1_1NodePrecedence.html#a791690768d878b2fabe6adfdd35383e5"> 2240</a></span>  int64 <a class="code" href="structRoutingDimension_1_1NodePrecedence.html#a791690768d878b2fabe6adfdd35383e5">first_node</a>;</div><div class="line"><a name="l02241"></a><span class="lineno"><a class="line" href="structRoutingDimension_1_1NodePrecedence.html#a380315e16036075ab1d6fa7896f90a01"> 2241</a></span>  int64 <a class="code" href="structRoutingDimension_1_1NodePrecedence.html#a380315e16036075ab1d6fa7896f90a01">second_node</a>;</div><div class="line"><a name="l02242"></a><span class="lineno"><a class="line" href="structRoutingDimension_1_1NodePrecedence.html#a0fcec9ed1d122c19028064641f0445a6"> 2242</a></span>  int64 <a class="code" href="structRoutingDimension_1_1NodePrecedence.html#a0fcec9ed1d122c19028064641f0445a6">offset</a>;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  };</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> </div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  <span class="keywordtype">void</span> AddNodePrecedence(<a class="code" href="structRoutingDimension_1_1NodePrecedence.html">NodePrecedence</a> precedence) {</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  node_precedences_.push_back(precedence);</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  }</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="keyword">const</span> std::vector<NodePrecedence>& GetNodePrecedences()<span class="keyword"> const </span>{</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordflow">return</span> node_precedences_;</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  }</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span> </div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <span class="keywordtype">void</span> AddNodePrecedence(int64 first_node, int64 second_node, int64 offset) {</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  AddNodePrecedence({first_node, second_node, offset});</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</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>  int64 GetSpanUpperBoundForVehicle(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <span class="keywordflow">return</span> vehicle_span_upper_bounds_[vehicle];</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  }</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="keyword">const</span> std::vector<int64>& vehicle_span_upper_bounds()<span class="keyword"> const </span>{</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="keywordflow">return</span> vehicle_span_upper_bounds_;</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  }</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  int64 GetSpanCostCoefficientForVehicle(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  <span class="keywordflow">return</span> vehicle_span_cost_coefficients_[vehicle];</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  }</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <span class="keyword">const</span> std::vector<int64>& vehicle_span_cost_coefficients()<span class="keyword"> const </span>{</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keywordflow">return</span> vehicle_span_cost_coefficients_;</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  }</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> <span class="preprocessor">#endif // SWIG</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  int64 global_span_cost_coefficient()<span class="keyword"> const </span>{</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordflow">return</span> global_span_cost_coefficient_;</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> </div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  int64 GetGlobalOptimizerOffset()<span class="keyword"> const </span>{</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  DCHECK_GE(global_optimizer_offset_, 0);</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  <span class="keywordflow">return</span> global_optimizer_offset_;</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  }</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  int64 GetLocalOptimizerOffsetForVehicle(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  <span class="keywordflow">if</span> (vehicle >= local_optimizer_offset_for_vehicle_.size()) {</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="keywordflow">return</span> 0;</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>  DCHECK_GE(local_optimizer_offset_for_vehicle_[vehicle], 0);</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  <span class="keywordflow">return</span> local_optimizer_offset_for_vehicle_[vehicle];</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  }</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span> <span class="preprocessor">#if !defined SWIG</span></div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  <span class="comment">// If the span of vehicle on this dimension is larger than bound,</span></div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  <span class="comment">// the cost will be increased by cost * (span - bound).</span></div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  <span class="keywordtype">void</span> SetSoftSpanUpperBoundForVehicle(<a class="code" href="structSimpleBoundCosts_1_1BoundCost.html">SimpleBoundCosts::BoundCost</a> bound_cost,</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>  <span class="keywordtype">int</span> vehicle) {</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>  <span class="keywordflow">if</span> (!HasSoftSpanUpperBounds()) {</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  vehicle_soft_span_upper_bound_ = absl::make_unique<SimpleBoundCosts>(</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  model_->vehicles(), <a class="code" href="structSimpleBoundCosts_1_1BoundCost.html">SimpleBoundCosts::BoundCost</a>{kint64max, 0});</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  }</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  vehicle_soft_span_upper_bound_->bound_cost(vehicle) = bound_cost;</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  }</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  <span class="keywordtype">bool</span> HasSoftSpanUpperBounds()<span class="keyword"> const </span>{</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="keywordflow">return</span> vehicle_soft_span_upper_bound_ != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  }</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  <a class="code" href="structSimpleBoundCosts_1_1BoundCost.html">SimpleBoundCosts::BoundCost</a> GetSoftSpanUpperBoundForVehicle(</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  DCHECK(HasSoftSpanUpperBounds());</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  <span class="keywordflow">return</span> vehicle_soft_span_upper_bound_->bound_cost(vehicle);</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  }</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span> <span class="preprocessor">#endif // !defined SWIG</span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span> </div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  <span class="keyword">struct </span>SoftBound {</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  IntVar* var;</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  int64 bound;</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  int64 coefficient;</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  };</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span> </div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <span class="keyword">struct </span>PiecewiseLinearCost {</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  PiecewiseLinearCost() : var(nullptr), cost(nullptr) {}</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  IntVar* var;</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  std::unique_ptr<PiecewiseLinearFunction> cost;</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  };</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> </div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="keyword">class </span>SelfBased {};</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>(RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::vector<int64> vehicle_capacities,</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  <span class="keyword">const</span> std::string& name,</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* base_dimension);</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>(RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::vector<int64> vehicle_capacities,</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  <span class="keyword">const</span> std::string& name, SelfBased);</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  <span class="keywordtype">void</span> Initialize(<span class="keyword">const</span> std::vector<int>& transit_evaluators,</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keyword">const</span> std::vector<int>& state_dependent_transit_evaluators,</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  int64 slack_max);</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  <span class="keywordtype">void</span> InitializeCumuls();</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  <span class="keywordtype">void</span> InitializeTransits(</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  <span class="keyword">const</span> std::vector<int>& transit_evaluators,</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="keyword">const</span> std::vector<int>& state_dependent_transit_evaluators,</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  int64 slack_max);</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  <span class="keywordtype">void</span> InitializeTransitVariables(int64 slack_max);</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  <span class="comment">// Sets up the cost variables related to cumul soft upper bounds.</span></div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  <span class="keywordtype">void</span> SetupCumulVarSoftUpperBoundCosts(</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  std::vector<IntVar*>* cost_elements) <span class="keyword">const</span>;</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  <span class="comment">// Sets up the cost variables related to cumul soft lower bounds.</span></div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  <span class="keywordtype">void</span> SetupCumulVarSoftLowerBoundCosts(</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  std::vector<IntVar*>* cost_elements) <span class="keyword">const</span>;</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  <span class="keywordtype">void</span> SetupCumulVarPiecewiseLinearCosts(</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  std::vector<IntVar*>* cost_elements) <span class="keyword">const</span>;</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="comment">// Sets up the cost variables related to the global span and per-vehicle span</span></div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  <span class="comment">// costs (only for the "slack" part of the latter).</span></div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  <span class="keywordtype">void</span> SetupGlobalSpanCost(std::vector<IntVar*>* cost_elements) <span class="keyword">const</span>;</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  <span class="keywordtype">void</span> SetupSlackAndDependentTransitCosts() <span class="keyword">const</span>;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  <span class="comment">// Finalize the model of the dimension.</span></div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  <span class="keywordtype">void</span> <a class="code" href="routing_8h.html#add71470f4175a0859e6e3d69c2a53988">CloseModel</a>(<span class="keywordtype">bool</span> use_light_propagation);</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> </div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  <span class="keywordtype">void</span> SetOffsetForGlobalOptimizer(int64 offset) {</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  global_optimizer_offset_ = std::max(<a class="code" href="namespaceoperations__research.html#a009f247167f32509baf749083e4bc984">Zero</a>(), offset);</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  }</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <span class="comment">// Moves elements of "offsets" into vehicle_offsets_for_local_optimizer_.</span></div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <span class="keywordtype">void</span> SetVehicleOffsetsForLocalOptimizer(std::vector<int64> offsets) {</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <span class="comment">// Make sure all offsets are positive.</span></div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  std::transform(offsets.begin(), offsets.end(), offsets.begin(),</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  [](int64 offset) { <span class="keywordflow">return</span> std::max(<a class="code" href="namespaceoperations__research.html#a009f247167f32509baf749083e4bc984">Zero</a>(), offset); });</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>  local_optimizer_offset_for_vehicle_ = std::move(offsets);</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  }</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> </div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  std::vector<IntVar*> cumuls_;</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  std::vector<SortedDisjointIntervalList> forbidden_intervals_;</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  std::vector<IntVar*> capacity_vars_;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>  <span class="keyword">const</span> std::vector<int64> vehicle_capacities_;</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>  std::vector<IntVar*> transits_;</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  std::vector<IntVar*> fixed_transits_;</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <span class="comment">// Values in class_evaluators_ correspond to the evaluators in</span></div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="comment">// RoutingModel::transit_evaluators_ for each vehicle class.</span></div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  std::vector<int> class_evaluators_;</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  std::vector<int64> vehicle_to_class_;</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  ReverseArcListGraph<int, int> path_precedence_graph_;</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  <span class="comment">// For every {first_node, second_node, offset} element in node_precedences_,</span></div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <span class="comment">// if both first_node and second_node are performed, then cumuls_[second_node]</span></div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  <span class="comment">// must be greater than (or equal to) cumuls_[first_node] + offset.</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  std::vector<NodePrecedence> node_precedences_;</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>  <span class="comment">// The transits of a dimension may depend on its cumuls or the cumuls of</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  <span class="comment">// another dimension. There can be no cycles, except for self loops, a typical</span></div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  <span class="comment">// example for this is a time dimension.</span></div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> base_dimension_;</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> </div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>  <span class="comment">// Values in state_dependent_class_evaluators_ correspond to the evaluators in</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  <span class="comment">// RoutingModel::state_dependent_transit_evaluators_ for each vehicle class.</span></div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  std::vector<int> state_dependent_class_evaluators_;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>  std::vector<int64> state_dependent_vehicle_to_class_;</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span> </div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="comment">// For each pickup/delivery pair_index for which limits have been set,</span></div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  <span class="comment">// pickup_to_delivery_limits_per_pair_index_[pair_index] contains the</span></div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  <span class="comment">// PickupToDeliveryLimitFunction for the pickup and deliveries in this pair.</span></div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  std::vector<PickupToDeliveryLimitFunction></div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  pickup_to_delivery_limits_per_pair_index_;</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>  <span class="comment">// Used if some vehicle has breaks in this dimension, typically time.</span></div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="keywordtype">bool</span> break_constraints_are_initialized_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  std::vector<std::vector<IntervalVar*> > vehicle_break_intervals_;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  std::vector<std::vector<std::pair<int64, int64> > ></div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  vehicle_break_distance_duration_;</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  <span class="comment">// For each vehicle, stores the part of travel that is made directly</span></div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  <span class="comment">// after (before) the departure (arrival) node of the travel.</span></div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  <span class="comment">// These parts of the travel are non-interruptible, in particular by a break.</span></div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  std::vector<int> vehicle_pre_travel_evaluators_;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  std::vector<int> vehicle_post_travel_evaluators_;</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span> </div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  std::vector<IntVar*> slacks_;</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  std::vector<IntVar*> dependent_transits_;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  std::vector<int64> vehicle_span_upper_bounds_;</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  int64 global_span_cost_coefficient_;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  std::vector<int64> vehicle_span_cost_coefficients_;</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  std::vector<SoftBound> cumul_var_soft_upper_bound_;</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  std::vector<SoftBound> cumul_var_soft_lower_bound_;</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  std::vector<PiecewiseLinearCost> cumul_var_piecewise_linear_cost_;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  RoutingModel* <span class="keyword">const</span> model_;</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  <span class="keyword">const</span> std::string name_;</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  int64 global_optimizer_offset_;</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  std::vector<int64> local_optimizer_offset_for_vehicle_;</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="comment">// nullptr if not defined.</span></div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  std::unique_ptr<SimpleBoundCosts> vehicle_soft_span_upper_bound_;</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  <span class="keyword">friend</span> <span class="keyword">class </span>RoutingModel;</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="routing_8h.html#a00141bd90e555aea59a9e98cfbcda6eb">RoutingModelInspector</a>;</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span> </div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  DISALLOW_COPY_AND_ASSIGN(<a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>);</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span> };</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span> </div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span> <span class="preprocessor">#ifndef SWIG</span></div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span> <span class="comment">// Class to arrange indices by by their distance and their angles from the</span></div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span> <span class="comment">// depot. Used in the Sweep first solution heuristic.</span></div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> <span class="keyword">class </span>SweepArranger {</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>  <span class="keyword">explicit</span> SweepArranger(<span class="keyword">const</span> std::vector<std::pair<int64, int64>>& points);</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>  <span class="keyword">virtual</span> ~SweepArranger() {}</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  <span class="keywordtype">void</span> ArrangeIndices(std::vector<int64>* indices);</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  <span class="keywordtype">void</span> SetSectors(<span class="keywordtype">int</span> sectors) { sectors_ = sectors; }</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>  <span class="keyword">private</span>:</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>  std::vector<int> coordinates_;</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  <span class="keywordtype">int</span> sectors_;</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>  DISALLOW_COPY_AND_ASSIGN(SweepArranger);</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span> };</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span> </div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span> <span class="comment">// A decision builder which tries to assign values to variables as close as</span></div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span> <span class="comment">// possible to target values first.</span></div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span> DecisionBuilder* MakeSetValuesFromTargets(Solver* <a class="code" href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864">solver</a>,</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>  std::vector<IntVar*> variables,</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  std::vector<int64> targets);</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span> </div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> <span class="comment">// Routing Search</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span> </div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span> <span class="comment">// Decision builders building a solution using local search filters to evaluate</span></div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span> <span class="comment">// its feasibility. This is very fast but can eventually fail when the solution</span></div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> <span class="comment">// is restored if filters did not detect all infeasiblities.</span></div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> <span class="comment">// More details:</span></div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span> <span class="comment">// Using local search filters to build a solution. The approach is pretty</span></div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> <span class="comment">// straight-forward: have a general assignment storing the current solution,</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> <span class="comment">// build delta assigment representing possible extensions to the current</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span> <span class="comment">// solution and validate them with filters.</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span> <span class="comment">// The tricky bit comes from using the assignment and filter APIs in a way</span></div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> <span class="comment">// which avoids the lazy creation of internal hash_maps between variables</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span> <span class="comment">// and indices.</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span> </div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> <span class="comment">// Generic filter-based decision builder applied to IntVars.</span></div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span> <span class="comment">// TODO(user): Eventually move this to the core CP solver library</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span> <span class="comment">// when the code is mature enough.</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span> <span class="keyword">class </span>IntVarFilteredDecisionBuilder : <span class="keyword">public</span> DecisionBuilder {</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  IntVarFilteredDecisionBuilder(Solver* <a class="code" href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864">solver</a>,</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  <span class="keyword">const</span> std::vector<IntVar*>& vars,</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  ~IntVarFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>  Decision* <a class="code" href="routing_8h.html#a46a69d9769aa92122c7e5e20f49e3da3">Next</a>(Solver* <a class="code" href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864">solver</a>) <span class="keyword">override</span>;</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>  <span class="comment">// Virtual method to redefine to build a solution.</span></div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> BuildSolution() = 0;</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>  <span class="comment">// Returns statistics on search, number of decisions sent to filters, number</span></div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  <span class="comment">// of decisions rejected by filters.</span></div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  int64 number_of_decisions()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> number_of_decisions_; }</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  int64 number_of_rejects()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> number_of_rejects_; }</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span> </div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  <span class="comment">// Virtual method to initialize the solution.</span></div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> InitializeSolution() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  <span class="comment">// Commits the modifications to the current solution if these modifications</span></div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  <span class="comment">// are "filter-feasible", returns false otherwise; in any case discards</span></div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  <span class="comment">// all modifications.</span></div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  <span class="keywordtype">bool</span> Commit();</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <span class="comment">// Returns true if the search must be stopped.</span></div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> StopSearch() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  <span class="comment">// Modifies the current solution by setting the variable of index 'index' to</span></div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <span class="comment">// value 'value'.</span></div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  <span class="keywordtype">void</span> SetValue(int64 index, int64 value) {</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  <span class="keywordflow">if</span> (!is_in_delta_[index]) {</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  delta_->FastAdd(vars_[index])->SetValue(value);</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  delta_indices_.push_back(index);</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  is_in_delta_[index] = <span class="keyword">true</span>;</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  delta_->SetValue(vars_[index], value);</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  }</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  }</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  <span class="comment">// Returns the value of the variable of index 'index' in the last committed</span></div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  <span class="comment">// solution.</span></div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  int64 Value(int64 index)<span class="keyword"> const </span>{</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="keywordflow">return</span> assignment_->IntVarContainer().Element(index).Value();</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  }</div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="comment">// Returns true if the variable of index 'index' is in the current solution.</span></div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  <span class="keywordtype">bool</span> Contains(int64 index)<span class="keyword"> const </span>{</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  <span class="keywordflow">return</span> assignment_->IntVarContainer().Element(index).Var() != <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  }</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  <span class="comment">// Returns the number of variables the decision builder is trying to</span></div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  <span class="comment">// instantiate.</span></div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <span class="keywordtype">int</span> <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vars_.size(); }</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  <span class="comment">// Returns the variable of index 'index'.</span></div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  IntVar* Var(int64 index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> vars_[index]; }</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span> </div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <span class="comment">// Synchronizes filters with an assignment (the current solution).</span></div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <span class="keywordtype">void</span> SynchronizeFilters();</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <span class="comment">// Checks if filters accept a given modification to the current solution</span></div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  <span class="comment">// (represented by delta).</span></div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordtype">bool</span> FilterAccept();</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span> </div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  <span class="keyword">const</span> std::vector<IntVar*> vars_;</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  Assignment* <span class="keyword">const</span> assignment_;</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  Assignment* <span class="keyword">const</span> delta_;</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  std::vector<int> delta_indices_;</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  std::vector<bool> is_in_delta_;</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  Assignment* <span class="keyword">const</span> empty_;</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>  LocalSearchFilterManager filter_manager_;</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>  <span class="comment">// Stats on search</span></div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  int64 number_of_decisions_;</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  int64 number_of_rejects_;</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span> };</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span> </div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span> <span class="comment">// Filter-based decision builder dedicated to routing.</span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span> <span class="keyword">class </span>RoutingFilteredDecisionBuilder : <span class="keyword">public</span> IntVarFilteredDecisionBuilder {</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  RoutingFilteredDecisionBuilder(</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  ~RoutingFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> model_; }</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="comment">// Returns the end of the start chain of vehicle,</span></div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  <span class="keywordtype">int</span> GetStartChainEnd(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> start_chain_ends_[vehicle]; }</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  <span class="comment">// Returns the start of the end chain of vehicle,</span></div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  <span class="keywordtype">int</span> GetEndChainStart(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> end_chain_starts_[vehicle]; }</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  <span class="comment">// Make nodes in the same disjunction as 'node' unperformed. 'node' is a</span></div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  <span class="comment">// variable index corresponding to a node.</span></div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  <span class="keywordtype">void</span> MakeDisjunctionNodesUnperformed(int64 node);</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  <span class="comment">// Make all unassigned nodes unperformed.</span></div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <span class="keywordtype">void</span> MakeUnassignedNodesUnperformed();</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span> </div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  <span class="keywordtype">bool</span> StopSearch()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> model_->CheckLimit(); }</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>  <span class="keyword">private</span>:</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <span class="comment">// Initializes the current solution with empty or partial vehicle routes.</span></div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  <span class="keywordtype">bool</span> InitializeSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span> </div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  RoutingModel* <span class="keyword">const</span> model_;</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  std::vector<int64> start_chain_ends_;</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  std::vector<int64> end_chain_starts_;</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span> };</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> </div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span> <span class="keyword">class </span>CheapestInsertionFilteredDecisionBuilder</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  : <span class="keyword">public</span> RoutingFilteredDecisionBuilder {</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="comment">// Takes ownership of evaluator.</span></div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  CheapestInsertionFilteredDecisionBuilder(</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::function<int64(int64, int64, int64)> evaluator,</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  std::function<int64(int64)> penalty_evaluator,</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  ~CheapestInsertionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span> </div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  <span class="keyword">typedef</span> std::pair<int64, int64> ValuedPosition;</div><div class="line"><a name="l02580"></a><span class="lineno"><a class="line" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html"> 2580</a></span>  <span class="keyword">struct </span><a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html">StartEndValue</a> {</div><div class="line"><a name="l02581"></a><span class="lineno"><a class="line" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#ad144ade2ac271bf7f285bad778774b87"> 2581</a></span>  int64 <a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#ad144ade2ac271bf7f285bad778774b87">distance</a>;</div><div class="line"><a name="l02582"></a><span class="lineno"><a class="line" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a843944b58d95caa2634a4c6b2792da2a"> 2582</a></span>  <span class="keywordtype">int</span> <a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a843944b58d95caa2634a4c6b2792da2a">vehicle</a>;</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span> </div><div class="line"><a name="l02584"></a><span class="lineno"><a class="line" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a0c85e075940ea179577a2e090395b446"> 2584</a></span>  <span class="keywordtype">bool</span> <a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a0c85e075940ea179577a2e090395b446">operator<</a>(<span class="keyword">const</span> <a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html">StartEndValue</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  <span class="keywordflow">return</span> std::tie(distance, vehicle) <</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  std::tie(other.<a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#ad144ade2ac271bf7f285bad778774b87">distance</a>, other.<a class="code" href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a843944b58d95caa2634a4c6b2792da2a">vehicle</a>);</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>  <span class="keyword">typedef</span> std::pair<StartEndValue, <span class="comment">/*seed_node*/</span> <span class="keywordtype">int</span>> Seed;</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="comment">// Computes and returns the distance of each uninserted node to every vehicle</span></div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>  <span class="comment">// in "vehicles" as a std::vector<std::vector<StartEndValue>>,</span></div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>  <span class="comment">// start_end_distances_per_node.</span></div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  <span class="comment">// For each node, start_end_distances_per_node[node] is sorted in decreasing</span></div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="comment">// order.</span></div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  std::vector<std::vector<StartEndValue> ></div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  ComputeStartEndDistanceForVehicles(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>);</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="comment">// Initializes the priority_queue by inserting the best entry corresponding</span></div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  <span class="comment">// to each node, i.e. the last element of start_end_distances_per_node[node],</span></div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="comment">// which is supposed to be sorted in decreasing order.</span></div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="comment">// Queue is a priority queue containing Seeds.</span></div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  <span class="keyword">template</span> <<span class="keyword">class</span> Queue></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="keywordtype">void</span> InitializePriorityQueue(</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  std::vector<std::vector<StartEndValue> >* start_end_distances_per_node,</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  Queue* priority_queue);</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  <span class="comment">// clang-format on</span></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>  <span class="comment">// Inserts 'node' just after 'predecessor', and just before 'successor',</span></div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  <span class="comment">// resulting in the following subsequence: predecessor -> node -> successor.</span></div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  <span class="comment">// If 'node' is part of a disjunction, other nodes of the disjunction are made</span></div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  <span class="comment">// unperformed.</span></div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  <span class="keywordtype">void</span> InsertBetween(int64 node, int64 predecessor, int64 successor);</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  <span class="comment">// Helper method to the ComputeEvaluatorSortedPositions* methods. Finds all</span></div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  <span class="comment">// possible insertion positions of node 'node_to_insert' in the partial route</span></div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  <span class="comment">// starting at node 'start' and adds them to 'valued_position', a list of</span></div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  <span class="comment">// unsorted pairs of (cost, position to insert the node).</span></div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  <span class="keywordtype">void</span> AppendEvaluatedPositionsAfter(</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  int64 node_to_insert, int64 start, int64 next_after_start, int64 vehicle,</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  std::vector<ValuedPosition>* valued_positions);</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  <span class="comment">// Returns the cost of unperforming node 'node_to_insert'. Returns kint64max</span></div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  <span class="comment">// if penalty callback is null or if the node cannot be unperformed.</span></div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  int64 GetUnperformedValue(int64 node_to_insert) <span class="keyword">const</span>;</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> </div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  std::function<int64(int64, int64, int64)> evaluator_;</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  std::function<int64(int64)> penalty_evaluator_;</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span> };</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> <span class="comment">// Filter-based decision builder which builds a solution by inserting</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span> <span class="comment">// nodes at their cheapest position on any route; potentially several routes can</span></div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span> <span class="comment">// be built in parallel. The cost of a position is computed from an arc-based</span></div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span> <span class="comment">// cost callback. The node selected for insertion is the one which minimizes</span></div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span> <span class="comment">// insertion cost. If a non null penalty evaluator is passed, making nodes</span></div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span> <span class="comment">// unperformed is also taken into account with the corresponding penalty cost.</span></div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span> <span class="keyword">class </span>GlobalCheapestInsertionFilteredDecisionBuilder</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  : <span class="keyword">public</span> CheapestInsertionFilteredDecisionBuilder {</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  <span class="comment">// Takes ownership of evaluators.</span></div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  GlobalCheapestInsertionFilteredDecisionBuilder(</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::function<int64(int64, int64, int64)> evaluator,</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  std::function<int64(int64)> penalty_evaluator,</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters, <span class="keywordtype">bool</span> is_sequential,</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  <span class="keywordtype">double</span> farthest_seeds_ratio, <span class="keywordtype">double</span> neighbors_ratio);</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  ~GlobalCheapestInsertionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  <span class="keywordtype">bool</span> BuildSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  <span class="keywordflow">return</span> <span class="stringliteral">"GlobalCheapestInsertionFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  }</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span> </div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  <span class="keyword">class </span>PairEntry;</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="keyword">class </span>NodeEntry;</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  <span class="keyword">typedef</span> absl::flat_hash_set<PairEntry*> PairEntries;</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  <span class="keyword">typedef</span> absl::flat_hash_set<NodeEntry*> NodeEntries;</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span> </div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  <span class="comment">// Inserts all non-inserted pickup and delivery pairs. Maintains a priority</span></div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  <span class="comment">// queue of possible pair insertions, which is incrementally updated when a</span></div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="comment">// pair insertion is committed. Incrementality is obtained by updating pair</span></div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  <span class="comment">// insertion positions on the four newly modified route arcs: after the pickup</span></div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  <span class="comment">// insertion position, after the pickup position, after the delivery insertion</span></div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  <span class="comment">// position and after the delivery position.</span></div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  <span class="keywordtype">void</span> InsertPairs();</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span> </div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  <span class="comment">// Inserts non-inserted individual nodes on the given routes (or all routes if</span></div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  <span class="comment">// "vehicles" is an empty vector), by constructing routes in parallel.</span></div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  <span class="comment">// Maintains a priority queue of possible insertions, which is incrementally</span></div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  <span class="comment">// updated when an insertion is committed.</span></div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  <span class="comment">// Incrementality is obtained by updating insertion positions on the two newly</span></div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  <span class="comment">// modified route arcs: after the node insertion position and after the node</span></div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  <span class="comment">// position.</span></div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  <span class="keywordtype">void</span> InsertNodesOnRoutes(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">nodes</a>,</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>);</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span> </div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="comment">// Inserts non-inserted individual nodes on routes by constructing routes</span></div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  <span class="comment">// sequentially.</span></div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  <span class="comment">// For each new route, the vehicle to use and the first node to insert on it</span></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="comment">// are given by calling InsertSeedNode(). The route is then completed with</span></div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  <span class="comment">// other nodes by calling InsertNodesOnRoutes({vehicle}).</span></div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="keywordtype">void</span> SequentialInsertNodes(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">nodes</a>);</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span> </div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  <span class="comment">// Goes through all vehicles in the model to check if they are already used</span></div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  <span class="comment">// (i.e. Value(start) != end) or not.</span></div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  <span class="comment">// Updates the three passed vectors accordingly.</span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="keywordtype">void</span> DetectUsedVehicles(std::vector<bool>* is_vehicle_used,</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  std::vector<int>* used_vehicles,</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  std::vector<int>* unused_vehicles);</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span> </div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="comment">// Inserts the (farthest_seeds_ratio_ * model()->vehicles()) nodes farthest</span></div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  <span class="comment">// from the start/ends of the available vehicle routes as seeds on their</span></div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  <span class="comment">// closest route.</span></div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  <span class="keywordtype">void</span> InsertFarthestNodesAsSeeds();</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span> </div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  <span class="comment">// Inserts a "seed node" based on the given priority_queue of Seeds.</span></div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  <span class="comment">// A "seed" is the node used in order to start a new route.</span></div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  <span class="comment">// If the Seed at the top of the priority queue cannot be inserted,</span></div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  <span class="comment">// (node already inserted in the model, corresponding vehicle already used, or</span></div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  <span class="comment">// unsuccessful Commit()), start_end_distances_per_node is updated and used</span></div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <span class="comment">// to insert a new entry for that node if necessary (next best vehicle).</span></div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  <span class="comment">// If a seed node is successfully inserted, updates is_vehicle_used and</span></div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  <span class="comment">// returns the vehice of the corresponding route. Returns -1 otherwise.</span></div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <span class="keyword">template</span> <<span class="keyword">class</span> Queue></div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="keywordtype">int</span> InsertSeedNode(</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  std::vector<std::vector<StartEndValue>>* start_end_distances_per_node,</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  Queue* priority_queue, std::vector<bool>* is_vehicle_used);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span> </div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  <span class="comment">// Initializes the priority queue and the pair entries with the current state</span></div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  <span class="comment">// of the solution.</span></div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  <span class="keywordtype">void</span> InitializePairPositions(</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  AdjustablePriorityQueue<PairEntry>* priority_queue,</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  std::vector<PairEntries>* pickup_to_entries,</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  std::vector<PairEntries>* delivery_to_entries);</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  <span class="comment">// Updates all pair entries inserting a node after node "insert_after" and</span></div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="comment">// updates the priority queue accordingly.</span></div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  <span class="keywordtype">void</span> UpdatePairPositions(<span class="keywordtype">int</span> vehicle, int64 insert_after,</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  AdjustablePriorityQueue<PairEntry>* priority_queue,</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  std::vector<PairEntries>* pickup_to_entries,</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  std::vector<PairEntries>* delivery_to_entries) {</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  UpdatePickupPositions(vehicle, insert_after, priority_queue,</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  pickup_to_entries, delivery_to_entries);</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  UpdateDeliveryPositions(vehicle, insert_after, priority_queue,</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  pickup_to_entries, delivery_to_entries);</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  }</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="comment">// Updates all pair entries inserting their pickup node after node</span></div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="comment">// "insert_after" and updates the priority queue accordingly.</span></div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  <span class="keywordtype">void</span> UpdatePickupPositions(<span class="keywordtype">int</span> vehicle, int64 pickup_insert_after,</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  AdjustablePriorityQueue<PairEntry>* priority_queue,</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  std::vector<PairEntries>* pickup_to_entries,</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  std::vector<PairEntries>* delivery_to_entries);</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  <span class="comment">// Updates all pair entries inserting their delivery node after node</span></div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="comment">// "insert_after" and updates the priority queue accordingly.</span></div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  <span class="keywordtype">void</span> UpdateDeliveryPositions(</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <span class="keywordtype">int</span> vehicle, int64 delivery_insert_after,</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  AdjustablePriorityQueue<PairEntry>* priority_queue,</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  std::vector<PairEntries>* pickup_to_entries,</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  std::vector<PairEntries>* delivery_to_entries);</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  <span class="comment">// Deletes an entry, removing it from the priority queue and the appropriate</span></div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="comment">// pickup and delivery entry sets.</span></div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="keywordtype">void</span> DeletePairEntry(PairEntry* entry,</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  AdjustablePriorityQueue<PairEntry>* priority_queue,</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  std::vector<PairEntries>* pickup_to_entries,</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  std::vector<PairEntries>* delivery_to_entries);</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <span class="comment">// Initializes the priority queue and the node entries with the current state</span></div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  <span class="comment">// of the solution on the given vehicle routes.</span></div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  <span class="keywordtype">void</span> InitializePositions(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">nodes</a>,</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  AdjustablePriorityQueue<NodeEntry>* priority_queue,</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  std::vector<NodeEntries>* position_to_node_entries,</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  <span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>);</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  <span class="comment">// Updates all node entries inserting a node after node "insert_after" and</span></div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="comment">// updates the priority queue accordingly.</span></div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <span class="keywordtype">void</span> UpdatePositions(<span class="keyword">const</span> std::vector<int>& <a class="code" href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">nodes</a>, <span class="keywordtype">int</span> vehicle,</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  int64 insert_after,</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  AdjustablePriorityQueue<NodeEntry>* priority_queue,</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  std::vector<NodeEntries>* node_entries);</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  <span class="comment">// Deletes an entry, removing it from the priority queue and the appropriate</span></div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  <span class="comment">// node entry sets.</span></div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  <span class="keywordtype">void</span> DeleteNodeEntry(NodeEntry* entry,</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  AdjustablePriorityQueue<NodeEntry>* priority_queue,</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  std::vector<NodeEntries>* node_entries);</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span> </div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  <span class="comment">// Inserts neighbor_index in</span></div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  <span class="comment">// node_index_to_[pickup|delivery|single]_neighbors_per_cost_class_</span></div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>  <span class="comment">// [node_index][cost_class] according to whether neighbor is a pickup,</span></div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>  <span class="comment">// a delivery, or neither.</span></div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>  <span class="keywordtype">void</span> AddNeighborForCostClass(<span class="keywordtype">int</span> cost_class, int64 node_index,</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>  int64 neighbor_index, <span class="keywordtype">bool</span> neighbor_is_pickup,</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  <span class="keywordtype">bool</span> neighbor_is_delivery);</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span> </div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  <span class="comment">// Returns true iff neighbor_index is in node_index's neighbors list</span></div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  <span class="comment">// corresponding to neighbor_is_pickup and neighbor_is_delivery.</span></div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  <span class="keywordtype">bool</span> IsNeighborForCostClass(<span class="keywordtype">int</span> cost_class, int64 node_index,</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  int64 neighbor_index) <span class="keyword">const</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>  <span class="comment">// Returns a reference to the set of pickup neighbors of node_index.</span></div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>  <span class="keyword">const</span> absl::flat_hash_set<int64>& GetPickupNeighborsOfNodeForCostClass(</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>  <span class="keywordtype">int</span> cost_class, int64 node_index) {</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  <span class="keywordflow">if</span> (neighbors_ratio_ == 1) {</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  <span class="keywordflow">return</span> pickup_nodes_;</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  }</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  <span class="keywordflow">return</span> node_index_to_pickup_neighbors_by_cost_class_[node_index]</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  [cost_class];</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>  }</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span> </div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="comment">// Same as above for delivery neighbors.</span></div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  <span class="keyword">const</span> absl::flat_hash_set<int64>& GetDeliveryNeighborsOfNodeForCostClass(</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  <span class="keywordtype">int</span> cost_class, int64 node_index) {</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  <span class="keywordflow">if</span> (neighbors_ratio_ == 1) {</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>  <span class="keywordflow">return</span> delivery_nodes_;</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  }</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  <span class="keywordflow">return</span> node_index_to_delivery_neighbors_by_cost_class_[node_index]</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  [cost_class];</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  }</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span> </div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> is_sequential_;</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> farthest_seeds_ratio_;</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> neighbors_ratio_;</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="comment">// clang-format off</span></div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  std::vector<std::vector<absl::flat_hash_set<int64> > ></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  node_index_to_single_neighbors_by_cost_class_;</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>  std::vector<std::vector<absl::flat_hash_set<int64> > ></div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>  node_index_to_pickup_neighbors_by_cost_class_;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>  std::vector<std::vector<absl::flat_hash_set<int64> > ></div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>  node_index_to_delivery_neighbors_by_cost_class_;</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span> </div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <span class="comment">// When neighbors_ratio is 1, we don't compute the neighborhood members above,</span></div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <span class="comment">// and use the following sets in the code to avoid unnecessary computations</span></div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="comment">// and decrease the time and space complexities.</span></div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  absl::flat_hash_set<int64> pickup_nodes_;</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  absl::flat_hash_set<int64> delivery_nodes_;</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span> };</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span> </div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span> <span class="comment">// Filter-base decision builder which builds a solution by inserting</span></div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span> <span class="comment">// nodes at their cheapest position. The cost of a position is computed</span></div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span> <span class="comment">// an arc-based cost callback. Node selected for insertion are considered in</span></div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span> <span class="comment">// decreasing order of distance to the start/ends of the routes, i.e. farthest</span></div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span> <span class="comment">// nodes are inserted first.</span></div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span> <span class="keyword">class </span>LocalCheapestInsertionFilteredDecisionBuilder</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  : <span class="keyword">public</span> CheapestInsertionFilteredDecisionBuilder {</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  <span class="comment">// Takes ownership of evaluator.</span></div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  LocalCheapestInsertionFilteredDecisionBuilder(</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::function<int64(int64, int64, int64)> evaluator,</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  ~LocalCheapestInsertionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  <span class="keywordtype">bool</span> BuildSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  <span class="keywordflow">return</span> <span class="stringliteral">"LocalCheapestInsertionFilteredDecisionBuilder"</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> </div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  <span class="comment">// Computes the possible insertion positions of 'node' and sorts them</span></div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  <span class="comment">// according to the current cost evaluator.</span></div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  <span class="comment">// 'node' is a variable index corresponding to a node, 'sorted_positions' is a</span></div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  <span class="comment">// vector of variable indices corresponding to nodes after which 'node' can be</span></div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  <span class="comment">// inserted.</span></div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  <span class="keywordtype">void</span> ComputeEvaluatorSortedPositions(int64 node,</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  std::vector<int64>* sorted_positions);</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  <span class="comment">// Like ComputeEvaluatorSortedPositions, subject to the additional</span></div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  <span class="comment">// restrictions that the node may only be inserted after node 'start' on the</span></div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  <span class="comment">// route. For convenience, this method also needs the node that is right after</span></div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  <span class="comment">// 'start' on the route.</span></div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  <span class="keywordtype">void</span> ComputeEvaluatorSortedPositionsOnRouteAfter(</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  int64 node, int64 start, int64 next_after_start,</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  std::vector<int64>* sorted_positions);</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> </div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span> <span class="comment">// Filtered-base decision builder based on the addition heuristic, extending</span></div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span> <span class="comment">// a path from its start node with the cheapest arc.</span></div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span> <span class="keyword">class </span>CheapestAdditionFilteredDecisionBuilder</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>  : <span class="keyword">public</span> RoutingFilteredDecisionBuilder {</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  CheapestAdditionFilteredDecisionBuilder(</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  ~CheapestAdditionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>  <span class="keywordtype">bool</span> BuildSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span> </div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>  <span class="keyword">class </span>PartialRoutesAndLargeVehicleIndicesFirst {</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>  <span class="keyword">explicit</span> PartialRoutesAndLargeVehicleIndicesFirst(</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  <span class="keyword">const</span> CheapestAdditionFilteredDecisionBuilder& builder)</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  : builder_(builder) {}</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  <span class="keywordtype">bool</span> operator()(<span class="keywordtype">int</span> vehicle1, <span class="keywordtype">int</span> vehicle2) <span class="keyword">const</span>;</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span> </div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <span class="keyword">const</span> CheapestAdditionFilteredDecisionBuilder& builder_;</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>  };</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>  <span class="comment">// Returns a vector of possible next indices of node from an iterator.</span></div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator></div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  std::vector<int64> GetPossibleNextsFromIterator(int64 node, Iterator start,</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  Iterator end)<span class="keyword"> const </span>{</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>()->Size();</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>  std::vector<int64> nexts;</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  <span class="keywordflow">for</span> (Iterator it = start; it != end; ++it) {</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  <span class="keyword">const</span> int64 next = *it;</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  <span class="keywordflow">if</span> (next != node && (next >= size || !Contains(next))) {</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  nexts.push_back(next);</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  }</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  }</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  <span class="keywordflow">return</span> nexts;</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>  }</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>  <span class="comment">// Sorts a vector of successors of node.</span></div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> SortSuccessors(int64 node, std::vector<int64>* successors) = 0;</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>  <span class="keyword">virtual</span> int64 FindTopSuccessor(int64 node,</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  <span class="keyword">const</span> std::vector<int64>& successors) = 0;</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span> };</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span> </div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span> <span class="comment">// A CheapestAdditionFilteredDecisionBuilder where the notion of 'cheapest arc'</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span> <span class="comment">// comes from an arc evaluator.</span></div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span> <span class="keyword">class </span>EvaluatorCheapestAdditionFilteredDecisionBuilder</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  : <span class="keyword">public</span> CheapestAdditionFilteredDecisionBuilder {</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  <span class="comment">// Takes ownership of evaluator.</span></div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  EvaluatorCheapestAdditionFilteredDecisionBuilder(</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, std::function<int64(int64, int64)> evaluator,</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  ~EvaluatorCheapestAdditionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <span class="keywordflow">return</span> <span class="stringliteral">"EvaluatorCheapestAdditionFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  }</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span> </div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>  <span class="comment">// Next nodes are sorted according to the current evaluator.</span></div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="keywordtype">void</span> SortSuccessors(int64 node, std::vector<int64>* successors) <span class="keyword">override</span>;</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  int64 FindTopSuccessor(int64 node,</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>  <span class="keyword">const</span> std::vector<int64>& successors) <span class="keyword">override</span>;</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span> </div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  std::function<int64(int64, int64)> evaluator_;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span> };</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span> </div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span> <span class="comment">// A CheapestAdditionFilteredDecisionBuilder where the notion of 'cheapest arc'</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span> <span class="comment">// comes from an arc comparator.</span></div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span> <span class="keyword">class </span>ComparatorCheapestAdditionFilteredDecisionBuilder</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  : <span class="keyword">public</span> CheapestAdditionFilteredDecisionBuilder {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  <span class="comment">// Takes ownership of evaluator.</span></div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  ComparatorCheapestAdditionFilteredDecisionBuilder(</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, <a class="code" href="classoperations__research_1_1Solver.html#af24d476da11ebf69fae9d4890447cc95">Solver::VariableValueComparator</a> comparator,</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  ~ComparatorCheapestAdditionFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="keywordflow">return</span> <span class="stringliteral">"ComparatorCheapestAdditionFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</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>  <span class="keyword">private</span>:</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="comment">// Next nodes are sorted according to the current comparator.</span></div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  <span class="keywordtype">void</span> SortSuccessors(int64 node, std::vector<int64>* successors) <span class="keyword">override</span>;</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  int64 FindTopSuccessor(int64 node,</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  <span class="keyword">const</span> std::vector<int64>& successors) <span class="keyword">override</span>;</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span> </div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  <a class="code" href="classoperations__research_1_1Solver.html#af24d476da11ebf69fae9d4890447cc95">Solver::VariableValueComparator</a> comparator_;</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span> };</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span> </div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span> <span class="comment">// Filter-based decision builder which builds a solution by using</span></div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span> <span class="comment">// Clarke & Wright's Savings heuristic. For each pair of nodes, the savings</span></div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span> <span class="comment">// value is the difference between the cost of two routes visiting one node each</span></div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span> <span class="comment">// and one route visiting both nodes. Routes are built sequentially, each route</span></div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span> <span class="comment">// being initialized from the pair with the best avalaible savings value then</span></div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span> <span class="comment">// extended by selecting the nodes with best savings on both ends of the partial</span></div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span> <span class="comment">// route.</span></div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span> <span class="comment">// Cost is based on the arc cost function of the routing model and cost classes</span></div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span> <span class="comment">// are taken into account.</span></div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span> <span class="keyword">class </span>SavingsFilteredDecisionBuilder : <span class="keyword">public</span> RoutingFilteredDecisionBuilder {</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02948"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html"> 2948</a></span>  <span class="keyword">struct </span><a class="code" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html">SavingsParameters</a> {</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  <span class="comment">// If neighbors_ratio < 1 then for each node only this ratio of its</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  <span class="comment">// neighbors leading to the smallest arc costs are considered.</span></div><div class="line"><a name="l02951"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html#a9b87637bdf8bb745a23976e9b559a8fd"> 2951</a></span>  <span class="keywordtype">double</span> neighbors_ratio = 1.0;</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  <span class="comment">// The number of neighbors considered for each node is also adapted so that</span></div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  <span class="comment">// the stored Savings don't use up more than max_memory_usage_bytes bytes.</span></div><div class="line"><a name="l02954"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html#a7d90515435ec6e9b43839c9ab9cb0fa8"> 2954</a></span>  <span class="keywordtype">double</span> max_memory_usage_bytes = 6e9;</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  <span class="comment">// If add_reverse_arcs is true, the neighborhood relationships are</span></div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  <span class="comment">// considered symmetrically.</span></div><div class="line"><a name="l02957"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html#ae5991151717961945329988d3f51303b"> 2957</a></span>  <span class="keywordtype">bool</span> add_reverse_arcs = <span class="keyword">false</span>;</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  <span class="comment">// arc_coefficient is a strictly positive parameter indicating the</span></div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  <span class="comment">// coefficient of the arc being considered in the Saving formula.</span></div><div class="line"><a name="l02960"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html#a20c144ff0287a9742bcd1e5a0b3fed1a"> 2960</a></span>  <span class="keywordtype">double</span> arc_coefficient = 1.0;</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>  };</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>  SavingsFilteredDecisionBuilder(</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, RoutingIndexManager* manager,</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>  <a class="code" href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html">SavingsParameters</a> parameters,</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  ~SavingsFilteredDecisionBuilder() <span class="keyword">override</span>;</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  <span class="keywordtype">bool</span> BuildSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span> </div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>  <span class="keyword">typedef</span> std::pair<<span class="comment">/*saving*/</span> int64, <span class="comment">/*saving index*/</span> int64> Saving;</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span> </div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> S></div><div class="line"><a name="l02974"></a><span class="lineno"><a class="line" href="classSavingsFilteredDecisionBuilder_1_1SavingsContainer.html"> 2974</a></span>  <span class="keyword">class </span><a class="code" href="classSavingsFilteredDecisionBuilder_1_1SavingsContainer.html">SavingsContainer</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="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html"> 2976</a></span>  <span class="keyword">struct </span><a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html">VehicleClassEntry</a> {</div><div class="line"><a name="l02977"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#aa504ae94659c25c6146786485941e8bc"> 2977</a></span>  <span class="keywordtype">int</span> <a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#aa504ae94659c25c6146786485941e8bc">vehicle_class</a>;</div><div class="line"><a name="l02978"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a27394b3588b9d4b2dfd663669772d698"> 2978</a></span>  int64 <a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a27394b3588b9d4b2dfd663669772d698">fixed_cost</a>;</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span> </div><div class="line"><a name="l02980"></a><span class="lineno"><a class="line" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a9c61973758bb413be11e59ffaad7216f"> 2980</a></span>  <span class="keywordtype">bool</span> <a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a9c61973758bb413be11e59ffaad7216f">operator<</a>(<span class="keyword">const</span> <a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html">VehicleClassEntry</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>  <span class="keywordflow">return</span> std::tie(fixed_cost, vehicle_class) <</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>  std::tie(other.<a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a27394b3588b9d4b2dfd663669772d698">fixed_cost</a>, other.<a class="code" href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#aa504ae94659c25c6146786485941e8bc">vehicle_class</a>);</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>  };</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span> </div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>  <span class="keyword">virtual</span> <span class="keywordtype">double</span> ExtraSavingsMemoryMultiplicativeFactor() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span> </div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> BuildRoutesFromSavings() = 0;</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span> </div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  <span class="comment">// Returns the cost class from a saving.</span></div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  int64 GetVehicleTypeFromSaving(<span class="keyword">const</span> Saving& saving)<span class="keyword"> const </span>{</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>  <span class="keywordflow">return</span> saving.second / size_squared_;</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  }</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  <span class="comment">// Returns the "before node" from a saving.</span></div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  int64 GetBeforeNodeFromSaving(<span class="keyword">const</span> Saving& saving)<span class="keyword"> const </span>{</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>  <span class="keywordflow">return</span> (saving.second % size_squared_) / <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>();</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  }</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>  <span class="comment">// Returns the "after node" from a saving.</span></div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>  int64 GetAfterNodeFromSaving(<span class="keyword">const</span> Saving& saving)<span class="keyword"> const </span>{</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>  <span class="keywordflow">return</span> (saving.second % size_squared_) % <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>();</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>  }</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>  <span class="comment">// Returns the saving value from a saving.</span></div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  int64 GetSavingValue(<span class="keyword">const</span> Saving& saving)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> saving.first; }</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span> </div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>  <span class="comment">// Finds the best available vehicle of type "type" to start a new route to</span></div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  <span class="comment">// serve the arc before_node-->after_node.</span></div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  <span class="comment">// Since there are different vehicle classes for each vehicle type, each</span></div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  <span class="comment">// vehicle class having its own capacity constraints, we go through all</span></div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>  <span class="comment">// vehicle types (in each case only studying the first available vehicle) to</span></div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>  <span class="comment">// make sure this Saving is inserted if possible.</span></div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>  <span class="comment">// If possible, the arc is committed to the best vehicle, and the vehicle</span></div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  <span class="comment">// index is returned. If this arc can't be served by any vehicle of this type,</span></div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>  <span class="comment">// the function returns -1.</span></div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  <span class="keywordtype">int</span> StartNewRouteWithBestVehicleOfType(<span class="keywordtype">int</span> type, int64 before_node,</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  int64 after_node);</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span> </div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  std::vector<int> type_index_of_vehicle_;</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  std::vector<std::set<VehicleClassEntry> > sorted_vehicle_classes_per_type_;</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>  std::vector<std::deque<int> > vehicles_per_vehicle_class_;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  std::unique_ptr<SavingsContainer<Saving> > savings_container_;</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span> </div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>  <span class="comment">// Used when add_reverse_arcs_ is true.</span></div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  <span class="comment">// Given the vector of adjacency lists of a graph, adds symetric arcs not</span></div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  <span class="comment">// already in the graph to the adjacencies (i.e. if n1-->n2 is present and not</span></div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  <span class="comment">// n2-->n1, then n1 is added to adjacency_matrix[n2].</span></div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  <span class="keywordtype">void</span> AddSymetricArcsToAdjacencyLists(</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  std::vector<std::vector<int64> >* adjacency_lists);</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span> </div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>  <span class="comment">// Computes saving values for node pairs (see MaxNumNeighborsPerNode()) and</span></div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>  <span class="comment">// all vehicle types (see ComputeVehicleTypes()).</span></div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>  <span class="comment">// The saving index attached to each saving value is an index used to</span></div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>  <span class="comment">// store and recover the node pair to which the value is linked (cf. the</span></div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <span class="comment">// index conversion methods below).</span></div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>  <span class="comment">// The computed savings are stored and sorted using the savings_container_.</span></div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  <span class="keywordtype">void</span> ComputeSavings();</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <span class="comment">// Builds a saving from a saving value, a vehicle type and two nodes.</span></div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  Saving BuildSaving(int64 saving, <span class="keywordtype">int</span> vehicle_type, <span class="keywordtype">int</span> before_node,</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  <span class="keywordtype">int</span> after_node)<span class="keyword"> const </span>{</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  <span class="keywordflow">return</span> std::make_pair(saving, vehicle_type * size_squared_ +</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  before_node * <a class="code" href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">Size</a>() + after_node);</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</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>  <span class="comment">// Computes the vehicle type of every vehicle and stores it in</span></div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  <span class="comment">// type_index_of_vehicle_. A "vehicle type" consists of the set of vehicles</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  <span class="comment">// having the same cost class and start/end nodes, therefore the same savings</span></div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  <span class="comment">// value for each arc.</span></div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  <span class="comment">// The vehicle classes corresponding to each vehicle type index are stored and</span></div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <span class="comment">// sorted by fixed cost in sorted_vehicle_classes_per_type_, and the vehicles</span></div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <span class="comment">// for each vehicle class are stored in vehicles_per_vehicle_class_.</span></div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>  <span class="keywordtype">void</span> ComputeVehicleTypes();</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span> </div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>  <span class="comment">// Computes and returns the maximum number of (closest) neighbors to consider</span></div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  <span class="comment">// for each node when computing Savings, based on the neighbors ratio and max</span></div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  <span class="comment">// memory usage specified by the savings_params_.</span></div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>  int64 MaxNumNeighborsPerNode(<span class="keywordtype">int</span> num_vehicle_types) <span class="keyword">const</span>;</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span> </div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  RoutingIndexManager* <span class="keyword">const</span> manager_;</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  <span class="keyword">const</span> SavingsParameters savings_params_;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  int64 size_squared_;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span> </div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  <span class="keyword">friend</span> <span class="keyword">class </span>SavingsFilteredDecisionBuilderTestPeer;</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> <span class="keyword">class </span>SequentialSavingsFilteredDecisionBuilder</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  : <span class="keyword">public</span> SavingsFilteredDecisionBuilder {</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  SequentialSavingsFilteredDecisionBuilder(</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, RoutingIndexManager* manager,</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  SavingsParameters parameters,</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters)</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>  : SavingsFilteredDecisionBuilder(<a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, manager, parameters, filters) {}</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  ~SequentialSavingsFilteredDecisionBuilder()<span class="keyword"> override</span>{};</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  <span class="keywordflow">return</span> <span class="stringliteral">"SequentialSavingsFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  }</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span> </div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  <span class="comment">// Builds routes sequentially.</span></div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  <span class="comment">// Once a Saving is used to start a new route, we extend this route as much as</span></div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  <span class="comment">// possible from both ends by gradually inserting the best Saving at either</span></div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  <span class="comment">// end of the route.</span></div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  <span class="keywordtype">void</span> BuildRoutesFromSavings() <span class="keyword">override</span>;</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  <span class="keywordtype">double</span> ExtraSavingsMemoryMultiplicativeFactor()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> 1.0; }</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span> };</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span> </div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span> <span class="keyword">class </span>ParallelSavingsFilteredDecisionBuilder</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  : <span class="keyword">public</span> SavingsFilteredDecisionBuilder {</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  ParallelSavingsFilteredDecisionBuilder(</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, RoutingIndexManager* manager,</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  SavingsParameters parameters,</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters)</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  : SavingsFilteredDecisionBuilder(<a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, manager, parameters, filters) {}</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  ~ParallelSavingsFilteredDecisionBuilder()<span class="keyword"> override</span>{};</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  <span class="keywordflow">return</span> <span class="stringliteral">"ParallelSavingsFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  }</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span> </div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  <span class="comment">// Goes through the ordered computed Savings to build routes in parallel.</span></div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>  <span class="comment">// Given a Saving for a before-->after arc :</span></div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  <span class="comment">// -- If both before and after are uncontained, we start a new route.</span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  <span class="comment">// -- If only before is served and is the last node on its route, we try</span></div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  <span class="comment">// adding after at the end of the route.</span></div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  <span class="comment">// -- If only after is served and is first on its route, we try adding before</span></div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  <span class="comment">// as first node on this route.</span></div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  <span class="comment">// -- If both nodes are contained and are respectively the last and first</span></div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  <span class="comment">// nodes on their (different) routes, we merge the routes of the two nodes</span></div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  <span class="comment">// into one if possible.</span></div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  <span class="keywordtype">void</span> BuildRoutesFromSavings() <span class="keyword">override</span>;</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span> </div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>  <span class="keywordtype">double</span> ExtraSavingsMemoryMultiplicativeFactor()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> 2.0; }</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span> </div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  <span class="comment">// Merges the routes of first_vehicle and second_vehicle onto the vehicle with</span></div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  <span class="comment">// lower fixed cost. The routes respectively end at before_node and start at</span></div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  <span class="comment">// after_node, and are merged into one by adding the arc</span></div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>  <span class="comment">// before_node-->after_node.</span></div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  <span class="keywordtype">void</span> MergeRoutes(<span class="keywordtype">int</span> first_vehicle, <span class="keywordtype">int</span> second_vehicle, int64 before_node,</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>  int64 after_node);</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span> </div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  <span class="comment">// First and last non start/end nodes served by each vehicle.</span></div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>  std::vector<int64> first_node_on_route_;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>  std::vector<int64> last_node_on_route_;</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>  <span class="comment">// For each first/last node served by a vehicle (besides start/end nodes of</span></div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>  <span class="comment">// vehicle), this vector contains the index of the vehicle serving them.</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>  <span class="comment">// For other (intermediary) nodes, contains -1.</span></div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  std::vector<int> vehicle_of_first_or_last_node_;</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span> };</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> <span class="comment">// Christofides addition heuristic. Initially created to solve TSPs, extended to</span></div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span> <span class="comment">// support any model by extending routes as much as possible following the path</span></div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span> <span class="comment">// found by the heuristic, before starting a new route.</span></div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span> </div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span> <span class="keyword">class </span>ChristofidesFilteredDecisionBuilder</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>  : <span class="keyword">public</span> RoutingFilteredDecisionBuilder {</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  ChristofidesFilteredDecisionBuilder(</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>  RoutingModel* <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>, <span class="keyword">const</span> std::vector<LocalSearchFilter*>& filters);</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  ~ChristofidesFilteredDecisionBuilder()<span class="keyword"> override </span>{}</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>  <span class="keywordtype">bool</span> BuildSolution() <span class="keyword">override</span>;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  std::string DebugString()<span class="keyword"> const override </span>{</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>  <span class="keywordflow">return</span> <span class="stringliteral">"ChristofidesFilteredDecisionBuilder"</span>;</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>  }</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span> };</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span> </div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span> <span class="comment">// Attempts to solve the model using the cp-sat solver. As of 5/2019, will solve</span></div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span> <span class="comment">// the TSP corresponding to the model if it has a single vehicle. Therefore the</span></div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span> <span class="comment">// resulting solution might not actually be feasible. Will return false if a</span></div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span> <span class="comment">// solution could not be found.</span></div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span> <span class="keywordtype">bool</span> SolveModelWithSat(<span class="keyword">const</span> RoutingModel& <a class="code" href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">model</a>,</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>  <span class="keyword">const</span> Assignment* initial_solution,</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  Assignment* solution);</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span> </div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span> <span class="comment">// Generic path-based filter class.</span></div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span> </div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span> <span class="keyword">class </span>BasePathFilter : <span class="keyword">public</span> IntVarLocalSearchFilter {</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>  BasePathFilter(<span class="keyword">const</span> std::vector<IntVar*>& nexts, <span class="keywordtype">int</span> next_domain_size,</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>  std::function<<span class="keywordtype">void</span>(int64)> objective_callback);</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>  ~BasePathFilter()<span class="keyword"> override </span>{}</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>  <span class="keywordtype">bool</span> Accept(Assignment* delta, Assignment* deltadelta) <span class="keyword">override</span>;</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  <span class="keywordtype">void</span> OnSynchronize(<span class="keyword">const</span> Assignment* delta) <span class="keyword">override</span>;</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span> </div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  <span class="keyword">static</span> <span class="keyword">const</span> int64 kUnassigned;</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span> </div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  int64 GetNext(int64 node)<span class="keyword"> const </span>{</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>  <span class="keywordflow">return</span> (new_nexts_[node] == kUnassigned)</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>  ? (IsVarSynced(node) ? Value(node) : kUnassigned)</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>  : new_nexts_[node];</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>  }</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>  <span class="keywordtype">int</span> NumPaths()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> starts_.size(); }</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>  int64 <a class="code" href="routing_8h.html#acbdbdfc9491ef0586459d38cc5ef4cb8">Start</a>(<span class="keywordtype">int</span> i)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> starts_[i]; }</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  <span class="keywordtype">int</span> GetPath(int64 node)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> paths_[node]; }</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  <span class="keywordtype">int</span> Rank(int64 node)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ranks_[node]; }</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  <span class="keywordtype">bool</span> IsDisabled()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> status_ == DISABLED; }</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  <span class="keyword">const</span> std::vector<int64>& GetNewSynchronizedUnperformedNodes()<span class="keyword"> const </span>{</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>  <span class="keywordflow">return</span> new_synchronized_unperformed_nodes_.PositionsSetAtLeastOnce();</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>  }</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span> </div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>  <span class="keyword">enum</span> Status { UNKNOWN, ENABLED, DISABLED };</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span> </div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> DisableFiltering()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnBeforeSynchronizePaths() {}</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnAfterSynchronizePaths() {}</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnSynchronizePathFromStart(int64 start) {}</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> InitializeAcceptPath() {}</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> AcceptPath(int64 path_start, int64 chain_start,</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>  int64 chain_end) = 0;</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> FinalizeAcceptPath(Assignment* delta) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>  <span class="comment">// Detects path starts, used to track which node belongs to which path.</span></div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>  <span class="keywordtype">void</span> ComputePathStarts(std::vector<int64>* path_starts,</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>  std::vector<int>* index_to_path);</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>  <span class="keywordtype">bool</span> HavePathsChanged();</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>  <span class="keywordtype">void</span> SynchronizeFullAssignment();</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>  <span class="keywordtype">void</span> UpdateAllRanks();</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>  <span class="keywordtype">void</span> UpdatePathRanksFromStart(<span class="keywordtype">int</span> start);</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span> </div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>  std::vector<int64> node_path_starts_;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  std::vector<int64> starts_;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>  std::vector<int> paths_;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>  SparseBitset<int64> new_synchronized_unperformed_nodes_;</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>  std::vector<int64> new_nexts_;</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>  std::vector<int> delta_touched_;</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>  SparseBitset<> touched_paths_;</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>  SparseBitset<> touched_path_nodes_;</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>  std::vector<int> ranks_;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span> </div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>  Status status_;</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span> };</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span> </div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span> <span class="comment">// This filter accepts deltas for which the assignment satisfies the constraints</span></div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span> <span class="comment">// of the Solver. This is verified by keeping an internal copy of the assignment</span></div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span> <span class="comment">// with all Next vars and their updated values, and calling RestoreAssignment()</span></div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span> <span class="comment">// on the assignment+delta.</span></div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span> <span class="comment">// TODO(user): Also call the solution finalizer on variables, with the</span></div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span> <span class="comment">// exception of Next Vars (woud fail on large instances).</span></div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span> <span class="comment">// WARNING: In the case of mandatory nodes, when all vehicles are currently</span></div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span> <span class="comment">// being used in the solution but uninserted nodes still remain, this filter</span></div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span> <span class="comment">// will reject the solution, even if the node could be inserted on one of these</span></div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span> <span class="comment">// routes, because all Next vars of vehicle starts are already instantiated.</span></div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span> <span class="comment">// TODO(user): Avoid such false negatives.</span></div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span> <span class="keyword">class </span>CPFeasibilityFilter : <span class="keyword">public</span> IntVarLocalSearchFilter {</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>  <span class="keyword">explicit</span> CPFeasibilityFilter(<span class="keyword">const</span> RoutingModel* routing_model);</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  ~CPFeasibilityFilter()<span class="keyword"> override </span>{}</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>  std::string DebugString()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"CPFeasibilityFilter"</span>; }</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>  <span class="keywordtype">bool</span> Accept(Assignment* delta, Assignment* deltadelta) <span class="keyword">override</span>;</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>  <span class="keywordtype">void</span> OnSynchronize(<span class="keyword">const</span> Assignment* delta) <span class="keyword">override</span>;</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span> </div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>  <span class="keywordtype">void</span> AddDeltaToAssignment(<span class="keyword">const</span> Assignment* delta, Assignment* assignment);</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>  <span class="keyword">static</span> <span class="keyword">const</span> int64 kUnassigned;</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>  <span class="keyword">const</span> RoutingModel* <span class="keyword">const</span> model_;</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  Solver* <span class="keyword">const</span> solver_;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>  Assignment* <span class="keyword">const</span> assignment_;</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  Assignment* <span class="keyword">const</span> temp_assignment_;</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>  DecisionBuilder* <span class="keyword">const</span> restore_;</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span> };</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span> </div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span> <span class="preprocessor">#if !defined(SWIG)</span></div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span> IntVarLocalSearchFilter* MakeNodeDisjunctionFilter(</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>  <span class="keyword">const</span> RoutingModel& routing_model,</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>  std::function<<span class="keywordtype">void</span>(int64)> objective_callback);</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span> IntVarLocalSearchFilter* MakeVehicleAmortizedCostFilter(</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>  <span class="keyword">const</span> RoutingModel& routing_model,</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>  <a class="code" href="classoperations__research_1_1Solver.html#acb354925d9ed2803b56953a9a9ec59df">Solver::ObjectiveWatcher</a> objective_callback);</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span> IntVarLocalSearchFilter* MakeTypeRegulationsFilter(</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>  <span class="keyword">const</span> RoutingModel& routing_model);</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span> std::vector<IntVarLocalSearchFilter*> MakeCumulFilters(</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension,</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  <a class="code" href="classoperations__research_1_1Solver.html#acb354925d9ed2803b56953a9a9ec59df">Solver::ObjectiveWatcher</a> objective_callback, <span class="keywordtype">bool</span> filter_objective_cost);</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span> IntVarLocalSearchFilter* MakePathCumulFilter(</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension,</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  <a class="code" href="classoperations__research_1_1Solver.html#acb354925d9ed2803b56953a9a9ec59df">Solver::ObjectiveWatcher</a> objective_callback,</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>  <span class="keywordtype">bool</span> propagate_own_objective_value, <span class="keywordtype">bool</span> filter_objective_cost);</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span> IntVarLocalSearchFilter* MakeGlobalLPCumulFilter(</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>  <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension,</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>  <a class="code" href="classoperations__research_1_1Solver.html#acb354925d9ed2803b56953a9a9ec59df">Solver::ObjectiveWatcher</a> objective_callback, <span class="keywordtype">bool</span> filter_objective_cost);</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span> IntVarLocalSearchFilter* MakePickupDeliveryFilter(</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>  <span class="keyword">const</span> RoutingModel& routing_model, <span class="keyword">const</span> RoutingModel::IndexPairs& pairs,</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>  <span class="keyword">const</span> std::vector<RoutingModel::PickupAndDeliveryPolicy>& vehicle_policies);</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span> IntVarLocalSearchFilter* MakeVehicleVarFilter(</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>  <span class="keyword">const</span> RoutingModel& routing_model);</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span> IntVarLocalSearchFilter* MakeVehicleBreaksFilter(</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>  <span class="keyword">const</span> RoutingModel& routing_model, <span class="keyword">const</span> <a class="code" href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension);</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span> IntVarLocalSearchFilter* MakeCPFeasibilityFilter(</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>  <span class="keyword">const</span> RoutingModel* routing_model);</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span> </div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span> } <span class="comment">// namespace operations_research</span></div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span> <span class="preprocessor">#endif // OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_</span></div><div class="ttc" id="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry_html_aa504ae94659c25c6146786485941e8bc"><div class="ttname"><a href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#aa504ae94659c25c6146786485941e8bc">SavingsFilteredDecisionBuilder::VehicleClassEntry::vehicle_class</a></div><div class="ttdeci">int vehicle_class</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02977">routing.h:2977</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ab313d84a56c5e9b1b8f28da70b8d4045"><div class="ttname"><a href="routing_8h.html#ab313d84a56c5e9b1b8f28da70b8d4045">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#l00762">routing.h:762</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a0e23be986e4c3b96a50c8798aa5f536d"><div class="ttname"><a href="routing_8h.html#a0e23be986e4c3b96a50c8798aa5f536d">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>
|
|
<div class="ttc" id="routing_8h_html_adb0524e488894fa8f88764c74abb31f5"><div class="ttname"><a href="routing_8h.html#adb0524e488894fa8f88764c74abb31f5">RemainingTime</a></div><div class="ttdeci">absl::Duration RemainingTime() const</div><div class="ttdoc">Returns the time left in the search limit.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01179">routing.h:1179</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ae1acdfe3dcf892d108d2a2ecab94e936"><div class="ttname"><a href="routing_8h.html#ae1acdfe3dcf892d108d2a2ecab94e936">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>
|
|
<div class="ttc" id="routing_8h_html_acfcef421e8c8cd243157543f741d6a73"><div class="ttname"><a href="routing_8h.html#acfcef421e8c8cd243157543f741d6a73">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>
|
|
<div class="ttc" id="routing_8h_html_a410f7da30cf944b7874eebe57eebe41a"><div class="ttname"><a href="routing_8h.html#a410f7da30cf944b7874eebe57eebe41a">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>
|
|
<div class="ttc" id="routing_8h_html_a92ee209f167d3974329301d784010b63"><div class="ttname"><a href="routing_8h.html#a92ee209f167d3974329301d784010b63">AddTemporalRequiredTypeAlternatives</a></div><div class="ttdeci">void AddTemporalRequiredTypeAlternatives(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)</div><div class="ttdoc">If type_D temporally depends on type_R, any non-delivery node_D of type_D requires at least one non-d...</div></div>
|
|
<div class="ttc" id="routing_8h_html_ad3b144985c2b4b24cf39b839dbd9c16d"><div class="ttname"><a href="routing_8h.html#ad3b144985c2b4b24cf39b839dbd9c16d">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#l01125">routing.h:1125</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ab69145472d51d341f82d3ad29e9c6be2"><div class="ttname"><a href="routing_8h.html#ab69145472d51d341f82d3ad29e9c6be2">SetFirstSolutionEvaluator</a></div><div class="ttdeci">void SetFirstSolutionEvaluator(Solver::IndexEvaluator2 evaluator)</div><div class="ttdoc">Takes ownership of evaluator.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00845">routing.h:845</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a66fb44c05f9875685e9c332fbdfb643b"><div class="ttname"><a href="routing_8h.html#a66fb44c05f9875685e9c332fbdfb643b">NextVar</a></div><div class="ttdeci">IntVar * NextVar(int64 index) const</div><div class="ttdoc">Returns the next variable of the node corresponding to index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01072">routing.h:1072</a></div></div>
|
|
<div class="ttc" id="structSimpleBoundCosts_1_1BoundCost_html_a8e9bc21d85a15811daec7d1b03b50704"><div class="ttname"><a href="structSimpleBoundCosts_1_1BoundCost.html#a8e9bc21d85a15811daec7d1b03b50704">SimpleBoundCosts::BoundCost::cost</a></div><div class="ttdeci">int64 cost</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01974">routing.h:1974</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a660cb5477a6d3fbf146657aa7af73968"><div class="ttname"><a href="routing_8h.html#a660cb5477a6d3fbf146657aa7af73968">first_solution_evaluator</a></div><div class="ttdeci">const Solver::IndexEvaluator2 & first_solution_evaluator() const</div><div class="ttdoc">Search Gets/sets the evaluator used during the search.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00840">routing.h:840</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a480a1199c2254e1b14f5124b77a65fe9"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a480a1199c2254e1b14f5124b77a65fe9">DisjunctivePropagator::Tasks::forbidden_intervals</a></div><div class="ttdeci">std::vector< const SortedDisjointIntervalList * > forbidden_intervals</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01689">routing.h:1689</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a5e3f4c6871f7b2c67fd5b1ad6c94d891"><div class="ttname"><a href="routing_8h.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891">HasTemporalTypeRequirements</a></div><div class="ttdeci">bool HasTemporalTypeRequirements() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00756">routing.h:756</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa9e7ba89833775f29889744fe9480d29"><div class="ttname"><a href="routing_8h.html#aa9e7ba89833775f29889744fe9480d29">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#l01188">routing.h:1188</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ac8347e84488d1b5eb7b5e6972fb32be3"><div class="ttname"><a href="routing_8h.html#ac8347e84488d1b5eb7b5e6972fb32be3">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>
|
|
<div class="ttc" id="routing_8h_html_abaa74f74aefe075aedb6b16259a4404e"><div class="ttname"><a href="routing_8h.html#abaa74f74aefe075aedb6b16259a4404e">GetNonZeroCostClassesCount</a></div><div class="ttdeci">int GetNonZeroCostClassesCount() const</div><div class="ttdoc">Ditto, minus the 'always zero', built-in cost class.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01127">routing.h:1127</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ad19492313b68e5a963af3793aaec8d90"><div class="ttname"><a href="routing_8h.html#ad19492313b68e5a963af3793aaec8d90">HasTemporalTypeIncompatibilities</a></div><div class="ttdeci">bool HasTemporalTypeIncompatibilities() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00723">routing.h:723</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a566ddf59563c1b37e8c178b1805aa0f4"><div class="ttname"><a href="routing_8h.html#a566ddf59563c1b37e8c178b1805aa0f4">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>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a78f61265441dff8a40873494e79e90bd"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a78f61265441dff8a40873494e79e90bd">DisjunctivePropagator::Tasks::distance_duration</a></div><div class="ttdeci">std::vector< std::pair< int64, int64 > > distance_duration</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01690">routing.h:1690</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa01519be299cb5ddef36111ee6f8a5cc"><div class="ttname"><a href="routing_8h.html#aa01519be299cb5ddef36111ee6f8a5cc">GetAmortizedLinearCostFactorOfVehicles</a></div><div class="ttdeci">const std::vector< int64 > & GetAmortizedLinearCostFactorOfVehicles() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00819">routing.h:819</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a7ccaa3133378da76d3fd5cdb560038ae"><div class="ttname"><a href="routing_8h.html#a7ccaa3133378da76d3fd5cdb560038ae">ConsiderEmptyRouteCostsForVehicle</a></div><div class="ttdeci">void ConsiderEmptyRouteCostsForVehicle(bool consider_costs, int vehicle)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00826">routing.h:826</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa1c45751ee316e0948ba32494262f006"><div class="ttname"><a href="routing_8h.html#aa1c45751ee316e0948ba32494262f006">MakeGreedyDescentLSOperator</a></div><div class="ttdeci">static std::unique_ptr< LocalSearchOperator > MakeGreedyDescentLSOperator(std::vector< IntVar * > variables)</div></div>
|
|
<div class="ttc" id="constraint__solver_8h_html"><div class="ttname"><a href="constraint__solver_8h.html">constraint_solver.h</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a97d152b7049084186342b719eee6fa15"><div class="ttname"><a href="routing_8h.html#a97d152b7049084186342b719eee6fa15">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>
|
|
<div class="ttc" id="routing_8h_html_a3e87a7710617f6ac19dca14adad9c5a6"><div class="ttname"><a href="routing_8h.html#a3e87a7710617f6ac19dca14adad9c5a6">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>
|
|
<div class="ttc" id="routing__index__manager_8h_html"><div class="ttname"><a href="routing__index__manager_8h.html">routing_index_manager.h</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a2dcba5165de6aec6cf5ab9dd3e703712"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a2dcba5165de6aec6cf5ab9dd3e703712">DisjunctivePropagator::Tasks::duration_min</a></div><div class="ttdeci">std::vector< int64 > duration_min</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01684">routing.h:1684</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ac22e9cfd1fbf1b4af4f8a9be46ec88a1"><div class="ttname"><a href="routing_8h.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1">AddSameVehicleRequiredTypeAlternatives</a></div><div class="ttdeci">void AddSameVehicleRequiredTypeAlternatives(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)</div><div class="ttdoc">Requirements:</div></div>
|
|
<div class="ttc" id="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue_html_a843944b58d95caa2634a4c6b2792da2a"><div class="ttname"><a href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a843944b58d95caa2634a4c6b2792da2a">CheapestInsertionFilteredDecisionBuilder::StartEndValue::vehicle</a></div><div class="ttdeci">int vehicle</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02582">routing.h:2582</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a562e4c0a80f7f4eda9573a482af288d1"><div class="ttname"><a href="routing_8h.html#a562e4c0a80f7f4eda9573a482af288d1">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>
|
|
<div class="ttc" id="routing_8h_html_abc101a64a3c876dcdf1b7176d59bd2c9"><div class="ttname"><a href="routing_8h.html#abc101a64a3c876dcdf1b7176d59bd2c9">HasSameVehicleTypeRequirements</a></div><div class="ttdeci">bool HasSameVehicleTypeRequirements() const</div><div class="ttdoc">clang-format on Returns true iff any same-route (resp.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00753">routing.h:753</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a8cded3d3d6746c179a8ec0eddad24342"><div class="ttname"><a href="routing_8h.html#a8cded3d3d6746c179a8ec0eddad24342">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#l01082">routing.h:1082</a></div></div>
|
|
<div class="ttc" id="namespaceoperations__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">-------— Misc -------—</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03118">constraint_solver.h:3118</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a9c58894df747f5498c335a3a8c5c0c88"><div class="ttname"><a href="routing_8h.html#a9c58894df747f5498c335a3a8c5c0c88">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#l00720">routing.h:720</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa241abc19460575d250a5788f03afbf6"><div class="ttname"><a href="routing_8h.html#aa241abc19460575d250a5788f03afbf6">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#l01096">routing.h:1096</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a7c2d33eef73401442fd9f2e205056c73"><div class="ttname"><a href="routing_8h.html#a7c2d33eef73401442fd9f2e205056c73">VehicleCostsConsideredVar</a></div><div class="ttdeci">IntVar * VehicleCostsConsideredVar(int vehicle) const</div><div class="ttdoc">Returns the variable specifying whether or not costs are considered for vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01077">routing.h:1077</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_afadc1348f0318e9bc8cebb75b2fc4234"><div class="ttname"><a href="routing_8h.html#afadc1348f0318e9bc8cebb75b2fc4234">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#l01074">routing.h:1074</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_af4e97be54c31d45d312d168ce1c8ba6f"><div class="ttname"><a href="routing_8h.html#af4e97be54c31d45d312d168ce1c8ba6f">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>
|
|
<div class="ttc" id="namespaceoperations__research_html_ae7851f8d6518e3180b9d9f0ec69826e7"><div class="ttname"><a href="namespaceoperations__research.html#ae7851f8d6518e3180b9d9f0ec69826e7">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>
|
|
<div class="ttc" id="constraint__solveri_8h_html"><div class="ttname"><a href="constraint__solveri_8h.html">constraint_solveri.h</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ae2530e17cabaf267e12929ca0ee1bee0"><div class="ttname"><a href="routing_8h.html#ae2530e17cabaf267e12929ca0ee1bee0">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#l01051">routing.h:1051</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a32bba655accbd7dc8e23d30bf679b880"><div class="ttname"><a href="routing_8h.html#a32bba655accbd7dc8e23d30bf679b880">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#l01111">routing.h:1111</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_abcbe77312783c0a5aa4926ace764533b"><div class="ttname"><a href="routing_8h.html#abcbe77312783c0a5aa4926ace764533b">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#l01084">routing.h:1084</a></div></div>
|
|
<div class="ttc" id="structRoutingDimension_1_1NodePrecedence_html_a0fcec9ed1d122c19028064641f0445a6"><div class="ttname"><a href="structRoutingDimension_1_1NodePrecedence.html#a0fcec9ed1d122c19028064641f0445a6">RoutingDimension::NodePrecedence::offset</a></div><div class="ttdeci">int64 offset</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02242">routing.h:2242</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ae1adbc353c105572655ae866124c61b6"><div class="ttname"><a href="routing_8h.html#ae1adbc353c105572655ae866124c61b6">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>
|
|
<div class="ttc" id="routing_8h_html_a46a69d9769aa92122c7e5e20f49e3da3"><div class="ttname"><a href="routing_8h.html#a46a69d9769aa92122c7e5e20f49e3da3">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>
|
|
<div class="ttc" id="routing_8h_html_ae033bc458ffce1ecc4874f3e212896f7"><div class="ttname"><a href="routing_8h.html#ae033bc458ffce1ecc4874f3e212896f7">PreAssignment</a></div><div class="ttdeci">const Assignment *const PreAssignment() const</div><div class="ttdoc">Returns an assignment used to fix some of the variables of the problem.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00941">routing.h:941</a></div></div>
|
|
<div class="ttc" id="classSavingsFilteredDecisionBuilder_1_1SavingsContainer_html"><div class="ttname"><a href="classSavingsFilteredDecisionBuilder_1_1SavingsContainer.html">SavingsFilteredDecisionBuilder::SavingsContainer</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02974">routing.h:2974</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a796b4eed03ed53bbbaed642f4ae94952"><div class="ttname"><a href="routing_8h.html#a796b4eed03ed53bbbaed642f4ae94952">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>
|
|
<div class="ttc" id="routing_8h_html_a9d8ead500db4128d0d27f8066d1f8208"><div class="ttname"><a href="routing_8h.html#a9d8ead500db4128d0d27f8066d1f8208">GetTemporalTypeIncompatibilitiesOfType</a></div><div class="ttdeci">const absl::flat_hash_set< int > & GetTemporalTypeIncompatibilitiesOfType(int type) const</div></div>
|
|
<div class="ttc" id="classoperations__research_1_1Solver_html_af24d476da11ebf69fae9d4890447cc95"><div class="ttname"><a href="classoperations__research_1_1Solver.html#af24d476da11ebf69fae9d4890447cc95">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#l00735">constraint_solver.h:735</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aedb8dca94b15e5465fef1667d1a81db6"><div class="ttname"><a href="routing_8h.html#aedb8dca94b15e5465fef1667d1a81db6">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>
|
|
<div class="ttc" id="routing_8h_html_ae9b2404a26ab1e6acf562b8261eeba38"><div class="ttname"><a href="routing_8h.html#ae9b2404a26ab1e6acf562b8261eeba38">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>
|
|
<div class="ttc" id="routing_8h_html_a97dca877bb5083a72c147628a8439770"><div class="ttname"><a href="routing_8h.html#a97dca877bb5083a72c147628a8439770">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>
|
|
<div class="ttc" id="routing_8h_html_a80572a238b48c2cefe38409e7544f161"><div class="ttname"><a href="routing_8h.html#a80572a238b48c2cefe38409e7544f161">VehicleVars</a></div><div class="ttdeci">const std::vector< IntVar * > & VehicleVars() const</div><div class="ttdoc">Returns all vehicle variables of the model, such that VehicleVars(i) is the vehicle variable of the n...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01068">routing.h:1068</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa79f8d482de4dd0ef86a1b54999686af"><div class="ttname"><a href="routing_8h.html#aa79f8d482de4dd0ef86a1b54999686af">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>
|
|
<div class="ttc" id="routing_8h_html_a3f5d70fe48cb54cbc5d8f6bba55b007d"><div class="ttname"><a href="routing_8h.html#a3f5d70fe48cb54cbc5d8f6bba55b007d">CheckLimit</a></div><div class="ttdeci">bool CheckLimit()</div><div class="ttdoc">Returns true if the search limit has been crossed.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01173">routing.h:1173</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ae8364b53d49a5b46e994d41124c4ffd6"><div class="ttname"><a href="routing_8h.html#ae8364b53d49a5b46e994d41124c4ffd6">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>
|
|
<div class="ttc" id="routing_8h_html_a50dd6fccc1cca84aa10efc8f3ece396c"><div class="ttname"><a href="routing_8h.html#a50dd6fccc1cca84aa10efc8f3ece396c">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>
|
|
<div class="ttc" id="routing_8h_html_a25d079aaf52ffdf6d547384b523ff018"><div class="ttname"><a href="routing_8h.html#a25d079aaf52ffdf6d547384b523ff018">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>
|
|
<div class="ttc" id="routing_8h_html_add71470f4175a0859e6e3d69c2a53988"><div class="ttname"><a href="routing_8h.html#add71470f4175a0859e6e3d69c2a53988">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>
|
|
<div class="ttc" id="routing_8h_html_a1dc8d32892f78532c8ee7a7186158e07"><div class="ttname"><a href="routing_8h.html#a1dc8d32892f78532c8ee7a7186158e07">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#l01047">routing.h:1047</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a4768ba91c34c542eddec212a68d79473"><div class="ttname"><a href="routing_8h.html#a4768ba91c34c542eddec212a68d79473">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>
|
|
<div class="ttc" id="routing_8h_html_a0e106a97f0156868f1d1c741b283793e"><div class="ttname"><a href="routing_8h.html#a0e106a97f0156868f1d1c741b283793e">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#l01206">routing.h:1206</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a92d7882c311f7d9d0c55c4def34150dd"><div class="ttname"><a href="routing_8h.html#a92d7882c311f7d9d0c55c4def34150dd">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>
|
|
<div class="ttc" id="routing_8h_html_ab878a81ace850e3ecd26e95966409f61"><div class="ttname"><a href="routing_8h.html#ab878a81ace850e3ecd26e95966409f61">AddIntervalToAssignment</a></div><div class="ttdeci">void AddIntervalToAssignment(IntervalVar *const interval)</div></div>
|
|
<div class="ttc" id="routing_8h_html_a20d0a3f5cec2e425c86f358e5f06b4a8"><div class="ttname"><a href="routing_8h.html#a20d0a3f5cec2e425c86f358e5f06b4a8">MakeGuidedSlackFinalizer</a></div><div class="ttdeci">DecisionBuilder * MakeGuidedSlackFinalizer(const RoutingDimension *dimension, std::function< int64(int64)> initializer)</div><div class="ttdoc">The next few members are in the public section only for testing purposes.</div></div>
|
|
<div class="ttc" id="routing_8h_html_ab8d61705aa4291d2cd437ba0a7dfccbf"><div class="ttname"><a href="routing_8h.html#ab8d61705aa4291d2cd437ba0a7dfccbf">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>
|
|
<div class="ttc" id="routing_8h_html_a1739a41268c21cfc401d870f05b93536"><div class="ttname"><a href="routing_8h.html#a1739a41268c21cfc401d870f05b93536">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>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a646bf1d98f0bcb2b157072f8dca5661d"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a646bf1d98f0bcb2b157072f8dca5661d">DisjunctivePropagator::Tasks::duration_max</a></div><div class="ttdeci">std::vector< int64 > duration_max</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01685">routing.h:1685</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a07b796e9f91ee5b4c5e99c7f23e2f743"><div class="ttname"><a href="routing_8h.html#a07b796e9f91ee5b4c5e99c7f23e2f743">SetFixedCostOfAllVehicles</a></div><div class="ttdeci">void SetFixedCostOfAllVehicles(int64 cost)</div><div class="ttdoc">Sets the fixed cost of all vehicle routes.</div></div>
|
|
<div class="ttc" id="routing_8h_html_a822458cc9a9a6fa02e86af3e3a1e5c89"><div class="ttname"><a href="routing_8h.html#a822458cc9a9a6fa02e86af3e3a1e5c89">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>
|
|
<div class="ttc" id="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue_html"><div class="ttname"><a href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html">CheapestInsertionFilteredDecisionBuilder::StartEndValue</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02580">routing.h:2580</a></div></div>
|
|
<div class="ttc" id="structSimpleBoundCosts_1_1BoundCost_html_aafe091324086df78a56f418adf2dc202"><div class="ttname"><a href="structSimpleBoundCosts_1_1BoundCost.html#aafe091324086df78a56f418adf2dc202">SimpleBoundCosts::BoundCost::bound</a></div><div class="ttdeci">int64 bound</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01973">routing.h:1973</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_acca75b5d3bfe2433c5805b049815f533"><div class="ttname"><a href="routing_8h.html#acca75b5d3bfe2433c5805b049815f533">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>
|
|
<div class="ttc" id="routing__types_8h_html"><div class="ttname"><a href="routing__types_8h.html">routing_types.h</a></div></div>
|
|
<div class="ttc" id="structSavingsFilteredDecisionBuilder_1_1SavingsParameters_html"><div class="ttname"><a href="structSavingsFilteredDecisionBuilder_1_1SavingsParameters.html">SavingsFilteredDecisionBuilder::SavingsParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02948">routing.h:2948</a></div></div>
|
|
<div class="ttc" id="namespaceoperations__research_html_a40e66c7b62d7c023af6f08912fdc3f9c"><div class="ttname"><a href="namespaceoperations__research.html#a40e66c7b62d7c023af6f08912fdc3f9c">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="routing_8h_html_abd33c037942b971eeefad43c6022c20e"><div class="ttname"><a href="routing_8h.html#abd33c037942b971eeefad43c6022c20e">VehicleIndex</a></div><div class="ttdeci">int VehicleIndex(int index) const</div><div class="ttdoc">Returns the vehicle of the given start/end index, and -1 if the given index is not a vehicle start/en...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01054">routing.h:1054</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a00141bd90e555aea59a9e98cfbcda6eb"><div class="ttname"><a href="routing_8h.html#a00141bd90e555aea59a9e98cfbcda6eb">RoutingModelInspector</a></div><div class="ttdeci">friend class RoutingModelInspector</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01656">routing.h:1656</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a34ab0d5fa45360b5e6a42b9a78cfe5a8"><div class="ttname"><a href="routing_8h.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8">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#l01135">routing.h:1135</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a700982f228080c6278eb5a2f7f06f31d"><div class="ttname"><a href="routing_8h.html#a700982f228080c6278eb5a2f7f06f31d">SetSweepArranger</a></div><div class="ttdeci">void SetSweepArranger(SweepArranger *sweep_arranger)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01024">routing.h:1024</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a3600327c657a0c83430d7bd9566e9ab6"><div class="ttname"><a href="routing_8h.html#a3600327c657a0c83430d7bd9566e9ab6">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>
|
|
<div class="ttc" id="routing_8h_html_ae0c21c6d4e99cb309b8b298d280e4853"><div class="ttname"><a href="routing_8h.html#ae0c21c6d4e99cb309b8b298d280e4853">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#l01091">routing.h:1091</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a874eb2862dd884ad47e30746e03627f5"><div class="ttname"><a href="routing_8h.html#a874eb2862dd884ad47e30746e03627f5">GetVisitType</a></div><div class="ttdeci">routing_no_lns(default:false) int GetVisitType(int64 index) const</div><div class="ttdoc">Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in c...</div></div>
|
|
<div class="ttc" id="routing_8h_html_acbdbdfc9491ef0586459d38cc5ef4cb8"><div class="ttname"><a href="routing_8h.html#acbdbdfc9491ef0586459d38cc5ef4cb8">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#l01045">routing.h:1045</a></div></div>
|
|
<div class="ttc" id="structRoutingDimension_1_1NodePrecedence_html_a791690768d878b2fabe6adfdd35383e5"><div class="ttname"><a href="structRoutingDimension_1_1NodePrecedence.html#a791690768d878b2fabe6adfdd35383e5">RoutingDimension::NodePrecedence::first_node</a></div><div class="ttdeci">int64 first_node</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02240">routing.h:2240</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a5cc6e6b421a6dfc8650cc38e116fff03"><div class="ttname"><a href="routing_8h.html#a5cc6e6b421a6dfc8650cc38e116fff03">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's dimensions_for_local/global_optimizer_, this method tries to pack ...</div></div>
|
|
<div class="ttc" id="routing_8h_html_a51fb0661acf38ed1442819e2cc452311"><div class="ttname"><a href="routing_8h.html#a51fb0661acf38ed1442819e2cc452311">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>
|
|
<div class="ttc" id="routing_8h_html_adb1490a44086db009cdb51f854a02a65"><div class="ttname"><a href="routing_8h.html#adb1490a44086db009cdb51f854a02a65">status</a></div><div class="ttdeci">Status status() const</div><div class="ttdoc">Returns the current status of the routing model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00918">routing.h:918</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a67e8d10adbcc563f428069f9b2c04b63"><div class="ttname"><a href="routing_8h.html#a67e8d10adbcc563f428069f9b2c04b63">HasVehicleWithCostClassIndex</a></div><div class="ttdeci">bool HasVehicleWithCostClassIndex(CostClassIndex cost_class_index) const</div><div class="ttdoc">Returns true iff the model contains a vehicle with the given cost_class_index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01117">routing.h:1117</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a566384949e6395952f6f6b48603fd87f"><div class="ttname"><a href="routing_8h.html#a566384949e6395952f6f6b48603fd87f">AddLocalSearchFilter</a></div><div class="ttdeci">void AddLocalSearchFilter(LocalSearchFilter *filter)</div><div class="ttdoc">Adds a custom local search filter to the list of filters used to speed up local search by pruning unf...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01035">routing.h:1035</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a7086a908f1890a7e1550c97b774e6384"><div class="ttname"><a href="routing_8h.html#a7086a908f1890a7e1550c97b774e6384">AddTemporalTypeIncompatibility</a></div><div class="ttdeci">void AddTemporalTypeIncompatibility(int type1, int type2)</div></div>
|
|
<div class="ttc" id="routing_8h_html_a04bd106a61d493872cabb0f41f7f118f"><div class="ttname"><a href="routing_8h.html#a04bd106a61d493872cabb0f41f7f118f">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>
|
|
<div class="ttc" id="routing_8h_html_aed6760664a6e4f3427832ee3b7ba0602"><div class="ttname"><a href="routing_8h.html#aed6760664a6e4f3427832ee3b7ba0602">AreEmptyRouteCostsConsideredForVehicle</a></div><div class="ttdeci">bool AreEmptyRouteCostsConsideredForVehicle(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00831">routing.h:831</a></div></div>
|
|
<div class="ttc" id="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue_html_a0c85e075940ea179577a2e090395b446"><div class="ttname"><a href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#a0c85e075940ea179577a2e090395b446">CheapestInsertionFilteredDecisionBuilder::StartEndValue::operator<</a></div><div class="ttdeci">bool operator<(const StartEndValue &other) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02584">routing.h:2584</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html">DisjunctivePropagator::Tasks</a></div><div class="ttdoc">A structure to hold tasks described by their features.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01680">routing.h:1680</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a29e9e4b732a34a405f0f43b746ebc741"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a29e9e4b732a34a405f0f43b746ebc741">DisjunctivePropagator::Tasks::end_min</a></div><div class="ttdeci">std::vector< int64 > end_min</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01686">routing.h:1686</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a1156fa8214dba09e2a2a94862244aa1f"><div class="ttname"><a href="routing_8h.html#a1156fa8214dba09e2a2a94862244aa1f">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>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_a020532a499977a36e38da249afc71230"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#a020532a499977a36e38da249afc71230">DisjunctivePropagator::Tasks::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01692">routing.h:1692</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a3af1158b77552d60afc3f0473de3892d"><div class="ttname"><a href="routing_8h.html#a3af1158b77552d60afc3f0473de3892d">MutablePreAssignment</a></div><div class="ttdeci">Assignment * MutablePreAssignment()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00942">routing.h:942</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aabdcf3bd412a5a61d811ef85e115e5ff"><div class="ttname"><a href="routing_8h.html#aabdcf3bd412a5a61d811ef85e115e5ff">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>
|
|
<div class="ttc" id="structTypeRegulationsChecker_1_1NodeCount_html"><div class="ttname"><a href="structTypeRegulationsChecker_1_1NodeCount.html">TypeRegulationsChecker::NodeCount</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01867">routing.h:1867</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ac1a2ab630f6b13644ca6853c7893f413"><div class="ttname"><a href="routing_8h.html#ac1a2ab630f6b13644ca6853c7893f413">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>
|
|
<div class="ttc" id="routing_8h_html_a0f38add802397fef1f57b7d90ccd5aef"><div class="ttname"><a href="routing_8h.html#a0f38add802397fef1f57b7d90ccd5aef">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#l01186">routing.h:1186</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a7e2d405cde11bc4a08d752d0e669912c"><div class="ttname"><a href="routing_8h.html#a7e2d405cde11bc4a08d752d0e669912c">SetTabuVarsCallback</a></div><div class="ttdeci">void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback)</div></div>
|
|
<div class="ttc" id="routing_8h_html_aaeaf95383c1c03da6f22c522d119775b"><div class="ttname"><a href="routing_8h.html#aaeaf95383c1c03da6f22c522d119775b">GetAmortizedQuadraticCostFactorOfVehicles</a></div><div class="ttdeci">const std::vector< int64 > & GetAmortizedQuadraticCostFactorOfVehicles() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00822">routing.h:822</a></div></div>
|
|
<div class="ttc" id="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry_html_a9c61973758bb413be11e59ffaad7216f"><div class="ttname"><a href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a9c61973758bb413be11e59ffaad7216f">SavingsFilteredDecisionBuilder::VehicleClassEntry::operator<</a></div><div class="ttdeci">bool operator<(const VehicleClassEntry &other) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02980">routing.h:2980</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_ae81bd9ed38788f7ab29ffa6b06c8780a"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#ae81bd9ed38788f7ab29ffa6b06c8780a">DisjunctivePropagator::Tasks::start_min</a></div><div class="ttdeci">std::vector< int64 > start_min</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01682">routing.h:1682</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aad154b31953d2b467bbac3e4ac696cd6"><div class="ttname"><a href="routing_8h.html#aad154b31953d2b467bbac3e4ac696cd6">Nexts</a></div><div class="ttdeci">const std::vector< IntVar * > & Nexts() const</div><div class="ttdoc">Variables.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01065">routing.h:1065</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aaf71584ad4bffea7a489dc53787fa6f8"><div class="ttname"><a href="routing_8h.html#aaf71584ad4bffea7a489dc53787fa6f8">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>
|
|
<div class="ttc" id="routing_8h_html_a4bab641f5b9bf8de266adad29558b4c2"><div class="ttname"><a href="routing_8h.html#a4bab641f5b9bf8de266adad29558b4c2">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>
|
|
<div class="ttc" id="routing_8h_html_a1048b3f7ef92f0d7747f93c8586ea1cc"><div class="ttname"><a href="routing_8h.html#a1048b3f7ef92f0d7747f93c8586ea1cc">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>
|
|
<div class="ttc" id="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry_html"><div class="ttname"><a href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html">SavingsFilteredDecisionBuilder::VehicleClassEntry</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02976">routing.h:2976</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a1b7f20d14ae5261cb2f250c6e99f4383"><div class="ttname"><a href="routing_8h.html#a1b7f20d14ae5261cb2f250c6e99f4383">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>
|
|
<div class="ttc" id="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue_html_ad144ade2ac271bf7f285bad778774b87"><div class="ttname"><a href="structCheapestInsertionFilteredDecisionBuilder_1_1StartEndValue.html#ad144ade2ac271bf7f285bad778774b87">CheapestInsertionFilteredDecisionBuilder::StartEndValue::distance</a></div><div class="ttdeci">int64 distance</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02581">routing.h:2581</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a4e8f5b5f090cf084347eda6eb803813a"><div class="ttname"><a href="routing_8h.html#a4e8f5b5f090cf084347eda6eb803813a">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>
|
|
<div class="ttc" id="classoperations__research_1_1Solver_html_acb354925d9ed2803b56953a9a9ec59df"><div class="ttname"><a href="classoperations__research_1_1Solver.html#acb354925d9ed2803b56953a9a9ec59df">operations_research::Solver::ObjectiveWatcher</a></div><div class="ttdeci">std::function< void(int64)> ObjectiveWatcher</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00736">constraint_solver.h:736</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ae75d9f49c157b7784fc8baa7d623ee35"><div class="ttname"><a href="routing_8h.html#ae75d9f49c157b7784fc8baa7d623ee35">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>
|
|
<div class="ttc" id="routing_8h_html_a939aa2ef2afec0337b0f9d4dcb1c2db8"><div class="ttname"><a href="routing_8h.html#a939aa2ef2afec0337b0f9d4dcb1c2db8">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>
|
|
<div class="ttc" id="namespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in c...</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00093">constraint_solver.h:93</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a78f7f1cb8b08b7ec1d477a14447bd8d4"><div class="ttname"><a href="routing_8h.html#a78f7f1cb8b08b7ec1d477a14447bd8d4">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>
|
|
<div class="ttc" id="routing_8h_html_a71815ec83f6605bddb11578ebb835aae"><div class="ttname"><a href="routing_8h.html#a71815ec83f6605bddb11578ebb835aae">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#l01028">routing.h:1028</a></div></div>
|
|
<div class="ttc" id="structRoutingDimension_1_1NodePrecedence_html_a380315e16036075ab1d6fa7896f90a01"><div class="ttname"><a href="structRoutingDimension_1_1NodePrecedence.html#a380315e16036075ab1d6fa7896f90a01">RoutingDimension::NodePrecedence::second_node</a></div><div class="ttdeci">int64 second_node</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02241">routing.h:2241</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aefff345740a5db07caea065ec14ec52f"><div class="ttname"><a href="routing_8h.html#aefff345740a5db07caea065ec14ec52f">GetNumberOfRejectsInFirstSolution</a></div><div class="ttdeci">int64 GetNumberOfRejectsInFirstSolution(const RoutingSearchParameters &search_parameters) const</div></div>
|
|
<div class="ttc" id="routing_8h_html_a5f32c22c620c811754ba7b6f977db864"><div class="ttname"><a href="routing_8h.html#a5f32c22c620c811754ba7b6f977db864">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#l01170">routing.h:1170</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_aa3d92ac74ce8d3e57551677e88e2c846"><div class="ttname"><a href="routing_8h.html#aa3d92ac74ce8d3e57551677e88e2c846">SetAmortizedCostFactorsOfAllVehicles</a></div><div class="ttdeci">quadratic_cost_factor_of_vehicle_ *[v] square of length of route v 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>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_aaa20225fc54638db1493c9ae0b2947f7"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#aaa20225fc54638db1493c9ae0b2947f7">DisjunctivePropagator::Tasks::is_preemptible</a></div><div class="ttdeci">std::vector< bool > is_preemptible</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01688">routing.h:1688</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a7a8e134df97e40d1fc498f7f985c33ec"><div class="ttname"><a href="routing_8h.html#a7a8e134df97e40d1fc498f7f985c33ec">GetVehicleClassIndexOfVehicle</a></div><div class="ttdeci">VehicleClassIndex GetVehicleClassIndexOfVehicle(int64 vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01130">routing.h:1130</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a24478803a7138d68852093b9c2743892"><div class="ttname"><a href="routing_8h.html#a24478803a7138d68852093b9c2743892">GetNumberOfVisitTypes</a></div><div class="ttdeci">int GetNumberOfVisitTypes() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00706">routing.h:706</a></div></div>
|
|
<div class="ttc" id="namespaceoperations__research_html_a114ea14886b902c9cf9b988c4ef12672"><div class="ttname"><a href="namespaceoperations__research.html#a114ea14886b902c9cf9b988c4ef12672">operations_research::RoutingIndexPairs</a></div><div class="ttdeci">std::vector< RoutingIndexPair > RoutingIndexPairs</div><div class="ttdef"><b>Definition:</b> <a href="routing__types_8h_source.html#l00045">routing_types.h:45</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a086605d9650ce3c576d8a9c45ce0b9fc"><div class="ttname"><a href="routing_8h.html#a086605d9650ce3c576d8a9c45ce0b9fc">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>
|
|
<div class="ttc" id="structSimpleBoundCosts_1_1BoundCost_html"><div class="ttname"><a href="structSimpleBoundCosts_1_1BoundCost.html">SimpleBoundCosts::BoundCost</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01972">routing.h:1972</a></div></div>
|
|
<div class="ttc" id="namespaceoperations__research_html_a2f03e5ed2f65164d62fc5f039441596d"><div class="ttname"><a href="namespaceoperations__research.html#a2f03e5ed2f65164d62fc5f039441596d">operations_research::model</a></div><div class="ttdeci">*RoutingModel model(manager)</div></div>
|
|
<div class="ttc" id="classoperations__research_1_1Solver_html_a0243986dd2db4b6e1bda331329ae529b"><div class="ttname"><a href="classoperations__research_1_1Solver.html#a0243986dd2db4b6e1bda331329ae529b">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#l00723">constraint_solver.h:723</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_ab1652af55e9d83490d9c59d35d991ce9"><div class="ttname"><a href="routing_8h.html#ab1652af55e9d83490d9c59d35d991ce9">GetTemporalRequiredTypeAlternativesOfType</a></div><div class="ttdeci">const std::vector< absl::flat_hash_set< int > > & GetTemporalRequiredTypeAlternativesOfType(int type) const</div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_aa686b73e8435b6c0052b4e545db897ed"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#aa686b73e8435b6c0052b4e545db897ed">DisjunctivePropagator::Tasks::end_max</a></div><div class="ttdeci">std::vector< int64 > end_max</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01687">routing.h:1687</a></div></div>
|
|
<div class="ttc" id="structRoutingDimension_1_1NodePrecedence_html"><div class="ttname"><a href="structRoutingDimension_1_1NodePrecedence.html">RoutingDimension::NodePrecedence</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02239">routing.h:2239</a></div></div>
|
|
<div class="ttc" id="namespaceoperations__research_html_a30af988d402f0f3d36640575ca87153c"><div class="ttname"><a href="namespaceoperations__research.html#a30af988d402f0f3d36640575ca87153c">operations_research::RoutingIndexPair</a></div><div class="ttdeci">std::pair< std::vector< int64 >, std::vector< int64 > > RoutingIndexPair</div><div class="ttdoc">NOTE(user): keep the "> >" for SWIG.</div><div class="ttdef"><b>Definition:</b> <a href="routing__types_8h_source.html#l00044">routing_types.h:44</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a56e06d63a6d3792ab5cd64e51724632b"><div class="ttname"><a href="routing_8h.html#a56e06d63a6d3792ab5cd64e51724632b">SolveFromAssignmentWithParameters</a></div><div class="ttdeci">const Assignment * SolveFromAssignmentWithParameters(const Assignment *assignment, const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)</div></div>
|
|
<div class="ttc" id="routing_8h_html_a56c3abe7b321f4caf06a0a5e72586cac"><div class="ttname"><a href="routing_8h.html#a56c3abe7b321f4caf06a0a5e72586cac">MakeSelfDependentDimensionFinalizer</a></div><div class="ttdeci">DecisionBuilder * MakeSelfDependentDimensionFinalizer(const RoutingDimension *dimension)</div><div class="ttdoc">MakeSelfDependentDimensionFinalizer is a finalizer for the slacks of a self-dependent dimension.</div></div>
|
|
<div class="ttc" id="routing_8h_html_a74e3de2ce73322e1860be0713c07c33e"><div class="ttname"><a href="routing_8h.html#a74e3de2ce73322e1860be0713c07c33e">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>
|
|
<div class="ttc" id="routing_8h_html_ae350d70cb713a6772283e3753f4f2f7a"><div class="ttname"><a href="routing_8h.html#ae350d70cb713a6772283e3753f4f2f7a">GetSameVehicleRequiredTypeAlternativesOfType</a></div><div class="ttdeci">const std::vector< absl::flat_hash_set< int > > & GetSameVehicleRequiredTypeAlternativesOfType(int type) const</div><div class="ttdoc">clang-format off Returns the sets of same-vehicle/temporal requirement alternatives for the given typ...</div></div>
|
|
<div class="ttc" id="routing_8h_html_a354dd8c252cf59b748602b342db6019d"><div class="ttname"><a href="routing_8h.html#a354dd8c252cf59b748602b342db6019d">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#l01190">routing.h:1190</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a6569b0ea25fa25c91c2b8b63bedeacc6"><div class="ttname"><a href="routing_8h.html#a6569b0ea25fa25c91c2b8b63bedeacc6">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>
|
|
<div class="ttc" id="routing_8h_html_a437ae499bef0aa64f2753166a000f5bd"><div class="ttname"><a href="routing_8h.html#a437ae499bef0aa64f2753166a000f5bd">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>
|
|
<div class="ttc" id="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry_html_a27394b3588b9d4b2dfd663669772d698"><div class="ttname"><a href="structSavingsFilteredDecisionBuilder_1_1VehicleClassEntry.html#a27394b3588b9d4b2dfd663669772d698">SavingsFilteredDecisionBuilder::VehicleClassEntry::fixed_cost</a></div><div class="ttdeci">int64 fixed_cost</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02978">routing.h:2978</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a50ba9dd11704e0be7edaa9e9f24142ff"><div class="ttname"><a href="routing_8h.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a></div><div class="ttdeci">friend class RoutingDimension</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01655">routing.h:1655</a></div></div>
|
|
<div class="ttc" id="routing_8h_html_a0f8c7a97b5465ae4ba4cb1a92c39b756"><div class="ttname"><a href="routing_8h.html#a0f8c7a97b5465ae4ba4cb1a92c39b756">GetSameVehicleIndicesOfIndex</a></div><div class="ttdeci">const std::vector< int > & GetSameVehicleIndicesOfIndex(int node) const</div><div class="ttdoc">Returns variable indices of nodes constrained to be on the same route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01137">routing.h:1137</a></div></div>
|
|
<div class="ttc" id="structDisjunctivePropagator_1_1Tasks_html_ad83f5b65e161e0c33b47c44ebe7a5486"><div class="ttname"><a href="structDisjunctivePropagator_1_1Tasks.html#ad83f5b65e161e0c33b47c44ebe7a5486">DisjunctivePropagator::Tasks::start_max</a></div><div class="ttdeci">std::vector< int64 > start_max</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01683">routing.h:1683</a></div></div>
|
|
<div class="ttc" id="routing__parameters_8pb_8h_html"><div class="ttname"><a href="routing__parameters_8pb_8h.html">routing_parameters.pb.h</a></div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
</div>
|
|
<div id="footer-container">
|
|
<div id="footer">
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|