Google OR-Tools v9.15
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
pywrapcp.py
Go to the documentation of this file.
1# This file was automatically generated by SWIG (https://www.swig.org).
2# Version 4.4.0
3#
4# Do not make changes to this file unless you know what you are doing - modify
5# the SWIG interface file instead.
6
7from sys import version_info as _swig_python_version_info
8# Import the low-level C/C++ module
9if getattr(globals().get("__spec__"), "parent", None) or __package__ or "." in __name__:
10 from . import _pywrapcp
11else:
12 import _pywrapcp
13
14try:
15 import builtins as __builtin__
16except ImportError:
17 import __builtin__
18
19def _swig_repr(self):
20 try:
21 strthis = "proxy of " + self.this.__repr__()
22 except __builtin__.Exception:
23 strthis = ""
24 return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
25
26
28 def set_instance_attr(self, name, value):
29 if name == "this":
30 set(self, name, value)
31 elif name == "thisown":
32 self.this.own(value)
33 elif hasattr(self, name) and isinstance(getattr(type(self), name), property):
34 set(self, name, value)
35 else:
36 raise AttributeError("You cannot add instance attributes to %s" % self)
37 return set_instance_attr
38
39
41 def set_class_attr(cls, name, value):
42 if hasattr(cls, name) and not isinstance(getattr(cls, name), property):
43 set(cls, name, value)
44 else:
45 raise AttributeError("You cannot add class attributes to %s" % cls)
46 return set_class_attr
47
48
49def _swig_add_metaclass(metaclass):
50 """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
51 def wrapper(cls):
52 return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
53 return wrapper
54
55
57 """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
58 __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)
59
60
61import weakref
62
64 r"""
65 This struct holds all parameters for the default search.
66 DefaultPhaseParameters is only used by Solver::MakeDefaultPhase
67 methods. Note this is for advanced users only.
68 """
69
70 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
71 __repr__ = _swig_repr
72 CHOOSE_MAX_SUM_IMPACT = _pywrapcp.DefaultPhaseParameters_CHOOSE_MAX_SUM_IMPACT
73 CHOOSE_MAX_AVERAGE_IMPACT = _pywrapcp.DefaultPhaseParameters_CHOOSE_MAX_AVERAGE_IMPACT
74 CHOOSE_MAX_VALUE_IMPACT = _pywrapcp.DefaultPhaseParameters_CHOOSE_MAX_VALUE_IMPACT
75 SELECT_MIN_IMPACT = _pywrapcp.DefaultPhaseParameters_SELECT_MIN_IMPACT
76 SELECT_MAX_IMPACT = _pywrapcp.DefaultPhaseParameters_SELECT_MAX_IMPACT
77 NONE = _pywrapcp.DefaultPhaseParameters_NONE
78 NORMAL = _pywrapcp.DefaultPhaseParameters_NORMAL
79 VERBOSE = _pywrapcp.DefaultPhaseParameters_VERBOSE
80 var_selection_schema = property(_pywrapcp.DefaultPhaseParameters_var_selection_schema_get, _pywrapcp.DefaultPhaseParameters_var_selection_schema_set, doc=r"""
81 This parameter describes how the next variable to instantiate
82 will be chosen.
83 """)
84 value_selection_schema = property(_pywrapcp.DefaultPhaseParameters_value_selection_schema_get, _pywrapcp.DefaultPhaseParameters_value_selection_schema_set, doc=r"""This parameter describes which value to select for a given var.""")
85 initialization_splits = property(_pywrapcp.DefaultPhaseParameters_initialization_splits_get, _pywrapcp.DefaultPhaseParameters_initialization_splits_set, doc=r"""
86 Maximum number of intervals that the initialization of impacts will scan
87 per variable.
88 """)
89 run_all_heuristics = property(_pywrapcp.DefaultPhaseParameters_run_all_heuristics_get, _pywrapcp.DefaultPhaseParameters_run_all_heuristics_set, doc=r"""
90 The default phase will run heuristics periodically. This parameter
91 indicates if we should run all heuristics, or a randomly selected
92 one.
93 """)
94 heuristic_period = property(_pywrapcp.DefaultPhaseParameters_heuristic_period_get, _pywrapcp.DefaultPhaseParameters_heuristic_period_set, doc=r"""
95 The distance in nodes between each run of the heuristics. A
96 negative or null value will mean that we will not run heuristics
97 at all.
98 """)
99 heuristic_num_failures_limit = property(_pywrapcp.DefaultPhaseParameters_heuristic_num_failures_limit_get, _pywrapcp.DefaultPhaseParameters_heuristic_num_failures_limit_set, doc=r"""The failure limit for each heuristic that we run.""")
100 persistent_impact = property(_pywrapcp.DefaultPhaseParameters_persistent_impact_get, _pywrapcp.DefaultPhaseParameters_persistent_impact_set, doc=r"""
101 Whether to keep the impact from the first search for other searches,
102 or to recompute the impact for each new search.
103 """)
104 random_seed = property(_pywrapcp.DefaultPhaseParameters_random_seed_get, _pywrapcp.DefaultPhaseParameters_random_seed_set, doc=r"""Seed used to initialize the random part in some heuristics.""")
105 display_level = property(_pywrapcp.DefaultPhaseParameters_display_level_get, _pywrapcp.DefaultPhaseParameters_display_level_set, doc=r"""
106 This represents the amount of information displayed by the default search.
107 NONE means no display, VERBOSE means extra information.
108 """)
109 decision_builder = property(_pywrapcp.DefaultPhaseParameters_decision_builder_get, _pywrapcp.DefaultPhaseParameters_decision_builder_set, doc=r"""When defined, this overrides the default impact based decision builder.""")
110
111 def __init__(self):
112 _pywrapcp.DefaultPhaseParameters_swiginit(self, _pywrapcp.new_DefaultPhaseParameters())
113 __swig_destroy__ = _pywrapcp.delete_DefaultPhaseParameters
114
115# Register DefaultPhaseParameters in _pywrapcp:
116_pywrapcp.DefaultPhaseParameters_swigregister(DefaultPhaseParameters)
117class Solver(object):
118 r"""
119 Solver Class.
120 A solver represents the main computation engine. It implements the
121 entire range of Constraint Programming protocols:
122 - Reversibility
123 - Propagation
124 - Search
125
126 Usually, Constraint Programming code consists of
127 - the creation of the Solver,
128 - the creation of the decision variables of the model,
129 - the creation of the constraints of the model and their addition to the
130 solver() through the AddConstraint() method,
131 - the creation of the main DecisionBuilder class,
132 - the launch of the solve() method with the decision builder.
133
134 For the time being, Solver is neither MT_SAFE nor MT_HOT.
135 """
136
137 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
138 __repr__ = _swig_repr
139 INT_VAR_DEFAULT = _pywrapcp.Solver_INT_VAR_DEFAULT
140 r"""The default behavior is CHOOSE_FIRST_UNBOUND."""
141 INT_VAR_SIMPLE = _pywrapcp.Solver_INT_VAR_SIMPLE
142 r"""The simple selection is CHOOSE_FIRST_UNBOUND."""
143 CHOOSE_FIRST_UNBOUND = _pywrapcp.Solver_CHOOSE_FIRST_UNBOUND
144 r"""
145 Select the first unbound variable.
146 Variables are considered in the order of the vector of IntVars used
147 to create the selector.
148 """
149 CHOOSE_RANDOM = _pywrapcp.Solver_CHOOSE_RANDOM
150 r"""Randomly select one of the remaining unbound variables."""
151 CHOOSE_MIN_SIZE_LOWEST_MIN = _pywrapcp.Solver_CHOOSE_MIN_SIZE_LOWEST_MIN
152 r"""
153 Among unbound variables, select the variable with the smallest size,
154 i.e., the smallest number of possible values.
155 In case of a tie, the selected variables is the one with the lowest min
156 value.
157 In case of a tie, the first one is selected, first being defined by the
158 order in the vector of IntVars used to create the selector.
159 """
160 CHOOSE_MIN_SIZE_HIGHEST_MIN = _pywrapcp.Solver_CHOOSE_MIN_SIZE_HIGHEST_MIN
161 r"""
162 Among unbound variables, select the variable with the smallest size,
163 i.e., the smallest number of possible values.
164 In case of a tie, the selected variable is the one with the highest min
165 value.
166 In case of a tie, the first one is selected, first being defined by the
167 order in the vector of IntVars used to create the selector.
168 """
169 CHOOSE_MIN_SIZE_LOWEST_MAX = _pywrapcp.Solver_CHOOSE_MIN_SIZE_LOWEST_MAX
170 r"""
171 Among unbound variables, select the variable with the smallest size,
172 i.e., the smallest number of possible values.
173 In case of a tie, the selected variables is the one with the lowest max
174 value.
175 In case of a tie, the first one is selected, first being defined by the
176 order in the vector of IntVars used to create the selector.
177 """
178 CHOOSE_MIN_SIZE_HIGHEST_MAX = _pywrapcp.Solver_CHOOSE_MIN_SIZE_HIGHEST_MAX
179 r"""
180 Among unbound variables, select the variable with the smallest size,
181 i.e., the smallest number of possible values.
182 In case of a tie, the selected variable is the one with the highest max
183 value.
184 In case of a tie, the first one is selected, first being defined by the
185 order in the vector of IntVars used to create the selector.
186 """
187 CHOOSE_LOWEST_MIN = _pywrapcp.Solver_CHOOSE_LOWEST_MIN
188 r"""
189 Among unbound variables, select the variable with the smallest minimal
190 value.
191 In case of a tie, the first one is selected, "first" defined by the
192 order in the vector of IntVars used to create the selector.
193 """
194 CHOOSE_HIGHEST_MAX = _pywrapcp.Solver_CHOOSE_HIGHEST_MAX
195 r"""
196 Among unbound variables, select the variable with the highest maximal
197 value.
198 In case of a tie, the first one is selected, first being defined by the
199 order in the vector of IntVars used to create the selector.
200 """
201 CHOOSE_MIN_SIZE = _pywrapcp.Solver_CHOOSE_MIN_SIZE
202 r"""
203 Among unbound variables, select the variable with the smallest size.
204 In case of a tie, the first one is selected, first being defined by the
205 order in the vector of IntVars used to create the selector.
206 """
207 CHOOSE_MAX_SIZE = _pywrapcp.Solver_CHOOSE_MAX_SIZE
208 r"""
209 Among unbound variables, select the variable with the highest size.
210 In case of a tie, the first one is selected, first being defined by the
211 order in the vector of IntVars used to create the selector.
212 """
213 CHOOSE_MAX_REGRET_ON_MIN = _pywrapcp.Solver_CHOOSE_MAX_REGRET_ON_MIN
214 r"""
215 Among unbound variables, select the variable with the largest
216 gap between the first and the second values of the domain.
217 """
218 CHOOSE_PATH = _pywrapcp.Solver_CHOOSE_PATH
219 r"""
220 Selects the next unbound variable on a path, the path being defined by
221 the variables: var[i] corresponds to the index of the next of i.
222 """
223 INT_VALUE_DEFAULT = _pywrapcp.Solver_INT_VALUE_DEFAULT
224 r"""The default behavior is ASSIGN_MIN_VALUE."""
225 INT_VALUE_SIMPLE = _pywrapcp.Solver_INT_VALUE_SIMPLE
226 r"""The simple selection is ASSIGN_MIN_VALUE."""
227 ASSIGN_MIN_VALUE = _pywrapcp.Solver_ASSIGN_MIN_VALUE
228 r"""Selects the min value of the selected variable."""
229 ASSIGN_MAX_VALUE = _pywrapcp.Solver_ASSIGN_MAX_VALUE
230 r"""Selects the max value of the selected variable."""
231 ASSIGN_RANDOM_VALUE = _pywrapcp.Solver_ASSIGN_RANDOM_VALUE
232 r"""Selects randomly one of the possible values of the selected variable."""
233 ASSIGN_CENTER_VALUE = _pywrapcp.Solver_ASSIGN_CENTER_VALUE
234 r"""
235 Selects the first possible value which is the closest to the center
236 of the domain of the selected variable.
237 The center is defined as (min + max) / 2.
238 """
239 SPLIT_LOWER_HALF = _pywrapcp.Solver_SPLIT_LOWER_HALF
240 r"""
241 Split the domain in two around the center, and choose the lower
242 part first.
243 """
244 SPLIT_UPPER_HALF = _pywrapcp.Solver_SPLIT_UPPER_HALF
245 r"""
246 Split the domain in two around the center, and choose the lower
247 part first.
248 """
249 SEQUENCE_DEFAULT = _pywrapcp.Solver_SEQUENCE_DEFAULT
250 SEQUENCE_SIMPLE = _pywrapcp.Solver_SEQUENCE_SIMPLE
251 CHOOSE_MIN_SLACK_RANK_FORWARD = _pywrapcp.Solver_CHOOSE_MIN_SLACK_RANK_FORWARD
252 CHOOSE_RANDOM_RANK_FORWARD = _pywrapcp.Solver_CHOOSE_RANDOM_RANK_FORWARD
253 INTERVAL_DEFAULT = _pywrapcp.Solver_INTERVAL_DEFAULT
254 r"""The default is INTERVAL_SET_TIMES_FORWARD."""
255 INTERVAL_SIMPLE = _pywrapcp.Solver_INTERVAL_SIMPLE
256 r"""The simple is INTERVAL_SET_TIMES_FORWARD."""
257 INTERVAL_SET_TIMES_FORWARD = _pywrapcp.Solver_INTERVAL_SET_TIMES_FORWARD
258 r"""
259 Selects the variable with the lowest starting time of all variables,
260 and fixes its starting time to this lowest value.
261 """
262 INTERVAL_SET_TIMES_BACKWARD = _pywrapcp.Solver_INTERVAL_SET_TIMES_BACKWARD
263 r"""
264 Selects the variable with the highest ending time of all variables,
265 and fixes the ending time to this highest values.
266 """
267 TWOOPT = _pywrapcp.Solver_TWOOPT
268 r"""
269 Operator which reverses a sub-chain of a path. It is called TwoOpt
270 because it breaks two arcs on the path; resulting paths are called
271 two-optimal.
272 Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5
273 (where (1, 5) are first and last nodes of the path and can therefore not
274 be moved):
275
276 .. code-block:: c++
277
278 1 -> [3 -> 2] -> 4 -> 5
279 1 -> [4 -> 3 -> 2] -> 5
280 1 -> 2 -> [4 -> 3] -> 5
281 """
282 OROPT = _pywrapcp.Solver_OROPT
283 r"""
284 Relocate: OROPT and RELOCATE.
285 Operator which moves a sub-chain of a path to another position; the
286 specified chain length is the fixed length of the chains being moved.
287 When this length is 1, the operator simply moves a node to another
288 position.
289 Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5, for a chain
290 length of 2 (where (1, 5) are first and last nodes of the path and can
291 therefore not be moved):
292
293 .. code-block:: c++
294
295 1 -> 4 -> [2 -> 3] -> 5
296 1 -> [3 -> 4] -> 2 -> 5
297 Using Relocate with chain lengths of 1, 2 and 3 together is equivalent
298 to the OrOpt operator on a path. The OrOpt operator is a limited
299 version of 3Opt (breaks 3 arcs on a path).
300 """
301 RELOCATE = _pywrapcp.Solver_RELOCATE
302 r"""Relocate neighborhood with length of 1 (see OROPT comment)."""
303 EXCHANGE = _pywrapcp.Solver_EXCHANGE
304 r"""
305 Operator which exchanges the positions of two nodes.
306 Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5
307 (where (1, 5) are first and last nodes of the path and can therefore not
308 be moved):
309
310 .. code-block:: c++
311
312 1 -> [3] -> [2] -> 4 -> 5
313 1 -> [4] -> 3 -> [2] -> 5
314 1 -> 2 -> [4] -> [3] -> 5
315 """
316 CROSS = _pywrapcp.Solver_CROSS
317 r"""
318 Operator which cross exchanges the starting chains of 2 paths, including
319 exchanging the whole paths.
320 First and last nodes are not moved.
321 Possible neighbors for the paths 1 -> 2 -> 3 -> 4 -> 5 and 6 -> 7 -> 8
322 (where (1, 5) and (6, 8) are first and last nodes of the paths and can
323 therefore not be moved):
324
325 .. code-block:: c++
326
327 1 -> [7] -> 3 -> 4 -> 5 6 -> [2] -> 8
328 1 -> [7] -> 4 -> 5 6 -> [2 -> 3] -> 8
329 1 -> [7] -> 5 6 -> [2 -> 3 -> 4] -> 8
330 """
331 MAKEACTIVE = _pywrapcp.Solver_MAKEACTIVE
332 r"""
333 Operator which inserts an inactive node into a path.
334 Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
335 (where 1 and 4 are first and last nodes of the path) are:
336
337 .. code-block:: c++
338
339 1 -> [5] -> 2 -> 3 -> 4
340 1 -> 2 -> [5] -> 3 -> 4
341 1 -> 2 -> 3 -> [5] -> 4
342 """
343 MAKEINACTIVE = _pywrapcp.Solver_MAKEINACTIVE
344 r"""
345 Operator which makes path nodes inactive.
346 Possible neighbors for the path 1 -> 2 -> 3 -> 4 (where 1 and 4 are
347 first and last nodes of the path) are:
348
349 .. code-block:: c++
350
351 1 -> 3 -> 4 with 2 inactive
352 1 -> 2 -> 4 with 3 inactive
353 """
354 MAKECHAININACTIVE = _pywrapcp.Solver_MAKECHAININACTIVE
355 r"""
356 Operator which makes a "chain" of path nodes inactive.
357 Possible neighbors for the path 1 -> 2 -> 3 -> 4 (where 1 and 4 are
358 first and last nodes of the path) are:
359
360 .. code-block:: c++
361
362 1 -> 3 -> 4 with 2 inactive
363 1 -> 2 -> 4 with 3 inactive
364 1 -> 4 with 2 and 3 inactive
365 """
366 SWAPACTIVE = _pywrapcp.Solver_SWAPACTIVE
367 r"""
368 Operator which replaces an active node by an inactive one.
369 Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
370 (where 1 and 4 are first and last nodes of the path) are:
371
372 .. code-block:: c++
373
374 1 -> [5] -> 3 -> 4 with 2 inactive
375 1 -> 2 -> [5] -> 4 with 3 inactive
376 """
377 EXTENDEDSWAPACTIVE = _pywrapcp.Solver_EXTENDEDSWAPACTIVE
378 r"""
379 Operator which makes an inactive node active and an active one inactive.
380 It is similar to SwapActiveOperator except that it tries to insert the
381 inactive node in all possible positions instead of just the position of
382 the node made inactive.
383 Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
384 (where 1 and 4 are first and last nodes of the path) are:
385
386 .. code-block:: c++
387
388 1 -> [5] -> 3 -> 4 with 2 inactive
389 1 -> 3 -> [5] -> 4 with 2 inactive
390 1 -> [5] -> 2 -> 4 with 3 inactive
391 1 -> 2 -> [5] -> 4 with 3 inactive
392 """
393 PATHLNS = _pywrapcp.Solver_PATHLNS
394 r"""
395 Operator which relaxes two sub-chains of three consecutive arcs each.
396 Each sub-chain is defined by a start node and the next three arcs. Those
397 six arcs are relaxed to build a new neighbor.
398 PATHLNS explores all possible pairs of starting nodes and so defines
399 n^2 neighbors, n being the number of nodes.
400 Note that the two sub-chains can be part of the same path; they even may
401 overlap.
402 """
403 FULLPATHLNS = _pywrapcp.Solver_FULLPATHLNS
404 r"""
405 Operator which relaxes one entire path and all inactive nodes, thus
406 defining num_paths neighbors.
407 """
408 UNACTIVELNS = _pywrapcp.Solver_UNACTIVELNS
409 r"""
410 Operator which relaxes all inactive nodes and one sub-chain of six
411 consecutive arcs. That way the path can be improved by inserting
412 inactive nodes or swapping arcs.
413 """
414 INCREMENT = _pywrapcp.Solver_INCREMENT
415 r"""
416 Operator which defines one neighbor per variable. Each neighbor tries to
417 increment by one the value of the corresponding variable. When a new
418 solution is found the neighborhood is rebuilt from scratch, i.e., tries
419 to increment values in the variable order.
420 Consider for instance variables x and y. x is incremented one by one to
421 its max, and when it is not possible to increment x anymore, y is
422 incremented once. If this is a solution, then next neighbor tries to
423 increment x.
424 """
425 DECREMENT = _pywrapcp.Solver_DECREMENT
426 r"""
427 Operator which defines a neighborhood to decrement values.
428 The behavior is the same as INCREMENT, except values are decremented
429 instead of incremented.
430 """
431 SIMPLELNS = _pywrapcp.Solver_SIMPLELNS
432 r"""
433 Operator which defines one neighbor per variable. Each neighbor relaxes
434 one variable.
435 When a new solution is found the neighborhood is rebuilt from scratch.
436 Consider for instance variables x and y. First x is relaxed and the
437 solver is looking for the best possible solution (with only x relaxed).
438 Then y is relaxed, and the solver is looking for a new solution.
439 If a new solution is found, then the next variable to be relaxed is x.
440 """
441 GE = _pywrapcp.Solver_GE
442 r"""Move is accepted when the current objective value >= objective.Min."""
443 LE = _pywrapcp.Solver_LE
444 r"""Move is accepted when the current objective value <= objective.Max."""
445 EQ = _pywrapcp.Solver_EQ
446 r"""
447 Move is accepted when the current objective value is in the interval
448 objective.Min .. objective.Max.
449 """
450 DELAYED_PRIORITY = _pywrapcp.Solver_DELAYED_PRIORITY
451 r"""
452 DELAYED_PRIORITY is the lowest priority: Demons will be processed after
453 VAR_PRIORITY and NORMAL_PRIORITY demons.
454 """
455 VAR_PRIORITY = _pywrapcp.Solver_VAR_PRIORITY
456 r"""VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY."""
457 NORMAL_PRIORITY = _pywrapcp.Solver_NORMAL_PRIORITY
458 r"""NORMAL_PRIORITY is the highest priority: Demons will be processed first."""
459
460 def __init__(self, *args):
461 r"""Solver API"""
462 _pywrapcp.Solver_swiginit(self, _pywrapcp.new_Solver(*args))
463
464 self.__python_constraints = []
465
466
467
468 __swig_destroy__ = _pywrapcp.delete_Solver
469
470 def Parameters(self):
471 r"""Stored Parameters."""
472 return _pywrapcp.Solver_Parameters(self)
473
474 @staticmethod
476 r"""Create a ConstraintSolverParameters proto with all the default values."""
477 return _pywrapcp.Solver_DefaultSolverParameters()
478
479 def AddConstraint(self, c):
480 r"""
481 Adds the constraint 'c' to the model.
482
483 After calling this method, and until there is a backtrack that undoes the
484 addition, any assignment of variables to values must satisfy the given
485 constraint in order to be considered feasible. There are two fairly
486 different use cases:
487
488 - the most common use case is modeling: the given constraint is really
489 part of the problem that the user is trying to solve. In this use case,
490 AddConstraint is called outside of search (i.e., with state() ==
491 OUTSIDE_SEARCH). Most users should only use AddConstraint in this
492 way. In this case, the constraint will belong to the model forever: it
493 cannot be removed by backtracking.
494
495 - a rarer use case is that 'c' is not a real constraint of the model. It
496 may be a constraint generated by a branching decision (a constraint whose
497 goal is to restrict the search space), a symmetry breaking constraint (a
498 constraint that does restrict the search space, but in a way that cannot
499 have an impact on the quality of the solutions in the subtree), or an
500 inferred constraint that, while having no semantic value to the model (it
501 does not restrict the set of solutions), is worth having because we
502 believe it may strengthen the propagation. In these cases, it happens
503 that the constraint is added during the search (i.e., with state() ==
504 IN_SEARCH or state() == IN_ROOT_NODE). When a constraint is
505 added during a search, it applies only to the subtree of the search tree
506 rooted at the current node, and will be automatically removed by
507 backtracking.
508
509 This method does not take ownership of the constraint. If the constraint
510 has been created by any factory method (Solver::MakeXXX), it will
511 automatically be deleted. However, power users who implement their own
512 constraints should do: solver.AddConstraint(solver.RevAlloc(new
513 MyConstraint(...));
514 """
515 return _pywrapcp.Solver_AddConstraint(self, c)
516
517 def Solve(self, *args):
518 r"""
519 Solves the problem using the given DecisionBuilder and returns true if a
520 solution was found and accepted.
521
522 These methods are the ones most users should use to search for a solution.
523 Note that the definition of 'solution' is subtle. A solution here is
524 defined as a leaf of the search tree with respect to the given decision
525 builder for which there is no failure. What this means is that, contrary
526 to intuition, a solution may not have all variables of the model bound.
527 It is the responsibility of the decision builder to keep returning
528 decisions until all variables are indeed bound. The most extreme
529 counterexample is calling Solve with a trivial decision builder whose
530 Next() method always returns nullptr. In this case, Solve immediately
531 returns 'true', since not assigning any variable to any value is a
532 solution, unless the root node propagation discovers that the model is
533 infeasible.
534
535 This function must be called either from outside of search,
536 or from within the Next() method of a decision builder.
537
538 Solve will terminate whenever any of the following event arise:
539 A search monitor asks the solver to terminate the search by calling
540 solver()->FinishCurrentSearch().
541 A solution is found that is accepted by all search monitors, and none of
542 the search monitors decides to search for another one.
543
544 Upon search termination, there will be a series of backtracks all the way
545 to the top level. This means that a user cannot expect to inspect the
546 solution by querying variables after a call to Solve(): all the
547 information will be lost. In order to do something with the solution, the
548 user must either:
549
550 Use a search monitor that can process such a leaf. See, in particular,
551 the SolutionCollector class.
552 Do not use Solve. Instead, use the more fine-grained approach using
553 methods NewSearch(...), NextSolution(), and EndSearch().
554
555 :type db: :py:class:`DecisionBuilder`
556 :param db: The decision builder that will generate the search tree.
557 :type monitors: std::vector< operations_research::SearchMonitor * >
558 :param monitors: A vector of search monitors that will be notified of
559 various events during the search. In their reaction to these events, such
560 monitors may influence the search.
561 """
562 return _pywrapcp.Solver_Solve(self, *args)
563
564 def NewSearch(self, *args):
565 r"""
566 Decomposed search.
567 The code for a top level search should look like
568 solver->NewSearch(db);
569 while (solver->NextSolution()) {
570 .. use the current solution
571 }
572 solver()->EndSearch();
573 """
574 return _pywrapcp.Solver_NewSearch(self, *args)
575
576 def NextSolution(self):
577 return _pywrapcp.Solver_NextSolution(self)
578
579 def RestartSearch(self):
580 return _pywrapcp.Solver_RestartSearch(self)
581
582 def EndSearch(self):
583 return _pywrapcp.Solver_EndSearch(self)
584
585 def SolveAndCommit(self, *args):
586 r"""
587 SolveAndCommit using a decision builder and up to three
588 search monitors, usually one for the objective, one for the limits
589 and one to collect solutions.
590
591 The difference between a SolveAndCommit() and a Solve() method
592 call is the fact that SolveAndCommit will not backtrack all
593 modifications at the end of the search. This method is only
594 usable during the Next() method of a decision builder.
595 """
596 return _pywrapcp.Solver_SolveAndCommit(self, *args)
597
598 def CheckAssignment(self, solution):
599 r"""Checks whether the given assignment satisfies all relevant constraints."""
600 return _pywrapcp.Solver_CheckAssignment(self, solution)
601
602 def CheckConstraint(self, ct):
603 r"""
604 Checks whether adding this constraint will lead to an immediate
605 failure. It will return false if the model is already inconsistent, or if
606 adding the constraint makes it inconsistent.
607 """
608 return _pywrapcp.Solver_CheckConstraint(self, ct)
609
610 def Fail(self):
611 r"""Abandon the current branch in the search tree. A backtrack will follow."""
612 return _pywrapcp.Solver_Fail(self)
613
614 @staticmethod
616 r"""Current memory usage in bytes"""
617 return _pywrapcp.Solver_MemoryUsage()
618
619 def WallTime(self):
620 r"""
621 Deprecated: Use Now() instead.
622 Time elapsed, in ms since the creation of the solver.
623 """
624 return _pywrapcp.Solver_WallTime(self)
625
626 def Branches(self):
627 r"""The number of branches explored since the creation of the solver."""
628 return _pywrapcp.Solver_Branches(self)
629
630 def Solutions(self):
631 r"""The number of solutions found since the start of the search."""
632 return _pywrapcp.Solver_Solutions(self)
633
634 def Failures(self):
635 r"""The number of failures encountered since the creation of the solver."""
636 return _pywrapcp.Solver_Failures(self)
637
639 r"""The number of accepted neighbors."""
640 return _pywrapcp.Solver_AcceptedNeighbors(self)
641
642 def Stamp(self):
643 r"""
644 The stamp indicates how many moves in the search tree we have performed.
645 It is useful to detect if we need to update same lazy structures.
646 """
647 return _pywrapcp.Solver_Stamp(self)
648
649 def FailStamp(self):
650 r"""The fail_stamp() is incremented after each backtrack."""
651 return _pywrapcp.Solver_FailStamp(self)
652
653 def IntVar(self, *args):
654 r"""
655 *Overload 1:*
656 MakeIntVar will create the best range based int var for the bounds given.
657
658 |
659
660 *Overload 2:*
661 MakeIntVar will create a variable with the given sparse domain.
662
663 |
664
665 *Overload 3:*
666 MakeIntVar will create a variable with the given sparse domain.
667
668 |
669
670 *Overload 4:*
671 MakeIntVar will create the best range based int var for the bounds given.
672
673 |
674
675 *Overload 5:*
676 MakeIntVar will create a variable with the given sparse domain.
677
678 |
679
680 *Overload 6:*
681 MakeIntVar will create a variable with the given sparse domain.
682 """
683 return _pywrapcp.Solver_IntVar(self, *args)
684
685 def BoolVar(self, *args):
686 r"""
687 *Overload 1:*
688 MakeBoolVar will create a variable with a {0, 1} domain.
689
690 |
691
692 *Overload 2:*
693 MakeBoolVar will create a variable with a {0, 1} domain.
694 """
695 return _pywrapcp.Solver_BoolVar(self, *args)
696
697 def IntConst(self, *args):
698 r"""
699 *Overload 1:*
700 IntConst will create a constant expression.
701
702 |
703
704 *Overload 2:*
705 IntConst will create a constant expression.
706 """
707 return _pywrapcp.Solver_IntConst(self, *args)
708
709 def Sum(self, vars):
710 r"""sum of all vars."""
711 return _pywrapcp.Solver_Sum(self, vars)
712
713 def ScalProd(self, *args):
714 r"""
715 *Overload 1:*
716 scalar product
717
718 |
719
720 *Overload 2:*
721 scalar product
722 """
723 return _pywrapcp.Solver_ScalProd(self, *args)
724
725 def MonotonicElement(self, values, increasing, index):
726 r"""
727 Function based element. The constraint takes ownership of the
728 callback. The callback must be monotonic. It must be able to
729 cope with any possible value in the domain of 'index'
730 (potentially negative ones too). Furtermore, monotonicity is not
731 checked. Thus giving a non-monotonic function, or specifying an
732 incorrect increasing parameter will result in undefined behavior.
733 """
734 return _pywrapcp.Solver_MonotonicElement(self, values, increasing, index)
735
736 def Element(self, *args):
737 r"""
738 *Overload 1:*
739 values[index]
740
741 |
742
743 *Overload 2:*
744 values[index]
745
746 |
747
748 *Overload 3:*
749 Function-based element. The constraint takes ownership of the
750 callback. The callback must be able to cope with any possible
751 value in the domain of 'index' (potentially negative ones too).
752
753 |
754
755 *Overload 4:*
756 2D version of function-based element expression, values(expr1, expr2).
757
758 |
759
760 *Overload 5:*
761 vars[expr]
762 """
763 return _pywrapcp.Solver_Element(self, *args)
764
765 def IndexExpression(self, vars, value):
766 r"""
767 Returns the expression expr such that vars[expr] == value.
768 It assumes that vars are all different.
769 """
770 return _pywrapcp.Solver_IndexExpression(self, vars, value)
771
772 def Min(self, *args):
773 r"""
774 *Overload 1:*
775 std::min(vars)
776
777 |
778
779 *Overload 2:*
780 std::min (left, right)
781
782 |
783
784 *Overload 3:*
785 std::min(expr, value)
786
787 |
788
789 *Overload 4:*
790 std::min(expr, value)
791 """
792 return _pywrapcp.Solver_Min(self, *args)
793
794 def Max(self, *args):
795 r"""
796 *Overload 1:*
797 std::max(vars)
798
799 |
800
801 *Overload 2:*
802 std::max(left, right)
803
804 |
805
806 *Overload 3:*
807 std::max(expr, value)
808
809 |
810
811 *Overload 4:*
812 std::max(expr, value)
813 """
814 return _pywrapcp.Solver_Max(self, *args)
815
816 def ConvexPiecewiseExpr(self, expr, early_cost, early_date, late_date, late_cost):
817 r"""Convex piecewise function."""
818 return _pywrapcp.Solver_ConvexPiecewiseExpr(self, expr, early_cost, early_date, late_date, late_cost)
819
820 def SemiContinuousExpr(self, expr, fixed_charge, step):
821 r"""
822 Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b)
823 a >= 0 and b >= 0
824 """
825 return _pywrapcp.Solver_SemiContinuousExpr(self, expr, fixed_charge, step)
826
827 def ConditionalExpression(self, condition, expr, unperformed_value):
828 r"""Conditional Expr condition ? expr : unperformed_value"""
829 return _pywrapcp.Solver_ConditionalExpression(self, condition, expr, unperformed_value)
830
831 def TrueConstraint(self):
832 r"""This constraint always succeeds."""
833 return _pywrapcp.Solver_TrueConstraint(self)
834
835 def FalseConstraint(self, *args):
836 r"""This constraint always fails."""
837 return _pywrapcp.Solver_FalseConstraint(self, *args)
838
839 def IsEqualCstCt(self, var, value, boolvar):
840 r"""boolvar == (var == value)"""
841 return _pywrapcp.Solver_IsEqualCstCt(self, var, value, boolvar)
842
843 def IsEqualCstVar(self, var, value):
844 r"""status var of (var == value)"""
845 return _pywrapcp.Solver_IsEqualCstVar(self, var, value)
846
847 def IsEqualCt(self, v1, v2, b):
848 r"""b == (v1 == v2)"""
849 return _pywrapcp.Solver_IsEqualCt(self, v1, v2, b)
850
851 def IsEqualVar(self, v1, v2):
852 r"""status var of (v1 == v2)"""
853 return _pywrapcp.Solver_IsEqualVar(self, v1, v2)
854
855 def IsDifferentCstCt(self, var, value, boolvar):
856 r"""boolvar == (var != value)"""
857 return _pywrapcp.Solver_IsDifferentCstCt(self, var, value, boolvar)
858
859 def IsDifferentCstVar(self, var, value):
860 r"""status var of (var != value)"""
861 return _pywrapcp.Solver_IsDifferentCstVar(self, var, value)
862
863 def IsDifferentVar(self, v1, v2):
864 r"""status var of (v1 != v2)"""
865 return _pywrapcp.Solver_IsDifferentVar(self, v1, v2)
866
867 def IsDifferentCt(self, v1, v2, b):
868 r"""b == (v1 != v2)"""
869 return _pywrapcp.Solver_IsDifferentCt(self, v1, v2, b)
870
871 def IsLessOrEqualCstCt(self, var, value, boolvar):
872 r"""boolvar == (var <= value)"""
873 return _pywrapcp.Solver_IsLessOrEqualCstCt(self, var, value, boolvar)
874
875 def IsLessOrEqualCstVar(self, var, value):
876 r"""status var of (var <= value)"""
877 return _pywrapcp.Solver_IsLessOrEqualCstVar(self, var, value)
878
879 def IsLessOrEqualVar(self, left, right):
880 r"""status var of (left <= right)"""
881 return _pywrapcp.Solver_IsLessOrEqualVar(self, left, right)
882
883 def IsLessOrEqualCt(self, left, right, b):
884 r"""b == (left <= right)"""
885 return _pywrapcp.Solver_IsLessOrEqualCt(self, left, right, b)
886
887 def IsGreaterOrEqualCstCt(self, var, value, boolvar):
888 r"""boolvar == (var >= value)"""
889 return _pywrapcp.Solver_IsGreaterOrEqualCstCt(self, var, value, boolvar)
890
891 def IsGreaterOrEqualCstVar(self, var, value):
892 r"""status var of (var >= value)"""
893 return _pywrapcp.Solver_IsGreaterOrEqualCstVar(self, var, value)
894
895 def IsGreaterOrEqualVar(self, left, right):
896 r"""status var of (left >= right)"""
897 return _pywrapcp.Solver_IsGreaterOrEqualVar(self, left, right)
898
899 def IsGreaterOrEqualCt(self, left, right, b):
900 r"""b == (left >= right)"""
901 return _pywrapcp.Solver_IsGreaterOrEqualCt(self, left, right, b)
902
903 def IsGreaterCstCt(self, v, c, b):
904 r"""b == (v > c)"""
905 return _pywrapcp.Solver_IsGreaterCstCt(self, v, c, b)
906
907 def IsGreaterCstVar(self, var, value):
908 r"""status var of (var > value)"""
909 return _pywrapcp.Solver_IsGreaterCstVar(self, var, value)
910
911 def IsGreaterVar(self, left, right):
912 r"""status var of (left > right)"""
913 return _pywrapcp.Solver_IsGreaterVar(self, left, right)
914
915 def IsGreaterCt(self, left, right, b):
916 r"""b == (left > right)"""
917 return _pywrapcp.Solver_IsGreaterCt(self, left, right, b)
918
919 def IsLessCstCt(self, v, c, b):
920 r"""b == (v < c)"""
921 return _pywrapcp.Solver_IsLessCstCt(self, v, c, b)
922
923 def IsLessCstVar(self, var, value):
924 r"""status var of (var < value)"""
925 return _pywrapcp.Solver_IsLessCstVar(self, var, value)
926
927 def IsLessVar(self, left, right):
928 r"""status var of (left < right)"""
929 return _pywrapcp.Solver_IsLessVar(self, left, right)
930
931 def IsLessCt(self, left, right, b):
932 r"""b == (left < right)"""
933 return _pywrapcp.Solver_IsLessCt(self, left, right, b)
934
935 def SumLessOrEqual(self, vars, cst):
936 r"""Variation on arrays."""
937 return _pywrapcp.Solver_SumLessOrEqual(self, vars, cst)
938
939 def SumGreaterOrEqual(self, vars, cst):
940 return _pywrapcp.Solver_SumGreaterOrEqual(self, vars, cst)
941
942 def SumEquality(self, *args):
943 return _pywrapcp.Solver_SumEquality(self, *args)
944
945 def ScalProdEquality(self, *args):
946 return _pywrapcp.Solver_ScalProdEquality(self, *args)
947
948 def ScalProdGreaterOrEqual(self, *args):
949 return _pywrapcp.Solver_ScalProdGreaterOrEqual(self, *args)
950
951 def ScalProdLessOrEqual(self, *args):
952 return _pywrapcp.Solver_ScalProdLessOrEqual(self, *args)
953
954 def MinEquality(self, vars, min_var):
955 return _pywrapcp.Solver_MinEquality(self, vars, min_var)
956
957 def MaxEquality(self, vars, max_var):
958 return _pywrapcp.Solver_MaxEquality(self, vars, max_var)
959
960 def ElementEquality(self, *args):
961 return _pywrapcp.Solver_ElementEquality(self, *args)
962
963 def AbsEquality(self, var, abs_var):
964 r"""Creates the constraint abs(var) == abs_var."""
965 return _pywrapcp.Solver_AbsEquality(self, var, abs_var)
966
967 def IndexOfConstraint(self, vars, index, target):
968 r"""
969 This constraint is a special case of the element constraint with
970 an array of integer variables, where the variables are all
971 different and the index variable is constrained such that
972 vars[index] == target.
973 """
974 return _pywrapcp.Solver_IndexOfConstraint(self, vars, index, target)
975
977 r"""
978 This method is a specialized case of the MakeConstraintDemon
979 method to call the InitiatePropagate of the constraint 'ct'.
980 """
981 return _pywrapcp.Solver_ConstraintInitialPropagateCallback(self, ct)
982
984 r"""
985 This method is a specialized case of the MakeConstraintDemon
986 method to call the InitiatePropagate of the constraint 'ct' with
987 low priority.
988 """
989 return _pywrapcp.Solver_DelayedConstraintInitialPropagateCallback(self, ct)
990
991 def ClosureDemon(self, closure):
992 r"""Creates a demon from a closure."""
993 return _pywrapcp.Solver_ClosureDemon(self, closure)
994
995 def BetweenCt(self, expr, l, u):
996 r"""(l <= expr <= u)"""
997 return _pywrapcp.Solver_BetweenCt(self, expr, l, u)
998
999 def IsBetweenCt(self, expr, l, u, b):
1000 r"""b == (l <= expr <= u)"""
1001 return _pywrapcp.Solver_IsBetweenCt(self, expr, l, u, b)
1002
1003 def IsBetweenVar(self, v, l, u):
1004 return _pywrapcp.Solver_IsBetweenVar(self, v, l, u)
1005
1006 def MemberCt(self, *args):
1007 r"""
1008 expr in set. Propagation is lazy, i.e. this constraint does not
1009 creates holes in the domain of the variable.
1010 """
1011 return _pywrapcp.Solver_MemberCt(self, *args)
1012
1013 def NotMemberCt(self, *args):
1014 r"""
1015 *Overload 1:*
1016 expr not in set.
1017
1018 |
1019
1020 *Overload 2:*
1021 expr should not be in the list of forbidden intervals [start[i]..end[i]].
1022
1023 |
1024
1025 *Overload 3:*
1026 expr should not be in the list of forbidden intervals [start[i]..end[i]].
1027 """
1028 return _pywrapcp.Solver_NotMemberCt(self, *args)
1029
1030 def IsMemberCt(self, *args):
1031 r"""boolvar == (expr in set)"""
1032 return _pywrapcp.Solver_IsMemberCt(self, *args)
1033
1034 def IsMemberVar(self, *args):
1035 return _pywrapcp.Solver_IsMemberVar(self, *args)
1036
1037 def Count(self, *args):
1038 r"""
1039 *Overload 1:*
1040 |{i | vars[i] == value}| == max_count
1041
1042 |
1043
1044 *Overload 2:*
1045 |{i | vars[i] == value}| == max_count
1046 """
1047 return _pywrapcp.Solver_Count(self, *args)
1048
1049 def Distribute(self, *args):
1050 r"""
1051 *Overload 1:*
1052 Aggregated version of count: |{i | v[i] == values[j]}| == cards[j]
1053
1054 |
1055
1056 *Overload 2:*
1057 Aggregated version of count: |{i | v[i] == values[j]}| == cards[j]
1058
1059 |
1060
1061 *Overload 3:*
1062 Aggregated version of count: |{i | v[i] == j}| == cards[j]
1063
1064 |
1065
1066 *Overload 4:*
1067 Aggregated version of count with bounded cardinalities:
1068 forall j in 0 .. card_size - 1: card_min <= |{i | v[i] == j}| <= card_max
1069
1070 |
1071
1072 *Overload 5:*
1073 Aggregated version of count with bounded cardinalities:
1074 forall j in 0 .. card_size - 1:
1075 card_min[j] <= |{i | v[i] == j}| <= card_max[j]
1076
1077 |
1078
1079 *Overload 6:*
1080 Aggregated version of count with bounded cardinalities:
1081 forall j in 0 .. card_size - 1:
1082 card_min[j] <= |{i | v[i] == j}| <= card_max[j]
1083
1084 |
1085
1086 *Overload 7:*
1087 Aggregated version of count with bounded cardinalities:
1088 forall j in 0 .. card_size - 1:
1089 card_min[j] <= |{i | v[i] == values[j]}| <= card_max[j]
1090
1091 |
1092
1093 *Overload 8:*
1094 Aggregated version of count with bounded cardinalities:
1095 forall j in 0 .. card_size - 1:
1096 card_min[j] <= |{i | v[i] == values[j]}| <= card_max[j]
1097 """
1098 return _pywrapcp.Solver_Distribute(self, *args)
1099
1100 def Deviation(self, vars, deviation_var, total_sum):
1101 r"""
1102 Deviation constraint:
1103 sum_i |n * vars[i] - total_sum| <= deviation_var and
1104 sum_i vars[i] == total_sum
1105 n = #vars
1106 """
1107 return _pywrapcp.Solver_Deviation(self, vars, deviation_var, total_sum)
1108
1109 def AllDifferent(self, *args):
1110 r"""
1111 *Overload 1:*
1112 All variables are pairwise different. This corresponds to the
1113 stronger version of the propagation algorithm.
1114
1115 |
1116
1117 *Overload 2:*
1118 All variables are pairwise different. If 'stronger_propagation'
1119 is true, stronger, and potentially slower propagation will
1120 occur. This API will be deprecated in the future.
1121 """
1122 return _pywrapcp.Solver_AllDifferent(self, *args)
1123
1124 def AllDifferentExcept(self, vars, escape_value):
1125 r"""
1126 All variables are pairwise different, unless they are assigned to
1127 the escape value.
1128 """
1129 return _pywrapcp.Solver_AllDifferentExcept(self, vars, escape_value)
1130
1131 def SortingConstraint(self, vars, sorted):
1132 r"""
1133 Creates a constraint binding the arrays of variables "vars" and
1134 "sorted_vars": sorted_vars[0] must be equal to the minimum of all
1135 variables in vars, and so on: the value of sorted_vars[i] must be
1136 equal to the i-th value of variables invars.
1137
1138 This constraint propagates in both directions: from "vars" to
1139 "sorted_vars" and vice-versa.
1140
1141 Behind the scenes, this constraint maintains that:
1142 - sorted is always increasing.
1143 - whatever the values of vars, there exists a permutation that
1144 injects its values into the sorted variables.
1145
1146 For more info, please have a look at:
1147 https://mpi-inf.mpg.de/~mehlhorn/ftp/Mehlhorn-Thiel.pdf
1148 """
1149 return _pywrapcp.Solver_SortingConstraint(self, vars, sorted)
1150
1151 def LexicalLess(self, left, right):
1152 r"""
1153 Creates a constraint that enforces that left is lexicographically less
1154 than right.
1155 """
1156 return _pywrapcp.Solver_LexicalLess(self, left, right)
1157
1158 def LexicalLessOrEqual(self, left, right):
1159 r"""
1160 Creates a constraint that enforces that left is lexicographically less
1161 than or equal to right.
1162 """
1163 return _pywrapcp.Solver_LexicalLessOrEqual(self, left, right)
1164
1165 def InversePermutationConstraint(self, left, right):
1166 r"""
1167 Creates a constraint that enforces that 'left' and 'right' both
1168 represent permutations of [0..left.size()-1], and that 'right' is
1169 the inverse permutation of 'left', i.e. for all i in
1170 [0..left.size()-1], right[left[i]] = i.
1171 """
1172 return _pywrapcp.Solver_InversePermutationConstraint(self, left, right)
1173
1174 def NullIntersect(self, first_vars, second_vars):
1175 r"""
1176 Creates a constraint that states that all variables in the first
1177 vector are different from all variables in the second
1178 group. Thus the set of values in the first vector does not
1179 intersect with the set of values in the second vector.
1180 """
1181 return _pywrapcp.Solver_NullIntersect(self, first_vars, second_vars)
1182
1183 def NullIntersectExcept(self, first_vars, second_vars, escape_value):
1184 r"""
1185 Creates a constraint that states that all variables in the first
1186 vector are different from all variables from the second group,
1187 unless they are assigned to the escape value. Thus the set of
1188 values in the first vector minus the escape value does not
1189 intersect with the set of values in the second vector.
1190 """
1191 return _pywrapcp.Solver_NullIntersectExcept(self, first_vars, second_vars, escape_value)
1192
1193 def Circuit(self, nexts):
1194 r"""Force the "nexts" variable to create a complete Hamiltonian path."""
1195 return _pywrapcp.Solver_Circuit(self, nexts)
1196
1197 def SubCircuit(self, nexts):
1198 r"""
1199 Force the "nexts" variable to create a complete Hamiltonian path
1200 for those that do not loop upon themselves.
1201 """
1202 return _pywrapcp.Solver_SubCircuit(self, nexts)
1203
1204 def DelayedPathCumul(self, nexts, active, cumuls, transits):
1205 r"""
1206 Delayed version of the same constraint: propagation on the nexts variables
1207 is delayed until all constraints have propagated.
1208 """
1209 return _pywrapcp.Solver_DelayedPathCumul(self, nexts, active, cumuls, transits)
1210
1211 def PathCumul(self, *args):
1212 r"""
1213 *Overload 1:*
1214 Creates a constraint which accumulates values along a path such that:
1215 cumuls[next[i]] = cumuls[i] + transits[i].
1216 Active variables indicate if the corresponding next variable is active;
1217 this could be useful to model unperformed nodes in a routing problem.
1218
1219 |
1220
1221 *Overload 2:*
1222 Creates a constraint which accumulates values along a path such that:
1223 cumuls[next[i]] = cumuls[i] + transit_evaluator(i, next[i]).
1224 Active variables indicate if the corresponding next variable is active;
1225 this could be useful to model unperformed nodes in a routing problem.
1226 Ownership of transit_evaluator is taken and it must be a repeatable
1227 callback.
1228
1229 |
1230
1231 *Overload 3:*
1232 Creates a constraint which accumulates values along a path such that:
1233 cumuls[next[i]] = cumuls[i] + transit_evaluator(i, next[i]) + slacks[i].
1234 Active variables indicate if the corresponding next variable is active;
1235 this could be useful to model unperformed nodes in a routing problem.
1236 Ownership of transit_evaluator is taken and it must be a repeatable
1237 callback.
1238 """
1239 return _pywrapcp.Solver_PathCumul(self, *args)
1240
1241 def AllowedAssignments(self, *args):
1242 r"""
1243 *Overload 1:*
1244 This method creates a constraint where the graph of the relation
1245 between the variables is given in extension. There are 'arity'
1246 variables involved in the relation and the graph is given by a
1247 integer tuple set.
1248
1249 |
1250
1251 *Overload 2:*
1252 Compatibility layer for Python API.
1253 """
1254 return _pywrapcp.Solver_AllowedAssignments(self, *args)
1255
1256 def TransitionConstraint(self, *args):
1257 r"""
1258 *Overload 1:*
1259 This constraint create a finite automaton that will check the
1260 sequence of variables vars. It uses a transition table called
1261 'transition_table'. Each transition is a triple
1262 (current_state, variable_value, new_state).
1263 The initial state is given, and the set of accepted states is decribed
1264 by 'final_states'. These states are hidden inside the constraint.
1265 Only the transitions (i.e. the variables) are visible.
1266
1267 |
1268
1269 *Overload 2:*
1270 This constraint create a finite automaton that will check the
1271 sequence of variables vars. It uses a transition table called
1272 'transition_table'. Each transition is a triple
1273 (current_state, variable_value, new_state).
1274 The initial state is given, and the set of accepted states is decribed
1275 by 'final_states'. These states are hidden inside the constraint.
1276 Only the transitions (i.e. the variables) are visible.
1277 """
1278 return _pywrapcp.Solver_TransitionConstraint(self, *args)
1279
1281 r"""
1282 This constraint states that all the boxes must not overlap.
1283 The coordinates of box i are:
1284 (x_vars[i], y_vars[i]),
1285 (x_vars[i], y_vars[i] + y_size[i]),
1286 (x_vars[i] + x_size[i], y_vars[i]),
1287 (x_vars[i] + x_size[i], y_vars[i] + y_size[i]).
1288 The sizes must be non-negative. Boxes with a zero dimension can be
1289 pushed like any box.
1290 """
1291 return _pywrapcp.Solver_NonOverlappingBoxesConstraint(self, *args)
1292
1293 def Pack(self, vars, number_of_bins):
1294 r"""
1295 This constraint packs all variables onto 'number_of_bins'
1296 variables. For any given variable, a value of 'number_of_bins'
1297 indicates that the variable is not assigned to any bin.
1298 Dimensions, i.e., cumulative constraints on this packing, can be
1299 added directly from the pack class.
1300 """
1301 return _pywrapcp.Solver_Pack(self, vars, number_of_bins)
1302
1304 r"""
1305 *Overload 1:*
1306 Creates an interval var with a fixed duration. The duration must
1307 be greater than 0. If optional is true, then the interval can be
1308 performed or unperformed. If optional is false, then the interval
1309 is always performed.
1310
1311 |
1312
1313 *Overload 2:*
1314 Creates a performed interval var with a fixed duration. The duration must
1315 be greater than 0.
1316
1317 |
1318
1319 *Overload 3:*
1320 Creates an interval var with a fixed duration, and performed_variable.
1321 The duration must be greater than 0.
1322 """
1323 return _pywrapcp.Solver_FixedDurationIntervalVar(self, *args)
1324
1325 def FixedInterval(self, start, duration, name):
1326 r"""Creates a fixed and performed interval."""
1327 return _pywrapcp.Solver_FixedInterval(self, start, duration, name)
1328
1329 def IntervalVar(self, start_min, start_max, duration_min, duration_max, end_min, end_max, optional, name):
1330 r"""
1331 Creates an interval var by specifying the bounds on start,
1332 duration, and end.
1333 """
1334 return _pywrapcp.Solver_IntervalVar(self, start_min, start_max, duration_min, duration_max, end_min, end_max, optional, name)
1335
1336 def MirrorInterval(self, interval_var):
1337 r"""
1338 Creates an interval var that is the mirror image of the given one, that
1339 is, the interval var obtained by reversing the axis.
1340 """
1341 return _pywrapcp.Solver_MirrorInterval(self, interval_var)
1342
1343 def FixedDurationStartSyncedOnStartIntervalVar(self, interval_var, duration, offset):
1344 r"""
1345 Creates an interval var with a fixed duration whose start is
1346 synchronized with the start of another interval, with a given
1347 offset. The performed status is also in sync with the performed
1348 status of the given interval variable.
1349 """
1350 return _pywrapcp.Solver_FixedDurationStartSyncedOnStartIntervalVar(self, interval_var, duration, offset)
1351
1352 def FixedDurationStartSyncedOnEndIntervalVar(self, interval_var, duration, offset):
1353 r"""
1354 Creates an interval var with a fixed duration whose start is
1355 synchronized with the end of another interval, with a given
1356 offset. The performed status is also in sync with the performed
1357 status of the given interval variable.
1358 """
1359 return _pywrapcp.Solver_FixedDurationStartSyncedOnEndIntervalVar(self, interval_var, duration, offset)
1360
1361 def FixedDurationEndSyncedOnStartIntervalVar(self, interval_var, duration, offset):
1362 r"""
1363 Creates an interval var with a fixed duration whose end is
1364 synchronized with the start of another interval, with a given
1365 offset. The performed status is also in sync with the performed
1366 status of the given interval variable.
1367 """
1368 return _pywrapcp.Solver_FixedDurationEndSyncedOnStartIntervalVar(self, interval_var, duration, offset)
1369
1370 def FixedDurationEndSyncedOnEndIntervalVar(self, interval_var, duration, offset):
1371 r"""
1372 Creates an interval var with a fixed duration whose end is
1373 synchronized with the end of another interval, with a given
1374 offset. The performed status is also in sync with the performed
1375 status of the given interval variable.
1376 """
1377 return _pywrapcp.Solver_FixedDurationEndSyncedOnEndIntervalVar(self, interval_var, duration, offset)
1378
1379 def IntervalRelaxedMin(self, interval_var):
1380 r"""
1381 Creates and returns an interval variable that wraps around the given one,
1382 relaxing the min start and end. Relaxing means making unbounded when
1383 optional. If the variable is non-optional, this method returns
1384 interval_var.
1385
1386 More precisely, such an interval variable behaves as follows:
1387 When the underlying must be performed, the returned interval variable
1388 behaves exactly as the underlying;
1389 When the underlying may or may not be performed, the returned interval
1390 variable behaves like the underlying, except that it is unbounded on
1391 the min side;
1392 When the underlying cannot be performed, the returned interval variable
1393 is of duration 0 and must be performed in an interval unbounded on
1394 both sides.
1395
1396 This is very useful to implement propagators that may only modify
1397 the start max or end max.
1398 """
1399 return _pywrapcp.Solver_IntervalRelaxedMin(self, interval_var)
1400
1401 def IntervalRelaxedMax(self, interval_var):
1402 r"""
1403 Creates and returns an interval variable that wraps around the given one,
1404 relaxing the max start and end. Relaxing means making unbounded when
1405 optional. If the variable is non optional, this method returns
1406 interval_var.
1407
1408 More precisely, such an interval variable behaves as follows:
1409 When the underlying must be performed, the returned interval variable
1410 behaves exactly as the underlying;
1411 When the underlying may or may not be performed, the returned interval
1412 variable behaves like the underlying, except that it is unbounded on
1413 the max side;
1414 When the underlying cannot be performed, the returned interval variable
1415 is of duration 0 and must be performed in an interval unbounded on
1416 both sides.
1417
1418 This is very useful for implementing propagators that may only modify
1419 the start min or end min.
1420 """
1421 return _pywrapcp.Solver_IntervalRelaxedMax(self, interval_var)
1422
1423 def TemporalDisjunction(self, *args):
1424 r"""
1425 *Overload 1:*
1426 This constraint implements a temporal disjunction between two
1427 interval vars t1 and t2. 'alt' indicates which alternative was
1428 chosen (alt == 0 is equivalent to t1 before t2).
1429
1430 |
1431
1432 *Overload 2:*
1433 This constraint implements a temporal disjunction between two
1434 interval vars.
1435 """
1436 return _pywrapcp.Solver_TemporalDisjunction(self, *args)
1437
1438 def DisjunctiveConstraint(self, intervals, name):
1439 r"""
1440 This constraint forces all interval vars into an non-overlapping
1441 sequence. Intervals with zero duration can be scheduled anywhere.
1442 """
1443 return _pywrapcp.Solver_DisjunctiveConstraint(self, intervals, name)
1444
1445 def Cumulative(self, *args):
1446 r"""
1447 *Overload 1:*
1448 This constraint forces that, for any integer t, the sum of the demands
1449 corresponding to an interval containing t does not exceed the given
1450 capacity.
1451
1452 Intervals and demands should be vectors of equal size.
1453
1454 Demands should only contain non-negative values. Zero values are
1455 supported, and the corresponding intervals are filtered out, as they
1456 neither impact nor are impacted by this constraint.
1457
1458 |
1459
1460 *Overload 2:*
1461 This constraint forces that, for any integer t, the sum of the demands
1462 corresponding to an interval containing t does not exceed the given
1463 capacity.
1464
1465 Intervals and demands should be vectors of equal size.
1466
1467 Demands should only contain non-negative values. Zero values are
1468 supported, and the corresponding intervals are filtered out, as they
1469 neither impact nor are impacted by this constraint.
1470
1471 |
1472
1473 *Overload 3:*
1474 This constraint forces that, for any integer t, the sum of the demands
1475 corresponding to an interval containing t does not exceed the given
1476 capacity.
1477
1478 Intervals and demands should be vectors of equal size.
1479
1480 Demands should only contain non-negative values. Zero values are
1481 supported, and the corresponding intervals are filtered out, as they
1482 neither impact nor are impacted by this constraint.
1483
1484 |
1485
1486 *Overload 4:*
1487 This constraint enforces that, for any integer t, the sum of the demands
1488 corresponding to an interval containing t does not exceed the given
1489 capacity.
1490
1491 Intervals and demands should be vectors of equal size.
1492
1493 Demands should only contain non-negative values. Zero values are
1494 supported, and the corresponding intervals are filtered out, as they
1495 neither impact nor are impacted by this constraint.
1496
1497 |
1498
1499 *Overload 5:*
1500 This constraint enforces that, for any integer t, the sum of demands
1501 corresponding to an interval containing t does not exceed the given
1502 capacity.
1503
1504 Intervals and demands should be vectors of equal size.
1505
1506 Demands should be positive.
1507
1508 |
1509
1510 *Overload 6:*
1511 This constraint enforces that, for any integer t, the sum of demands
1512 corresponding to an interval containing t does not exceed the given
1513 capacity.
1514
1515 Intervals and demands should be vectors of equal size.
1516
1517 Demands should be positive.
1518 """
1519 return _pywrapcp.Solver_Cumulative(self, *args)
1520
1521 def Cover(self, vars, target_var):
1522 r"""
1523 This constraint states that the target_var is the convex hull of
1524 the intervals. If none of the interval variables is performed,
1525 then the target var is unperformed too. Also, if the target
1526 variable is unperformed, then all the intervals variables are
1527 unperformed too.
1528 """
1529 return _pywrapcp.Solver_Cover(self, vars, target_var)
1530
1531 def Assignment(self, *args):
1532 r"""
1533 *Overload 1:*
1534 This method creates an empty assignment.
1535
1536 |
1537
1538 *Overload 2:*
1539 This method creates an assignment which is a copy of 'a'.
1540 """
1541 return _pywrapcp.Solver_Assignment(self, *args)
1542
1543 def FirstSolutionCollector(self, *args):
1544 r"""
1545 *Overload 1:*
1546 Collect the first solution of the search.
1547
1548 |
1549
1550 *Overload 2:*
1551 Collect the first solution of the search. The variables will need to
1552 be added later.
1553 """
1554 return _pywrapcp.Solver_FirstSolutionCollector(self, *args)
1555
1556 def LastSolutionCollector(self, *args):
1557 r"""
1558 *Overload 1:*
1559 Collect the last solution of the search.
1560
1561 |
1562
1563 *Overload 2:*
1564 Collect the last solution of the search. The variables will need to
1565 be added later.
1566 """
1567 return _pywrapcp.Solver_LastSolutionCollector(self, *args)
1568
1570 r"""
1571 *Overload 1:*
1572 Collect the solution corresponding to the optimal value of the objective
1573 of 'assignment'; if 'assignment' does not have an objective no solution is
1574 collected. This collector only collects one solution corresponding to the
1575 best objective value (the first one found).
1576
1577 |
1578
1579 *Overload 2:*
1580 Collect the solution corresponding to the optimal value of the
1581 objective of the internal assignment; if this assignment does not have an
1582 objective no solution is collected. This collector only collects one
1583 solution corresponding to the best objective value (the first one found).
1584 The variables and objective(s) will need to be added later.
1585 """
1586 return _pywrapcp.Solver_BestValueSolutionCollector(self, *args)
1587
1588 def AllSolutionCollector(self, *args):
1589 r"""
1590 *Overload 1:*
1591 Collect all solutions of the search.
1592
1593 |
1594
1595 *Overload 2:*
1596 Collect all solutions of the search. The variables will need to
1597 be added later.
1598 """
1599 return _pywrapcp.Solver_AllSolutionCollector(self, *args)
1600
1601 def Minimize(self, v, step):
1602 r"""Creates a minimization objective."""
1603 return _pywrapcp.Solver_Minimize(self, v, step)
1604
1605 def Maximize(self, v, step):
1606 r"""Creates a maximization objective."""
1607 return _pywrapcp.Solver_Maximize(self, v, step)
1608
1609 def Optimize(self, maximize, v, step):
1610 r"""Creates a objective with a given sense (true = maximization)."""
1611 return _pywrapcp.Solver_Optimize(self, maximize, v, step)
1612
1613 def WeightedMinimize(self, *args):
1614 r"""
1615 *Overload 1:*
1616 Creates a minimization weighted objective. The actual objective is
1617 scalar_prod(sub_objectives, weights).
1618
1619 |
1620
1621 *Overload 2:*
1622 Creates a minimization weighted objective. The actual objective is
1623 scalar_prod(sub_objectives, weights).
1624 """
1625 return _pywrapcp.Solver_WeightedMinimize(self, *args)
1626
1627 def WeightedMaximize(self, *args):
1628 r"""
1629 *Overload 1:*
1630 Creates a maximization weigthed objective.
1631
1632 |
1633
1634 *Overload 2:*
1635 Creates a maximization weigthed objective.
1636 """
1637 return _pywrapcp.Solver_WeightedMaximize(self, *args)
1638
1639 def WeightedOptimize(self, *args):
1640 r"""
1641 *Overload 1:*
1642 Creates a weighted objective with a given sense (true = maximization).
1643
1644 |
1645
1646 *Overload 2:*
1647 Creates a weighted objective with a given sense (true = maximization).
1648 """
1649 return _pywrapcp.Solver_WeightedOptimize(self, *args)
1650
1651 def TabuSearch(self, maximize, objective, step, vars, keep_tenure, forbid_tenure, tabu_factor):
1652 r"""
1653 MetaHeuristics which try to get the search out of local optima.
1654 Creates a Tabu Search monitor.
1655 In the context of local search the behavior is similar to MakeOptimize(),
1656 creating an objective in a given sense. The behavior differs once a local
1657 optimum is reached: thereafter solutions which degrade the value of the
1658 objective are allowed if they are not "tabu". A solution is "tabu" if it
1659 doesn't respect the following rules:
1660 - improving the best solution found so far
1661 - variables in the "keep" list must keep their value, variables in the
1662 "forbid" list must not take the value they have in the list.
1663 Variables with new values enter the tabu lists after each new solution
1664 found and leave the lists after a given number of iterations (called
1665 tenure). Only the variables passed to the method can enter the lists.
1666 The tabu criterion is softened by the tabu factor which gives the number
1667 of "tabu" violations which is tolerated; a factor of 1 means no violations
1668 allowed; a factor of 0 means all violations are allowed.
1669 """
1670 return _pywrapcp.Solver_TabuSearch(self, maximize, objective, step, vars, keep_tenure, forbid_tenure, tabu_factor)
1671
1672 def SimulatedAnnealing(self, maximize, v, step, initial_temperature):
1673 r"""Creates a Simulated Annealing monitor."""
1674 return _pywrapcp.Solver_SimulatedAnnealing(self, maximize, v, step, initial_temperature)
1675
1676 def LubyRestart(self, scale_factor):
1677 r"""
1678 This search monitor will restart the search periodically.
1679 At the iteration n, it will restart after scale_factor * Luby(n) failures
1680 where Luby is the Luby Strategy (i.e. 1 1 2 1 1 2 4 1 1 2 1 1 2 4 8...).
1681 """
1682 return _pywrapcp.Solver_LubyRestart(self, scale_factor)
1683
1684 def ConstantRestart(self, frequency):
1685 r"""
1686 This search monitor will restart the search periodically after 'frequency'
1687 failures.
1688 """
1689 return _pywrapcp.Solver_ConstantRestart(self, frequency)
1690
1691 def TimeLimit(self, *args):
1692 r"""Creates a search limit that constrains the running time."""
1693 return _pywrapcp.Solver_TimeLimit(self, *args)
1694
1695 def BranchesLimit(self, branches):
1696 r"""
1697 Creates a search limit that constrains the number of branches
1698 explored in the search tree.
1699 """
1700 return _pywrapcp.Solver_BranchesLimit(self, branches)
1701
1702 def FailuresLimit(self, failures):
1703 r"""
1704 Creates a search limit that constrains the number of failures
1705 that can happen when exploring the search tree.
1706 """
1707 return _pywrapcp.Solver_FailuresLimit(self, failures)
1708
1709 def SolutionsLimit(self, solutions):
1710 r"""
1711 Creates a search limit that constrains the number of solutions found
1712 during the search.
1713 """
1714 return _pywrapcp.Solver_SolutionsLimit(self, solutions)
1715
1716 def Limit(self, *args):
1717 r"""
1718 *Overload 1:*
1719 Limits the search with the 'time', 'branches', 'failures' and
1720 'solutions' limits. 'smart_time_check' reduces the calls to the wall
1721
1722 |
1723
1724 *Overload 2:*
1725 Creates a search limit from its protobuf description
1726
1727 |
1728
1729 *Overload 3:*
1730 Creates a search limit that is reached when either of the underlying limit
1731 is reached. That is, the returned limit is more stringent than both
1732 argument limits.
1733 """
1734 return _pywrapcp.Solver_Limit(self, *args)
1735
1736 def CustomLimit(self, limiter):
1737 r"""
1738 Callback-based search limit. Search stops when limiter returns true; if
1739 this happens at a leaf the corresponding solution will be rejected.
1740 """
1741 return _pywrapcp.Solver_CustomLimit(self, limiter)
1742
1743 def SearchLog(self, *args):
1744 r"""
1745 *Overload 1:*
1746 The SearchMonitors below will display a periodic search log
1747 on LOG(INFO) every branch_period branches explored.
1748
1749 |
1750
1751 *Overload 2:*
1752 At each solution, this monitor also display the var value.
1753
1754 |
1755
1756 *Overload 3:*
1757 At each solution, this monitor will also display result of
1758 ``display_callback``.
1759
1760 |
1761
1762 *Overload 4:*
1763 At each solution, this monitor will display the 'var' value and the
1764 result of ``display_callback``.
1765
1766 |
1767
1768 *Overload 5:*
1769 At each solution, this monitor will display the 'vars' values and the
1770 result of ``display_callback``.
1771
1772 |
1773
1774 *Overload 6:*
1775 OptimizeVar Search Logs
1776 At each solution, this monitor will also display the 'opt_var' value.
1777
1778 |
1779
1780 *Overload 7:*
1781 Creates a search monitor that will also print the result of the
1782 display callback.
1783 """
1784 return _pywrapcp.Solver_SearchLog(self, *args)
1785
1786 def SearchTrace(self, prefix):
1787 r"""
1788 Creates a search monitor that will trace precisely the behavior of the
1789 search. Use this only for low level debugging.
1790 """
1791 return _pywrapcp.Solver_SearchTrace(self, prefix)
1792
1794 r"""Prints the model."""
1795 return _pywrapcp.Solver_PrintModelVisitor(self)
1796
1798 r"""Displays some nice statistics on the model."""
1799 return _pywrapcp.Solver_StatisticsModelVisitor(self)
1800
1801 def AssignVariableValue(self, var, val):
1802 r"""Decisions."""
1803 return _pywrapcp.Solver_AssignVariableValue(self, var, val)
1804
1805 def VariableLessOrEqualValue(self, var, value):
1806 return _pywrapcp.Solver_VariableLessOrEqualValue(self, var, value)
1807
1808 def VariableGreaterOrEqualValue(self, var, value):
1809 return _pywrapcp.Solver_VariableGreaterOrEqualValue(self, var, value)
1810
1811 def SplitVariableDomain(self, var, val, start_with_lower_half):
1812 return _pywrapcp.Solver_SplitVariableDomain(self, var, val, start_with_lower_half)
1813
1814 def AssignVariableValueOrFail(self, var, value):
1815 return _pywrapcp.Solver_AssignVariableValueOrFail(self, var, value)
1816
1817 def AssignVariablesValues(self, vars, values):
1818 return _pywrapcp.Solver_AssignVariablesValues(self, vars, values)
1819
1820 def FailDecision(self):
1821 return _pywrapcp.Solver_FailDecision(self)
1822
1823 def Decision(self, apply, refute):
1824 return _pywrapcp.Solver_Decision(self, apply, refute)
1825
1826 def Compose(self, dbs):
1827 return _pywrapcp.Solver_Compose(self, dbs)
1828
1829 def Try(self, dbs):
1830 return _pywrapcp.Solver_Try(self, dbs)
1831
1832 def DefaultPhase(self, *args):
1833 return _pywrapcp.Solver_DefaultPhase(self, *args)
1834
1835 def ScheduleOrPostpone(self, var, est, marker):
1836 r"""
1837 Returns a decision that tries to schedule a task at a given time.
1838 On the Apply branch, it will set that interval var as performed and set
1839 its start to 'est'. On the Refute branch, it will just update the
1840 'marker' to 'est' + 1. This decision is used in the
1841 INTERVAL_SET_TIMES_FORWARD strategy.
1842 """
1843 return _pywrapcp.Solver_ScheduleOrPostpone(self, var, est, marker)
1844
1845 def ScheduleOrExpedite(self, var, est, marker):
1846 r"""
1847 Returns a decision that tries to schedule a task at a given time.
1848 On the Apply branch, it will set that interval var as performed and set
1849 its end to 'est'. On the Refute branch, it will just update the
1850 'marker' to 'est' - 1. This decision is used in the
1851 INTERVAL_SET_TIMES_BACKWARD strategy.
1852 """
1853 return _pywrapcp.Solver_ScheduleOrExpedite(self, var, est, marker)
1854
1855 def RankFirstInterval(self, sequence, index):
1856 r"""
1857 Returns a decision that tries to rank first the ith interval var
1858 in the sequence variable.
1859 """
1860 return _pywrapcp.Solver_RankFirstInterval(self, sequence, index)
1861
1862 def RankLastInterval(self, sequence, index):
1863 r"""
1864 Returns a decision that tries to rank last the ith interval var
1865 in the sequence variable.
1866 """
1867 return _pywrapcp.Solver_RankLastInterval(self, sequence, index)
1868
1869 def Phase(self, *args):
1870 r"""
1871 *Overload 1:*
1872 Phases on IntVar arrays.
1873 for all other functions that have several homonyms in this .h).
1874
1875 |
1876
1877 *Overload 2:*
1878 Scheduling phases.
1879 """
1880 return _pywrapcp.Solver_Phase(self, *args)
1881
1882 def DecisionBuilderFromAssignment(self, assignment, db, vars):
1883 r"""
1884 Returns a decision builder for which the left-most leaf corresponds
1885 to assignment, the rest of the tree being explored using 'db'.
1886 """
1887 return _pywrapcp.Solver_DecisionBuilderFromAssignment(self, assignment, db, vars)
1888
1889 def ConstraintAdder(self, ct):
1890 r"""
1891 Returns a decision builder that will add the given constraint to
1892 the model.
1893 """
1894 return _pywrapcp.Solver_ConstraintAdder(self, ct)
1895
1896 def SolveOnce(self, db, monitors):
1897 return _pywrapcp.Solver_SolveOnce(self, db, monitors)
1898
1899 def NestedOptimize(self, *args):
1900 r"""
1901 NestedOptimize will collapse a search tree described by a
1902 decision builder 'db' and a set of monitors and wrap it into a
1903 single point. If there are no solutions to this nested tree, then
1904 NestedOptimize will fail. If there are solutions, it will find
1905 the best as described by the mandatory objective in the solution
1906 as well as the optimization direction, instantiate all variables
1907 to this solution, and return nullptr.
1908 """
1909 return _pywrapcp.Solver_NestedOptimize(self, *args)
1910
1911 def RestoreAssignment(self, assignment):
1912 r"""
1913 Returns a DecisionBuilder which restores an Assignment
1914 (calls void Assignment::Restore())
1915 """
1916 return _pywrapcp.Solver_RestoreAssignment(self, assignment)
1917
1918 def StoreAssignment(self, assignment):
1919 r"""
1920 Returns a DecisionBuilder which stores an Assignment
1921 (calls void Assignment::Store())
1922 """
1923 return _pywrapcp.Solver_StoreAssignment(self, assignment)
1924
1925 def Operator(self, *args):
1926 r"""Local Search Operators."""
1927 return _pywrapcp.Solver_Operator(self, *args)
1928
1929 def RandomLnsOperator(self, *args):
1930 r"""
1931 Creates a large neighborhood search operator which creates fragments (set
1932 of relaxed variables) with up to number_of_variables random variables
1933 (sampling with replacement is performed meaning that at most
1934 number_of_variables variables are selected). Warning: this operator will
1935 always return neighbors; using it without a search limit will result in a
1936 non-ending search.
1937 Optionally a random seed can be specified.
1938 """
1939 return _pywrapcp.Solver_RandomLnsOperator(self, *args)
1940
1942 r"""
1943 *Overload 1:*
1944 Creates a local search operator that tries to move the assignment of some
1945 variables toward a target. The target is given as an Assignment. This
1946 operator generates neighbors in which the only difference compared to the
1947 current state is that one variable that belongs to the target assignment
1948 is set to its target value.
1949
1950 |
1951
1952 *Overload 2:*
1953 Creates a local search operator that tries to move the assignment of some
1954 variables toward a target. The target is given either as two vectors: a
1955 vector of variables and a vector of associated target values. The two
1956 vectors should be of the same length. This operator generates neighbors in
1957 which the only difference compared to the current state is that one
1958 variable that belongs to the given vector is set to its target value.
1959 """
1960 return _pywrapcp.Solver_MoveTowardTargetOperator(self, *args)
1961
1962 def ConcatenateOperators(self, *args):
1963 r"""
1964 Creates a local search operator which concatenates a vector of operators.
1965 Each operator from the vector is called sequentially. By default, when a
1966 neighbor is found the neighborhood exploration restarts from the last
1967 active operator (the one which produced the neighbor).
1968 This can be overridden by setting restart to true to force the exploration
1969 to start from the first operator in the vector.
1970
1971 The default behavior can also be overridden using an evaluation callback
1972 to set the order in which the operators are explored (the callback is
1973 called in LocalSearchOperator::Start()). The first argument of the
1974 callback is the index of the operator which produced the last move, the
1975 second argument is the index of the operator to be evaluated. Ownership of
1976 the callback is taken by ConcatenateOperators.
1977
1978 Example:
1979
1980 const int kPriorities = {10, 100, 10, 0};
1981 int64_t Evaluate(int active_operator, int current_operator) {
1982 return kPriorities[current_operator];
1983 }
1984
1985 LocalSearchOperator* concat =
1986 solver.ConcatenateOperators(operators,
1987 NewPermanentCallback(&Evaluate));
1988
1989 The elements of the vector operators will be sorted by increasing priority
1990 and explored in that order (tie-breaks are handled by keeping the relative
1991 operator order in the vector). This would result in the following order:
1992 operators[3], operators[0], operators[2], operators[1].
1993 """
1994 return _pywrapcp.Solver_ConcatenateOperators(self, *args)
1995
1997 r"""
1998 *Overload 1:*
1999 Randomized version of local search concatenator; calls a random operator
2000 at each call to MakeNextNeighbor().
2001
2002 |
2003
2004 *Overload 2:*
2005 Randomized version of local search concatenator; calls a random operator
2006 at each call to MakeNextNeighbor(). The provided seed is used to
2007 initialize the random number generator.
2008 """
2009 return _pywrapcp.Solver_RandomConcatenateOperators(self, *args)
2010
2011 def NeighborhoodLimit(self, op, limit):
2012 r"""
2013 Creates a local search operator that wraps another local search
2014 operator and limits the number of neighbors explored (i.e., calls
2015 to MakeNextNeighbor from the current solution (between two calls
2016 to Start()). When this limit is reached, MakeNextNeighbor()
2017 returns false. The counter is cleared when Start() is called.
2018 """
2019 return _pywrapcp.Solver_NeighborhoodLimit(self, op, limit)
2020
2021 def LocalSearchPhase(self, *args):
2022 r"""
2023 *Overload 1:*
2024 Local Search decision builders factories.
2025 Local search is used to improve a given solution. This initial solution
2026 can be specified either by an Assignment or by a DecisionBulder, and the
2027 corresponding variables, the initial solution being the first solution
2028 found by the DecisionBuilder.
2029 The LocalSearchPhaseParameters parameter holds the actual definition of
2030 the local search phase:
2031 - a local search operator used to explore the neighborhood of the current
2032 solution,
2033 - a decision builder to instantiate unbound variables once a neighbor has
2034 been defined; in the case of LNS-based operators instantiates fragment
2035 variables; search monitors can be added to this sub-search by wrapping
2036 the decision builder with MakeSolveOnce.
2037 - a search limit specifying how long local search looks for neighbors
2038 before accepting one; the last neighbor is always taken and in the case
2039 of a greedy search, this corresponds to the best local neighbor;
2040 first-accept (which is the default behavior) can be modeled using a
2041 solution found limit of 1,
2042 - a vector of local search filters used to speed up the search by pruning
2043 unfeasible neighbors.
2044 Metaheuristics can be added by defining specialized search monitors;
2045 currently down/up-hill climbing is available through OptimizeVar, as well
2046 as Guided Local Search, Tabu Search and Simulated Annealing.
2047
2048 |
2049
2050 *Overload 2:*
2051 Variant with a sub_decison_builder specific to the first solution.
2052 """
2053 return _pywrapcp.Solver_LocalSearchPhase(self, *args)
2054
2056 r"""Local Search Phase Parameters"""
2057 return _pywrapcp.Solver_LocalSearchPhaseParameters(self, *args)
2058
2060 r"""
2061 Returns a percentage representing the propress of the search before
2062 reaching the limits of the top-level search (can be called from a nested
2063 solve).
2064 """
2065 return _pywrapcp.Solver_TopProgressPercent(self)
2066
2067 def SearchDepth(self):
2068 r"""
2069 Gets the search depth of the current active search. Returns -1 if
2070 there is no active search opened.
2071 """
2072 return _pywrapcp.Solver_SearchDepth(self)
2073
2075 r"""
2076 Gets the search left depth of the current active search. Returns -1 if
2077 there is no active search opened.
2078 """
2079 return _pywrapcp.Solver_SearchLeftDepth(self)
2080
2081 def SolveDepth(self):
2082 r"""
2083 Gets the number of nested searches. It returns 0 outside search,
2084 1 during the top level search, 2 or more in case of nested searches.
2085 """
2086 return _pywrapcp.Solver_SolveDepth(self)
2087
2088 def Rand64(self, size):
2089 r"""Returns a random value between 0 and 'size' - 1;"""
2090 return _pywrapcp.Solver_Rand64(self, size)
2091
2092 def Rand32(self, size):
2093 r"""Returns a random value between 0 and 'size' - 1;"""
2094 return _pywrapcp.Solver_Rand32(self, size)
2095
2096 def ReSeed(self, seed):
2097 r"""Reseed the solver random generator."""
2098 return _pywrapcp.Solver_ReSeed(self, seed)
2099
2101 r"""Returns local search profiling information in a human readable format."""
2102 return _pywrapcp.Solver_LocalSearchProfile(self)
2103
2104 def Constraints(self):
2105 r"""
2106 Counts the number of constraints that have been added
2107 to the solver before the search.
2108 """
2109 return _pywrapcp.Solver_Constraints(self)
2110
2111 def Accept(self, visitor):
2112 r"""Accepts the given model visitor."""
2113 return _pywrapcp.Solver_Accept(self, visitor)
2114
2116 r"""Tells the solver to kill or restart the current search."""
2117 return _pywrapcp.Solver_FinishCurrentSearch(self)
2118
2120 return _pywrapcp.Solver_RestartCurrentSearch(self)
2121
2122 def ShouldFail(self):
2123 r"""
2124 These methods are only useful for the SWIG wrappers, which need a way
2125 to externally cause the Solver to fail.
2126 """
2127 return _pywrapcp.Solver_ShouldFail(self)
2128
2129 def __str__(self):
2130 return _pywrapcp.Solver___str__(self)
2131
2132 def Add(self, ct):
2133 if isinstance(ct, PyConstraint):
2134 self.__python_constraints.append(ct)
2135 self.AddConstraint(ct)
2136
2137
2138 def TreeNoCycle(self, nexts, active, callback=0):
2139 return _pywrapcp.Solver_TreeNoCycle(self, nexts, active, callback)
2140
2141 def SearchLogWithCallback(self, period, callback):
2142 return _pywrapcp.Solver_SearchLogWithCallback(self, period, callback)
2143
2144 def ElementFunction(self, values, index):
2145 return _pywrapcp.Solver_ElementFunction(self, values, index)
2146
2147 def VarEvalValStrPhase(self, vars, var_evaluator, val_str):
2148 return _pywrapcp.Solver_VarEvalValStrPhase(self, vars, var_evaluator, val_str)
2149
2150 def VarStrValEvalPhase(self, vars, var_str, val_eval):
2151 return _pywrapcp.Solver_VarStrValEvalPhase(self, vars, var_str, val_eval)
2152
2153 def VarEvalValEvalPhase(self, vars, var_eval, val_eval):
2154 return _pywrapcp.Solver_VarEvalValEvalPhase(self, vars, var_eval, val_eval)
2155
2156 def VarStrValEvalTieBreakPhase(self, vars, var_str, val_eval, tie_breaker):
2157 return _pywrapcp.Solver_VarStrValEvalTieBreakPhase(self, vars, var_str, val_eval, tie_breaker)
2158
2159 def VarEvalValEvalTieBreakPhase(self, vars, var_eval, val_eval, tie_breaker):
2160 return _pywrapcp.Solver_VarEvalValEvalTieBreakPhase(self, vars, var_eval, val_eval, tie_breaker)
2161
2162 def EvalEvalStrPhase(self, vars, evaluator, str):
2163 return _pywrapcp.Solver_EvalEvalStrPhase(self, vars, evaluator, str)
2164
2165 def EvalEvalStrTieBreakPhase(self, vars, evaluator, tie_breaker, str):
2166 return _pywrapcp.Solver_EvalEvalStrTieBreakPhase(self, vars, evaluator, tie_breaker, str)
2167
2168 def GuidedLocalSearch(self, maximize, objective, objective_function, step, vars, penalty_factor):
2169 return _pywrapcp.Solver_GuidedLocalSearch(self, maximize, objective, objective_function, step, vars, penalty_factor)
2170
2171 def SumObjectiveFilter(self, vars, values, filter_enum):
2172 return _pywrapcp.Solver_SumObjectiveFilter(self, vars, values, filter_enum)
2173
2174# Register Solver in _pywrapcp:
2175_pywrapcp.Solver_swigregister(Solver)
2176class BaseObject(object):
2177 r"""
2178 A BaseObject is the root of all reversibly allocated objects.
2179 A DebugString method and the associated << operator are implemented
2180 as a convenience.
2181 """
2182
2183 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2184
2185 def __init__(self):
2186 if self.__class__ == BaseObject:
2187 _self = None
2188 else:
2189 _self = self
2190 _pywrapcp.BaseObject_swiginit(self, _pywrapcp.new_BaseObject(_self, ))
2191 __swig_destroy__ = _pywrapcp.delete_BaseObject
2192
2193 def DebugString(self):
2194 return _pywrapcp.BaseObject_DebugString(self)
2195
2196 def __str__(self):
2197 return _pywrapcp.BaseObject___str__(self)
2198
2199 def __repr__(self):
2200 return _pywrapcp.BaseObject___repr__(self)
2201 def __disown__(self):
2202 self.this.disown()
2203 _pywrapcp.disown_BaseObject(self)
2204 return weakref.proxy(self)
2205
2206# Register BaseObject in _pywrapcp:
2207_pywrapcp.BaseObject_swigregister(BaseObject)
2209 r"""
2210 NOLINT
2211 The PropagationBaseObject is a subclass of BaseObject that is also
2212 friend to the Solver class. It allows accessing methods useful when
2213 writing new constraints or new expressions.
2214 """
2215
2216 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2217 __repr__ = _swig_repr
2218
2219 def __init__(self, s):
2220 if self.__class__ == PropagationBaseObject:
2221 _self = None
2222 else:
2223 _self = self
2224 _pywrapcp.PropagationBaseObject_swiginit(self, _pywrapcp.new_PropagationBaseObject(_self, s))
2225 __swig_destroy__ = _pywrapcp.delete_PropagationBaseObject
2226
2227 def DebugString(self):
2228 return _pywrapcp.PropagationBaseObject_DebugString(self)
2229
2230 def solver(self):
2231 return _pywrapcp.PropagationBaseObject_solver(self)
2232
2233 def Name(self):
2234 r"""Object naming."""
2235 return _pywrapcp.PropagationBaseObject_Name(self)
2236 def __disown__(self):
2237 self.this.disown()
2238 _pywrapcp.disown_PropagationBaseObject(self)
2239 return weakref.proxy(self)
2240
2241# Register PropagationBaseObject in _pywrapcp:
2242_pywrapcp.PropagationBaseObject_swigregister(PropagationBaseObject)
2244 r"""
2245 A Decision represents a choice point in the search tree. The two main
2246 methods are Apply() to go left, or Refute() to go right.
2247 """
2248
2249 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2250
2251 def __init__(self):
2252 if self.__class__ == Decision:
2253 _self = None
2254 else:
2255 _self = self
2256 _pywrapcp.Decision_swiginit(self, _pywrapcp.new_Decision(_self, ))
2257 __swig_destroy__ = _pywrapcp.delete_Decision
2258
2259 def ApplyWrapper(self, s):
2260 r"""Apply will be called first when the decision is executed."""
2261 return _pywrapcp.Decision_ApplyWrapper(self, s)
2262
2263 def RefuteWrapper(self, s):
2264 r"""Refute will be called after a backtrack."""
2265 return _pywrapcp.Decision_RefuteWrapper(self, s)
2266
2267 def DebugString(self):
2268 return _pywrapcp.Decision_DebugString(self)
2269
2270 def __repr__(self):
2271 return _pywrapcp.Decision___repr__(self)
2272
2273 def __str__(self):
2274 return _pywrapcp.Decision___str__(self)
2275 def __disown__(self):
2276 self.this.disown()
2277 _pywrapcp.disown_Decision(self)
2278 return weakref.proxy(self)
2279
2280# Register Decision in _pywrapcp:
2281_pywrapcp.Decision_swigregister(Decision)
2283 r"""
2284 A DecisionBuilder is responsible for creating the search tree. The
2285 important method is Next(), which returns the next decision to execute.
2286 """
2287
2288 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2289
2290 def __init__(self):
2291 if self.__class__ == DecisionBuilder:
2292 _self = None
2293 else:
2294 _self = self
2295 _pywrapcp.DecisionBuilder_swiginit(self, _pywrapcp.new_DecisionBuilder(_self, ))
2296 __swig_destroy__ = _pywrapcp.delete_DecisionBuilder
2297
2298 def NextWrapper(self, s):
2299 r"""
2300 This is the main method of the decision builder class. It must
2301 return a decision (an instance of the class Decision). If it
2302 returns nullptr, this means that the decision builder has finished
2303 its work.
2304 """
2305 return _pywrapcp.DecisionBuilder_NextWrapper(self, s)
2306
2307 def DebugString(self):
2308 return _pywrapcp.DecisionBuilder_DebugString(self)
2309
2310 def __repr__(self):
2311 return _pywrapcp.DecisionBuilder___repr__(self)
2312
2313 def __str__(self):
2314 return _pywrapcp.DecisionBuilder___str__(self)
2315 def __disown__(self):
2316 self.this.disown()
2317 _pywrapcp.disown_DecisionBuilder(self)
2318 return weakref.proxy(self)
2319
2320# Register DecisionBuilder in _pywrapcp:
2321_pywrapcp.DecisionBuilder_swigregister(DecisionBuilder)
2323 r"""
2324 A Demon is the base element of a propagation queue. It is the main
2325 object responsible for implementing the actual propagation
2326 of the constraint and pruning the inconsistent values in the domains
2327 of the variables. The main concept is that demons are listeners that are
2328 attached to the variables and listen to their modifications.
2329 There are two methods:
2330 - Run() is the actual method called when the demon is processed.
2331 - priority() returns its priority. Standard priorities are slow, normal
2332 or fast. "immediate" is reserved for variables and is treated separately.
2333 """
2334
2335 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2336 __repr__ = _swig_repr
2337
2338 def __init__(self):
2339 r"""
2340 This indicates the priority of a demon. Immediate demons are treated
2341 separately and corresponds to variables.
2342 """
2343 if self.__class__ == Demon:
2344 _self = None
2345 else:
2346 _self = self
2347 _pywrapcp.Demon_swiginit(self, _pywrapcp.new_Demon(_self, ))
2348 __swig_destroy__ = _pywrapcp.delete_Demon
2349
2350 def RunWrapper(self, s):
2351 r"""This is the main callback of the demon."""
2352 return _pywrapcp.Demon_RunWrapper(self, s)
2353
2354 def Priority(self):
2355 r"""
2356 This method returns the priority of the demon. Usually a demon is
2357 fast, slow or normal. Immediate demons are reserved for internal
2358 use to maintain variables.
2359 """
2360 return _pywrapcp.Demon_Priority(self)
2361
2362 def DebugString(self):
2363 return _pywrapcp.Demon_DebugString(self)
2364
2365 def Inhibit(self, s):
2366 r"""
2367 This method inhibits the demon in the search tree below the
2368 current position.
2369 """
2370 return _pywrapcp.Demon_Inhibit(self, s)
2371
2372 def Desinhibit(self, s):
2373 r"""This method un-inhibits the demon that was previously inhibited."""
2374 return _pywrapcp.Demon_Desinhibit(self, s)
2375 def __disown__(self):
2376 self.this.disown()
2377 _pywrapcp.disown_Demon(self)
2378 return weakref.proxy(self)
2379
2380# Register Demon in _pywrapcp:
2381_pywrapcp.Demon_swigregister(Demon)
2383 r"""
2384 A constraint is the main modeling object. It provides two methods:
2385 - Post() is responsible for creating the demons and attaching them to
2386 immediate demons().
2387 - InitialPropagate() is called once just after Post and performs
2388 the initial propagation. The subsequent propagations will be performed
2389 by the demons Posted during the post() method.
2390 """
2391
2392 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2393
2394 def __init__(self, solver):
2395 if self.__class__ == Constraint:
2396 _self = None
2397 else:
2398 _self = self
2399 _pywrapcp.Constraint_swiginit(self, _pywrapcp.new_Constraint(_self, solver))
2400 __swig_destroy__ = _pywrapcp.delete_Constraint
2401
2402 def Post(self):
2403 r"""
2404 This method is called when the constraint is processed by the
2405 solver. Its main usage is to attach demons to variables.
2406 """
2407 return _pywrapcp.Constraint_Post(self)
2408
2410 r"""
2411 This method performs the initial propagation of the
2412 constraint. It is called just after the post.
2413 """
2414 return _pywrapcp.Constraint_InitialPropagateWrapper(self)
2415
2416 def DebugString(self):
2417 return _pywrapcp.Constraint_DebugString(self)
2418
2419 def Var(self):
2420 r"""
2421 Creates a Boolean variable representing the status of the constraint
2422 (false = constraint is violated, true = constraint is satisfied). It
2423 returns nullptr if the constraint does not support this API.
2424 """
2425 return _pywrapcp.Constraint_Var(self)
2426
2427 def __repr__(self):
2428 return _pywrapcp.Constraint___repr__(self)
2429
2430 def __str__(self):
2431 return _pywrapcp.Constraint___str__(self)
2432
2433 def __add__(self, *args):
2434 return _pywrapcp.Constraint___add__(self, *args)
2435
2436 def __radd__(self, v):
2437 return _pywrapcp.Constraint___radd__(self, v)
2438
2439 def __sub__(self, *args):
2440 return _pywrapcp.Constraint___sub__(self, *args)
2441
2442 def __rsub__(self, v):
2443 return _pywrapcp.Constraint___rsub__(self, v)
2444
2445 def __mul__(self, *args):
2446 return _pywrapcp.Constraint___mul__(self, *args)
2447
2448 def __rmul__(self, v):
2449 return _pywrapcp.Constraint___rmul__(self, v)
2450
2451 def __floordiv__(self, v):
2452 return _pywrapcp.Constraint___floordiv__(self, v)
2453
2454 def __neg__(self):
2455 return _pywrapcp.Constraint___neg__(self)
2456
2457 def __abs__(self):
2458 return _pywrapcp.Constraint___abs__(self)
2459
2460 def Square(self):
2461 return _pywrapcp.Constraint_Square(self)
2462
2463 def __eq__(self, *args):
2464 return _pywrapcp.Constraint___eq__(self, *args)
2465
2466 def __ne__(self, *args):
2467 return _pywrapcp.Constraint___ne__(self, *args)
2468
2469 def __ge__(self, *args):
2470 return _pywrapcp.Constraint___ge__(self, *args)
2471
2472 def __gt__(self, *args):
2473 return _pywrapcp.Constraint___gt__(self, *args)
2474
2475 def __le__(self, *args):
2476 return _pywrapcp.Constraint___le__(self, *args)
2477
2478 def __lt__(self, *args):
2479 return _pywrapcp.Constraint___lt__(self, *args)
2480
2481 def MapTo(self, vars):
2482 return _pywrapcp.Constraint_MapTo(self, vars)
2483
2484 def IndexOf(self, *args):
2485 return _pywrapcp.Constraint_IndexOf(self, *args)
2486 def __disown__(self):
2487 self.this.disown()
2488 _pywrapcp.disown_Constraint(self)
2489 return weakref.proxy(self)
2490
2491# Register Constraint in _pywrapcp:
2492_pywrapcp.Constraint_swigregister(Constraint)
2494 r"""A search monitor is a simple set of callbacks to monitor all search events"""
2495
2496 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2497 kNoProgress = _pywrapcp.SearchMonitor_kNoProgress
2498
2499 def __init__(self, s):
2500 if self.__class__ == SearchMonitor:
2501 _self = None
2502 else:
2503 _self = self
2504 _pywrapcp.SearchMonitor_swiginit(self, _pywrapcp.new_SearchMonitor(_self, s))
2505 __swig_destroy__ = _pywrapcp.delete_SearchMonitor
2506
2507 def EnterSearch(self):
2508 r"""Beginning of the search."""
2509 return _pywrapcp.SearchMonitor_EnterSearch(self)
2510
2511 def RestartSearch(self):
2512 r"""Restart the search."""
2513 return _pywrapcp.SearchMonitor_RestartSearch(self)
2514
2515 def ExitSearch(self):
2516 r"""End of the search."""
2517 return _pywrapcp.SearchMonitor_ExitSearch(self)
2518
2519 def BeginNextDecision(self, b):
2520 r"""Before calling DecisionBuilder::Next."""
2521 return _pywrapcp.SearchMonitor_BeginNextDecision(self, b)
2522
2523 def EndNextDecision(self, b, d):
2524 r"""After calling DecisionBuilder::Next, along with the returned decision."""
2525 return _pywrapcp.SearchMonitor_EndNextDecision(self, b, d)
2526
2527 def ApplyDecision(self, d):
2528 r"""Before applying the decision."""
2529 return _pywrapcp.SearchMonitor_ApplyDecision(self, d)
2530
2531 def RefuteDecision(self, d):
2532 r"""Before refuting the decision."""
2533 return _pywrapcp.SearchMonitor_RefuteDecision(self, d)
2534
2535 def AfterDecision(self, d, apply):
2536 r"""
2537 Just after refuting or applying the decision, apply is true after Apply.
2538 This is called only if the Apply() or Refute() methods have not failed.
2539 """
2540 return _pywrapcp.SearchMonitor_AfterDecision(self, d, apply)
2541
2542 def BeginFail(self):
2543 r"""Just when the failure occurs."""
2544 return _pywrapcp.SearchMonitor_BeginFail(self)
2545
2546 def EndFail(self):
2547 r"""After completing the backtrack."""
2548 return _pywrapcp.SearchMonitor_EndFail(self)
2549
2551 r"""Before the initial propagation."""
2552 return _pywrapcp.SearchMonitor_BeginInitialPropagation(self)
2553
2555 r"""After the initial propagation."""
2556 return _pywrapcp.SearchMonitor_EndInitialPropagation(self)
2557
2559 r"""
2560 This method is called when a solution is found. It asserts whether the
2561 solution is valid. A value of false indicates that the solution
2562 should be discarded.
2563 """
2564 return _pywrapcp.SearchMonitor_AcceptSolution(self)
2565
2566 def AtSolution(self):
2567 r"""
2568 This method is called when a valid solution is found. If the
2569 return value is true, then search will resume after. If the result
2570 is false, then search will stop there.
2571 """
2572 return _pywrapcp.SearchMonitor_AtSolution(self)
2573
2575 r"""When the search tree is finished."""
2576 return _pywrapcp.SearchMonitor_NoMoreSolutions(self)
2577
2578 def AcceptDelta(self, delta, deltadelta):
2579
2580 return _pywrapcp.SearchMonitor_AcceptDelta(self, delta, deltadelta)
2581
2583 r"""After accepting a neighbor during local search."""
2584 return _pywrapcp.SearchMonitor_AcceptNeighbor(self)
2585
2587 r"""
2588 Returns a percentage representing the propress of the search before
2589 reaching limits.
2590 """
2591 return _pywrapcp.SearchMonitor_ProgressPercent(self)
2592
2593 def solver(self):
2594 return _pywrapcp.SearchMonitor_solver(self)
2595
2596 def __repr__(self):
2597 return _pywrapcp.SearchMonitor___repr__(self)
2598
2599 def __str__(self):
2600 return _pywrapcp.SearchMonitor___str__(self)
2601 def __disown__(self):
2602 self.this.disown()
2603 _pywrapcp.disown_SearchMonitor(self)
2604 return weakref.proxy(self)
2605
2606# Register SearchMonitor in _pywrapcp:
2607_pywrapcp.SearchMonitor_swigregister(SearchMonitor)
2609 r"""
2610 The class IntExpr is the base of all integer expressions in
2611 constraint programming.
2612 It contains the basic protocol for an expression:
2613 - setting and modifying its bound
2614 - querying if it is bound
2615 - listening to events modifying its bounds
2616 - casting it into a variable (instance of IntVar)
2617 """
2618
2619 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2620
2621 def __init__(self, *args, **kwargs):
2622 raise AttributeError("No constructor defined - class is abstract")
2623
2624 def Min(self):
2625 return _pywrapcp.IntExpr_Min(self)
2626
2627 def SetMin(self, m):
2628 return _pywrapcp.IntExpr_SetMin(self, m)
2629
2630 def Max(self):
2631 return _pywrapcp.IntExpr_Max(self)
2632
2633 def SetMax(self, m):
2634 return _pywrapcp.IntExpr_SetMax(self, m)
2635
2636 def SetRange(self, l, u):
2637 r"""This method sets both the min and the max of the expression."""
2638 return _pywrapcp.IntExpr_SetRange(self, l, u)
2639
2640 def SetValue(self, v):
2641 r"""This method sets the value of the expression."""
2642 return _pywrapcp.IntExpr_SetValue(self, v)
2643
2644 def Bound(self):
2645 r"""Returns true if the min and the max of the expression are equal."""
2646 return _pywrapcp.IntExpr_Bound(self)
2647
2648 def IsVar(self):
2649 r"""Returns true if the expression is indeed a variable."""
2650 return _pywrapcp.IntExpr_IsVar(self)
2651
2652 def Var(self):
2653 r"""Creates a variable from the expression."""
2654 return _pywrapcp.IntExpr_Var(self)
2655
2656 def VarWithName(self, name):
2657 r"""
2658 Creates a variable from the expression and set the name of the
2659 resulting var. If the expression is already a variable, then it
2660 will set the name of the expression, possibly overwriting it.
2661 This is just a shortcut to Var() followed by set_name().
2662 """
2663 return _pywrapcp.IntExpr_VarWithName(self, name)
2664
2665 def WhenRange(self, *args):
2666 r"""
2667 *Overload 1:*
2668 Attach a demon that will watch the min or the max of the expression.
2669
2670 |
2671
2672 *Overload 2:*
2673 Attach a demon that will watch the min or the max of the expression.
2674 """
2675 return _pywrapcp.IntExpr_WhenRange(self, *args)
2676
2677 def __repr__(self):
2678 return _pywrapcp.IntExpr___repr__(self)
2679
2680 def __str__(self):
2681 return _pywrapcp.IntExpr___str__(self)
2682
2683 def __add__(self, *args):
2684 return _pywrapcp.IntExpr___add__(self, *args)
2685
2686 def __radd__(self, v):
2687 return _pywrapcp.IntExpr___radd__(self, v)
2688
2689 def __sub__(self, *args):
2690 return _pywrapcp.IntExpr___sub__(self, *args)
2691
2692 def __rsub__(self, v):
2693 return _pywrapcp.IntExpr___rsub__(self, v)
2694
2695 def __mul__(self, *args):
2696 return _pywrapcp.IntExpr___mul__(self, *args)
2697
2698 def __rmul__(self, v):
2699 return _pywrapcp.IntExpr___rmul__(self, v)
2700
2701 def __floordiv__(self, *args):
2702 return _pywrapcp.IntExpr___floordiv__(self, *args)
2703
2704 def __mod__(self, *args):
2705 return _pywrapcp.IntExpr___mod__(self, *args)
2706
2707 def __neg__(self):
2708 return _pywrapcp.IntExpr___neg__(self)
2709
2710 def __abs__(self):
2711 return _pywrapcp.IntExpr___abs__(self)
2712
2713 def Square(self):
2714 return _pywrapcp.IntExpr_Square(self)
2715
2716 def __eq__(self, *args):
2717 return _pywrapcp.IntExpr___eq__(self, *args)
2718
2719 def __ne__(self, *args):
2720 return _pywrapcp.IntExpr___ne__(self, *args)
2721
2722 def __ge__(self, *args):
2723 return _pywrapcp.IntExpr___ge__(self, *args)
2724
2725 def __gt__(self, *args):
2726 return _pywrapcp.IntExpr___gt__(self, *args)
2727
2728 def __le__(self, *args):
2729 return _pywrapcp.IntExpr___le__(self, *args)
2730
2731 def __lt__(self, *args):
2732 return _pywrapcp.IntExpr___lt__(self, *args)
2733
2734 def MapTo(self, vars):
2735 return _pywrapcp.IntExpr_MapTo(self, vars)
2736
2737 def IndexOf(self, *args):
2738 return _pywrapcp.IntExpr_IndexOf(self, *args)
2739
2740 def IsMember(self, values):
2741 return _pywrapcp.IntExpr_IsMember(self, values)
2742
2743 def Member(self, values):
2744 return _pywrapcp.IntExpr_Member(self, values)
2745
2746 def NotMember(self, starts, ends):
2747 return _pywrapcp.IntExpr_NotMember(self, starts, ends)
2748
2749# Register IntExpr in _pywrapcp:
2750_pywrapcp.IntExpr_swigregister(IntExpr)
2752 r"""
2753 The class Iterator has two direct subclasses. HoleIterators
2754 iterates over all holes, that is value removed between the
2755 current min and max of the variable since the last time the
2756 variable was processed in the queue. DomainIterators iterates
2757 over all elements of the variable domain. Both iterators are not
2758 robust to domain changes. Hole iterators can also report values outside
2759 the current min and max of the variable.
2760 HoleIterators should only be called from a demon attached to the
2761 variable that has created this iterator.
2762 IntVar* current_var;
2763 std::unique_ptr<IntVarIterator> it(current_var->MakeHoleIterator(false));
2764 for (const int64_t hole : InitAndGetValues(it)) {
2765 use the hole
2766 }
2767 """
2768
2769 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2770
2771 def __init__(self, *args, **kwargs):
2772 raise AttributeError("No constructor defined - class is abstract")
2773 __repr__ = _swig_repr
2774
2775 def Init(self):
2776 r"""This method must be called before each loop."""
2777 return _pywrapcp.IntVarIterator_Init(self)
2778
2779 def Ok(self):
2780 r"""This method indicates if we can call Value() or not."""
2781 return _pywrapcp.IntVarIterator_Ok(self)
2782
2783 def Value(self):
2784 r"""This method returns the current value of the iterator."""
2785 return _pywrapcp.IntVarIterator_Value(self)
2786
2787 def Next(self):
2788 r"""This method moves the iterator to the next value."""
2789 return _pywrapcp.IntVarIterator_Next(self)
2790
2791 def DebugString(self):
2792 r"""Pretty Print."""
2793 return _pywrapcp.IntVarIterator_DebugString(self)
2794
2795 def __iter__(self):
2796 self.Init()
2797 return self
2798
2799 def next(self):
2800 if self.Ok():
2801 result = self.Value()
2802 self.Next()
2803 return result
2804 else:
2805 raise StopIteration()
2806
2807 def __next__(self):
2808 return self.next()
2809
2810
2811# Register IntVarIterator in _pywrapcp:
2812_pywrapcp.IntVarIterator_swigregister(IntVarIterator)
2814 r"""
2815 The class IntVar is a subset of IntExpr. In addition to the
2816 IntExpr protocol, it offers persistence, removing values from the domains,
2817 and a finer model for events.
2818 """
2819
2820 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2821
2822 def __init__(self, *args, **kwargs):
2823 raise AttributeError("No constructor defined - class is abstract")
2824
2825 def IsVar(self):
2826 return _pywrapcp.IntVar_IsVar(self)
2827
2828 def Var(self):
2829 return _pywrapcp.IntVar_Var(self)
2830
2831 def Value(self):
2832 r"""
2833 This method returns the value of the variable. This method checks
2834 before that the variable is bound.
2835 """
2836 return _pywrapcp.IntVar_Value(self)
2837
2838 def RemoveValue(self, v):
2839 r"""This method removes the value 'v' from the domain of the variable."""
2840 return _pywrapcp.IntVar_RemoveValue(self, v)
2841
2842 def RemoveInterval(self, l, u):
2843 r"""
2844 This method removes the interval 'l' .. 'u' from the domain of
2845 the variable. It assumes that 'l' <= 'u'.
2846 """
2847 return _pywrapcp.IntVar_RemoveInterval(self, l, u)
2848
2849 def RemoveValues(self, values):
2850 r"""This method remove the values from the domain of the variable."""
2851 return _pywrapcp.IntVar_RemoveValues(self, values)
2852
2853 def SetValues(self, values):
2854 r"""This method intersects the current domain with the values in the array."""
2855 return _pywrapcp.IntVar_SetValues(self, values)
2856
2857 def WhenBound(self, *args):
2858 r"""
2859 *Overload 1:*
2860 This method attaches a demon that will be awakened when the
2861 variable is bound.
2862
2863 |
2864
2865 *Overload 2:*
2866 This method attaches a closure that will be awakened when the
2867 variable is bound.
2868 """
2869 return _pywrapcp.IntVar_WhenBound(self, *args)
2870
2871 def WhenDomain(self, *args):
2872 r"""
2873 *Overload 1:*
2874 This method attaches a demon that will watch any domain
2875 modification of the domain of the variable.
2876
2877 |
2878
2879 *Overload 2:*
2880 This method attaches a closure that will watch any domain
2881 modification of the domain of the variable.
2882 """
2883 return _pywrapcp.IntVar_WhenDomain(self, *args)
2884
2885 def Size(self):
2886 r"""This method returns the number of values in the domain of the variable."""
2887 return _pywrapcp.IntVar_Size(self)
2888
2889 def Contains(self, v):
2890 r"""
2891 This method returns whether the value 'v' is in the domain of the
2892 variable.
2893 """
2894 return _pywrapcp.IntVar_Contains(self, v)
2895
2896 def HoleIteratorAux(self, reversible):
2897 r"""
2898 Creates a hole iterator. When 'reversible' is false, the returned
2899 object is created on the normal C++ heap and the solver does NOT
2900 take ownership of the object.
2901 """
2902 return _pywrapcp.IntVar_HoleIteratorAux(self, reversible)
2903
2904 def DomainIteratorAux(self, reversible):
2905 r"""
2906 Creates a domain iterator. When 'reversible' is false, the
2907 returned object is created on the normal C++ heap and the solver
2908 does NOT take ownership of the object.
2909 """
2910 return _pywrapcp.IntVar_DomainIteratorAux(self, reversible)
2911
2912 def OldMin(self):
2913 r"""Returns the previous min."""
2914 return _pywrapcp.IntVar_OldMin(self)
2915
2916 def OldMax(self):
2917 r"""Returns the previous max."""
2918 return _pywrapcp.IntVar_OldMax(self)
2919
2920 def __repr__(self):
2921 return _pywrapcp.IntVar___repr__(self)
2922
2923 def __str__(self):
2924 return _pywrapcp.IntVar___str__(self)
2925
2927 return iter(self.DomainIteratorAux(False))
2928
2929 def HoleIterator(self):
2930 return iter(self.HoleIteratorAux(False))
2931
2932
2933# Register IntVar in _pywrapcp:
2934_pywrapcp.IntVar_swigregister(IntVar)
2936 r"""
2937 This class is the root class of all solution collectors.
2938 It implements a basic query API to be used independently
2939 of the collector used.
2940 """
2941
2942 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
2943
2944 def __init__(self, *args, **kwargs):
2945 raise AttributeError("No constructor defined")
2946 __repr__ = _swig_repr
2947
2948 def DebugString(self):
2949 return _pywrapcp.SolutionCollector_DebugString(self)
2950
2951 def Add(self, *args):
2952 r"""Add API."""
2953 return _pywrapcp.SolutionCollector_Add(self, *args)
2954
2955 def AddObjective(self, objective):
2956 return _pywrapcp.SolutionCollector_AddObjective(self, objective)
2957
2958 def EnterSearch(self):
2959 r"""Beginning of the search."""
2960 return _pywrapcp.SolutionCollector_EnterSearch(self)
2961
2962 def SolutionCount(self):
2963 r"""Returns how many solutions were stored during the search."""
2964 return _pywrapcp.SolutionCollector_SolutionCount(self)
2965
2966 def Solution(self, n):
2967 r"""Returns the nth solution."""
2968 return _pywrapcp.SolutionCollector_Solution(self, n)
2969
2970 def WallTime(self, n):
2971 r"""Returns the wall time in ms for the nth solution."""
2972 return _pywrapcp.SolutionCollector_WallTime(self, n)
2973
2974 def Branches(self, n):
2975 r"""Returns the number of branches when the nth solution was found."""
2976 return _pywrapcp.SolutionCollector_Branches(self, n)
2977
2978 def Failures(self, n):
2979 r"""
2980 Returns the number of failures encountered at the time of the nth
2981 solution.
2982 """
2983 return _pywrapcp.SolutionCollector_Failures(self, n)
2984
2985 def ObjectiveValue(self, n):
2986 r"""Returns the objective value of the nth solution."""
2987 return _pywrapcp.SolutionCollector_ObjectiveValue(self, n)
2988
2989 def Value(self, n, var):
2990 r"""This is a shortcut to get the Value of 'var' in the nth solution."""
2991 return _pywrapcp.SolutionCollector_Value(self, n, var)
2992
2993 def StartValue(self, n, var):
2994 r"""This is a shortcut to get the StartValue of 'var' in the nth solution."""
2995 return _pywrapcp.SolutionCollector_StartValue(self, n, var)
2996
2997 def EndValue(self, n, var):
2998 r"""This is a shortcut to get the EndValue of 'var' in the nth solution."""
2999 return _pywrapcp.SolutionCollector_EndValue(self, n, var)
3000
3001 def DurationValue(self, n, var):
3002 r"""This is a shortcut to get the DurationValue of 'var' in the nth solution."""
3003 return _pywrapcp.SolutionCollector_DurationValue(self, n, var)
3004
3005 def PerformedValue(self, n, var):
3006 r"""This is a shortcut to get the PerformedValue of 'var' in the nth solution."""
3007 return _pywrapcp.SolutionCollector_PerformedValue(self, n, var)
3008
3009 def ForwardSequence(self, n, var):
3010 r"""
3011 This is a shortcut to get the ForwardSequence of 'var' in the
3012 nth solution. The forward sequence is the list of ranked interval
3013 variables starting from the start of the sequence.
3014 """
3015 return _pywrapcp.SolutionCollector_ForwardSequence(self, n, var)
3016
3017 def BackwardSequence(self, n, var):
3018 r"""
3019 This is a shortcut to get the BackwardSequence of 'var' in the
3020 nth solution. The backward sequence is the list of ranked interval
3021 variables starting from the end of the sequence.
3022 """
3023 return _pywrapcp.SolutionCollector_BackwardSequence(self, n, var)
3024
3025 def Unperformed(self, n, var):
3026 r"""
3027 This is a shortcut to get the list of unperformed of 'var' in the
3028 nth solution.
3029 """
3030 return _pywrapcp.SolutionCollector_Unperformed(self, n, var)
3031
3032# Register SolutionCollector in _pywrapcp:
3033_pywrapcp.SolutionCollector_swigregister(SolutionCollector)
3034class OptimizeVar(object):
3035 r"""
3036 This class encapsulates an objective. It requires the direction
3037 (minimize or maximize), the variable to optimize, and the
3038 improvement step.
3039 """
3040
3041 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3042
3043 def __init__(self, *args, **kwargs):
3044 raise AttributeError("No constructor defined")
3045 __repr__ = _swig_repr
3046
3047 def Best(self):
3048 r"""Returns the best value found during search."""
3049 return _pywrapcp.OptimizeVar_Best(self)
3050
3051 def BeginNextDecision(self, db):
3052 r"""Internal methods."""
3053 return _pywrapcp.OptimizeVar_BeginNextDecision(self, db)
3054
3055 def RefuteDecision(self, d):
3056 return _pywrapcp.OptimizeVar_RefuteDecision(self, d)
3057
3058 def AtSolution(self):
3059 return _pywrapcp.OptimizeVar_AtSolution(self)
3060
3062 return _pywrapcp.OptimizeVar_AcceptSolution(self)
3063
3064 def DebugString(self):
3065 return _pywrapcp.OptimizeVar_DebugString(self)
3066 __swig_destroy__ = _pywrapcp.delete_OptimizeVar
3067
3068# Register OptimizeVar in _pywrapcp:
3069_pywrapcp.OptimizeVar_swigregister(OptimizeVar)
3071 r"""Base class of all search limits."""
3072
3073 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3074
3075 def __init__(self, *args, **kwargs):
3076 raise AttributeError("No constructor defined - class is abstract")
3077 __repr__ = _swig_repr
3078 __swig_destroy__ = _pywrapcp.delete_SearchLimit
3079
3080 def Crossed(self):
3081 r"""Returns true if the limit has been crossed."""
3082 return _pywrapcp.SearchLimit_Crossed(self)
3083
3084 def Check(self):
3085 r"""
3086 This method is called to check the status of the limit. A return
3087 value of true indicates that we have indeed crossed the limit. In
3088 that case, this method will not be called again and the remaining
3089 search will be discarded.
3090 """
3091 return _pywrapcp.SearchLimit_Check(self)
3092
3093 def Init(self):
3094 r"""This method is called when the search limit is initialized."""
3095 return _pywrapcp.SearchLimit_Init(self)
3096
3097 def EnterSearch(self):
3098 r"""Internal methods."""
3099 return _pywrapcp.SearchLimit_EnterSearch(self)
3100
3101 def BeginNextDecision(self, b):
3102 return _pywrapcp.SearchLimit_BeginNextDecision(self, b)
3103
3104 def RefuteDecision(self, d):
3105 return _pywrapcp.SearchLimit_RefuteDecision(self, d)
3106
3107 def DebugString(self):
3108 return _pywrapcp.SearchLimit_DebugString(self)
3109
3110# Register SearchLimit in _pywrapcp:
3111_pywrapcp.SearchLimit_swigregister(SearchLimit)
3113 r"""
3114 Interval variables are often used in scheduling. The main characteristics
3115 of an IntervalVar are the start position, duration, and end
3116 date. All these characteristics can be queried and set, and demons can
3117 be posted on their modifications.
3118
3119 An important aspect is optionality: an IntervalVar can be performed or not.
3120 If unperformed, then it simply does not exist, and its characteristics
3121 cannot be accessed any more. An interval var is automatically marked
3122 as unperformed when it is not consistent anymore (start greater
3123 than end, duration < 0...)
3124 """
3125
3126 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3127
3128 def __init__(self, *args, **kwargs):
3129 raise AttributeError("No constructor defined - class is abstract")
3130
3131 def StartMin(self):
3132 r"""
3133 These methods query, set, and watch the start position of the
3134 interval var.
3135 """
3136 return _pywrapcp.IntervalVar_StartMin(self)
3137
3138 def StartMax(self):
3139 return _pywrapcp.IntervalVar_StartMax(self)
3140
3141 def SetStartMin(self, m):
3142 return _pywrapcp.IntervalVar_SetStartMin(self, m)
3143
3144 def SetStartMax(self, m):
3145 return _pywrapcp.IntervalVar_SetStartMax(self, m)
3146
3147 def SetStartRange(self, mi, ma):
3148 return _pywrapcp.IntervalVar_SetStartRange(self, mi, ma)
3149
3150 def OldStartMin(self):
3151 return _pywrapcp.IntervalVar_OldStartMin(self)
3152
3153 def OldStartMax(self):
3154 return _pywrapcp.IntervalVar_OldStartMax(self)
3155
3156 def WhenStartRange(self, *args):
3157 return _pywrapcp.IntervalVar_WhenStartRange(self, *args)
3158
3159 def WhenStartBound(self, *args):
3160 return _pywrapcp.IntervalVar_WhenStartBound(self, *args)
3161
3162 def DurationMin(self):
3163 r"""These methods query, set, and watch the duration of the interval var."""
3164 return _pywrapcp.IntervalVar_DurationMin(self)
3165
3166 def DurationMax(self):
3167 return _pywrapcp.IntervalVar_DurationMax(self)
3168
3169 def SetDurationMin(self, m):
3170 return _pywrapcp.IntervalVar_SetDurationMin(self, m)
3171
3172 def SetDurationMax(self, m):
3173 return _pywrapcp.IntervalVar_SetDurationMax(self, m)
3174
3175 def SetDurationRange(self, mi, ma):
3176 return _pywrapcp.IntervalVar_SetDurationRange(self, mi, ma)
3177
3179 return _pywrapcp.IntervalVar_OldDurationMin(self)
3180
3182 return _pywrapcp.IntervalVar_OldDurationMax(self)
3183
3184 def WhenDurationRange(self, *args):
3185 return _pywrapcp.IntervalVar_WhenDurationRange(self, *args)
3186
3187 def WhenDurationBound(self, *args):
3188 return _pywrapcp.IntervalVar_WhenDurationBound(self, *args)
3189
3190 def EndMin(self):
3191 r"""These methods query, set, and watch the end position of the interval var."""
3192 return _pywrapcp.IntervalVar_EndMin(self)
3193
3194 def EndMax(self):
3195 return _pywrapcp.IntervalVar_EndMax(self)
3196
3197 def SetEndMin(self, m):
3198 return _pywrapcp.IntervalVar_SetEndMin(self, m)
3199
3200 def SetEndMax(self, m):
3201 return _pywrapcp.IntervalVar_SetEndMax(self, m)
3202
3203 def SetEndRange(self, mi, ma):
3204 return _pywrapcp.IntervalVar_SetEndRange(self, mi, ma)
3205
3206 def OldEndMin(self):
3207 return _pywrapcp.IntervalVar_OldEndMin(self)
3208
3209 def OldEndMax(self):
3210 return _pywrapcp.IntervalVar_OldEndMax(self)
3211
3212 def WhenEndRange(self, *args):
3213 return _pywrapcp.IntervalVar_WhenEndRange(self, *args)
3214
3215 def WhenEndBound(self, *args):
3216 return _pywrapcp.IntervalVar_WhenEndBound(self, *args)
3217
3219 r"""
3220 These methods query, set, and watch the performed status of the
3221 interval var.
3222 """
3223 return _pywrapcp.IntervalVar_MustBePerformed(self)
3224
3226 return _pywrapcp.IntervalVar_MayBePerformed(self)
3227
3229 return _pywrapcp.IntervalVar_CannotBePerformed(self)
3230
3232 return _pywrapcp.IntervalVar_IsPerformedBound(self)
3233
3234 def SetPerformed(self, val):
3235 return _pywrapcp.IntervalVar_SetPerformed(self, val)
3236
3238 return _pywrapcp.IntervalVar_WasPerformedBound(self)
3239
3240 def WhenPerformedBound(self, *args):
3241 return _pywrapcp.IntervalVar_WhenPerformedBound(self, *args)
3242
3243 def WhenAnything(self, *args):
3244 r"""
3245 *Overload 1:*
3246 Attaches a demon awakened when anything about this interval changes.
3247
3248 |
3249
3250 *Overload 2:*
3251 Attaches a closure awakened when anything about this interval changes.
3252 """
3253 return _pywrapcp.IntervalVar_WhenAnything(self, *args)
3254
3255 def StartExpr(self):
3256 r"""
3257 These methods create expressions encapsulating the start, end
3258 and duration of the interval var. Please note that these must not
3259 be used if the interval var is unperformed.
3260 """
3261 return _pywrapcp.IntervalVar_StartExpr(self)
3262
3263 def DurationExpr(self):
3264 return _pywrapcp.IntervalVar_DurationExpr(self)
3265
3266 def EndExpr(self):
3267 return _pywrapcp.IntervalVar_EndExpr(self)
3268
3269 def PerformedExpr(self):
3270 return _pywrapcp.IntervalVar_PerformedExpr(self)
3271
3272 def SafeStartExpr(self, unperformed_value):
3273 r"""
3274 These methods create expressions encapsulating the start, end
3275 and duration of the interval var. If the interval var is
3276 unperformed, they will return the unperformed_value.
3277 """
3278 return _pywrapcp.IntervalVar_SafeStartExpr(self, unperformed_value)
3279
3280 def SafeDurationExpr(self, unperformed_value):
3281 return _pywrapcp.IntervalVar_SafeDurationExpr(self, unperformed_value)
3282
3283 def SafeEndExpr(self, unperformed_value):
3284 return _pywrapcp.IntervalVar_SafeEndExpr(self, unperformed_value)
3285
3286 def EndsAfterEnd(self, other):
3287 return _pywrapcp.IntervalVar_EndsAfterEnd(self, other)
3288
3289 def EndsAfterEndWithDelay(self, other, delay):
3290 return _pywrapcp.IntervalVar_EndsAfterEndWithDelay(self, other, delay)
3291
3292 def EndsAfterStart(self, other):
3293 return _pywrapcp.IntervalVar_EndsAfterStart(self, other)
3294
3295 def EndsAfterStartWithDelay(self, other, delay):
3296 return _pywrapcp.IntervalVar_EndsAfterStartWithDelay(self, other, delay)
3297
3298 def EndsAtEnd(self, other):
3299 return _pywrapcp.IntervalVar_EndsAtEnd(self, other)
3300
3301 def EndsAtEndWithDelay(self, other, delay):
3302 return _pywrapcp.IntervalVar_EndsAtEndWithDelay(self, other, delay)
3303
3304 def EndsAtStart(self, other):
3305 return _pywrapcp.IntervalVar_EndsAtStart(self, other)
3306
3307 def EndsAtStartWithDelay(self, other, delay):
3308 return _pywrapcp.IntervalVar_EndsAtStartWithDelay(self, other, delay)
3309
3310 def StartsAfterEnd(self, other):
3311 return _pywrapcp.IntervalVar_StartsAfterEnd(self, other)
3312
3313 def StartsAfterEndWithDelay(self, other, delay):
3314 return _pywrapcp.IntervalVar_StartsAfterEndWithDelay(self, other, delay)
3315
3316 def StartsAfterStart(self, other):
3317 return _pywrapcp.IntervalVar_StartsAfterStart(self, other)
3318
3319 def StartsAfterStartWithDelay(self, other, delay):
3320 return _pywrapcp.IntervalVar_StartsAfterStartWithDelay(self, other, delay)
3321
3322 def StartsAtEnd(self, other):
3323 return _pywrapcp.IntervalVar_StartsAtEnd(self, other)
3324
3325 def StartsAtEndWithDelay(self, other, delay):
3326 return _pywrapcp.IntervalVar_StartsAtEndWithDelay(self, other, delay)
3327
3328 def StartsAtStart(self, other):
3329 return _pywrapcp.IntervalVar_StartsAtStart(self, other)
3330
3331 def StartsAtStartWithDelay(self, other, delay):
3332 return _pywrapcp.IntervalVar_StartsAtStartWithDelay(self, other, delay)
3333
3334 def StaysInSync(self, other):
3335 return _pywrapcp.IntervalVar_StaysInSync(self, other)
3336
3337 def StaysInSyncWithDelay(self, other, delay):
3338 return _pywrapcp.IntervalVar_StaysInSyncWithDelay(self, other, delay)
3339
3340 def EndsAfter(self, date):
3341 return _pywrapcp.IntervalVar_EndsAfter(self, date)
3342
3343 def EndsAt(self, date):
3344 return _pywrapcp.IntervalVar_EndsAt(self, date)
3345
3346 def EndsBefore(self, date):
3347 return _pywrapcp.IntervalVar_EndsBefore(self, date)
3348
3349 def StartsAfter(self, date):
3350 return _pywrapcp.IntervalVar_StartsAfter(self, date)
3351
3352 def StartsAt(self, date):
3353 return _pywrapcp.IntervalVar_StartsAt(self, date)
3354
3355 def StartsBefore(self, date):
3356 return _pywrapcp.IntervalVar_StartsBefore(self, date)
3357
3358 def CrossesDate(self, date):
3359 return _pywrapcp.IntervalVar_CrossesDate(self, date)
3360
3361 def AvoidsDate(self, date):
3362 return _pywrapcp.IntervalVar_AvoidsDate(self, date)
3363
3364 def __repr__(self):
3365 return _pywrapcp.IntervalVar___repr__(self)
3366
3367 def __str__(self):
3368 return _pywrapcp.IntervalVar___str__(self)
3369
3370# Register IntervalVar in _pywrapcp:
3371_pywrapcp.IntervalVar_swigregister(IntervalVar)
3373 r"""
3374 A sequence variable is a variable whose domain is a set of possible
3375 orderings of the interval variables. It allows ordering of tasks. It
3376 has two sets of methods: ComputePossibleFirstsAndLasts(), which
3377 returns the list of interval variables that can be ranked first or
3378 last; and RankFirst/RankNotFirst/RankLast/RankNotLast, which can be
3379 used to create the search decision.
3380 """
3381
3382 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3383
3384 def __init__(self, *args, **kwargs):
3385 raise AttributeError("No constructor defined")
3386
3387 def DebugString(self):
3388 return _pywrapcp.SequenceVar_DebugString(self)
3389
3390 def RankFirst(self, index):
3391 r"""
3392 Ranks the index_th interval var first of all unranked interval
3393 vars. After that, it will no longer be considered ranked.
3394 """
3395 return _pywrapcp.SequenceVar_RankFirst(self, index)
3396
3397 def RankNotFirst(self, index):
3398 r"""
3399 Indicates that the index_th interval var will not be ranked first
3400 of all currently unranked interval vars.
3401 """
3402 return _pywrapcp.SequenceVar_RankNotFirst(self, index)
3403
3404 def RankLast(self, index):
3405 r"""
3406 Ranks the index_th interval var first of all unranked interval
3407 vars. After that, it will no longer be considered ranked.
3408 """
3409 return _pywrapcp.SequenceVar_RankLast(self, index)
3410
3411 def RankNotLast(self, index):
3412 r"""
3413 Indicates that the index_th interval var will not be ranked first
3414 of all currently unranked interval vars.
3415 """
3416 return _pywrapcp.SequenceVar_RankNotLast(self, index)
3417
3418 def Interval(self, index):
3419 r"""Returns the index_th interval of the sequence."""
3420 return _pywrapcp.SequenceVar_Interval(self, index)
3421
3422 def Next(self, index):
3423 r"""Returns the next of the index_th interval of the sequence."""
3424 return _pywrapcp.SequenceVar_Next(self, index)
3425
3426 def Size(self):
3427 r"""Returns the number of interval vars in the sequence."""
3428 return _pywrapcp.SequenceVar_Size(self)
3429
3430 def __repr__(self):
3431 return _pywrapcp.SequenceVar___repr__(self)
3432
3433 def __str__(self):
3434 return _pywrapcp.SequenceVar___str__(self)
3435
3436# Register SequenceVar in _pywrapcp:
3437_pywrapcp.SequenceVar_swigregister(SequenceVar)
3438class AssignmentElement(object):
3439 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3440
3441 def __init__(self, *args, **kwargs):
3442 raise AttributeError("No constructor defined")
3443 __repr__ = _swig_repr
3444
3445 def Activate(self):
3446 return _pywrapcp.AssignmentElement_Activate(self)
3447
3448 def Deactivate(self):
3449 return _pywrapcp.AssignmentElement_Deactivate(self)
3450
3451 def Activated(self):
3452 return _pywrapcp.AssignmentElement_Activated(self)
3453 __swig_destroy__ = _pywrapcp.delete_AssignmentElement
3454
3455# Register AssignmentElement in _pywrapcp:
3456_pywrapcp.AssignmentElement_swigregister(AssignmentElement)
3458 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3459
3460 def __init__(self, *args, **kwargs):
3461 raise AttributeError("No constructor defined")
3462 __repr__ = _swig_repr
3463
3464 def Var(self):
3465 return _pywrapcp.IntVarElement_Var(self)
3466
3467 def Min(self):
3468 return _pywrapcp.IntVarElement_Min(self)
3469
3470 def SetMin(self, m):
3471 return _pywrapcp.IntVarElement_SetMin(self, m)
3472
3473 def Max(self):
3474 return _pywrapcp.IntVarElement_Max(self)
3475
3476 def SetMax(self, m):
3477 return _pywrapcp.IntVarElement_SetMax(self, m)
3478
3479 def Value(self):
3480 return _pywrapcp.IntVarElement_Value(self)
3481
3482 def Bound(self):
3483 return _pywrapcp.IntVarElement_Bound(self)
3484
3485 def SetRange(self, l, u):
3486 return _pywrapcp.IntVarElement_SetRange(self, l, u)
3487
3488 def SetValue(self, v):
3489 return _pywrapcp.IntVarElement_SetValue(self, v)
3490
3491 def __eq__(self, element):
3492 return _pywrapcp.IntVarElement___eq__(self, element)
3493
3494 def __ne__(self, element):
3495 return _pywrapcp.IntVarElement___ne__(self, element)
3496 __swig_destroy__ = _pywrapcp.delete_IntVarElement
3497
3498# Register IntVarElement in _pywrapcp:
3499_pywrapcp.IntVarElement_swigregister(IntVarElement)
3501 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3502
3503 def __init__(self, *args, **kwargs):
3504 raise AttributeError("No constructor defined")
3505 __repr__ = _swig_repr
3506
3507 def Var(self):
3508 return _pywrapcp.IntervalVarElement_Var(self)
3509
3510 def StartMin(self):
3511 return _pywrapcp.IntervalVarElement_StartMin(self)
3512
3513 def StartMax(self):
3514 return _pywrapcp.IntervalVarElement_StartMax(self)
3515
3516 def StartValue(self):
3517 return _pywrapcp.IntervalVarElement_StartValue(self)
3518
3519 def DurationMin(self):
3520 return _pywrapcp.IntervalVarElement_DurationMin(self)
3521
3522 def DurationMax(self):
3523 return _pywrapcp.IntervalVarElement_DurationMax(self)
3524
3525 def DurationValue(self):
3526 return _pywrapcp.IntervalVarElement_DurationValue(self)
3527
3528 def EndMin(self):
3529 return _pywrapcp.IntervalVarElement_EndMin(self)
3530
3531 def EndMax(self):
3532 return _pywrapcp.IntervalVarElement_EndMax(self)
3533
3534 def EndValue(self):
3535 return _pywrapcp.IntervalVarElement_EndValue(self)
3536
3537 def PerformedMin(self):
3538 return _pywrapcp.IntervalVarElement_PerformedMin(self)
3539
3540 def PerformedMax(self):
3541 return _pywrapcp.IntervalVarElement_PerformedMax(self)
3542
3544 return _pywrapcp.IntervalVarElement_PerformedValue(self)
3545
3546 def SetStartMin(self, m):
3547 return _pywrapcp.IntervalVarElement_SetStartMin(self, m)
3548
3549 def SetStartMax(self, m):
3550 return _pywrapcp.IntervalVarElement_SetStartMax(self, m)
3551
3552 def SetStartRange(self, mi, ma):
3553 return _pywrapcp.IntervalVarElement_SetStartRange(self, mi, ma)
3554
3555 def SetStartValue(self, v):
3556 return _pywrapcp.IntervalVarElement_SetStartValue(self, v)
3557
3558 def SetDurationMin(self, m):
3559 return _pywrapcp.IntervalVarElement_SetDurationMin(self, m)
3560
3561 def SetDurationMax(self, m):
3562 return _pywrapcp.IntervalVarElement_SetDurationMax(self, m)
3563
3564 def SetDurationRange(self, mi, ma):
3565 return _pywrapcp.IntervalVarElement_SetDurationRange(self, mi, ma)
3566
3567 def SetDurationValue(self, v):
3568 return _pywrapcp.IntervalVarElement_SetDurationValue(self, v)
3569
3570 def SetEndMin(self, m):
3571 return _pywrapcp.IntervalVarElement_SetEndMin(self, m)
3572
3573 def SetEndMax(self, m):
3574 return _pywrapcp.IntervalVarElement_SetEndMax(self, m)
3575
3576 def SetEndRange(self, mi, ma):
3577 return _pywrapcp.IntervalVarElement_SetEndRange(self, mi, ma)
3578
3579 def SetEndValue(self, v):
3580 return _pywrapcp.IntervalVarElement_SetEndValue(self, v)
3581
3582 def SetPerformedMin(self, m):
3583 return _pywrapcp.IntervalVarElement_SetPerformedMin(self, m)
3584
3585 def SetPerformedMax(self, m):
3586 return _pywrapcp.IntervalVarElement_SetPerformedMax(self, m)
3587
3588 def SetPerformedRange(self, mi, ma):
3589 return _pywrapcp.IntervalVarElement_SetPerformedRange(self, mi, ma)
3590
3591 def SetPerformedValue(self, v):
3592 return _pywrapcp.IntervalVarElement_SetPerformedValue(self, v)
3593
3594 def __eq__(self, element):
3595 return _pywrapcp.IntervalVarElement___eq__(self, element)
3596
3597 def __ne__(self, element):
3598 return _pywrapcp.IntervalVarElement___ne__(self, element)
3599 __swig_destroy__ = _pywrapcp.delete_IntervalVarElement
3600
3601# Register IntervalVarElement in _pywrapcp:
3602_pywrapcp.IntervalVarElement_swigregister(IntervalVarElement)
3604 r"""
3605 The SequenceVarElement stores a partial representation of ranked
3606 interval variables in the underlying sequence variable.
3607 This representation consists of three vectors:
3608 - the forward sequence. That is the list of interval variables
3609 ranked first in the sequence. The first element of the backward
3610 sequence is the first interval in the sequence variable.
3611 - the backward sequence. That is the list of interval variables
3612 ranked last in the sequence. The first element of the backward
3613 sequence is the last interval in the sequence variable.
3614 - The list of unperformed interval variables.
3615 Furthermore, if all performed variables are ranked, then by
3616 convention, the forward_sequence will contain all such variables
3617 and the backward_sequence will be empty.
3618 """
3619
3620 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3621
3622 def __init__(self, *args, **kwargs):
3623 raise AttributeError("No constructor defined")
3624 __repr__ = _swig_repr
3625
3626 def Var(self):
3627 return _pywrapcp.SequenceVarElement_Var(self)
3628
3630 return _pywrapcp.SequenceVarElement_ForwardSequence(self)
3631
3633 return _pywrapcp.SequenceVarElement_BackwardSequence(self)
3634
3635 def Unperformed(self):
3636 return _pywrapcp.SequenceVarElement_Unperformed(self)
3637
3638 def SetSequence(self, forward_sequence, backward_sequence, unperformed):
3639 return _pywrapcp.SequenceVarElement_SetSequence(self, forward_sequence, backward_sequence, unperformed)
3640
3641 def SetForwardSequence(self, forward_sequence):
3642 return _pywrapcp.SequenceVarElement_SetForwardSequence(self, forward_sequence)
3643
3644 def SetBackwardSequence(self, backward_sequence):
3645 return _pywrapcp.SequenceVarElement_SetBackwardSequence(self, backward_sequence)
3646
3647 def SetUnperformed(self, unperformed):
3648 return _pywrapcp.SequenceVarElement_SetUnperformed(self, unperformed)
3649
3650 def __eq__(self, element):
3651 return _pywrapcp.SequenceVarElement___eq__(self, element)
3652
3653 def __ne__(self, element):
3654 return _pywrapcp.SequenceVarElement___ne__(self, element)
3655 __swig_destroy__ = _pywrapcp.delete_SequenceVarElement
3656
3657# Register SequenceVarElement in _pywrapcp:
3658_pywrapcp.SequenceVarElement_swigregister(SequenceVarElement)
3660 r"""
3661 An Assignment is a variable -> domains mapping, used
3662 to report solutions to the user.
3663 """
3664
3665 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3666
3667 def __init__(self, *args, **kwargs):
3668 raise AttributeError("No constructor defined")
3669 __repr__ = _swig_repr
3670
3671 def Clear(self):
3672 return _pywrapcp.Assignment_Clear(self)
3673
3674 def Empty(self):
3675 return _pywrapcp.Assignment_Empty(self)
3676
3677 def Size(self):
3678 return _pywrapcp.Assignment_Size(self)
3679
3680 def NumIntVars(self):
3681 return _pywrapcp.Assignment_NumIntVars(self)
3682
3684 return _pywrapcp.Assignment_NumIntervalVars(self)
3685
3687 return _pywrapcp.Assignment_NumSequenceVars(self)
3688
3689 def Store(self):
3690 return _pywrapcp.Assignment_Store(self)
3691
3692 def Restore(self):
3693 return _pywrapcp.Assignment_Restore(self)
3694
3695 def Load(self, *args):
3696 r"""
3697 Loads an assignment from a file; does not add variables to the
3698 assignment (only the variables contained in the assignment are modified).
3699 """
3700 return _pywrapcp.Assignment_Load(self, *args)
3701
3702 def Save(self, *args):
3703 r"""Saves the assignment to a file."""
3704 return _pywrapcp.Assignment_Save(self, *args)
3705
3706 def AddObjective(self, v):
3707 return _pywrapcp.Assignment_AddObjective(self, v)
3708
3709 def Objective(self):
3710 return _pywrapcp.Assignment_Objective(self)
3711
3712 def HasObjective(self):
3713 return _pywrapcp.Assignment_HasObjective(self)
3714
3715 def ObjectiveMin(self):
3716 return _pywrapcp.Assignment_ObjectiveMin(self)
3717
3718 def ObjectiveMax(self):
3719 return _pywrapcp.Assignment_ObjectiveMax(self)
3720
3722 return _pywrapcp.Assignment_ObjectiveValue(self)
3723
3725 return _pywrapcp.Assignment_ObjectiveBound(self)
3726
3727 def SetObjectiveMin(self, m):
3728 return _pywrapcp.Assignment_SetObjectiveMin(self, m)
3729
3730 def SetObjectiveMax(self, m):
3731 return _pywrapcp.Assignment_SetObjectiveMax(self, m)
3732
3733 def SetObjectiveValue(self, value):
3734 return _pywrapcp.Assignment_SetObjectiveValue(self, value)
3735
3736 def SetObjectiveRange(self, l, u):
3737 return _pywrapcp.Assignment_SetObjectiveRange(self, l, u)
3738
3739 def Min(self, var):
3740 return _pywrapcp.Assignment_Min(self, var)
3741
3742 def Max(self, var):
3743 return _pywrapcp.Assignment_Max(self, var)
3744
3745 def Value(self, var):
3746 return _pywrapcp.Assignment_Value(self, var)
3747
3748 def Bound(self, var):
3749 return _pywrapcp.Assignment_Bound(self, var)
3750
3751 def SetMin(self, var, m):
3752 return _pywrapcp.Assignment_SetMin(self, var, m)
3753
3754 def SetMax(self, var, m):
3755 return _pywrapcp.Assignment_SetMax(self, var, m)
3756
3757 def SetRange(self, var, l, u):
3758 return _pywrapcp.Assignment_SetRange(self, var, l, u)
3759
3760 def SetValue(self, var, value):
3761 return _pywrapcp.Assignment_SetValue(self, var, value)
3762
3763 def StartMin(self, var):
3764 return _pywrapcp.Assignment_StartMin(self, var)
3765
3766 def StartMax(self, var):
3767 return _pywrapcp.Assignment_StartMax(self, var)
3768
3769 def StartValue(self, var):
3770 return _pywrapcp.Assignment_StartValue(self, var)
3771
3772 def DurationMin(self, var):
3773 return _pywrapcp.Assignment_DurationMin(self, var)
3774
3775 def DurationMax(self, var):
3776 return _pywrapcp.Assignment_DurationMax(self, var)
3777
3778 def DurationValue(self, var):
3779 return _pywrapcp.Assignment_DurationValue(self, var)
3780
3781 def EndMin(self, var):
3782 return _pywrapcp.Assignment_EndMin(self, var)
3783
3784 def EndMax(self, var):
3785 return _pywrapcp.Assignment_EndMax(self, var)
3786
3787 def EndValue(self, var):
3788 return _pywrapcp.Assignment_EndValue(self, var)
3789
3790 def PerformedMin(self, var):
3791 return _pywrapcp.Assignment_PerformedMin(self, var)
3792
3793 def PerformedMax(self, var):
3794 return _pywrapcp.Assignment_PerformedMax(self, var)
3795
3796 def PerformedValue(self, var):
3797 return _pywrapcp.Assignment_PerformedValue(self, var)
3798
3799 def SetStartMin(self, var, m):
3800 return _pywrapcp.Assignment_SetStartMin(self, var, m)
3801
3802 def SetStartMax(self, var, m):
3803 return _pywrapcp.Assignment_SetStartMax(self, var, m)
3804
3805 def SetStartRange(self, var, mi, ma):
3806 return _pywrapcp.Assignment_SetStartRange(self, var, mi, ma)
3807
3808 def SetStartValue(self, var, value):
3809 return _pywrapcp.Assignment_SetStartValue(self, var, value)
3810
3811 def SetDurationMin(self, var, m):
3812 return _pywrapcp.Assignment_SetDurationMin(self, var, m)
3813
3814 def SetDurationMax(self, var, m):
3815 return _pywrapcp.Assignment_SetDurationMax(self, var, m)
3816
3817 def SetDurationRange(self, var, mi, ma):
3818 return _pywrapcp.Assignment_SetDurationRange(self, var, mi, ma)
3819
3820 def SetDurationValue(self, var, value):
3821 return _pywrapcp.Assignment_SetDurationValue(self, var, value)
3822
3823 def SetEndMin(self, var, m):
3824 return _pywrapcp.Assignment_SetEndMin(self, var, m)
3825
3826 def SetEndMax(self, var, m):
3827 return _pywrapcp.Assignment_SetEndMax(self, var, m)
3828
3829 def SetEndRange(self, var, mi, ma):
3830 return _pywrapcp.Assignment_SetEndRange(self, var, mi, ma)
3831
3832 def SetEndValue(self, var, value):
3833 return _pywrapcp.Assignment_SetEndValue(self, var, value)
3834
3835 def SetPerformedMin(self, var, m):
3836 return _pywrapcp.Assignment_SetPerformedMin(self, var, m)
3837
3838 def SetPerformedMax(self, var, m):
3839 return _pywrapcp.Assignment_SetPerformedMax(self, var, m)
3840
3841 def SetPerformedRange(self, var, mi, ma):
3842 return _pywrapcp.Assignment_SetPerformedRange(self, var, mi, ma)
3843
3844 def SetPerformedValue(self, var, value):
3845 return _pywrapcp.Assignment_SetPerformedValue(self, var, value)
3846
3847 def Add(self, *args):
3848 return _pywrapcp.Assignment_Add(self, *args)
3849
3850 def ForwardSequence(self, var):
3851 return _pywrapcp.Assignment_ForwardSequence(self, var)
3852
3853 def BackwardSequence(self, var):
3854 return _pywrapcp.Assignment_BackwardSequence(self, var)
3855
3856 def Unperformed(self, var):
3857 return _pywrapcp.Assignment_Unperformed(self, var)
3858
3859 def SetSequence(self, var, forward_sequence, backward_sequence, unperformed):
3860 return _pywrapcp.Assignment_SetSequence(self, var, forward_sequence, backward_sequence, unperformed)
3861
3862 def SetForwardSequence(self, var, forward_sequence):
3863 return _pywrapcp.Assignment_SetForwardSequence(self, var, forward_sequence)
3864
3865 def SetBackwardSequence(self, var, backward_sequence):
3866 return _pywrapcp.Assignment_SetBackwardSequence(self, var, backward_sequence)
3867
3868 def SetUnperformed(self, var, unperformed):
3869 return _pywrapcp.Assignment_SetUnperformed(self, var, unperformed)
3870
3871 def Activate(self, *args):
3872 return _pywrapcp.Assignment_Activate(self, *args)
3873
3874 def Deactivate(self, *args):
3875 return _pywrapcp.Assignment_Deactivate(self, *args)
3876
3877 def Activated(self, *args):
3878 return _pywrapcp.Assignment_Activated(self, *args)
3879
3880 def DebugString(self):
3881 return _pywrapcp.Assignment_DebugString(self)
3882
3884 return _pywrapcp.Assignment_IntVarContainer(self)
3885
3887 return _pywrapcp.Assignment_MutableIntVarContainer(self)
3888
3890 return _pywrapcp.Assignment_IntervalVarContainer(self)
3891
3893 return _pywrapcp.Assignment_MutableIntervalVarContainer(self)
3894
3896 return _pywrapcp.Assignment_SequenceVarContainer(self)
3897
3899 return _pywrapcp.Assignment_MutableSequenceVarContainer(self)
3900
3901 def __eq__(self, assignment):
3902 return _pywrapcp.Assignment___eq__(self, assignment)
3903
3904 def __ne__(self, assignment):
3905 return _pywrapcp.Assignment___ne__(self, assignment)
3906
3907# Register Assignment in _pywrapcp:
3908_pywrapcp.Assignment_swigregister(Assignment)
3909
3910def __lshift__(*args):
3911 return _pywrapcp.__lshift__(*args)
3913 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
3914
3915 def __init__(self, *args, **kwargs):
3916 raise AttributeError("No constructor defined")
3917 __repr__ = _swig_repr
3918
3920 r"""
3921 *Overload 1:*
3922 Dimensions are additional constraints than can restrict what is
3923 possible with the pack constraint. It can be used to set capacity
3924 limits, to count objects per bin, to compute unassigned
3925 penalties...
3926 This dimension imposes that for all bins b, the weighted sum
3927 (weights[i]) of all objects i assigned to 'b' is less or equal
3928 'bounds[b]'.
3929
3930 |
3931
3932 *Overload 2:*
3933 This dimension imposes that for all bins b, the weighted sum
3934 (weights->Run(i)) of all objects i assigned to 'b' is less or
3935 equal to 'bounds[b]'. Ownership of the callback is transferred to
3936 the pack constraint.
3937
3938 |
3939
3940 *Overload 3:*
3941 This dimension imposes that for all bins b, the weighted sum
3942 (weights->Run(i, b) of all objects i assigned to 'b' is less or
3943 equal to 'bounds[b]'. Ownership of the callback is transferred to
3944 the pack constraint.
3945 """
3946 return _pywrapcp.Pack_AddWeightedSumLessOrEqualConstantDimension(self, *args)
3947
3949 r"""
3950 *Overload 1:*
3951 This dimension imposes that for all bins b, the weighted sum
3952 (weights[i]) of all objects i assigned to 'b' is equal to loads[b].
3953
3954 |
3955
3956 *Overload 2:*
3957 This dimension imposes that for all bins b, the weighted sum
3958 (weights->Run(i, b)) of all objects i assigned to 'b' is equal to
3959 loads[b].
3960 """
3961 return _pywrapcp.Pack_AddWeightedSumEqualVarDimension(self, *args)
3962
3964 r"""
3965 This dimension imposes:
3966 forall b in bins,
3967 sum (i in items: usage[i] * is_assigned(i, b)) <= capacity[b]
3968 where is_assigned(i, b) is true if and only if item i is assigned
3969 to the bin b.
3970
3971 This can be used to model shapes of items by linking variables of
3972 the same item on parallel dimensions with an allowed assignment
3973 constraint.
3974 """
3975 return _pywrapcp.Pack_AddSumVariableWeightsLessOrEqualConstantDimension(self, usage, capacity)
3976
3977 def AddWeightedSumOfAssignedDimension(self, weights, cost_var):
3978 r"""
3979 This dimension enforces that cost_var == sum of weights[i] for
3980 all objects 'i' assigned to a bin.
3981 """
3982 return _pywrapcp.Pack_AddWeightedSumOfAssignedDimension(self, weights, cost_var)
3983
3984 def AddCountUsedBinDimension(self, count_var):
3985 r"""
3986 This dimension links 'count_var' to the actual number of bins used in the
3987 pack.
3988 """
3989 return _pywrapcp.Pack_AddCountUsedBinDimension(self, count_var)
3990
3992 r"""
3993 This dimension links 'count_var' to the actual number of items
3994 assigned to a bin in the pack.
3995 """
3996 return _pywrapcp.Pack_AddCountAssignedItemsDimension(self, count_var)
3997
3998 def Post(self):
3999 return _pywrapcp.Pack_Post(self)
4000
4002 return _pywrapcp.Pack_InitialPropagateWrapper(self)
4003
4004 def DebugString(self):
4005 return _pywrapcp.Pack_DebugString(self)
4006
4007# Register Pack in _pywrapcp:
4008_pywrapcp.Pack_swigregister(Pack)
4010 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4011
4012 def __init__(self, *args, **kwargs):
4013 raise AttributeError("No constructor defined - class is abstract")
4014 __repr__ = _swig_repr
4015
4016 def SequenceVar(self):
4017 r"""Creates a sequence variable from the constraint."""
4018 return _pywrapcp.DisjunctiveConstraint_SequenceVar(self)
4019
4020 def SetTransitionTime(self, transition_time):
4021 r"""
4022 Add a transition time between intervals. It forces the distance between
4023 the end of interval a and start of interval b that follows it to be at
4024 least transition_time(a, b). This function must always return
4025 a positive or null value.
4026 """
4027 return _pywrapcp.DisjunctiveConstraint_SetTransitionTime(self, transition_time)
4028
4029 def TransitionTime(self, before_index, after_index):
4030 return _pywrapcp.DisjunctiveConstraint_TransitionTime(self, before_index, after_index)
4031
4032# Register DisjunctiveConstraint in _pywrapcp:
4033_pywrapcp.DisjunctiveConstraint_swigregister(DisjunctiveConstraint)
4034class RevInteger(object):
4035 r"""
4036 This class adds reversibility to a POD type.
4037 It contains the stamp optimization. i.e. the SaveValue call is done
4038 only once per node of the search tree. Please note that actual
4039 stamps always starts at 1, thus an initial value of 0 will always
4040 trigger the first SaveValue.
4041 """
4042
4043 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4044 __repr__ = _swig_repr
4045
4046 def __init__(self, val):
4047 _pywrapcp.RevInteger_swiginit(self, _pywrapcp.new_RevInteger(val))
4048
4049 def Value(self):
4050 return _pywrapcp.RevInteger_Value(self)
4051
4052 def SetValue(self, s, val):
4053 return _pywrapcp.RevInteger_SetValue(self, s, val)
4054 __swig_destroy__ = _pywrapcp.delete_RevInteger
4055
4056# Register RevInteger in _pywrapcp:
4057_pywrapcp.RevInteger_swigregister(RevInteger)
4059 r"""Subclass of Rev<T> which adds numerical operations."""
4060
4061 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4062 __repr__ = _swig_repr
4063
4064 def __init__(self, val):
4065 _pywrapcp.NumericalRevInteger_swiginit(self, _pywrapcp.new_NumericalRevInteger(val))
4066
4067 def Add(self, s, to_add):
4068 return _pywrapcp.NumericalRevInteger_Add(self, s, to_add)
4069
4070 def Incr(self, s):
4071 return _pywrapcp.NumericalRevInteger_Incr(self, s)
4072
4073 def Decr(self, s):
4074 return _pywrapcp.NumericalRevInteger_Decr(self, s)
4075 __swig_destroy__ = _pywrapcp.delete_NumericalRevInteger
4076
4077# Register NumericalRevInteger in _pywrapcp:
4078_pywrapcp.NumericalRevInteger_swigregister(NumericalRevInteger)
4079class RevBool(object):
4080 r"""
4081 This class adds reversibility to a POD type.
4082 It contains the stamp optimization. i.e. the SaveValue call is done
4083 only once per node of the search tree. Please note that actual
4084 stamps always starts at 1, thus an initial value of 0 will always
4085 trigger the first SaveValue.
4086 """
4087
4088 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4089 __repr__ = _swig_repr
4090
4091 def __init__(self, val):
4092 _pywrapcp.RevBool_swiginit(self, _pywrapcp.new_RevBool(val))
4093
4094 def Value(self):
4095 return _pywrapcp.RevBool_Value(self)
4096
4097 def SetValue(self, s, val):
4098 return _pywrapcp.RevBool_SetValue(self, s, val)
4099 __swig_destroy__ = _pywrapcp.delete_RevBool
4100
4101# Register RevBool in _pywrapcp:
4102_pywrapcp.RevBool_swigregister(RevBool)
4103class IntVarContainer(object):
4104 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4105
4106 def __init__(self, *args, **kwargs):
4107 raise AttributeError("No constructor defined")
4108 __repr__ = _swig_repr
4109
4110 def Contains(self, var):
4111 return _pywrapcp.IntVarContainer_Contains(self, var)
4112
4113 def Element(self, index):
4114 return _pywrapcp.IntVarContainer_Element(self, index)
4115
4116 def Size(self):
4117 return _pywrapcp.IntVarContainer_Size(self)
4118
4119 def Store(self):
4120 return _pywrapcp.IntVarContainer_Store(self)
4121
4122 def Restore(self):
4123 return _pywrapcp.IntVarContainer_Restore(self)
4124
4125 def __eq__(self, container):
4126 r"""
4127 Returns true if this and 'container' both represent the same V* -> E map.
4128 Runs in linear time; requires that the == operator on the type E is well
4129 defined.
4130 """
4131 return _pywrapcp.IntVarContainer___eq__(self, container)
4132
4133 def __ne__(self, container):
4134 return _pywrapcp.IntVarContainer___ne__(self, container)
4135 __swig_destroy__ = _pywrapcp.delete_IntVarContainer
4136
4137# Register IntVarContainer in _pywrapcp:
4138_pywrapcp.IntVarContainer_swigregister(IntVarContainer)
4140 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4141
4142 def __init__(self, *args, **kwargs):
4143 raise AttributeError("No constructor defined")
4144 __repr__ = _swig_repr
4145
4146 def Contains(self, var):
4147 return _pywrapcp.IntervalVarContainer_Contains(self, var)
4148
4149 def Element(self, index):
4150 return _pywrapcp.IntervalVarContainer_Element(self, index)
4151
4152 def Size(self):
4153 return _pywrapcp.IntervalVarContainer_Size(self)
4154
4155 def Store(self):
4156 return _pywrapcp.IntervalVarContainer_Store(self)
4157
4158 def Restore(self):
4159 return _pywrapcp.IntervalVarContainer_Restore(self)
4160
4161 def __eq__(self, container):
4162 r"""
4163 Returns true if this and 'container' both represent the same V* -> E map.
4164 Runs in linear time; requires that the == operator on the type E is well
4165 defined.
4166 """
4167 return _pywrapcp.IntervalVarContainer___eq__(self, container)
4168
4169 def __ne__(self, container):
4170 return _pywrapcp.IntervalVarContainer___ne__(self, container)
4171 __swig_destroy__ = _pywrapcp.delete_IntervalVarContainer
4172
4173# Register IntervalVarContainer in _pywrapcp:
4174_pywrapcp.IntervalVarContainer_swigregister(IntervalVarContainer)
4176 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4177
4178 def __init__(self, *args, **kwargs):
4179 raise AttributeError("No constructor defined")
4180 __repr__ = _swig_repr
4181
4182 def Contains(self, var):
4183 return _pywrapcp.SequenceVarContainer_Contains(self, var)
4184
4185 def Element(self, index):
4186 return _pywrapcp.SequenceVarContainer_Element(self, index)
4187
4188 def Size(self):
4189 return _pywrapcp.SequenceVarContainer_Size(self)
4190
4191 def Store(self):
4192 return _pywrapcp.SequenceVarContainer_Store(self)
4193
4194 def Restore(self):
4195 return _pywrapcp.SequenceVarContainer_Restore(self)
4196
4197 def __eq__(self, container):
4198 r"""
4199 Returns true if this and 'container' both represent the same V* -> E map.
4200 Runs in linear time; requires that the == operator on the type E is well
4201 defined.
4202 """
4203 return _pywrapcp.SequenceVarContainer___eq__(self, container)
4204
4205 def __ne__(self, container):
4206 return _pywrapcp.SequenceVarContainer___ne__(self, container)
4207 __swig_destroy__ = _pywrapcp.delete_SequenceVarContainer
4208
4209# Register SequenceVarContainer in _pywrapcp:
4210_pywrapcp.SequenceVarContainer_swigregister(SequenceVarContainer)
4212 r"""
4213 The base class for all local search operators.
4214
4215 A local search operator is an object that defines the neighborhood of a
4216 solution. In other words, a neighborhood is the set of solutions which can
4217 be reached from a given solution using an operator.
4218
4219 The behavior of the LocalSearchOperator class is similar to iterators.
4220 The operator is synchronized with an assignment (gives the
4221 current values of the variables); this is done in the Start() method.
4222
4223 Then one can iterate over the neighbors using the MakeNextNeighbor method.
4224 This method returns an assignment which represents the incremental changes
4225 to the current solution. It also returns a second assignment representing
4226 the changes to the last solution defined by the neighborhood operator; this
4227 assignment is empty if the neighborhood operator cannot track this
4228 information.
4229 """
4230
4231 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4232
4233 def __init__(self, *args, **kwargs):
4234 raise AttributeError("No constructor defined - class is abstract")
4235 __repr__ = _swig_repr
4236
4237 def NextNeighbor(self, delta, deltadelta):
4238 return _pywrapcp.LocalSearchOperator_NextNeighbor(self, delta, deltadelta)
4239
4240 def Start(self, assignment):
4241 return _pywrapcp.LocalSearchOperator_Start(self, assignment)
4242 def __disown__(self):
4243 self.this.disown()
4244 _pywrapcp.disown_LocalSearchOperator(self)
4245 return weakref.proxy(self)
4246
4247# Register LocalSearchOperator in _pywrapcp:
4248_pywrapcp.LocalSearchOperator_swigregister(LocalSearchOperator)
4250 r"""
4251 Specialization of LocalSearchOperator built from an array of IntVars
4252 which specifies the scope of the operator.
4253 This class also takes care of storing current variable values in Start(),
4254 keeps track of changes done by the operator and builds the delta.
4255 The Deactivate() method can be used to perform Large Neighborhood Search.
4256 """
4257
4258 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4259 __repr__ = _swig_repr
4260
4261 def __init__(self, vars, keep_inverse_values=False):
4262 if self.__class__ == IntVarLocalSearchOperator:
4263 _self = None
4264 else:
4265 _self = self
4266 _pywrapcp.IntVarLocalSearchOperator_swiginit(self, _pywrapcp.new_IntVarLocalSearchOperator(_self, vars, keep_inverse_values))
4267 __swig_destroy__ = _pywrapcp.delete_IntVarLocalSearchOperator
4268
4269 def Start(self, assignment):
4270 r"""
4271 This method should not be overridden. Override OnStart() instead which is
4272 called before exiting this method.
4273 """
4274 return _pywrapcp.IntVarLocalSearchOperator_Start(self, assignment)
4275
4276 def IsIncremental(self):
4277 return _pywrapcp.IntVarLocalSearchOperator_IsIncremental(self)
4278
4279 def Size(self):
4280 return _pywrapcp.IntVarLocalSearchOperator_Size(self)
4281
4282 def Value(self, index):
4283 r"""
4284 Returns the value in the current assignment of the variable of given
4285 index.
4286 """
4287 return _pywrapcp.IntVarLocalSearchOperator_Value(self, index)
4288
4289 def Var(self, index):
4290 r"""Returns the variable of given index."""
4291 return _pywrapcp.IntVarLocalSearchOperator_Var(self, index)
4292
4293 def OldValue(self, index):
4294 return _pywrapcp.IntVarLocalSearchOperator_OldValue(self, index)
4295
4296 def PrevValue(self, index):
4297 return _pywrapcp.IntVarLocalSearchOperator_PrevValue(self, index)
4298
4299 def SetValue(self, index, value):
4300 return _pywrapcp.IntVarLocalSearchOperator_SetValue(self, index, value)
4301
4302 def Activated(self, index):
4303 return _pywrapcp.IntVarLocalSearchOperator_Activated(self, index)
4304
4305 def Activate(self, index):
4306 return _pywrapcp.IntVarLocalSearchOperator_Activate(self, index)
4307
4308 def Deactivate(self, index):
4309 return _pywrapcp.IntVarLocalSearchOperator_Deactivate(self, index)
4310
4311 def AddVars(self, vars):
4312 return _pywrapcp.IntVarLocalSearchOperator_AddVars(self, vars)
4313
4314 def OnStart(self):
4315 r"""
4316 Called by Start() after synchronizing the operator with the current
4317 assignment. Should be overridden instead of Start() to avoid calling
4318 IntVarLocalSearchOperator::Start explicitly.
4319 """
4320 return _pywrapcp.IntVarLocalSearchOperator_OnStart(self)
4321
4322 def NextNeighbor(self, delta, deltadelta):
4323 r"""
4324 OnStart() should really be protected, but then SWIG doesn't see it. So we
4325 make it public, but only subclasses should access to it (to override it).
4326 Redefines MakeNextNeighbor to export a simpler interface. The calls to
4327 ApplyChanges() and RevertChanges() are factored in this method, hiding
4328 both delta and deltadelta from subclasses which only need to override
4329 MakeOneNeighbor().
4330 Therefore this method should not be overridden. Override MakeOneNeighbor()
4331 instead.
4332 """
4333 return _pywrapcp.IntVarLocalSearchOperator_NextNeighbor(self, delta, deltadelta)
4334
4335 def OneNeighbor(self):
4336 r"""
4337 Creates a new neighbor. It returns false when the neighborhood is
4338 completely explored.
4339 MakeNextNeighbor() in a subclass of IntVarLocalSearchOperator.
4340 """
4341 return _pywrapcp.IntVarLocalSearchOperator_OneNeighbor(self)
4342 def __disown__(self):
4343 self.this.disown()
4344 _pywrapcp.disown_IntVarLocalSearchOperator(self)
4345 return weakref.proxy(self)
4346
4347# Register IntVarLocalSearchOperator in _pywrapcp:
4348_pywrapcp.IntVarLocalSearchOperator_swigregister(IntVarLocalSearchOperator)
4350 r"""
4351 This is the base class for building an Lns operator. An Lns fragment is a
4352 collection of variables which will be relaxed. Fragments are built with
4353 NextFragment(), which returns false if there are no more fragments to build.
4354 Optionally one can override InitFragments, which is called from
4355 LocalSearchOperator::Start to initialize fragment data.
4356
4357 Here's a sample relaxing one variable at a time:
4358
4359 class OneVarLns : public BaseLns {
4360 public:
4361 OneVarLns(const std::vector<IntVar*>& vars) : BaseLns(vars), index_(0) {}
4362 virtual ~OneVarLns() {}
4363 virtual void InitFragments() { index_ = 0; }
4364 virtual bool NextFragment() {
4365 const int size = Size();
4366 if (index_ < size) {
4367 AppendToFragment(index_);
4368 ++index_;
4369 return true;
4370 } else {
4371 return false;
4372 }
4373 }
4374
4375 private:
4376 int index_;
4377 };
4378 """
4379
4380 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4381 __repr__ = _swig_repr
4382
4383 def __init__(self, vars):
4384 if self.__class__ == BaseLns:
4385 _self = None
4386 else:
4387 _self = self
4388 _pywrapcp.BaseLns_swiginit(self, _pywrapcp.new_BaseLns(_self, vars))
4389 __swig_destroy__ = _pywrapcp.delete_BaseLns
4390
4391 def InitFragments(self):
4392 return _pywrapcp.BaseLns_InitFragments(self)
4393
4394 def NextFragment(self):
4395 return _pywrapcp.BaseLns_NextFragment(self)
4396
4397 def AppendToFragment(self, index):
4398 return _pywrapcp.BaseLns_AppendToFragment(self, index)
4399
4400 def FragmentSize(self):
4401 return _pywrapcp.BaseLns_FragmentSize(self)
4402
4403 def __getitem__(self, index):
4404 return _pywrapcp.BaseLns___getitem__(self, index)
4405
4406 def __len__(self):
4407 return _pywrapcp.BaseLns___len__(self)
4408 def __disown__(self):
4409 self.this.disown()
4410 _pywrapcp.disown_BaseLns(self)
4411 return weakref.proxy(self)
4412
4413# Register BaseLns in _pywrapcp:
4414_pywrapcp.BaseLns_swigregister(BaseLns)
4416 r"""
4417 Defines operators which change the value of variables;
4418 each neighbor corresponds to *one* modified variable.
4419 Sub-classes have to define ModifyValue which determines what the new
4420 variable value is going to be (given the current value and the variable).
4421 """
4422
4423 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4424 __repr__ = _swig_repr
4425
4426 def __init__(self, vars):
4427 if self.__class__ == ChangeValue:
4428 _self = None
4429 else:
4430 _self = self
4431 _pywrapcp.ChangeValue_swiginit(self, _pywrapcp.new_ChangeValue(_self, vars))
4432 __swig_destroy__ = _pywrapcp.delete_ChangeValue
4433
4434 def ModifyValue(self, index, value):
4435 return _pywrapcp.ChangeValue_ModifyValue(self, index, value)
4436
4437 def OneNeighbor(self):
4438 r"""This method should not be overridden. Override ModifyValue() instead."""
4439 return _pywrapcp.ChangeValue_OneNeighbor(self)
4440 def __disown__(self):
4441 self.this.disown()
4442 _pywrapcp.disown_ChangeValue(self)
4443 return weakref.proxy(self)
4444
4445# Register ChangeValue in _pywrapcp:
4446_pywrapcp.ChangeValue_swigregister(ChangeValue)
4448 r"""
4449 Local Search Filters are used for fast neighbor pruning.
4450 Filtering a move is done in several phases:
4451 - in the Relax phase, filters determine which parts of their internals
4452 will be changed by the candidate, and modify intermediary State
4453 - in the Accept phase, filters check that the candidate is feasible,
4454 - if the Accept phase succeeds, the solver may decide to trigger a
4455 Synchronize phase that makes filters change their internal representation
4456 to the last candidate,
4457 - otherwise (Accept fails or the solver does not want to synchronize),
4458 a Revert phase makes filters erase any intermediary State generated by the
4459 Relax and Accept phases.
4460 A given filter has phases called with the following pattern:
4461 (Relax.Accept.Synchronize | Relax.Accept.Revert | Relax.Revert)*.
4462 Filters's Revert() is always called in the reverse order their Accept() was
4463 called, to allow late filters to use state done/undone by early filters'
4464 Accept()/Revert().
4465 """
4466
4467 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4468
4469 def __init__(self, *args, **kwargs):
4470 raise AttributeError("No constructor defined - class is abstract")
4471 __repr__ = _swig_repr
4472
4473 def Accept(self, delta, deltadelta, objective_min, objective_max):
4474 r"""
4475 Accepts a "delta" given the assignment with which the filter has been
4476 synchronized; the delta holds the variables which have been modified and
4477 their new value.
4478 If the filter represents a part of the global objective, its contribution
4479 must be between objective_min and objective_max.
4480 Sample: supposing one wants to maintain a[0,1] + b[0,1] <= 1,
4481 for the assignment (a,1), (b,0), the delta (b,1) will be rejected
4482 but the delta (a,0) will be accepted.
4483 TODO(user): Remove arguments when there are no more need for those.
4484 """
4485 return _pywrapcp.LocalSearchFilter_Accept(self, delta, deltadelta, objective_min, objective_max)
4486
4487 def IsIncremental(self):
4488 return _pywrapcp.LocalSearchFilter_IsIncremental(self)
4489
4490 def Synchronize(self, assignment, delta):
4491 r"""
4492 Synchronizes the filter with the current solution, delta being the
4493 difference with the solution passed to the previous call to Synchronize()
4494 or IncrementalSynchronize(). 'delta' can be used to incrementally
4495 synchronizing the filter with the new solution by only considering the
4496 changes in delta.
4497 """
4498 return _pywrapcp.LocalSearchFilter_Synchronize(self, assignment, delta)
4499 __swig_destroy__ = _pywrapcp.delete_LocalSearchFilter
4500
4501# Register LocalSearchFilter in _pywrapcp:
4502_pywrapcp.LocalSearchFilter_swigregister(LocalSearchFilter)
4504 r"""
4505 Filter manager: when a move is made, filters are executed to decide whether
4506 the solution is feasible and compute parts of the new cost. This class
4507 schedules filter execution and composes costs as a sum.
4508 """
4509
4510 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4511 __repr__ = _swig_repr
4512
4513 def DebugString(self):
4514 return _pywrapcp.LocalSearchFilterManager_DebugString(self)
4515
4516 def __init__(self, *args):
4517 _pywrapcp.LocalSearchFilterManager_swiginit(self, _pywrapcp.new_LocalSearchFilterManager(*args))
4518
4519 def Accept(self, monitor, delta, deltadelta, objective_min, objective_max):
4520 r"""
4521 Returns true iff all filters return true, and the sum of their accepted
4522 objectives is between objective_min and objective_max.
4523 The monitor has its Begin/EndFiltering events triggered.
4524 """
4525 return _pywrapcp.LocalSearchFilterManager_Accept(self, monitor, delta, deltadelta, objective_min, objective_max)
4526
4527 def Synchronize(self, assignment, delta):
4528 r"""Synchronizes all filters to assignment."""
4529 return _pywrapcp.LocalSearchFilterManager_Synchronize(self, assignment, delta)
4530 __swig_destroy__ = _pywrapcp.delete_LocalSearchFilterManager
4531
4532# Register LocalSearchFilterManager in _pywrapcp:
4533_pywrapcp.LocalSearchFilterManager_swigregister(LocalSearchFilterManager)
4535 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4536 __repr__ = _swig_repr
4537
4538 def __init__(self, vars):
4539 if self.__class__ == IntVarLocalSearchFilter:
4540 _self = None
4541 else:
4542 _self = self
4543 _pywrapcp.IntVarLocalSearchFilter_swiginit(self, _pywrapcp.new_IntVarLocalSearchFilter(_self, vars))
4544 __swig_destroy__ = _pywrapcp.delete_IntVarLocalSearchFilter
4545
4546 def Synchronize(self, assignment, delta):
4547 r"""
4548 This method should not be overridden. Override OnSynchronize() instead
4549 which is called before exiting this method.
4550 """
4551 return _pywrapcp.IntVarLocalSearchFilter_Synchronize(self, assignment, delta)
4552
4553 def Size(self):
4554 return _pywrapcp.IntVarLocalSearchFilter_Size(self)
4555
4556 def Value(self, index):
4557 return _pywrapcp.IntVarLocalSearchFilter_Value(self, index)
4558
4559 def IndexFromVar(self, var):
4560 return _pywrapcp.IntVarLocalSearchFilter_IndexFromVar(self, var)
4561 def __disown__(self):
4562 self.this.disown()
4563 _pywrapcp.disown_IntVarLocalSearchFilter(self)
4564 return weakref.proxy(self)
4565
4566# Register IntVarLocalSearchFilter in _pywrapcp:
4567_pywrapcp.IntVarLocalSearchFilter_swigregister(IntVarLocalSearchFilter)
4569 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4570
4571 def __init__(self, *args, **kwargs):
4572 raise AttributeError("No constructor defined - class is abstract")
4573 __repr__ = _swig_repr
4574
4575 def Min(self):
4576 return _pywrapcp.BooleanVar_Min(self)
4577
4578 def SetMin(self, m):
4579 return _pywrapcp.BooleanVar_SetMin(self, m)
4580
4581 def Max(self):
4582 return _pywrapcp.BooleanVar_Max(self)
4583
4584 def SetMax(self, m):
4585 return _pywrapcp.BooleanVar_SetMax(self, m)
4586
4587 def SetRange(self, mi, ma):
4588 return _pywrapcp.BooleanVar_SetRange(self, mi, ma)
4589
4590 def Bound(self):
4591 return _pywrapcp.BooleanVar_Bound(self)
4592
4593 def Value(self):
4594 return _pywrapcp.BooleanVar_Value(self)
4595
4596 def RemoveValue(self, v):
4597 return _pywrapcp.BooleanVar_RemoveValue(self, v)
4598
4599 def RemoveInterval(self, l, u):
4600 return _pywrapcp.BooleanVar_RemoveInterval(self, l, u)
4601
4602 def WhenBound(self, d):
4603 return _pywrapcp.BooleanVar_WhenBound(self, d)
4604
4605 def WhenRange(self, d):
4606 return _pywrapcp.BooleanVar_WhenRange(self, d)
4607
4608 def WhenDomain(self, d):
4609 return _pywrapcp.BooleanVar_WhenDomain(self, d)
4610
4611 def Size(self):
4612 return _pywrapcp.BooleanVar_Size(self)
4613
4614 def Contains(self, v):
4615 return _pywrapcp.BooleanVar_Contains(self, v)
4616
4617 def HoleIteratorAux(self, reversible):
4618 return _pywrapcp.BooleanVar_HoleIteratorAux(self, reversible)
4619
4620 def DomainIteratorAux(self, reversible):
4621 return _pywrapcp.BooleanVar_DomainIteratorAux(self, reversible)
4622
4623 def DebugString(self):
4624 return _pywrapcp.BooleanVar_DebugString(self)
4625
4626# Register BooleanVar in _pywrapcp:
4627_pywrapcp.BooleanVar_swigregister(BooleanVar)
4628
4630 def ApplyWrapper(self, solver):
4631 try:
4632 self.Apply(solver)
4633 except Exception as e:
4634 if 'CP Solver fail' in str(e):
4635 solver.ShouldFail()
4636 else:
4637 raise
4638
4639 def RefuteWrapper(self, solver):
4640 try:
4641 self.Refute(solver)
4642 except Exception as e:
4643 if 'CP Solver fail' in str(e):
4644 solver.ShouldFail()
4645 else:
4646 raise
4647
4648 def DebugString(self):
4649 return "PyDecision"
4650
4651
4653 def NextWrapper(self, solver):
4654 try:
4655 return self.Next(solver)
4656 except Exception as e:
4657 if 'CP Solver fail' in str(e):
4658 return solver.FailDecision()
4659 else:
4660 raise
4661
4662 def DebugString(self):
4663 return "PyDecisionBuilder"
4664
4665
4667 def RunWrapper(self, solver):
4668 try:
4669 self.Run(solver)
4670 except Exception as e:
4671 if 'CP Solver fail' in str(e):
4672 solver.ShouldFail()
4673 else:
4674 raise
4675
4676 def DebugString(self):
4677 return "PyDemon"
4678
4679
4681 def __init__(self, ct, method, delayed, *args):
4682 super().__init__()
4683 self.__constraint = ct
4684 self.__method = method
4685 self.__delayed = delayed
4686 self.__args = args
4687
4688 def Run(self, solver):
4689 self.__method(self.__constraint, *self.__args)
4690
4691 def Priority(self):
4692 return Solver.DELAYED_PRIORITY if self.__delayed else Solver.NORMAL_PRIORITY
4693
4694 def DebugString(self):
4695 return 'PyConstraintDemon'
4696
4697
4699 def __init__(self, solver):
4700 super().__init__(solver)
4701 self.__demons = []
4702
4703 def Demon(self, method, *args):
4704 demon = PyConstraintDemon(self, method, False, *args)
4705 self.__demons.append(demon)
4706 return demon
4707
4708 def DelayedDemon(self, method, *args):
4709 demon = PyConstraintDemon(self, method, True, *args)
4710 self.__demons.append(demon)
4711 return demon
4712
4714 return self.solver().ConstraintInitialPropagateCallback(self)
4715
4717 return self.solver().DelayedConstraintInitialPropagateCallback(self)
4718
4720 try:
4721 self.InitialPropagate()
4722 except Exception as e:
4723 if 'CP Solver fail' in str(e):
4724 self.solver().ShouldFail()
4725 else:
4726 raise
4727
4728 def DebugString(self):
4729 return "PyConstraint"
4730
4732 r"""
4733 Manager for any NodeIndex <-> variable index conversion.
4734 The routing solver uses variable indices internally and through
4735 its API.
4736 These variable indices are tricky to manage directly because one Node can
4737 correspond to a multitude of variables, depending on the number of times
4738 they appear in the model, and if they're used as start and/or end points.
4739 This class aims to simplify variable index usage, allowing users to use
4740 NodeIndex instead.
4741
4742 Usage:
4743
4744 .. code-block:: c++
4745
4746 auto starts_ends = ...; /// These are NodeIndex.
4747 RoutingIndexManager manager(10, 4, starts_ends); // 10 nodes, 4 vehicles.
4748 RoutingModel model(manager);
4749
4750 Then, use 'manager.NodeToIndex(node)' whenever model requires a variable
4751 index.
4752
4753 Note: the mapping between node indices and variables indices is subject to
4754 change so no assumption should be made on it. The only guarantee is that
4755 indices range between 0 and n-1, where n = number of vehicles * 2 (for start
4756 and end nodes) + number of non-start or end nodes.
4757 """
4758
4759 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4760 __repr__ = _swig_repr
4761
4762 def __init__(self, *args):
4763 r"""
4764 *Overload 1:*
4765 Creates a NodeIndex to variable index mapping for a problem
4766 containing 'num_nodes', 'num_vehicles' and the given starts and ends for
4767 each vehicle. If used, any start/end arrays have to have exactly
4768 'num_vehicles' elements.
4769 :type num_nodes: int
4770 :param num_nodes: Number of nodes in the problem.
4771 :type num_vehicles: int
4772 :param num_vehicles: Number of vehicles in the problem.
4773 :type depot: operations_research::RoutingIndexManager::NodeIndex
4774 :param depot: 'start' and 'end'
4775 NodeIndex for all vehicles.
4776
4777 |
4778
4779 *Overload 2:*
4780 Creates a NodeIndex to variable index mapping.
4781 :type num_nodes: int
4782 :param num_nodes: Number of nodes in the problem.
4783 :type num_vehicles: int
4784 :param num_vehicles: Number of vehicles in the problem.
4785 :type starts: std::vector< operations_research::RoutingIndexManager::NodeIndex >
4786 :param starts: Array containing the start NodeIndex for each vehicle.
4787 :type ends: std::vector< operations_research::RoutingIndexManager::NodeIndex >
4788 :param ends: Array containing the end NodeIndex for each vehicle.
4789 Notes: **starts** and **ends** arrays must have **exactly** 'num_vehicles'
4790 elements.
4791 """
4792 _pywrapcp.RoutingIndexManager_swiginit(self, _pywrapcp.new_RoutingIndexManager(*args))
4793
4795 return _pywrapcp.RoutingIndexManager_GetNumberOfNodes(self)
4796
4798 return _pywrapcp.RoutingIndexManager_GetNumberOfVehicles(self)
4799
4801 return _pywrapcp.RoutingIndexManager_GetNumberOfIndices(self)
4802
4803 def GetStartIndex(self, vehicle):
4804 return _pywrapcp.RoutingIndexManager_GetStartIndex(self, vehicle)
4805
4806 def GetEndIndex(self, vehicle):
4807 return _pywrapcp.RoutingIndexManager_GetEndIndex(self, vehicle)
4808
4809 def NodeToIndex(self, node):
4810 return _pywrapcp.RoutingIndexManager_NodeToIndex(self, node)
4811
4812 def IndexToNode(self, index):
4813 return _pywrapcp.RoutingIndexManager_IndexToNode(self, index)
4814 __swig_destroy__ = _pywrapcp.delete_RoutingIndexManager
4815
4816# Register RoutingIndexManager in _pywrapcp:
4817_pywrapcp.RoutingIndexManager_swigregister(RoutingIndexManager)
4818
4820 return _pywrapcp.DefaultRoutingModelParameters()
4821
4823 return _pywrapcp.DefaultRoutingSearchParameters()
4824
4826 r"""
4827 Returns an empty std::string if the routing search parameters are valid, and
4828 a non-empty, human readable error description if they're not.
4829 """
4830 return _pywrapcp.FindErrorInRoutingSearchParameters(search_parameters)
4831BOOL_UNSPECIFIED = _pywrapcp.BOOL_UNSPECIFIED
4832BOOL_FALSE = _pywrapcp.BOOL_FALSE
4833BOOL_TRUE = _pywrapcp.BOOL_TRUE
4835 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4836 __repr__ = _swig_repr
4837
4838 def __init__(self):
4839 _pywrapcp.FirstSolutionStrategy_swiginit(self, _pywrapcp.new_FirstSolutionStrategy())
4840 __swig_destroy__ = _pywrapcp.delete_FirstSolutionStrategy
4841
4842# Register FirstSolutionStrategy in _pywrapcp:
4843_pywrapcp.FirstSolutionStrategy_swigregister(FirstSolutionStrategy)
4845 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4846 __repr__ = _swig_repr
4847
4848 def __init__(self):
4849 _pywrapcp.LocalSearchMetaheuristic_swiginit(self, _pywrapcp.new_LocalSearchMetaheuristic())
4850 __swig_destroy__ = _pywrapcp.delete_LocalSearchMetaheuristic
4851
4852# Register LocalSearchMetaheuristic in _pywrapcp:
4853_pywrapcp.LocalSearchMetaheuristic_swigregister(LocalSearchMetaheuristic)
4855 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4856 __repr__ = _swig_repr
4857
4858 def __init__(self):
4859 _pywrapcp.RoutingSearchStatus_swiginit(self, _pywrapcp.new_RoutingSearchStatus())
4860 __swig_destroy__ = _pywrapcp.delete_RoutingSearchStatus
4861
4862# Register RoutingSearchStatus in _pywrapcp:
4863_pywrapcp.RoutingSearchStatus_swigregister(RoutingSearchStatus)
4864class PathsMetadata(object):
4865 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4866 __repr__ = _swig_repr
4867
4868 def __init__(self, manager):
4869 _pywrapcp.PathsMetadata_swiginit(self, _pywrapcp.new_PathsMetadata(manager))
4870
4871 def IsStart(self, node):
4872 return _pywrapcp.PathsMetadata_IsStart(self, node)
4873
4874 def IsEnd(self, node):
4875 return _pywrapcp.PathsMetadata_IsEnd(self, node)
4876
4877 def GetPath(self, start_or_end_node):
4878 return _pywrapcp.PathsMetadata_GetPath(self, start_or_end_node)
4879
4880 def NumPaths(self):
4881 return _pywrapcp.PathsMetadata_NumPaths(self)
4882
4883 def Paths(self):
4884 return _pywrapcp.PathsMetadata_Paths(self)
4885
4886 def Starts(self):
4887 return _pywrapcp.PathsMetadata_Starts(self)
4888
4889 def Start(self, path):
4890 return _pywrapcp.PathsMetadata_Start(self, path)
4891
4892 def End(self, path):
4893 return _pywrapcp.PathsMetadata_End(self, path)
4894
4895 def Ends(self):
4896 return _pywrapcp.PathsMetadata_Ends(self)
4897 __swig_destroy__ = _pywrapcp.delete_PathsMetadata
4898
4899# Register PathsMetadata in _pywrapcp:
4900_pywrapcp.PathsMetadata_swigregister(PathsMetadata)
4902 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4903 __repr__ = _swig_repr
4904 num_cp_sat_calls_in_lp_scheduling = property(_pywrapcp.RoutingSearchStats_num_cp_sat_calls_in_lp_scheduling_get, _pywrapcp.RoutingSearchStats_num_cp_sat_calls_in_lp_scheduling_set)
4905 num_glop_calls_in_lp_scheduling = property(_pywrapcp.RoutingSearchStats_num_glop_calls_in_lp_scheduling_get, _pywrapcp.RoutingSearchStats_num_glop_calls_in_lp_scheduling_set)
4906 num_min_cost_flow_calls = property(_pywrapcp.RoutingSearchStats_num_min_cost_flow_calls_get, _pywrapcp.RoutingSearchStats_num_min_cost_flow_calls_set)
4907 num_cp_sat_calls_in_routing = property(_pywrapcp.RoutingSearchStats_num_cp_sat_calls_in_routing_get, _pywrapcp.RoutingSearchStats_num_cp_sat_calls_in_routing_set)
4908 num_generalized_cp_sat_calls_in_routing = property(_pywrapcp.RoutingSearchStats_num_generalized_cp_sat_calls_in_routing_get, _pywrapcp.RoutingSearchStats_num_generalized_cp_sat_calls_in_routing_set)
4909
4910 def __init__(self):
4911 _pywrapcp.RoutingSearchStats_swiginit(self, _pywrapcp.new_RoutingSearchStats())
4912 __swig_destroy__ = _pywrapcp.delete_RoutingSearchStats
4913
4914# Register RoutingSearchStats in _pywrapcp:
4915_pywrapcp.RoutingSearchStats_swigregister(RoutingSearchStats)
4916class RoutingModel(object):
4917 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
4918 __repr__ = _swig_repr
4919 PICKUP_AND_DELIVERY_NO_ORDER = _pywrapcp.RoutingModel_PICKUP_AND_DELIVERY_NO_ORDER
4920 r"""Any precedence is accepted."""
4921 PICKUP_AND_DELIVERY_LIFO = _pywrapcp.RoutingModel_PICKUP_AND_DELIVERY_LIFO
4922 r"""Deliveries must be performed in reverse order of pickups."""
4923 PICKUP_AND_DELIVERY_FIFO = _pywrapcp.RoutingModel_PICKUP_AND_DELIVERY_FIFO
4924 r"""Deliveries must be performed in the same order as pickups."""
4925
4926 def __init__(self, *args):
4927 r"""
4928 Constructor taking an index manager. The version which does not take
4929 RoutingModelParameters is equivalent to passing
4930 DefaultRoutingModelParameters().
4931 """
4932 _pywrapcp.RoutingModel_swiginit(self, _pywrapcp.new_RoutingModel(*args))
4933 __swig_destroy__ = _pywrapcp.delete_RoutingModel
4934 kTransitEvaluatorSignUnknown = _pywrapcp.RoutingModel_kTransitEvaluatorSignUnknown
4935 kTransitEvaluatorSignPositiveOrZero = _pywrapcp.RoutingModel_kTransitEvaluatorSignPositiveOrZero
4936 kTransitEvaluatorSignNegativeOrZero = _pywrapcp.RoutingModel_kTransitEvaluatorSignNegativeOrZero
4937
4939 r"""
4940 Registers 'callback' and returns its index.
4941 The sign parameter allows to notify the solver that the callback only
4942 return values of the given sign. This can help the solver, but passing
4943 an incorrect sign may crash in non-opt compilation mode, and yield
4944 incorrect results in opt.
4945 """
4946 return _pywrapcp.RoutingModel_RegisterUnaryTransitVector(self, values)
4947
4949 return _pywrapcp.RoutingModel_RegisterUnaryTransitCallback(self, *args)
4950
4951 def RegisterTransitMatrix(self, values):
4952 return _pywrapcp.RoutingModel_RegisterTransitMatrix(self, values)
4953
4954 def RegisterTransitCallback(self, *args):
4955 return _pywrapcp.RoutingModel_RegisterTransitCallback(self, *args)
4956
4958 return _pywrapcp.RoutingModel_RegisterCumulDependentTransitCallback(self, callback)
4959
4960 def TransitCallback(self, callback_index):
4961 return _pywrapcp.RoutingModel_TransitCallback(self, callback_index)
4962
4963 def UnaryTransitCallbackOrNull(self, callback_index):
4964 return _pywrapcp.RoutingModel_UnaryTransitCallbackOrNull(self, callback_index)
4965
4966 def CumulDependentTransitCallback(self, callback_index):
4967 return _pywrapcp.RoutingModel_CumulDependentTransitCallback(self, callback_index)
4968
4969 def AddDimension(self, evaluator_index, slack_max, capacity, fix_start_cumul_to_zero, name):
4970 r"""
4971 Model creation
4972 Methods to add dimensions to routes; dimensions represent quantities
4973 accumulated at nodes along the routes. They represent quantities such as
4974 weights or volumes carried along the route, or distance or times.
4975 Quantities at a node are represented by "cumul" variables and the increase
4976 or decrease of quantities between nodes are represented by "transit"
4977 variables. These variables are linked as follows:
4978 if j == next(i), cumul(j) = cumul(i) + transit(i, j) + slack(i)
4979 where slack is a positive slack variable (can represent waiting times for
4980 a time dimension).
4981 Setting the value of fix_start_cumul_to_zero to true will force the
4982 "cumul" variable of the start node of all vehicles to be equal to 0.
4983 Creates a dimension where the transit variable is constrained to be
4984 equal to evaluator(i, next(i)); 'slack_max' is the upper bound of the
4985 slack variable and 'capacity' is the upper bound of the cumul variables.
4986 'name' is the name used to reference the dimension; this name is used to
4987 get cumul and transit variables from the routing model.
4988 Returns false if a dimension with the same name has already been created
4989 (and doesn't create the new dimension).
4990 Takes ownership of the callback 'evaluator'.
4991 """
4992 return _pywrapcp.RoutingModel_AddDimension(self, evaluator_index, slack_max, capacity, fix_start_cumul_to_zero, name)
4993
4994 def AddDimensionWithVehicleTransits(self, evaluator_indices, slack_max, capacity, fix_start_cumul_to_zero, name):
4995 return _pywrapcp.RoutingModel_AddDimensionWithVehicleTransits(self, evaluator_indices, slack_max, capacity, fix_start_cumul_to_zero, name)
4996
4997 def AddDimensionWithVehicleCapacity(self, evaluator_index, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name):
4998 return _pywrapcp.RoutingModel_AddDimensionWithVehicleCapacity(self, evaluator_index, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
4999
5000 def AddDimensionWithVehicleTransitAndCapacity(self, evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name):
5001 return _pywrapcp.RoutingModel_AddDimensionWithVehicleTransitAndCapacity(self, evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
5002
5003 def AddDimensionWithCumulDependentVehicleTransitAndCapacity(self, fixed_evaluator_indices, cumul_dependent_evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name):
5004 r"""
5005 Creates a dimension where the transit variable on arc i->j is the sum of:
5006 - A "fixed" transit value, obtained from the fixed_evaluator_index for
5007 this vehicle, referencing evaluators in transit_evaluators_, and
5008 - A FloatSlopePiecewiseLinearFunction of the cumul of node i, obtained
5009 from the cumul_dependent_evaluator_index of this vehicle, pointing to
5010 an evaluator in cumul_dependent_transit_evaluators_.
5011 """
5012 return _pywrapcp.RoutingModel_AddDimensionWithCumulDependentVehicleTransitAndCapacity(self, fixed_evaluator_indices, cumul_dependent_evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
5013
5014 def AddConstantDimensionWithSlack(self, value, capacity, slack_max, fix_start_cumul_to_zero, name):
5015 r"""
5016 Creates a dimension where the transit variable is constrained to be
5017 equal to 'value'; 'capacity' is the upper bound of the cumul variables.
5018 'name' is the name used to reference the dimension; this name is used to
5019 get cumul and transit variables from the routing model.
5020 Returns a pair consisting of an index to the registered unary transit
5021 callback and a bool denoting whether the dimension has been created.
5022 It is false if a dimension with the same name has already been created
5023 (and doesn't create the new dimension but still register a new callback).
5024 """
5025 return _pywrapcp.RoutingModel_AddConstantDimensionWithSlack(self, value, capacity, slack_max, fix_start_cumul_to_zero, name)
5026
5027 def AddConstantDimension(self, value, capacity, fix_start_cumul_to_zero, name):
5028 return _pywrapcp.RoutingModel_AddConstantDimension(self, value, capacity, fix_start_cumul_to_zero, name)
5029
5030 def AddVectorDimension(self, values, capacity, fix_start_cumul_to_zero, name):
5031 r"""
5032 Creates a dimension where the transit variable is constrained to be
5033 equal to 'values[i]' for node i; 'capacity' is the upper bound of
5034 the cumul variables. 'name' is the name used to reference the dimension;
5035 this name is used to get cumul and transit variables from the routing
5036 model.
5037 Returns a pair consisting of an index to the registered unary transit
5038 callback and a bool denoting whether the dimension has been created.
5039 It is false if a dimension with the same name has already been created
5040 (and doesn't create the new dimension but still register a new callback).
5041 """
5042 return _pywrapcp.RoutingModel_AddVectorDimension(self, values, capacity, fix_start_cumul_to_zero, name)
5043
5044 def AddMatrixDimension(self, values, capacity, fix_start_cumul_to_zero, name):
5045 r"""
5046 Creates a dimension where the transit variable is constrained to be
5047 equal to 'values[i][next(i)]' for node i; 'capacity' is the upper bound of
5048 the cumul variables. 'name' is the name used to reference the dimension;
5049 this name is used to get cumul and transit variables from the routing
5050 model.
5051 Returns a pair consisting of an index to the registered transit callback
5052 and a bool denoting whether the dimension has been created.
5053 It is false if a dimension with the same name has already been created
5054 (and doesn't create the new dimension but still register a new callback).
5055 """
5056 return _pywrapcp.RoutingModel_AddMatrixDimension(self, values, capacity, fix_start_cumul_to_zero, name)
5057
5059 r"""Outputs the names of all dimensions added to the routing engine."""
5060 return _pywrapcp.RoutingModel_GetAllDimensionNames(self)
5061
5062 def GetDimensions(self):
5063 r"""Returns all dimensions of the model."""
5064 return _pywrapcp.RoutingModel_GetDimensions(self)
5065
5067 r"""Returns dimensions with soft or vehicle span costs."""
5068 return _pywrapcp.RoutingModel_GetDimensionsWithSoftOrSpanCosts(self)
5069
5071 r"""Returns dimensions for which all transit evaluators are unary."""
5072 return _pywrapcp.RoutingModel_GetUnaryDimensions(self)
5073
5075 r"""Returns the dimensions which have [global|local]_dimension_optimizers_."""
5076 return _pywrapcp.RoutingModel_GetDimensionsWithGlobalCumulOptimizers(self)
5077
5079 return _pywrapcp.RoutingModel_GetDimensionsWithLocalCumulOptimizers(self)
5080
5081 def HasGlobalCumulOptimizer(self, dimension):
5082 r"""Returns whether the given dimension has global/local cumul optimizers."""
5083 return _pywrapcp.RoutingModel_HasGlobalCumulOptimizer(self, dimension)
5084
5085 def HasLocalCumulOptimizer(self, dimension):
5086 return _pywrapcp.RoutingModel_HasLocalCumulOptimizer(self, dimension)
5087
5089 r"""
5090 Returns the global/local dimension cumul optimizer for a given dimension,
5091 or nullptr if there is none.
5092 """
5093 return _pywrapcp.RoutingModel_GetMutableGlobalCumulLPOptimizer(self, dimension)
5094
5096 return _pywrapcp.RoutingModel_GetMutableGlobalCumulMPOptimizer(self, dimension)
5097
5099 return _pywrapcp.RoutingModel_GetMutableLocalCumulLPOptimizer(self, dimension)
5100
5102 return _pywrapcp.RoutingModel_GetMutableLocalCumulMPOptimizer(self, dimension)
5103
5104 def HasDimension(self, dimension_name):
5105 r"""Returns true if a dimension exists for a given dimension name."""
5106 return _pywrapcp.RoutingModel_HasDimension(self, dimension_name)
5107
5108 def GetDimensionOrDie(self, dimension_name):
5109 r"""Returns a dimension from its name. Dies if the dimension does not exist."""
5110 return _pywrapcp.RoutingModel_GetDimensionOrDie(self, dimension_name)
5111
5112 def GetMutableDimension(self, dimension_name):
5113 r"""
5114 Returns a dimension from its name. Returns nullptr if the dimension does
5115 not exist.
5116 """
5117 return _pywrapcp.RoutingModel_GetMutableDimension(self, dimension_name)
5118
5119 def SetPrimaryConstrainedDimension(self, dimension_name):
5120 r"""
5121 Set the given dimension as "primary constrained". As of August 2013, this
5122 is only used by ArcIsMoreConstrainedThanArc().
5123 "dimension" must be the name of an existing dimension, or be empty, in
5124 which case there will not be a primary dimension after this call.
5125 """
5126 return _pywrapcp.RoutingModel_SetPrimaryConstrainedDimension(self, dimension_name)
5127
5129 r"""Get the primary constrained dimension, or an empty string if it is unset."""
5130 return _pywrapcp.RoutingModel_GetPrimaryConstrainedDimension(self)
5131
5132 def GetResourceGroup(self, rg_index):
5133 return _pywrapcp.RoutingModel_GetResourceGroup(self, rg_index)
5134
5136 r"""
5137 Returns the indices of resource groups for this dimension. This method can
5138 only be called after the model has been closed.
5139 """
5140 return _pywrapcp.RoutingModel_GetDimensionResourceGroupIndices(self, dimension)
5141
5143 r"""
5144 Returns the index of the resource group attached to the dimension.
5145 DCHECKS that there's exactly one resource group for this dimension.
5146 """
5147 return _pywrapcp.RoutingModel_GetDimensionResourceGroupIndex(self, dimension)
5148 PENALIZE_ONCE = _pywrapcp.RoutingModel_PENALIZE_ONCE
5149 PENALIZE_PER_INACTIVE = _pywrapcp.RoutingModel_PENALIZE_PER_INACTIVE
5150
5151 def AddDisjunction(self, *args):
5152 r"""
5153 Adds a disjunction constraint on the indices.
5154 Exactly 'max_cardinality' of the indices are active.
5155
5156 If a penalty is given, at most 'max_cardinality' of the indices can be
5157 active, and if less are active, 'penalty' is payed per inactive index if
5158 the penalty cost is set to `PENALIZE_PER_INACTIVE`.
5159 This is equivalent to adding the constraint:
5160 p + Sum(i)active[i] == max_cardinality
5161 where p is an integer variable.
5162 If the penalty cost is set to `PENALIZE_ONCE`, then 'penalty' is payed
5163 once if there are less than `max_cardinality` of the indices active.
5164 This is equivalent to adding the constraint:
5165 p == (Sum(i)active[i] != max_cardinality)
5166 where p is a boolean variable.
5167 The following cost is added to the cost function: p * penalty.
5168 :type penalty: int, in, optional
5169 :param penalty: must be positive to make the disjunction optional; a
5170 negative penalty will force 'max_cardinality' indices of the disjunction
5171 to be performed, and therefore p == 0.
5172 Note: passing a vector with a single index will model an optional index
5173 with a penalty cost if it is not visited.
5174 Warning: Start and end indices of any vehicle cannot be part of a
5175 disjunction.
5176 """
5177 return _pywrapcp.RoutingModel_AddDisjunction(self, *args)
5178
5179 def GetDisjunctionIndices(self, index):
5180 r"""Returns the indices of the disjunctions to which an index belongs."""
5181 return _pywrapcp.RoutingModel_GetDisjunctionIndices(self, index)
5182
5183 def GetDisjunctionPenalty(self, index):
5184 r"""Returns the penalty of the node disjunction of index 'index'."""
5185 return _pywrapcp.RoutingModel_GetDisjunctionPenalty(self, index)
5186
5188 r"""
5189 Returns the maximum number of possible active nodes of the node
5190 disjunction of index 'index'.
5191 """
5192 return _pywrapcp.RoutingModel_GetDisjunctionMaxCardinality(self, index)
5193
5195 r"""
5196 Returns the 'PenaltyCostBehavior' used by the disjunction of index
5197 'index'.
5198 """
5199 return _pywrapcp.RoutingModel_GetDisjunctionPenaltyCostBehavior(self, index)
5200
5202 r"""Returns the number of node disjunctions in the model."""
5203 return _pywrapcp.RoutingModel_GetNumberOfDisjunctions(self)
5204
5206 r"""
5207 Returns true if the model contains mandatory disjunctions (ones with
5208 kNoPenalty as penalty).
5209 """
5210 return _pywrapcp.RoutingModel_HasMandatoryDisjunctions(self)
5211
5213 r"""
5214 Returns true if the model contains at least one disjunction which is
5215 constrained by its max_cardinality.
5216 """
5217 return _pywrapcp.RoutingModel_HasMaxCardinalityConstrainedDisjunctions(self)
5218
5220 r"""
5221 Returns the list of all perfect binary disjunctions, as pairs of variable
5222 indices: a disjunction is "perfect" when its variables do not appear in
5223 any other disjunction. Each pair is sorted (lowest variable index first),
5224 and the output vector is also sorted (lowest pairs first).
5225 """
5226 return _pywrapcp.RoutingModel_GetPerfectBinaryDisjunctions(self)
5227
5229 r"""
5230 SPECIAL: Makes the solver ignore all the disjunctions whose active
5231 variables are all trivially zero (i.e. Max() == 0), by setting their
5232 max_cardinality to 0.
5233 This can be useful when using the BaseBinaryDisjunctionNeighborhood
5234 operators, in the context of arc-based routing.
5235 """
5236 return _pywrapcp.RoutingModel_IgnoreDisjunctionsAlreadyForcedToZero(self)
5237
5238 def AddSoftSameVehicleConstraint(self, indices, cost):
5239 r"""
5240 Adds a soft constraint to force a set of variable indices to be on the
5241 same vehicle. If all nodes are not on the same vehicle, each extra vehicle
5242 used adds 'cost' to the cost function.
5243 TODO(user): Extend this to allow nodes/indices to be on the same given
5244 set of vehicle.
5245 """
5246 return _pywrapcp.RoutingModel_AddSoftSameVehicleConstraint(self, indices, cost)
5247
5249 r"""Returns the number of soft same vehicle constraints in the model."""
5250 return _pywrapcp.RoutingModel_GetNumberOfSoftSameVehicleConstraints(self)
5251
5253 r"""
5254 Returns the indices of the nodes in the soft same vehicle constraint of
5255 index 'index'.
5256 """
5257 return _pywrapcp.RoutingModel_GetSoftSameVehicleIndices(self, index)
5258
5259 def GetSoftSameVehicleCost(self, index):
5260 r"""Returns the cost of the soft same vehicle constraint of index 'index'."""
5261 return _pywrapcp.RoutingModel_GetSoftSameVehicleCost(self, index)
5262
5263 def SetAllowedVehiclesForIndex(self, vehicles, index):
5264 r"""
5265 Sets the vehicles which can visit a given node. If the node is in a
5266 disjunction, this will not prevent it from being unperformed.
5267 Specifying an empty vector of vehicles has no effect (all vehicles
5268 will be allowed to visit the node).
5269 """
5270 return _pywrapcp.RoutingModel_SetAllowedVehiclesForIndex(self, vehicles, index)
5271
5272 def IsVehicleAllowedForIndex(self, vehicle, index):
5273 r"""Returns true if a vehicle is allowed to visit a given node."""
5274 return _pywrapcp.RoutingModel_IsVehicleAllowedForIndex(self, vehicle, index)
5275
5276 def AddPickupAndDelivery(self, pickup, delivery):
5277 r"""
5278 Notifies that index1 and index2 form a pair of nodes which should belong
5279 to the same route. This methods helps the search find better solutions,
5280 especially in the local search phase.
5281 It should be called each time you have an equality constraint linking
5282 the vehicle variables of two node (including for instance pickup and
5283 delivery problems):
5284 Solver* const solver = routing.solver();
5285 int64_t index1 = manager.NodeToIndex(node1);
5286 int64_t index2 = manager.NodeToIndex(node2);
5287 solver->AddConstraint(solver->MakeEquality(
5288 routing.VehicleVar(index1),
5289 routing.VehicleVar(index2)));
5290 routing.AddPickupAndDelivery(index1, index2);
5291 """
5292 return _pywrapcp.RoutingModel_AddPickupAndDelivery(self, pickup, delivery)
5293
5294 def AddPickupAndDeliverySets(self, pickup_disjunction, delivery_disjunction):
5295 r"""
5296 Same as AddPickupAndDelivery but notifying that the performed node from
5297 the disjunction of index 'pickup_disjunction' is on the same route as the
5298 performed node from the disjunction of index 'delivery_disjunction'.
5299 """
5300 return _pywrapcp.RoutingModel_AddPickupAndDeliverySets(self, pickup_disjunction, delivery_disjunction)
5301
5302 def GetPickupPosition(self, node_index):
5303 r"""Returns the pickup and delivery positions where the node is a pickup."""
5304 return _pywrapcp.RoutingModel_GetPickupPosition(self, node_index)
5305
5306 def GetDeliveryPosition(self, node_index):
5307 r"""Returns the pickup and delivery positions where the node is a delivery."""
5308 return _pywrapcp.RoutingModel_GetDeliveryPosition(self, node_index)
5309
5310 def IsPickup(self, node_index):
5311 r"""Returns whether the node is a pickup (resp. delivery)."""
5312 return _pywrapcp.RoutingModel_IsPickup(self, node_index)
5313
5314 def IsDelivery(self, node_index):
5315 return _pywrapcp.RoutingModel_IsDelivery(self, node_index)
5316
5318 r"""
5319 Sets the Pickup and delivery policy of all vehicles. It is equivalent to
5320 calling SetPickupAndDeliveryPolicyOfVehicle on all vehicles.
5321 """
5322 return _pywrapcp.RoutingModel_SetPickupAndDeliveryPolicyOfAllVehicles(self, policy)
5323
5324 def SetPickupAndDeliveryPolicyOfVehicle(self, policy, vehicle):
5325 return _pywrapcp.RoutingModel_SetPickupAndDeliveryPolicyOfVehicle(self, policy, vehicle)
5326
5328 return _pywrapcp.RoutingModel_GetPickupAndDeliveryPolicyOfVehicle(self, vehicle)
5329
5331 r"""
5332 Returns the number of non-start/end nodes which do not appear in a
5333 pickup/delivery pair.
5334 """
5335 return _pywrapcp.RoutingModel_GetNumOfSingletonNodes(self)
5336
5337 def GetFirstMatchingPickupDeliverySibling(self, node, is_match):
5338 return _pywrapcp.RoutingModel_GetFirstMatchingPickupDeliverySibling(self, node, is_match)
5339 TYPE_ADDED_TO_VEHICLE = _pywrapcp.RoutingModel_TYPE_ADDED_TO_VEHICLE
5340 r"""When visited, the number of types 'T' on the vehicle increases by one."""
5341 ADDED_TYPE_REMOVED_FROM_VEHICLE = _pywrapcp.RoutingModel_ADDED_TYPE_REMOVED_FROM_VEHICLE
5342 r"""
5343 When visited, one instance of type 'T' previously added to the route
5344 (TYPE_ADDED_TO_VEHICLE), if any, is removed from the vehicle.
5345 If the type was not previously added to the route or all added instances
5346 have already been removed, this visit has no effect on the types.
5347 """
5348 TYPE_ON_VEHICLE_UP_TO_VISIT = _pywrapcp.RoutingModel_TYPE_ON_VEHICLE_UP_TO_VISIT
5349 r"""
5350 With the following policy, the visit enforces that type 'T' is
5351 considered on the route from its start until this node is visited.
5352 """
5353 TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED = _pywrapcp.RoutingModel_TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED
5354 r"""
5355 The visit doesn't have an impact on the number of types 'T' on the
5356 route, as it's (virtually) added and removed directly.
5357 This policy can be used for visits which are part of an incompatibility
5358 or requirement set without affecting the type count on the route.
5359 """
5360
5361 def SetVisitType(self, index, type, type_policy):
5362 return _pywrapcp.RoutingModel_SetVisitType(self, index, type, type_policy)
5363
5364 def GetVisitType(self, index):
5365 return _pywrapcp.RoutingModel_GetVisitType(self, index)
5366
5367 def GetSingleNodesOfType(self, type):
5368 return _pywrapcp.RoutingModel_GetSingleNodesOfType(self, type)
5369
5370 def GetPairIndicesOfType(self, type):
5371 return _pywrapcp.RoutingModel_GetPairIndicesOfType(self, type)
5372
5373 def GetVisitTypePolicy(self, index):
5374 return _pywrapcp.RoutingModel_GetVisitTypePolicy(self, index)
5375
5377 return _pywrapcp.RoutingModel_GetNumberOfVisitTypes(self)
5378
5379 def AddHardTypeIncompatibility(self, type1, type2):
5380 r"""
5381 Incompatibilities:
5382 Two nodes with "hard" incompatible types cannot share the same route at
5383 all, while with a "temporal" incompatibility they can't be on the same
5384 route at the same time.
5385 NOTE: To avoid unnecessary memory reallocations, it is recommended to only
5386 add incompatibilities once all the existing types have been set with
5387 SetVisitType().
5388 """
5389 return _pywrapcp.RoutingModel_AddHardTypeIncompatibility(self, type1, type2)
5390
5391 def AddTemporalTypeIncompatibility(self, type1, type2):
5392 return _pywrapcp.RoutingModel_AddTemporalTypeIncompatibility(self, type1, type2)
5393
5395 r"""Returns visit types incompatible with a given type."""
5396 return _pywrapcp.RoutingModel_GetHardTypeIncompatibilitiesOfType(self, type)
5397
5399 return _pywrapcp.RoutingModel_GetTemporalTypeIncompatibilitiesOfType(self, type)
5400
5402 r"""
5403 Returns true iff any hard (resp. temporal) type incompatibilities have
5404 been added to the model.
5405 """
5406 return _pywrapcp.RoutingModel_HasHardTypeIncompatibilities(self)
5407
5409 return _pywrapcp.RoutingModel_HasTemporalTypeIncompatibilities(self)
5410
5411 def AddSameVehicleRequiredTypeAlternatives(self, dependent_type, required_type_alternatives):
5412 r"""
5413 Requirements:
5414 NOTE: As of 2019-04, cycles in the requirement graph are not supported,
5415 and lead to the dependent nodes being skipped if possible (otherwise
5416 the model is considered infeasible).
5417 The following functions specify that "dependent_type" requires at least
5418 one of the types in "required_type_alternatives".
5419
5420 For same-vehicle requirements, a node of dependent type type_D requires at
5421 least one node of type type_R among the required alternatives on the same
5422 route.
5423 NOTE: To avoid unnecessary memory reallocations, it is recommended to only
5424 add requirements once all the existing types have been set with
5425 SetVisitType().
5426 """
5427 return _pywrapcp.RoutingModel_AddSameVehicleRequiredTypeAlternatives(self, dependent_type, required_type_alternatives)
5428
5429 def AddRequiredTypeAlternativesWhenAddingType(self, dependent_type, required_type_alternatives):
5430 r"""
5431 If type_D depends on type_R when adding type_D, any node_D of type_D and
5432 VisitTypePolicy TYPE_ADDED_TO_VEHICLE or
5433 TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED requires at least one type_R on its
5434 vehicle at the time node_D is visited.
5435 """
5436 return _pywrapcp.RoutingModel_AddRequiredTypeAlternativesWhenAddingType(self, dependent_type, required_type_alternatives)
5437
5438 def AddRequiredTypeAlternativesWhenRemovingType(self, dependent_type, required_type_alternatives):
5439 r"""
5440 The following requirements apply when visiting dependent nodes that remove
5441 their type from the route, i.e. type_R must be on the vehicle when type_D
5442 of VisitTypePolicy ADDED_TYPE_REMOVED_FROM_VEHICLE,
5443 TYPE_ON_VEHICLE_UP_TO_VISIT or TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED is
5444 visited.
5445 """
5446 return _pywrapcp.RoutingModel_AddRequiredTypeAlternativesWhenRemovingType(self, dependent_type, required_type_alternatives)
5447
5449 r"""
5450 Returns the set of same-vehicle requirement alternatives for the given
5451 type.
5452 """
5453 return _pywrapcp.RoutingModel_GetSameVehicleRequiredTypeAlternativesOfType(self, type)
5454
5456 r"""Returns the set of requirement alternatives when adding the given type."""
5457 return _pywrapcp.RoutingModel_GetRequiredTypeAlternativesWhenAddingType(self, type)
5458
5460 r"""Returns the set of requirement alternatives when removing the given type."""
5461 return _pywrapcp.RoutingModel_GetRequiredTypeAlternativesWhenRemovingType(self, type)
5462
5464 r"""
5465 Returns true iff any same-route (resp. temporal) type requirements have
5466 been added to the model.
5467 """
5468 return _pywrapcp.RoutingModel_HasSameVehicleTypeRequirements(self)
5469
5471 return _pywrapcp.RoutingModel_HasTemporalTypeRequirements(self)
5472
5474 r"""
5475 Returns true iff the model has any incompatibilities or requirements set
5476 on node types.
5477 """
5478 return _pywrapcp.RoutingModel_HasTypeRegulations(self)
5479
5480 def UnperformedPenalty(self, var_index):
5481 r"""
5482 Get the "unperformed" penalty of a node. This is only well defined if the
5483 node is only part of a single Disjunction, and that disjunction has a
5484 penalty. For forced active nodes returns max int64_t. In all other cases,
5485 this returns 0.
5486 """
5487 return _pywrapcp.RoutingModel_UnperformedPenalty(self, var_index)
5488
5489 def UnperformedPenaltyOrValue(self, default_value, var_index):
5490 r"""
5491 Same as above except that it returns default_value instead of 0 when
5492 penalty is not well defined (default value is passed as first argument to
5493 simplify the usage of the method in a callback).
5494 """
5495 return _pywrapcp.RoutingModel_UnperformedPenaltyOrValue(self, default_value, var_index)
5496
5497 def GetDepot(self):
5498 r"""
5499 Returns the variable index of the first starting or ending node of all
5500 routes. If all routes start and end at the same node (single depot), this
5501 is the node returned.
5502 """
5503 return _pywrapcp.RoutingModel_GetDepot(self)
5504
5505 def SetMaximumNumberOfActiveVehicles(self, max_active_vehicles):
5506 r"""
5507 Constrains the maximum number of active vehicles, aka the number of
5508 vehicles which do not have an empty route. For instance, this can be used
5509 to limit the number of routes in the case where there are fewer drivers
5510 than vehicles and that the fleet of vehicle is heterogeneous.
5511 """
5512 return _pywrapcp.RoutingModel_SetMaximumNumberOfActiveVehicles(self, max_active_vehicles)
5513
5515 r"""Returns the maximum number of active vehicles."""
5516 return _pywrapcp.RoutingModel_GetMaximumNumberOfActiveVehicles(self)
5517
5518 def SetArcCostEvaluatorOfAllVehicles(self, evaluator_index):
5519 r"""
5520 Sets the cost function of the model such that the cost of a segment of a
5521 route between node 'from' and 'to' is evaluator(from, to), whatever the
5522 route or vehicle performing the route.
5523 """
5524 return _pywrapcp.RoutingModel_SetArcCostEvaluatorOfAllVehicles(self, evaluator_index)
5525
5526 def SetArcCostEvaluatorOfVehicle(self, evaluator_index, vehicle):
5527 r"""Sets the cost function for a given vehicle route."""
5528 return _pywrapcp.RoutingModel_SetArcCostEvaluatorOfVehicle(self, evaluator_index, vehicle)
5529
5531 r"""
5532 Sets the fixed cost of all vehicle routes. It is equivalent to calling
5533 SetFixedCostOfVehicle on all vehicle routes.
5534 """
5535 return _pywrapcp.RoutingModel_SetFixedCostOfAllVehicles(self, cost)
5536
5537 def SetFixedCostOfVehicle(self, cost, vehicle):
5538 r"""Sets the fixed cost of one vehicle route."""
5539 return _pywrapcp.RoutingModel_SetFixedCostOfVehicle(self, cost, vehicle)
5540
5541 def GetFixedCostOfVehicle(self, vehicle):
5542 r"""
5543 Returns the route fixed cost taken into account if the route of the
5544 vehicle is not empty, aka there's at least one node on the route other
5545 than the first and last nodes.
5546 """
5547 return _pywrapcp.RoutingModel_GetFixedCostOfVehicle(self, vehicle)
5548
5549 def SetPathEnergyCostOfVehicle(self, force, distance, cost_per_unit, vehicle):
5550 return _pywrapcp.RoutingModel_SetPathEnergyCostOfVehicle(self, force, distance, cost_per_unit, vehicle)
5551
5552 def SetPathEnergyCostsOfVehicle(self, force, distance, threshold, cost_per_unit_below_threshold, cost_per_unit_above_threshold, vehicle):
5553 return _pywrapcp.RoutingModel_SetPathEnergyCostsOfVehicle(self, force, distance, threshold, cost_per_unit_below_threshold, cost_per_unit_above_threshold, vehicle)
5554
5555 def SetAmortizedCostFactorsOfAllVehicles(self, linear_cost_factor, quadratic_cost_factor):
5556 r"""
5557 The following methods set the linear and quadratic cost factors of
5558 vehicles (must be positive values). The default value of these parameters
5559 is zero for all vehicles.
5560
5561 When set, the cost_ of the model will contain terms aiming at reducing the
5562 number of vehicles used in the model, by adding the following to the
5563 objective for every vehicle v:
5564 INDICATOR(v used in the model) *
5565 [linear_cost_factor_of_vehicle_[v]
5566 - quadratic_cost_factor_of_vehicle_[v]*(square of length of route v)]
5567 i.e. for every used vehicle, we add the linear factor as fixed cost, and
5568 subtract the square of the route length multiplied by the quadratic
5569 factor. This second term aims at making the routes as dense as possible.
5570
5571 Sets the linear and quadratic cost factor of all vehicles.
5572 """
5573 return _pywrapcp.RoutingModel_SetAmortizedCostFactorsOfAllVehicles(self, linear_cost_factor, quadratic_cost_factor)
5574
5575 def SetAmortizedCostFactorsOfVehicle(self, linear_cost_factor, quadratic_cost_factor, vehicle):
5576 r"""Sets the linear and quadratic cost factor of the given vehicle."""
5577 return _pywrapcp.RoutingModel_SetAmortizedCostFactorsOfVehicle(self, linear_cost_factor, quadratic_cost_factor, vehicle)
5578
5580 return _pywrapcp.RoutingModel_GetAmortizedLinearCostFactorOfVehicles(self)
5581
5583 return _pywrapcp.RoutingModel_GetAmortizedQuadraticCostFactorOfVehicles(self)
5584
5585 def GetRouteCost(self, route):
5586 return _pywrapcp.RoutingModel_GetRouteCost(self, route)
5587
5588 def SetVehicleUsedWhenEmpty(self, is_used, vehicle):
5589 return _pywrapcp.RoutingModel_SetVehicleUsedWhenEmpty(self, is_used, vehicle)
5590
5591 def IsVehicleUsedWhenEmpty(self, vehicle):
5592 return _pywrapcp.RoutingModel_IsVehicleUsedWhenEmpty(self, vehicle)
5593
5594 def SetFirstSolutionEvaluator(self, evaluator):
5595 r"""
5596 Gets/sets the evaluator used during the search. Only relevant when
5597 RoutingSearchParameters.first_solution_strategy = EVALUATOR_STRATEGY.
5598 Takes ownership of evaluator.
5599 """
5600 return _pywrapcp.RoutingModel_SetFirstSolutionEvaluator(self, evaluator)
5601
5602 def SetFirstSolutionHint(self, hint):
5603 r"""
5604 Adds a hint to be used by first solution strategies. The hint assignment
5605 must outlive the search.
5606 As of 2024-12, only used by LOCAL_CHEAPEST_INSERTION and
5607 LOCAL_CHEAPEST_COST_INSERTION.
5608 """
5609 return _pywrapcp.RoutingModel_SetFirstSolutionHint(self, hint)
5610
5612 r"""Returns the current hint assignment."""
5613 return _pywrapcp.RoutingModel_GetFirstSolutionHint(self)
5614
5615 def AddLocalSearchOperator(self, ls_operator):
5616 r"""
5617 Adds a local search operator to the set of operators used to solve the
5618 vehicle routing problem.
5619 """
5620 return _pywrapcp.RoutingModel_AddLocalSearchOperator(self, ls_operator)
5621
5622 def AddSearchMonitor(self, monitor):
5623 r"""Adds a search monitor to the search used to solve the routing model."""
5624 return _pywrapcp.RoutingModel_AddSearchMonitor(self, monitor)
5625
5626 def AddEnterSearchCallback(self, callback):
5627 return _pywrapcp.RoutingModel_AddEnterSearchCallback(self, callback)
5628
5629 def AddAtSolutionCallback(self, callback, track_unchecked_neighbors=False):
5630 r"""
5631 Adds a callback called each time a solution is found during the search.
5632 This is a shortcut to creating a monitor to call the callback on
5633 AtSolution() and adding it with AddSearchMonitor.
5634 If track_unchecked_neighbors is true, the callback will also be called on
5635 AcceptUncheckedNeighbor() events, which is useful to grab solutions
5636 obtained when solver_parameters.check_solution_period > 1 (aka fastLS).
5637 """
5638 return _pywrapcp.RoutingModel_AddAtSolutionCallback(self, callback, track_unchecked_neighbors)
5639
5641 return _pywrapcp.RoutingModel_AddRestoreDimensionValuesResetCallback(self, callback)
5642
5644 r"""
5645 Adds a variable to minimize in the solution finalizer. The solution
5646 finalizer is called each time a solution is found during the search and
5647 allows to instantiate secondary variables (such as dimension cumul
5648 variables).
5649 """
5650 return _pywrapcp.RoutingModel_AddVariableMinimizedByFinalizer(self, var)
5651
5653 r"""
5654 Adds a variable to maximize in the solution finalizer (see above for
5655 information on the solution finalizer).
5656 """
5657 return _pywrapcp.RoutingModel_AddVariableMaximizedByFinalizer(self, var)
5658
5660 r"""
5661 Adds a variable to minimize in the solution finalizer, with a weighted
5662 priority: the higher the more priority it has.
5663 """
5664 return _pywrapcp.RoutingModel_AddWeightedVariableMinimizedByFinalizer(self, var, cost)
5665
5667 r"""
5668 Adds a variable to maximize in the solution finalizer, with a weighted
5669 priority: the higher the more priority it has.
5670 """
5671 return _pywrapcp.RoutingModel_AddWeightedVariableMaximizedByFinalizer(self, var, cost)
5672
5673 def AddVariableTargetToFinalizer(self, var, target):
5674 r"""
5675 Add a variable to set the closest possible to the target value in the
5676 solution finalizer.
5677 """
5678 return _pywrapcp.RoutingModel_AddVariableTargetToFinalizer(self, var, target)
5679
5680 def AddWeightedVariableTargetToFinalizer(self, var, target, cost):
5681 r"""
5682 Same as above with a weighted priority: the higher the cost, the more
5683 priority it has to be set close to the target value.
5684 """
5685 return _pywrapcp.RoutingModel_AddWeightedVariableTargetToFinalizer(self, var, target, cost)
5686
5687 def CloseModel(self):
5688 r"""
5689 Closes the current routing model; after this method is called, no
5690 modification to the model can be done, but RoutesToAssignment becomes
5691 available. Note that CloseModel() is automatically called by Solve() and
5692 other methods that produce solution.
5693 This is equivalent to calling
5694 CloseModelWithParameters(DefaultRoutingSearchParameters()).
5695 """
5696 return _pywrapcp.RoutingModel_CloseModel(self)
5697
5698 def CloseModelWithParameters(self, search_parameters):
5699 r"""
5700 Same as above taking search parameters (as of 10/2015 some the parameters
5701 have to be set when closing the model).
5702 """
5703 return _pywrapcp.RoutingModel_CloseModelWithParameters(self, search_parameters)
5704
5705 def Solve(self, assignment=None):
5706 r"""
5707 Solves the current routing model; closes the current model.
5708 This is equivalent to calling
5709 SolveWithParameters(DefaultRoutingSearchParameters())
5710 or
5711 SolveFromAssignmentWithParameters(assignment,
5712 DefaultRoutingSearchParameters()).
5713 """
5714 return _pywrapcp.RoutingModel_Solve(self, assignment)
5715
5716 def SolveWithParameters(self, search_parameters, solutions=None):
5717 r"""
5718 Solves the current routing model with the given parameters. If 'solutions'
5719 is specified, it will contain the k best solutions found during the search
5720 (from worst to best, including the one returned by this method), where k
5721 corresponds to the 'number_of_solutions_to_collect' in
5722 'search_parameters'. Note that the Assignment returned by the method and
5723 the ones in solutions are owned by the underlying solver and should not be
5724 deleted.
5725 """
5726 return _pywrapcp.RoutingModel_SolveWithParameters(self, search_parameters, solutions)
5727
5728 def SolveFromAssignmentWithParameters(self, assignment, search_parameters, solutions=None):
5729 r"""
5730 Same as above, except that if assignment is not null, it will be used as
5731 the initial solution.
5732 """
5733 return _pywrapcp.RoutingModel_SolveFromAssignmentWithParameters(self, assignment, search_parameters, solutions)
5734
5735 def FastSolveFromAssignmentWithParameters(self, assignment, search_parameters, check_solution_in_cp, touched=None):
5736 r"""
5737 Improves a given assignment using unchecked local search.
5738 If check_solution_in_cp is true the final solution will be checked with
5739 the CP solver.
5740 As of 11/2023, only works with greedy descent.
5741 """
5742 return _pywrapcp.RoutingModel_FastSolveFromAssignmentWithParameters(self, assignment, search_parameters, check_solution_in_cp, touched)
5743
5744 def SolveFromAssignmentsWithParameters(self, assignments, search_parameters, solutions=None):
5745 r"""
5746 Same as above but will try all assignments in order as first solutions
5747 until one succeeds.
5748 """
5749 return _pywrapcp.RoutingModel_SolveFromAssignmentsWithParameters(self, assignments, search_parameters, solutions)
5750
5751 def SolveWithIteratedLocalSearch(self, search_parameters):
5752 r"""
5753 Solves the current routing model by using an Iterated Local Search
5754 approach.
5755 """
5756 return _pywrapcp.RoutingModel_SolveWithIteratedLocalSearch(self, search_parameters)
5757
5758 def SetAssignmentFromOtherModelAssignment(self, target_assignment, source_model, source_assignment):
5759 r"""
5760 Given a "source_model" and its "source_assignment", resets
5761 "target_assignment" with the IntVar variables (nexts_, and vehicle_vars_
5762 if costs aren't homogeneous across vehicles) of "this" model, with the
5763 values set according to those in "other_assignment".
5764 The objective_element of target_assignment is set to this->cost_.
5765 """
5766 return _pywrapcp.RoutingModel_SetAssignmentFromOtherModelAssignment(self, target_assignment, source_model, source_assignment)
5767
5769 r"""Returns detailed search statistics."""
5770 return _pywrapcp.RoutingModel_GetSubSolverStatistics(self)
5771
5773 r"""
5774 Computes a lower bound to the routing problem solving a linear assignment
5775 problem. The routing model must be closed before calling this method.
5776 Note that problems with node disjunction constraints (including optional
5777 nodes) and non-homogenous costs are not supported (the method returns 0 in
5778 these cases).
5779 """
5780 return _pywrapcp.RoutingModel_ComputeLowerBound(self)
5781
5783 r"""
5784 Returns the current lower bound found by internal solvers during the
5785 search.
5786 """
5787 return _pywrapcp.RoutingModel_objective_lower_bound(self)
5788
5789 def status(self):
5790 r"""Returns the current status of the routing model."""
5791 return _pywrapcp.RoutingModel_status(self)
5792
5793 def search_stats(self):
5794 r"""Returns search statistics."""
5795 return _pywrapcp.RoutingModel_search_stats(self)
5796
5798 r"""Returns the value of the internal enable_deep_serialization_ parameter."""
5799 return _pywrapcp.RoutingModel_enable_deep_serialization(self)
5800
5801 def ApplyLocks(self, locks):
5802 r"""
5803 Applies a lock chain to the next search. 'locks' represents an ordered
5804 vector of nodes representing a partial route which will be fixed during
5805 the next search; it will constrain next variables such that:
5806 next[locks[i]] == locks[i+1].
5807
5808 Returns the next variable at the end of the locked chain; this variable is
5809 not locked. An assignment containing the locks can be obtained by calling
5810 PreAssignment().
5811 """
5812 return _pywrapcp.RoutingModel_ApplyLocks(self, locks)
5813
5814 def ApplyLocksToAllVehicles(self, locks, close_routes):
5815 r"""
5816 Applies lock chains to all vehicles to the next search, such that locks[p]
5817 is the lock chain for route p. Returns false if the locks do not contain
5818 valid routes; expects that the routes do not contain the depots,
5819 i.e. there are empty vectors in place of empty routes.
5820 If close_routes is set to true, adds the end nodes to the route of each
5821 vehicle and deactivates other nodes.
5822 An assignment containing the locks can be obtained by calling
5823 PreAssignment().
5824 """
5825 return _pywrapcp.RoutingModel_ApplyLocksToAllVehicles(self, locks, close_routes)
5826
5827 def PreAssignment(self):
5828 r"""
5829 Returns an assignment used to fix some of the variables of the problem.
5830 In practice, this assignment locks partial routes of the problem. This
5831 can be used in the context of locking the parts of the routes which have
5832 already been driven in online routing problems.
5833 """
5834 return _pywrapcp.RoutingModel_PreAssignment(self)
5835
5837 return _pywrapcp.RoutingModel_MutablePreAssignment(self)
5838
5839 def WriteAssignment(self, file_name):
5840 r"""
5841 Writes the current solution to a file containing an AssignmentProto.
5842 Returns false if the file cannot be opened or if there is no current
5843 solution.
5844 """
5845 return _pywrapcp.RoutingModel_WriteAssignment(self, file_name)
5846
5847 def ReadAssignment(self, file_name):
5848 r"""
5849 Reads an assignment from a file and returns the current solution.
5850 Returns nullptr if the file cannot be opened or if the assignment is not
5851 valid.
5852 """
5853 return _pywrapcp.RoutingModel_ReadAssignment(self, file_name)
5854
5855 def RestoreAssignment(self, solution):
5856 r"""
5857 Restores an assignment as a solution in the routing model and returns the
5858 new solution. Returns nullptr if the assignment is not valid.
5859 """
5860 return _pywrapcp.RoutingModel_RestoreAssignment(self, solution)
5861
5862 def ReadAssignmentFromRoutes(self, routes, ignore_inactive_indices):
5863 r"""
5864 Restores the routes as the current solution. Returns nullptr if the
5865 solution cannot be restored (routes do not contain a valid solution). Note
5866 that calling this method will run the solver to assign values to the
5867 dimension variables; this may take considerable amount of time, especially
5868 when using dimensions with slack.
5869 """
5870 return _pywrapcp.RoutingModel_ReadAssignmentFromRoutes(self, routes, ignore_inactive_indices)
5871
5872 def RoutesToAssignment(self, routes, ignore_inactive_indices, close_routes, assignment):
5873 r"""
5874 Fills an assignment from a specification of the routes of the
5875 vehicles. The routes are specified as lists of variable indices that
5876 appear on the routes of the vehicles. The indices of the outer vector in
5877 'routes' correspond to vehicles IDs, the inner vector contains the
5878 variable indices on the routes for the given vehicle. The inner vectors
5879 must not contain the start and end indices, as these are determined by the
5880 routing model. Sets the value of NextVars in the assignment, adding the
5881 variables to the assignment if necessary. The method does not touch other
5882 variables in the assignment. The method can only be called after the model
5883 is closed. With ignore_inactive_indices set to false, this method will
5884 fail (return nullptr) in case some of the route contain indices that are
5885 deactivated in the model; when set to true, these indices will be
5886 skipped. Returns true if routes were successfully
5887 loaded. However, such assignment still might not be a valid
5888 solution to the routing problem due to more complex constraints;
5889 it is advisible to call solver()->CheckSolution() afterwards.
5890 """
5891 return _pywrapcp.RoutingModel_RoutesToAssignment(self, routes, ignore_inactive_indices, close_routes, assignment)
5892
5893 def AssignmentToRoutes(self, assignment, routes):
5894 r"""
5895 Converts the solution in the given assignment to routes for all vehicles.
5896 Expects that assignment contains a valid solution (i.e. routes for all
5897 vehicles end with an end index for that vehicle).
5898 """
5899 return _pywrapcp.RoutingModel_AssignmentToRoutes(self, assignment, routes)
5900
5901 def CompactAssignment(self, assignment):
5902 r"""
5903 Converts the solution in the given assignment to routes for all vehicles.
5904 If the returned vector is route_indices, route_indices[i][j] is the index
5905 for jth location visited on route i. Note that contrary to
5906 AssignmentToRoutes, the vectors do include start and end locations.
5907 Returns a compacted version of the given assignment, in which all vehicles
5908 with id lower or equal to some N have non-empty routes, and all vehicles
5909 with id greater than N have empty routes. Does not take ownership of the
5910 returned object.
5911 If found, the cost of the compact assignment is the same as in the
5912 original assignment and it preserves the values of 'active' variables.
5913 Returns nullptr if a compact assignment was not found.
5914 This method only works in homogenous mode, and it only swaps equivalent
5915 vehicles (vehicles with the same start and end nodes). When creating the
5916 compact assignment, the empty plan is replaced by the route assigned to
5917 the compatible vehicle with the highest id. Note that with more complex
5918 constraints on vehicle variables, this method might fail even if a compact
5919 solution exists.
5920 This method changes the vehicle and dimension variables as necessary.
5921 While compacting the solution, only basic checks on vehicle variables are
5922 performed; if one of these checks fails no attempts to repair it are made
5923 (instead, the method returns nullptr).
5924 """
5925 return _pywrapcp.RoutingModel_CompactAssignment(self, assignment)
5926
5927 def CompactAndCheckAssignment(self, assignment):
5928 r"""
5929 Same as CompactAssignment() but also checks the validity of the final
5930 compact solution; if it is not valid, no attempts to repair it are made
5931 (instead, the method returns nullptr).
5932 """
5933 return _pywrapcp.RoutingModel_CompactAndCheckAssignment(self, assignment)
5934
5935 def AddToAssignment(self, var):
5936 r"""Adds an extra variable to the vehicle routing assignment."""
5937 return _pywrapcp.RoutingModel_AddToAssignment(self, var)
5938
5939 def AddIntervalToAssignment(self, interval):
5940 return _pywrapcp.RoutingModel_AddIntervalToAssignment(self, interval)
5941
5942 def PackCumulsOfOptimizerDimensionsFromAssignment(self, original_assignment, duration_limit, time_limit_was_reached=None):
5943 r"""
5944 For every dimension in the model with an optimizer in
5945 local/global_dimension_optimizers_, this method tries to pack the cumul
5946 values of the dimension, such that:
5947 - The cumul costs (span costs, soft lower and upper bound costs, etc) are
5948 minimized.
5949 - The cumuls of the ends of the routes are minimized for this given
5950 minimal cumul cost.
5951 - Given these minimal end cumuls, the route start cumuls are maximized.
5952 Returns the assignment resulting from allocating these packed cumuls with
5953 the solver, and nullptr if these cumuls could not be set by the solver.
5954 """
5955 return _pywrapcp.RoutingModel_PackCumulsOfOptimizerDimensionsFromAssignment(self, original_assignment, duration_limit, time_limit_was_reached)
5956
5958 r"""
5959 *Overload 1:*
5960 Returns neighbors of all nodes for every cost class. The result is cached
5961 and is computed once. The number of neighbors considered is based on a
5962 ratio of non-vehicle nodes, specified by neighbors_ratio, with a minimum
5963 of min-neighbors node considered.
5964
5965 |
5966
5967 *Overload 2:*
5968 Returns parameters.num_neighbors neighbors of all nodes for every cost
5969 class. The result is cached and is computed once.
5970 """
5971 return _pywrapcp.RoutingModel_GetOrCreateNodeNeighborsByCostClass(self, *args)
5972
5973 def AddLocalSearchFilter(self, filter):
5974 r"""
5975 Adds a custom local search filter to the list of filters used to speed up
5976 local search by pruning unfeasible variable assignments.
5977 Calling this method after the routing model has been closed (CloseModel()
5978 or Solve() has been called) has no effect.
5979 The routing model does not take ownership of the filter.
5980 """
5981 return _pywrapcp.RoutingModel_AddLocalSearchFilter(self, filter)
5982
5983 def Start(self, vehicle):
5984 r"""
5985 Model inspection.
5986 Returns the variable index of the starting node of a vehicle route.
5987 """
5988 return _pywrapcp.RoutingModel_Start(self, vehicle)
5989
5990 def End(self, vehicle):
5991 r"""Returns the variable index of the ending node of a vehicle route."""
5992 return _pywrapcp.RoutingModel_End(self, vehicle)
5993
5994 def IsStart(self, index):
5995 r"""Returns true if 'index' represents the first node of a route."""
5996 return _pywrapcp.RoutingModel_IsStart(self, index)
5997
5998 def IsEnd(self, index):
5999 r"""Returns true if 'index' represents the last node of a route."""
6000 return _pywrapcp.RoutingModel_IsEnd(self, index)
6001
6002 def VehicleIndex(self, index):
6003 r"""
6004 Returns the vehicle of the given start/end index, and -1 if the given
6005 index is not a vehicle start/end.
6006 """
6007 return _pywrapcp.RoutingModel_VehicleIndex(self, index)
6008
6009 def Next(self, assignment, index):
6010 r"""
6011 Assignment inspection
6012 Returns the variable index of the node directly after the node
6013 corresponding to 'index' in 'assignment'.
6014 """
6015 return _pywrapcp.RoutingModel_Next(self, assignment, index)
6016
6017 def IsVehicleUsed(self, assignment, vehicle):
6018 r"""Returns true if the route of 'vehicle' is non empty in 'assignment'."""
6019 return _pywrapcp.RoutingModel_IsVehicleUsed(self, assignment, vehicle)
6020
6021 def NextVar(self, index):
6022 r"""
6023 Returns the next variable of the node corresponding to index. Note that
6024 NextVar(index) == index is equivalent to ActiveVar(index) == 0.
6025 """
6026 return _pywrapcp.RoutingModel_NextVar(self, index)
6027
6028 def ActiveVar(self, index):
6029 r"""Returns the active variable of the node corresponding to index."""
6030 return _pywrapcp.RoutingModel_ActiveVar(self, index)
6031
6032 def ActiveVehicleVar(self, vehicle):
6033 r"""
6034 Returns the active variable of the vehicle. It will be equal to 1 iff the
6035 route of the vehicle is not empty, 0 otherwise.
6036 """
6037 return _pywrapcp.RoutingModel_ActiveVehicleVar(self, vehicle)
6038
6039 def VehicleRouteConsideredVar(self, vehicle):
6040 r"""
6041 Returns the variable specifying whether or not the given vehicle route is
6042 considered for costs and constraints. It will be equal to 1 iff the route
6043 of the vehicle is not empty OR vehicle_used_when_empty_[vehicle] is true.
6044 """
6045 return _pywrapcp.RoutingModel_VehicleRouteConsideredVar(self, vehicle)
6046
6047 def VehicleVar(self, index):
6048 r"""
6049 Returns the vehicle variable of the node corresponding to index. Note that
6050 VehicleVar(index) == -1 is equivalent to ActiveVar(index) == 0.
6051 """
6052 return _pywrapcp.RoutingModel_VehicleVar(self, index)
6053
6054 def ResourceVar(self, vehicle, resource_group):
6055 r"""
6056 Returns the resource variable for the given vehicle index in the given
6057 resource group. If a vehicle doesn't require a resource from the
6058 corresponding resource group, then ResourceVar(v, r_g) == -1.
6059 """
6060 return _pywrapcp.RoutingModel_ResourceVar(self, vehicle, resource_group)
6061
6062 def CostVar(self):
6063 r"""Returns the global cost variable which is being minimized."""
6064 return _pywrapcp.RoutingModel_CostVar(self)
6065
6066 def GetArcCostForVehicle(self, from_index, to_index, vehicle):
6067 r"""
6068 Returns the cost of the transit arc between two nodes for a given vehicle.
6069 Input are variable indices of node. This returns 0 if vehicle < 0.
6070 """
6071 return _pywrapcp.RoutingModel_GetArcCostForVehicle(self, from_index, to_index, vehicle)
6072
6074 r"""Whether costs are homogeneous across all vehicles."""
6075 return _pywrapcp.RoutingModel_CostsAreHomogeneousAcrossVehicles(self)
6076
6077 def GetHomogeneousCost(self, from_index, to_index):
6078 r"""
6079 Returns the cost of the segment between two nodes supposing all vehicle
6080 costs are the same (returns the cost for the first vehicle otherwise).
6081 """
6082 return _pywrapcp.RoutingModel_GetHomogeneousCost(self, from_index, to_index)
6083
6084 def GetArcCostForFirstSolution(self, from_index, to_index):
6085 r"""
6086 Returns the cost of the arc in the context of the first solution strategy.
6087 This is typically a simplification of the actual cost; see the .cc.
6088 """
6089 return _pywrapcp.RoutingModel_GetArcCostForFirstSolution(self, from_index, to_index)
6090
6091 def GetArcCostForClass(self, from_index, to_index, cost_class_index):
6092 r"""
6093 Returns the cost of the segment between two nodes for a given cost
6094 class. Input are variable indices of nodes and the cost class.
6095 Unlike GetArcCostForVehicle(), if cost_class is kNoCost, then the
6096 returned cost won't necessarily be zero: only some of the components
6097 of the cost that depend on the cost class will be omited. See the code
6098 for details.
6099 """
6100 return _pywrapcp.RoutingModel_GetArcCostForClass(self, from_index, to_index, cost_class_index)
6101
6102 def GetCostClassIndexOfVehicle(self, vehicle):
6103 r"""Get the cost class index of the given vehicle."""
6104 return _pywrapcp.RoutingModel_GetCostClassIndexOfVehicle(self, vehicle)
6105
6106 def HasVehicleWithCostClassIndex(self, cost_class_index):
6107 r"""
6108 Returns true iff the model contains a vehicle with the given
6109 cost_class_index.
6110 """
6111 return _pywrapcp.RoutingModel_HasVehicleWithCostClassIndex(self, cost_class_index)
6112
6114 r"""Returns the number of different cost classes in the model."""
6115 return _pywrapcp.RoutingModel_GetCostClassesCount(self)
6116
6118 r"""Ditto, minus the 'always zero', built-in cost class."""
6119 return _pywrapcp.RoutingModel_GetNonZeroCostClassesCount(self)
6120
6122 return _pywrapcp.RoutingModel_GetVehicleClassIndexOfVehicle(self, vehicle)
6123
6124 def GetVehicleOfClass(self, vehicle_class):
6125 r"""
6126 Returns a vehicle of the given vehicle class, and -1 if there are no
6127 vehicles for this class.
6128 """
6129 return _pywrapcp.RoutingModel_GetVehicleOfClass(self, vehicle_class)
6130
6132 r"""Returns the number of different vehicle classes in the model."""
6133 return _pywrapcp.RoutingModel_GetVehicleClassesCount(self)
6134
6136 r"""Returns variable indices of nodes constrained to be on the same route."""
6137 return _pywrapcp.RoutingModel_GetSameVehicleIndicesOfIndex(self, node)
6138
6139 def AddSameActivityGroup(self, nodes):
6140 return _pywrapcp.RoutingModel_AddSameActivityGroup(self, nodes)
6141
6143 r"""Returns variable indices of nodes constrained to have the same activity."""
6144 return _pywrapcp.RoutingModel_GetSameActivityIndicesOfIndex(self, node)
6145
6147 r"""Returns the same activity group of the node."""
6148 return _pywrapcp.RoutingModel_GetSameActivityGroupOfIndex(self, node)
6149
6151 r"""Returns same activity groups of all nodes."""
6152 return _pywrapcp.RoutingModel_GetSameActivityGroups(self)
6153
6155 r"""Returns the number of same activity groups."""
6156 return _pywrapcp.RoutingModel_GetSameActivityGroupsCount(self)
6157
6159 r"""Returns variable indices of nodes in the same activity group."""
6160 return _pywrapcp.RoutingModel_GetSameActivityIndicesOfGroup(self, group)
6161
6163 return _pywrapcp.RoutingModel_GetVehicleTypeContainer(self)
6164
6165 def ArcIsMoreConstrainedThanArc(self, _from, to1, to2):
6166 r"""
6167 Returns whether the arc from->to1 is more constrained than from->to2,
6168 taking into account, in order:
6169 - whether the destination node isn't an end node
6170 - whether the destination node is mandatory
6171 - whether the destination node is bound to the same vehicle as the source
6172 - the "primary constrained" dimension (see SetPrimaryConstrainedDimension)
6173 It then breaks ties using, in order:
6174 - the arc cost (taking unperformed penalties into account)
6175 - the size of the vehicle vars of "to1" and "to2" (lowest size wins)
6176 - the value: the lowest value of the indices to1 and to2 wins.
6177 See the .cc for details.
6178 The more constrained arc is typically preferable when building a
6179 first solution. This method is intended to be used as a callback for the
6180 BestValueByComparisonSelector value selector.
6181 Args:
6182 from: the variable index of the source node
6183 to1: the variable index of the first candidate destination node.
6184 to2: the variable index of the second candidate destination node.
6185 """
6186 return _pywrapcp.RoutingModel_ArcIsMoreConstrainedThanArc(self, _from, to1, to2)
6187
6188 def DebugOutputAssignment(self, solution_assignment, dimension_to_print):
6189 r"""
6190 Print some debugging information about an assignment, including the
6191 feasible intervals of the CumulVar for dimension "dimension_to_print"
6192 at each step of the routes.
6193 If "dimension_to_print" is omitted, all dimensions will be printed.
6194 """
6195 return _pywrapcp.RoutingModel_DebugOutputAssignment(self, solution_assignment, dimension_to_print)
6196
6197 def CheckIfAssignmentIsFeasible(self, assignment, call_at_solution_monitors):
6198 r"""
6199 Returns a vector cumul_bounds, for which cumul_bounds[i][j] is a pair
6200 containing the minimum and maximum of the CumulVar of the jth node on
6201 route i.
6202 - cumul_bounds[i][j].first is the minimum.
6203 - cumul_bounds[i][j].second is the maximum.
6204 Checks if an assignment is feasible.
6205 """
6206 return _pywrapcp.RoutingModel_CheckIfAssignmentIsFeasible(self, assignment, call_at_solution_monitors)
6207
6208 def solver(self):
6209 r"""
6210 Returns the underlying constraint solver. Can be used to add extra
6211 constraints and/or modify search algorithms.
6212 """
6213 return _pywrapcp.RoutingModel_solver(self)
6214
6215 def CheckLimit(self, *args):
6216 r"""
6217 Returns true if the search limit has been crossed with the given time
6218 offset.
6219 """
6220 return _pywrapcp.RoutingModel_CheckLimit(self, *args)
6221
6222 def RemainingTime(self):
6223 r"""Returns the time left in the search limit."""
6224 return _pywrapcp.RoutingModel_RemainingTime(self)
6225
6226 def UpdateTimeLimit(self, time_limit):
6227 r"""Updates the time limit of the search limit."""
6228 return _pywrapcp.RoutingModel_UpdateTimeLimit(self, time_limit)
6229
6230 def TimeBuffer(self):
6231 r"""Returns the time buffer to safely return a solution."""
6232 return _pywrapcp.RoutingModel_TimeBuffer(self)
6233
6235 r"""Returns the atomic<bool> to stop the CP-SAT solver."""
6236 return _pywrapcp.RoutingModel_GetMutableCPSatInterrupt(self)
6237
6239 r"""Returns the atomic<bool> to stop the CP solver."""
6240 return _pywrapcp.RoutingModel_GetMutableCPInterrupt(self)
6241
6242 def CancelSearch(self):
6243 r"""Cancels the current search."""
6244 return _pywrapcp.RoutingModel_CancelSearch(self)
6245
6246 def nodes(self):
6247 r"""
6248 Sizes and indices
6249 Returns the number of nodes in the model.
6250 """
6251 return _pywrapcp.RoutingModel_nodes(self)
6252
6253 def vehicles(self):
6254 r"""Returns the number of vehicle routes in the model."""
6255 return _pywrapcp.RoutingModel_vehicles(self)
6256
6257 def Size(self):
6258 r"""Returns the number of next variables in the model."""
6259 return _pywrapcp.RoutingModel_Size(self)
6260
6261 def GetNumberOfDecisionsInFirstSolution(self, search_parameters):
6262 r"""
6263 Returns statistics on first solution search, number of decisions sent to
6264 filters, number of decisions rejected by filters.
6265 """
6266 return _pywrapcp.RoutingModel_GetNumberOfDecisionsInFirstSolution(self, search_parameters)
6267
6268 def GetNumberOfRejectsInFirstSolution(self, search_parameters):
6269 return _pywrapcp.RoutingModel_GetNumberOfRejectsInFirstSolution(self, search_parameters)
6270
6272 r"""Returns the automatic first solution strategy selected."""
6273 return _pywrapcp.RoutingModel_GetAutomaticFirstSolutionStrategy(self)
6274
6276 r"""Returns true if a vehicle/node matching problem is detected."""
6277 return _pywrapcp.RoutingModel_IsMatchingModel(self)
6278
6279 def AreRoutesInterdependent(self, parameters):
6280 r"""
6281 Returns true if routes are interdependent. This means that any
6282 modification to a route might impact another.
6283 """
6284 return _pywrapcp.RoutingModel_AreRoutesInterdependent(self, parameters)
6285
6286 def MakeGuidedSlackFinalizer(self, dimension, initializer):
6287 r"""
6288 The next few members are in the public section only for testing purposes.
6289
6290 MakeGuidedSlackFinalizer creates a DecisionBuilder for the slacks of a
6291 dimension using a callback to choose which values to start with.
6292 The finalizer works only when all next variables in the model have
6293 been fixed. It has the following two characteristics:
6294 1. It follows the routes defined by the nexts variables when choosing a
6295 variable to make a decision on.
6296 2. When it comes to choose a value for the slack of node i, the decision
6297 builder first calls the callback with argument i, and supposingly the
6298 returned value is x it creates decisions slack[i] = x, slack[i] = x +
6299 1, slack[i] = x - 1, slack[i] = x + 2, etc.
6300 """
6301 return _pywrapcp.RoutingModel_MakeGuidedSlackFinalizer(self, dimension, initializer)
6302
6304 r"""
6305 MakeSelfDependentDimensionFinalizer is a finalizer for the slacks of a
6306 self-dependent dimension. It makes an extensive use of the caches of the
6307 state dependent transits.
6308 In detail, MakeSelfDependentDimensionFinalizer returns a composition of a
6309 local search decision builder with a greedy descent operator for the cumul
6310 of the start of each route and a guided slack finalizer. Provided there
6311 are no time windows and the maximum slacks are large enough, once the
6312 cumul of the start of route is fixed, the guided finalizer can find
6313 optimal values of the slacks for the rest of the route in time
6314 proportional to the length of the route. Therefore the composed finalizer
6315 generally works in time O(log(t)*n*m), where t is the latest possible
6316 departute time, n is the number of nodes in the network and m is the
6317 number of vehicles.
6318 """
6319 return _pywrapcp.RoutingModel_MakeSelfDependentDimensionFinalizer(self, dimension)
6320
6322 return _pywrapcp.RoutingModel_GetPathsMetadata(self)
6323
6324 def GetVehiclesOfSameClass(self, start_end_index):
6325 r"""
6326 Returns indices of the vehicles which are in the same vehicle class as the
6327 vehicle starting or ending at start_end_index.
6328 """
6329 return _pywrapcp.RoutingModel_GetVehiclesOfSameClass(self, start_end_index)
6330
6331 def GetSameVehicleClassArcs(self, from_index, to_index):
6332 r"""
6333 Returns all arcs which are equivalent to the {from_index, to_index} arc
6334 wrt vehicle classes. Arcs will be returned only if from_index is the
6335 start of a vehicle or if to_index is the end of a vehicle. The returned
6336 arcs will then be starting or ending at start or end nodes of vehicles in
6337 the same vehicle class. The input arc is included in the returned vector.
6338 """
6339 return _pywrapcp.RoutingModel_GetSameVehicleClassArcs(self, from_index, to_index)
6340
6341# Register RoutingModel in _pywrapcp:
6342_pywrapcp.RoutingModel_swigregister(RoutingModel)
6343cvar = _pywrapcp.cvar
6344RoutingModel.kNoPenalty = _pywrapcp.cvar.RoutingModel_kNoPenalty
6345RoutingModel.kNoDisjunction = _pywrapcp.cvar.RoutingModel_kNoDisjunction
6346RoutingModel.kNoDimension = _pywrapcp.cvar.RoutingModel_kNoDimension
6347
6349 r"""Routing model visitor."""
6350
6351 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6352 __repr__ = _swig_repr
6353
6354 def __init__(self):
6355 _pywrapcp.RoutingModelVisitor_swiginit(self, _pywrapcp.new_RoutingModelVisitor())
6356 __swig_destroy__ = _pywrapcp.delete_RoutingModelVisitor
6357
6358# Register RoutingModelVisitor in _pywrapcp:
6359_pywrapcp.RoutingModelVisitor_swigregister(RoutingModelVisitor)
6360RoutingModelVisitor.kLightElement = _pywrapcp.cvar.RoutingModelVisitor_kLightElement
6361RoutingModelVisitor.kLightElement2 = _pywrapcp.cvar.RoutingModelVisitor_kLightElement2
6362RoutingModelVisitor.kRemoveValues = _pywrapcp.cvar.RoutingModelVisitor_kRemoveValues
6363
6365 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6366
6367 def __init__(self, *args, **kwargs):
6368 raise AttributeError("No constructor defined - class is abstract")
6369 __repr__ = _swig_repr
6370 __swig_destroy__ = _pywrapcp.delete_TypeRegulationsChecker
6371
6372 def CheckVehicle(self, vehicle, next_accessor):
6373 return _pywrapcp.TypeRegulationsChecker_CheckVehicle(self, vehicle, next_accessor)
6374
6375# Register TypeRegulationsChecker in _pywrapcp:
6376_pywrapcp.TypeRegulationsChecker_swigregister(TypeRegulationsChecker)
6378 r"""Checker for type incompatibilities."""
6379
6380 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6381 __repr__ = _swig_repr
6382
6383 def __init__(self, model, check_hard_incompatibilities):
6384 _pywrapcp.TypeIncompatibilityChecker_swiginit(self, _pywrapcp.new_TypeIncompatibilityChecker(model, check_hard_incompatibilities))
6385 __swig_destroy__ = _pywrapcp.delete_TypeIncompatibilityChecker
6386
6387# Register TypeIncompatibilityChecker in _pywrapcp:
6388_pywrapcp.TypeIncompatibilityChecker_swigregister(TypeIncompatibilityChecker)
6390 r"""Checker for type requirements."""
6391
6392 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6393 __repr__ = _swig_repr
6394
6395 def __init__(self, model):
6396 _pywrapcp.TypeRequirementChecker_swiginit(self, _pywrapcp.new_TypeRequirementChecker(model))
6397 __swig_destroy__ = _pywrapcp.delete_TypeRequirementChecker
6398
6399# Register TypeRequirementChecker in _pywrapcp:
6400_pywrapcp.TypeRequirementChecker_swigregister(TypeRequirementChecker)
6402 r"""
6403 The following constraint ensures that incompatibilities and requirements
6404 between types are respected.
6405
6406 It verifies both "hard" and "temporal" incompatibilities.
6407 Two nodes with hard incompatible types cannot be served by the same vehicle
6408 at all, while with a temporal incompatibility they can't be on the same
6409 route at the same time.
6410 The VisitTypePolicy of a node determines how visiting it impacts the type
6411 count on the route.
6412
6413 For example, for
6414 - three temporally incompatible types T1 T2 and T3
6415 - 2 pairs of nodes a1/r1 and a2/r2 of type T1 and T2 respectively, with
6416 - a1 and a2 of VisitTypePolicy TYPE_ADDED_TO_VEHICLE
6417 - r1 and r2 of policy ADDED_TYPE_REMOVED_FROM_VEHICLE
6418 - 3 nodes A, UV and AR of type T3, respectively with type policies
6419 TYPE_ADDED_TO_VEHICLE, TYPE_ON_VEHICLE_UP_TO_VISIT and
6420 TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED
6421 the configurations
6422 UV --> a1 --> r1 --> a2 --> r2, a1 --> r1 --> a2 --> r2 --> A and
6423 a1 --> r1 --> AR --> a2 --> r2 are acceptable, whereas the configurations
6424 a1 --> a2 --> r1 --> ..., or A --> a1 --> r1 --> ..., or
6425 a1 --> r1 --> UV --> ... are not feasible.
6426
6427 It also verifies same-vehicle and temporal type requirements.
6428 A node of type T_d with a same-vehicle requirement for type T_r needs to be
6429 served by the same vehicle as a node of type T_r.
6430 Temporal requirements, on the other hand, can take effect either when the
6431 dependent type is being added to the route or when it's removed from it,
6432 which is determined by the dependent node's VisitTypePolicy.
6433 In the above example:
6434 - If T3 is required on the same vehicle as T1, A, AR or UV must be on the
6435 same vehicle as a1.
6436 - If T2 is required when adding T1, a2 must be visited *before* a1, and if
6437 r2 is also visited on the route, it must be *after* a1, i.e. T2 must be on
6438 the vehicle when a1 is visited:
6439 ... --> a2 --> ... --> a1 --> ... --> r2 --> ...
6440 - If T3 is required when removing T1, T3 needs to be on the vehicle when
6441 r1 is visited:
6442 ... --> A --> ... --> r1 --> ... OR ... --> r1 --> ... --> UV --> ...
6443 """
6444
6445 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6446 __repr__ = _swig_repr
6447
6448 def __init__(self, model):
6449 _pywrapcp.TypeRegulationsConstraint_swiginit(self, _pywrapcp.new_TypeRegulationsConstraint(model))
6450
6451 def Post(self):
6452 return _pywrapcp.TypeRegulationsConstraint_Post(self)
6453
6455 return _pywrapcp.TypeRegulationsConstraint_InitialPropagateWrapper(self)
6456 __swig_destroy__ = _pywrapcp.delete_TypeRegulationsConstraint
6457
6458# Register TypeRegulationsConstraint in _pywrapcp:
6459_pywrapcp.TypeRegulationsConstraint_swigregister(TypeRegulationsConstraint)
6460class BoundCost(object):
6461 r"""
6462 A structure meant to store soft bounds and associated violation constants.
6463 It is 'Simple' because it has one BoundCost per element,
6464 in contrast to 'Multiple'. Design notes:
6465 - it is meant to store model information to be shared through pointers,
6466 so it disallows copy and assign to avoid accidental duplication.
6467 - it keeps soft bounds as an array of structs to help cache,
6468 because code that uses such bounds typically use both bound and cost.
6469 - soft bounds are named pairs, prevents some mistakes.
6470 - using operator[] to access elements is not interesting,
6471 because the structure will be accessed through pointers, moreover having
6472 to type bound_cost reminds the user of the order if they do a copy
6473 assignment of the element.
6474 """
6475
6476 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6477 __repr__ = _swig_repr
6478 bound = property(_pywrapcp.BoundCost_bound_get, _pywrapcp.BoundCost_bound_set)
6479 cost = property(_pywrapcp.BoundCost_cost_get, _pywrapcp.BoundCost_cost_set)
6480
6481 def __init__(self, *args):
6482 _pywrapcp.BoundCost_swiginit(self, _pywrapcp.new_BoundCost(*args))
6483 __swig_destroy__ = _pywrapcp.delete_BoundCost
6484
6485# Register BoundCost in _pywrapcp:
6486_pywrapcp.BoundCost_swigregister(BoundCost)
6487class SimpleBoundCosts(object):
6488 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6489 __repr__ = _swig_repr
6490
6491 def __init__(self, num_bounds, default_bound_cost):
6492 _pywrapcp.SimpleBoundCosts_swiginit(self, _pywrapcp.new_SimpleBoundCosts(num_bounds, default_bound_cost))
6493
6494 def bound_cost(self, element):
6495 return _pywrapcp.SimpleBoundCosts_bound_cost(self, element)
6496
6497 def size(self):
6498 return _pywrapcp.SimpleBoundCosts_size(self)
6499 __swig_destroy__ = _pywrapcp.delete_SimpleBoundCosts
6500
6501# Register SimpleBoundCosts in _pywrapcp:
6502_pywrapcp.SimpleBoundCosts_swigregister(SimpleBoundCosts)
6503class RoutingDimension(object):
6504 r"""
6505 Dimensions represent quantities accumulated at nodes along the routes. They
6506 represent quantities such as weights or volumes carried along the route, or
6507 distance or times.
6508
6509 Quantities at a node are represented by "cumul" variables and the increase
6510 or decrease of quantities between nodes are represented by "transit"
6511 variables. These variables are linked as follows:
6512
6513 if j == next(i),
6514 cumuls(j) = cumuls(i) + transits(i) + slacks(i) +
6515 state_dependent_transits(i)
6516
6517 where slack is a positive slack variable (can represent waiting times for
6518 a time dimension), and state_dependent_transits is a non-purely functional
6519 version of transits_. Favour transits over state_dependent_transits when
6520 possible, because purely functional callbacks allow more optimisations and
6521 make the model faster and easier to solve.
6522 for a given vehicle, it is passed as an external vector, it would be better
6523 to have this information here.
6524 """
6525
6526 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
6527
6528 def __init__(self, *args, **kwargs):
6529 raise AttributeError("No constructor defined")
6530 __repr__ = _swig_repr
6531 __swig_destroy__ = _pywrapcp.delete_RoutingDimension
6532
6533 def model(self):
6534 r"""Returns the model on which the dimension was created."""
6535 return _pywrapcp.RoutingDimension_model(self)
6536
6537 def GetTransitValue(self, from_index, to_index, vehicle):
6538 r"""
6539 Returns the transition value for a given pair of nodes (as var index);
6540 this value is the one taken by the corresponding transit variable when
6541 the 'next' variable for 'from_index' is bound to 'to_index'.
6542 """
6543 return _pywrapcp.RoutingDimension_GetTransitValue(self, from_index, to_index, vehicle)
6544
6545 def GetTransitValueFromClass(self, from_index, to_index, vehicle_class):
6546 r"""
6547 Same as above but taking a vehicle class of the dimension instead of a
6548 vehicle (the class of a vehicle can be obtained with vehicle_to_class()).
6549 """
6550 return _pywrapcp.RoutingDimension_GetTransitValueFromClass(self, from_index, to_index, vehicle_class)
6551
6552 def CumulVar(self, index):
6553 r"""
6554 Get the cumul, transit and slack variables for the given node (given as
6555 int64_t var index).
6556 """
6557 return _pywrapcp.RoutingDimension_CumulVar(self, index)
6558
6559 def TransitVar(self, index):
6560 return _pywrapcp.RoutingDimension_TransitVar(self, index)
6561
6562 def FixedTransitVar(self, index):
6563 return _pywrapcp.RoutingDimension_FixedTransitVar(self, index)
6564
6565 def SlackVar(self, index):
6566 return _pywrapcp.RoutingDimension_SlackVar(self, index)
6567
6568 def SetCumulVarRange(self, index, min, max):
6569 r"""
6570 Some functions to allow users to use the interface without knowing about
6571 the underlying CP model.
6572 Restricts the range of the cumul variable associated to index.
6573 """
6574 return _pywrapcp.RoutingDimension_SetCumulVarRange(self, index, min, max)
6575
6576 def GetCumulVarMin(self, index):
6577 r"""Gets the current minimum of the cumul variable associated to index."""
6578 return _pywrapcp.RoutingDimension_GetCumulVarMin(self, index)
6579
6580 def GetCumulVarMax(self, index):
6581 r"""Gets the current maximum of the cumul variable associated to index."""
6582 return _pywrapcp.RoutingDimension_GetCumulVarMax(self, index)
6583
6584 def SetSpanUpperBoundForVehicle(self, upper_bound, vehicle):
6585 r"""
6586 Sets an upper bound on the dimension span on a given vehicle. This is the
6587 preferred way to limit the "length" of the route of a vehicle according to
6588 a dimension.
6589 """
6590 return _pywrapcp.RoutingDimension_SetSpanUpperBoundForVehicle(self, upper_bound, vehicle)
6591
6592 def SetSpanCostCoefficientForVehicle(self, coefficient, vehicle):
6593 r"""
6594 Sets a cost proportional to the dimension span on a given vehicle,
6595 or on all vehicles at once. "coefficient" must be nonnegative.
6596 This is handy to model costs proportional to idle time when the dimension
6597 represents time.
6598 The cost for a vehicle is
6599 span_cost = coefficient * (dimension end value - dimension start value).
6600 """
6601 return _pywrapcp.RoutingDimension_SetSpanCostCoefficientForVehicle(self, coefficient, vehicle)
6602
6604 return _pywrapcp.RoutingDimension_SetSpanCostCoefficientForAllVehicles(self, coefficient)
6605
6606 def SetSlackCostCoefficientForVehicle(self, coefficient, vehicle):
6607 r"""
6608 Sets a cost proportional to the dimension total slack on a given vehicle,
6609 or on all vehicles at once. "coefficient" must be nonnegative.
6610 This is handy to model costs only proportional to idle time when the
6611 dimension represents time.
6612 The cost for a vehicle is
6613 slack_cost = coefficient *
6614 (dimension end value - dimension start value - total_transit).
6615 """
6616 return _pywrapcp.RoutingDimension_SetSlackCostCoefficientForVehicle(self, coefficient, vehicle)
6617
6619 return _pywrapcp.RoutingDimension_SetSlackCostCoefficientForAllVehicles(self, coefficient)
6620
6621 def SetGlobalSpanCostCoefficient(self, coefficient):
6622 r"""
6623 Sets a cost proportional to the *global* dimension span, that is the
6624 difference between the largest value of route end cumul variables and
6625 the smallest value of route start cumul variables.
6626 In other words:
6627 global_span_cost =
6628 coefficient * (Max(dimension end value) - Min(dimension start value)).
6629 """
6630 return _pywrapcp.RoutingDimension_SetGlobalSpanCostCoefficient(self, coefficient)
6631
6632 def SetCumulVarSoftUpperBound(self, index, upper_bound, coefficient):
6633 r"""
6634 Sets a soft upper bound to the cumul variable of a given variable index.
6635 If the value of the cumul variable is greater than the bound, a cost
6636 proportional to the difference between this value and the bound is added
6637 to the cost function of the model:
6638 cumulVar <= upper_bound -> cost = 0
6639 cumulVar > upper_bound -> cost = coefficient * (cumulVar - upper_bound)
6640 This is also handy to model tardiness costs when the dimension represents
6641 time.
6642 """
6643 return _pywrapcp.RoutingDimension_SetCumulVarSoftUpperBound(self, index, upper_bound, coefficient)
6644
6646 r"""
6647 Returns true if a soft upper bound has been set for a given variable
6648 index.
6649 """
6650 return _pywrapcp.RoutingDimension_HasCumulVarSoftUpperBound(self, index)
6651
6653 r"""
6654 Returns the soft upper bound of a cumul variable for a given variable
6655 index. The "hard" upper bound of the variable is returned if no soft upper
6656 bound has been set.
6657 """
6658 return _pywrapcp.RoutingDimension_GetCumulVarSoftUpperBound(self, index)
6659
6661 r"""
6662 Returns the cost coefficient of the soft upper bound of a cumul variable
6663 for a given variable index. If no soft upper bound has been set, 0 is
6664 returned.
6665 """
6666 return _pywrapcp.RoutingDimension_GetCumulVarSoftUpperBoundCoefficient(self, index)
6667
6668 def SetCumulVarSoftLowerBound(self, index, lower_bound, coefficient):
6669 r"""
6670 Sets a soft lower bound to the cumul variable of a given variable index.
6671 If the value of the cumul variable is less than the bound, a cost
6672 proportional to the difference between this value and the bound is added
6673 to the cost function of the model:
6674 cumulVar > lower_bound -> cost = 0
6675 cumulVar <= lower_bound -> cost = coefficient * (lower_bound -
6676 cumulVar).
6677 This is also handy to model earliness costs when the dimension represents
6678 time.
6679 """
6680 return _pywrapcp.RoutingDimension_SetCumulVarSoftLowerBound(self, index, lower_bound, coefficient)
6681
6683 r"""
6684 Returns true if a soft lower bound has been set for a given variable
6685 index.
6686 """
6687 return _pywrapcp.RoutingDimension_HasCumulVarSoftLowerBound(self, index)
6688
6690 r"""
6691 Returns the soft lower bound of a cumul variable for a given variable
6692 index. The "hard" lower bound of the variable is returned if no soft lower
6693 bound has been set.
6694 """
6695 return _pywrapcp.RoutingDimension_GetCumulVarSoftLowerBound(self, index)
6696
6698 r"""
6699 Returns the cost coefficient of the soft lower bound of a cumul variable
6700 for a given variable index. If no soft lower bound has been set, 0 is
6701 returned.
6702 """
6703 return _pywrapcp.RoutingDimension_GetCumulVarSoftLowerBoundCoefficient(self, index)
6704
6705 def SetBreakIntervalsOfVehicle(self, breaks, vehicle, node_visit_transits):
6706 r"""
6707 Sets the breaks for a given vehicle. Breaks are represented by
6708 IntervalVars. They may interrupt transits between nodes and increase
6709 the value of corresponding slack variables.
6710 A break may take place before the start of a vehicle, after the end of
6711 a vehicle, or during a travel i -> j.
6712
6713 In that case, the interval [break.Start(), break.End()) must be a subset
6714 of [CumulVar(i) + pre_travel(i, j), CumulVar(j) - post_travel(i, j)). In
6715 other words, a break may not overlap any node n's visit, given by
6716 [CumulVar(n) - post_travel(_, n), CumulVar(n) + pre_travel(n, _)).
6717 This formula considers post_travel(_, start) and pre_travel(end, _) to be
6718 0; pre_travel will never be called on any (_, start) and post_travel will
6719 never we called on any (end, _). If pre_travel_evaluator or
6720 post_travel_evaluator is -1, it will be taken as a function that always
6721 returns 0.
6722 Deprecated, sets pre_travel(i, j) = node_visit_transit[i].
6723 """
6724 return _pywrapcp.RoutingDimension_SetBreakIntervalsOfVehicle(self, breaks, vehicle, node_visit_transits)
6725
6726 def SetBreakDistanceDurationOfVehicle(self, distance, duration, vehicle):
6727 r"""
6728 With breaks supposed to be consecutive, this forces the distance between
6729 breaks of size at least minimum_break_duration to be at most distance.
6730 This supposes that the time until route start and after route end are
6731 infinite breaks.
6732 """
6733 return _pywrapcp.RoutingDimension_SetBreakDistanceDurationOfVehicle(self, distance, duration, vehicle)
6734
6736 r"""
6737 Sets up vehicle_break_intervals_, vehicle_break_distance_duration_,
6738 pre_travel_evaluators and post_travel_evaluators.
6739 """
6740 return _pywrapcp.RoutingDimension_InitializeBreaks(self)
6741
6743 r"""Returns true if any break interval or break distance was defined."""
6744 return _pywrapcp.RoutingDimension_HasBreakConstraints(self)
6745
6747 return _pywrapcp.RoutingDimension_GetPreTravelEvaluatorOfVehicle(self, vehicle)
6748
6750 return _pywrapcp.RoutingDimension_GetPostTravelEvaluatorOfVehicle(self, vehicle)
6751
6753 r"""Returns the parent in the dependency tree if any or nullptr otherwise."""
6754 return _pywrapcp.RoutingDimension_base_dimension(self)
6755
6757 r"""
6758 It makes sense to use the function only for self-dependent dimension.
6759 For such dimensions the value of the slack of a node determines the
6760 transition cost of the next transit. Provided that
6761 1. cumul[node] is fixed,
6762 2. next[node] and next[next[node]] (if exists) are fixed,
6763 the value of slack[node] for which cumul[next[node]] + transit[next[node]]
6764 is minimized can be found in O(1) using this function.
6765 """
6766 return _pywrapcp.RoutingDimension_ShortestTransitionSlack(self, node)
6767
6768 def index(self):
6769 r"""Returns the index of the dimension in the model."""
6770 return _pywrapcp.RoutingDimension_index(self)
6771
6772 def name(self):
6773 r"""Returns the name of the dimension."""
6774 return _pywrapcp.RoutingDimension_name(self)
6775
6776 def SetPickupToDeliveryLimitFunctionForPair(self, limit_function, pair_index):
6777 return _pywrapcp.RoutingDimension_SetPickupToDeliveryLimitFunctionForPair(self, limit_function, pair_index)
6778
6780 return _pywrapcp.RoutingDimension_HasPickupToDeliveryLimits(self)
6781
6782 def AddNodePrecedence(self, first_node, second_node, offset):
6783 return _pywrapcp.RoutingDimension_AddNodePrecedence(self, first_node, second_node, offset)
6784
6786 return _pywrapcp.RoutingDimension_GetSpanUpperBoundForVehicle(self, vehicle)
6787
6789 return _pywrapcp.RoutingDimension_GetSpanCostCoefficientForVehicle(self, vehicle)
6790
6792 return _pywrapcp.RoutingDimension_GetSlackCostCoefficientForVehicle(self, vehicle)
6793
6795 return _pywrapcp.RoutingDimension_global_span_cost_coefficient(self)
6796
6798 return _pywrapcp.RoutingDimension_GetGlobalOptimizerOffset(self)
6799
6801 return _pywrapcp.RoutingDimension_GetLocalOptimizerOffsetForVehicle(self, vehicle)
6802
6803 def SetSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle):
6804 r"""
6805 If the span of vehicle on this dimension is larger than bound,
6806 the cost will be increased by cost * (span - bound).
6807 """
6808 return _pywrapcp.RoutingDimension_SetSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
6809
6811 return _pywrapcp.RoutingDimension_HasSoftSpanUpperBounds(self)
6812
6814 return _pywrapcp.RoutingDimension_GetSoftSpanUpperBoundForVehicle(self, vehicle)
6815
6816 def SetQuadraticCostSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle):
6817 r"""
6818 If the span of vehicle on this dimension is larger than bound,
6819 the cost will be increased by cost * (span - bound)^2.
6820 """
6821 return _pywrapcp.RoutingDimension_SetQuadraticCostSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
6822
6824 return _pywrapcp.RoutingDimension_HasQuadraticCostSoftSpanUpperBounds(self)
6825
6827 return _pywrapcp.RoutingDimension_GetQuadraticCostSoftSpanUpperBoundForVehicle(self, vehicle)
6828
6829# Register RoutingDimension in _pywrapcp:
6830_pywrapcp.RoutingDimension_swigregister(RoutingDimension)
6831
6832def SolveModelWithSat(model, search_stats, search_parameters, initial_solution, solution):
6833 r"""
6834 Attempts to solve the model using the cp-sat solver. As of 5/2019, will
6835 solve the TSP corresponding to the model if it has a single vehicle.
6836 Therefore the resulting solution might not actually be feasible. Will return
6837 false if a solution could not be found.
6838 """
6839 return _pywrapcp.SolveModelWithSat(model, search_stats, search_parameters, initial_solution, solution)
6840
SetForwardSequence(self, var, forward_sequence)
Definition pywrapcp.py:3862
SetSequence(self, var, forward_sequence, backward_sequence, unperformed)
Definition pywrapcp.py:3859
SetBackwardSequence(self, var, backward_sequence)
Definition pywrapcp.py:3865
TransitionTime(self, before_index, after_index)
Definition pywrapcp.py:4029
__init__(self, vars, keep_inverse_values=False)
Definition pywrapcp.py:4261
Accept(self, monitor, delta, deltadelta, objective_min, objective_max)
Definition pywrapcp.py:4519
Accept(self, delta, deltadelta, objective_min, objective_max)
Definition pywrapcp.py:4473
AddWeightedSumOfAssignedDimension(self, weights, cost_var)
Definition pywrapcp.py:3977
AddCountAssignedItemsDimension(self, count_var)
Definition pywrapcp.py:3991
AddSumVariableWeightsLessOrEqualConstantDimension(self, usage, capacity)
Definition pywrapcp.py:3963
AddWeightedSumLessOrEqualConstantDimension(self, *args)
Definition pywrapcp.py:3919
__init__(self, ct, method, delayed, *args)
Definition pywrapcp.py:4681
AddNodePrecedence(self, first_node, second_node, offset)
Definition pywrapcp.py:6782
SetSpanUpperBoundForVehicle(self, upper_bound, vehicle)
Definition pywrapcp.py:6584
SetPickupToDeliveryLimitFunctionForPair(self, limit_function, pair_index)
Definition pywrapcp.py:6776
GetTransitValue(self, from_index, to_index, vehicle)
Definition pywrapcp.py:6537
SetBreakIntervalsOfVehicle(self, breaks, vehicle, node_visit_transits)
Definition pywrapcp.py:6705
SetSlackCostCoefficientForVehicle(self, coefficient, vehicle)
Definition pywrapcp.py:6606
SetSpanCostCoefficientForVehicle(self, coefficient, vehicle)
Definition pywrapcp.py:6592
SetBreakDistanceDurationOfVehicle(self, distance, duration, vehicle)
Definition pywrapcp.py:6726
SetQuadraticCostSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
Definition pywrapcp.py:6816
SetCumulVarSoftLowerBound(self, index, lower_bound, coefficient)
Definition pywrapcp.py:6668
GetTransitValueFromClass(self, from_index, to_index, vehicle_class)
Definition pywrapcp.py:6545
SetSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
Definition pywrapcp.py:6803
SetCumulVarSoftUpperBound(self, index, upper_bound, coefficient)
Definition pywrapcp.py:6632
ReadAssignmentFromRoutes(self, routes, ignore_inactive_indices)
Definition pywrapcp.py:5862
FastSolveFromAssignmentWithParameters(self, assignment, search_parameters, check_solution_in_cp, touched=None)
Definition pywrapcp.py:5735
AddRequiredTypeAlternativesWhenAddingType(self, dependent_type, required_type_alternatives)
Definition pywrapcp.py:5429
UnperformedPenaltyOrValue(self, default_value, var_index)
Definition pywrapcp.py:5489
AddSameVehicleRequiredTypeAlternatives(self, dependent_type, required_type_alternatives)
Definition pywrapcp.py:5411
GetFirstMatchingPickupDeliverySibling(self, node, is_match)
Definition pywrapcp.py:5337
SolveWithParameters(self, search_parameters, solutions=None)
Definition pywrapcp.py:5716
HasVehicleWithCostClassIndex(self, cost_class_index)
Definition pywrapcp.py:6106
SetPrimaryConstrainedDimension(self, dimension_name)
Definition pywrapcp.py:5119
ArcIsMoreConstrainedThanArc(self, _from, to1, to2)
Definition pywrapcp.py:6165
AddDimensionWithVehicleCapacity(self, evaluator_index, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:4997
SetVehicleUsedWhenEmpty(self, is_used, vehicle)
Definition pywrapcp.py:5588
SolveFromAssignmentWithParameters(self, assignment, search_parameters, solutions=None)
Definition pywrapcp.py:5728
SolveFromAssignmentsWithParameters(self, assignments, search_parameters, solutions=None)
Definition pywrapcp.py:5744
SetAssignmentFromOtherModelAssignment(self, target_assignment, source_model, source_assignment)
Definition pywrapcp.py:5758
GetArcCostForVehicle(self, from_index, to_index, vehicle)
Definition pywrapcp.py:6066
CheckIfAssignmentIsFeasible(self, assignment, call_at_solution_monitors)
Definition pywrapcp.py:6197
AddAtSolutionCallback(self, callback, track_unchecked_neighbors=False)
Definition pywrapcp.py:5629
SetArcCostEvaluatorOfVehicle(self, evaluator_index, vehicle)
Definition pywrapcp.py:5526
SolveWithIteratedLocalSearch(self, search_parameters)
Definition pywrapcp.py:5751
PackCumulsOfOptimizerDimensionsFromAssignment(self, original_assignment, duration_limit, time_limit_was_reached=None)
Definition pywrapcp.py:5942
SetPathEnergyCostOfVehicle(self, force, distance, cost_per_unit, vehicle)
Definition pywrapcp.py:5549
GetArcCostForFirstSolution(self, from_index, to_index)
Definition pywrapcp.py:6084
GetSameVehicleClassArcs(self, from_index, to_index)
Definition pywrapcp.py:6331
AddMatrixDimension(self, values, capacity, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5044
SetAllowedVehiclesForIndex(self, vehicles, index)
Definition pywrapcp.py:5263
AddVectorDimension(self, values, capacity, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5030
AddRequiredTypeAlternativesWhenRemovingType(self, dependent_type, required_type_alternatives)
Definition pywrapcp.py:5438
GetHomogeneousCost(self, from_index, to_index)
Definition pywrapcp.py:6077
ApplyLocksToAllVehicles(self, locks, close_routes)
Definition pywrapcp.py:5814
AddDimensionWithVehicleTransits(self, evaluator_indices, slack_max, capacity, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:4994
CloseModelWithParameters(self, search_parameters)
Definition pywrapcp.py:5698
AddDimensionWithVehicleTransitAndCapacity(self, evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5000
CumulDependentTransitCallback(self, callback_index)
Definition pywrapcp.py:4966
SetAmortizedCostFactorsOfVehicle(self, linear_cost_factor, quadratic_cost_factor, vehicle)
Definition pywrapcp.py:5575
SetPickupAndDeliveryPolicyOfVehicle(self, policy, vehicle)
Definition pywrapcp.py:5324
AddWeightedVariableTargetToFinalizer(self, var, target, cost)
Definition pywrapcp.py:5680
SetAmortizedCostFactorsOfAllVehicles(self, linear_cost_factor, quadratic_cost_factor)
Definition pywrapcp.py:5555
GetNumberOfDecisionsInFirstSolution(self, search_parameters)
Definition pywrapcp.py:6261
SetArcCostEvaluatorOfAllVehicles(self, evaluator_index)
Definition pywrapcp.py:5518
RoutesToAssignment(self, routes, ignore_inactive_indices, close_routes, assignment)
Definition pywrapcp.py:5872
ResourceVar(self, vehicle, resource_group)
Definition pywrapcp.py:6054
AddPickupAndDeliverySets(self, pickup_disjunction, delivery_disjunction)
Definition pywrapcp.py:5294
AssignmentToRoutes(self, assignment, routes)
Definition pywrapcp.py:5893
AddConstantDimension(self, value, capacity, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5027
GetNumberOfRejectsInFirstSolution(self, search_parameters)
Definition pywrapcp.py:6268
AddDimensionWithCumulDependentVehicleTransitAndCapacity(self, fixed_evaluator_indices, cumul_dependent_evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5003
AddDimension(self, evaluator_index, slack_max, capacity, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:4969
AddConstantDimensionWithSlack(self, value, capacity, slack_max, fix_start_cumul_to_zero, name)
Definition pywrapcp.py:5014
GetArcCostForClass(self, from_index, to_index, cost_class_index)
Definition pywrapcp.py:6091
SetMaximumNumberOfActiveVehicles(self, max_active_vehicles)
Definition pywrapcp.py:5505
SetVisitType(self, index, type, type_policy)
Definition pywrapcp.py:5361
DebugOutputAssignment(self, solution_assignment, dimension_to_print)
Definition pywrapcp.py:6188
MakeGuidedSlackFinalizer(self, dimension, initializer)
Definition pywrapcp.py:6286
SetPathEnergyCostsOfVehicle(self, force, distance, threshold, cost_per_unit_below_threshold, cost_per_unit_above_threshold, vehicle)
Definition pywrapcp.py:5552
SetSequence(self, forward_sequence, backward_sequence, unperformed)
Definition pywrapcp.py:3638
__init__(self, num_bounds, default_bound_cost)
Definition pywrapcp.py:6491
NullIntersect(self, first_vars, second_vars)
Definition pywrapcp.py:1174
DecisionBuilderFromAssignment(self, assignment, db, vars)
Definition pywrapcp.py:1882
EvalEvalStrPhase(self, vars, evaluator, str)
Definition pywrapcp.py:2162
EvalEvalStrTieBreakPhase(self, vars, evaluator, tie_breaker, str)
Definition pywrapcp.py:2165
VarStrValEvalTieBreakPhase(self, vars, var_str, val_eval, tie_breaker)
Definition pywrapcp.py:2156
IsEqualCstCt(self, var, value, boolvar)
Definition pywrapcp.py:839
VarEvalValEvalPhase(self, vars, var_eval, val_eval)
Definition pywrapcp.py:2153
DisjunctiveConstraint(self, intervals, name)
Definition pywrapcp.py:1438
VarEvalValStrPhase(self, vars, var_evaluator, val_str)
Definition pywrapcp.py:2147
Deviation(self, vars, deviation_var, total_sum)
Definition pywrapcp.py:1100
ConvexPiecewiseExpr(self, expr, early_cost, early_date, late_date, late_cost)
Definition pywrapcp.py:816
ConditionalExpression(self, condition, expr, unperformed_value)
Definition pywrapcp.py:827
TreeNoCycle(self, nexts, active, callback=0)
Definition pywrapcp.py:2138
VarStrValEvalPhase(self, vars, var_str, val_eval)
Definition pywrapcp.py:2150
VarEvalValEvalTieBreakPhase(self, vars, var_eval, val_eval, tie_breaker)
Definition pywrapcp.py:2159
SplitVariableDomain(self, var, val, start_with_lower_half)
Definition pywrapcp.py:1811
SumObjectiveFilter(self, vars, values, filter_enum)
Definition pywrapcp.py:2171
NullIntersectExcept(self, first_vars, second_vars, escape_value)
Definition pywrapcp.py:1183
Optimize(self, maximize, v, step)
Definition pywrapcp.py:1609
TabuSearch(self, maximize, objective, step, vars, keep_tenure, forbid_tenure, tabu_factor)
Definition pywrapcp.py:1651
IsGreaterOrEqualCstCt(self, var, value, boolvar)
Definition pywrapcp.py:887
RankFirstInterval(self, sequence, index)
Definition pywrapcp.py:1855
SimulatedAnnealing(self, maximize, v, step, initial_temperature)
Definition pywrapcp.py:1672
InversePermutationConstraint(self, left, right)
Definition pywrapcp.py:1165
SemiContinuousExpr(self, expr, fixed_charge, step)
Definition pywrapcp.py:820
FixedDurationStartSyncedOnStartIntervalVar(self, interval_var, duration, offset)
Definition pywrapcp.py:1343
IsGreaterOrEqualCt(self, left, right, b)
Definition pywrapcp.py:899
FixedDurationEndSyncedOnEndIntervalVar(self, interval_var, duration, offset)
Definition pywrapcp.py:1370
SearchLogWithCallback(self, period, callback)
Definition pywrapcp.py:2141
ScheduleOrExpedite(self, var, est, marker)
Definition pywrapcp.py:1845
FixedInterval(self, start, duration, name)
Definition pywrapcp.py:1325
IsDifferentCstCt(self, var, value, boolvar)
Definition pywrapcp.py:855
RankLastInterval(self, sequence, index)
Definition pywrapcp.py:1862
ScheduleOrPostpone(self, var, est, marker)
Definition pywrapcp.py:1835
MonotonicElement(self, values, increasing, index)
Definition pywrapcp.py:725
IndexOfConstraint(self, vars, index, target)
Definition pywrapcp.py:967
DelayedPathCumul(self, nexts, active, cumuls, transits)
Definition pywrapcp.py:1204
Pack(self, vars, number_of_bins)
Definition pywrapcp.py:1293
FixedDurationEndSyncedOnStartIntervalVar(self, interval_var, duration, offset)
Definition pywrapcp.py:1361
IsLessOrEqualCstCt(self, var, value, boolvar)
Definition pywrapcp.py:871
AllDifferentExcept(self, vars, escape_value)
Definition pywrapcp.py:1124
GuidedLocalSearch(self, maximize, objective, objective_function, step, vars, penalty_factor)
Definition pywrapcp.py:2168
FixedDurationStartSyncedOnEndIntervalVar(self, interval_var, duration, offset)
Definition pywrapcp.py:1352
IntervalVar(self, start_min, start_max, duration_min, duration_max, end_min, end_max, optional, name)
Definition pywrapcp.py:1329
IsLessOrEqualCt(self, left, right, b)
Definition pywrapcp.py:883
__init__(self, model, check_hard_incompatibilities)
Definition pywrapcp.py:6383
SolveModelWithSat(model, search_stats, search_parameters, initial_solution, solution)
Definition pywrapcp.py:6832
FindErrorInRoutingSearchParameters(search_parameters)
Definition pywrapcp.py:4825