7from sys
import version_info
as _swig_python_version_info
9if getattr(globals().get(
"__spec__"),
"parent",
None)
or __package__
or "." in __name__:
10 from .
import _pywrapcp
15 import builtins
as __builtin__
21 strthis =
"proxy of " + self.this.__repr__()
22 except __builtin__.Exception:
24 return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
28 def set_instance_attr(self, name, value):
30 set(self, name, value)
31 elif name ==
"thisown":
33 elif hasattr(self, name)
and isinstance(getattr(type(self), name), property):
34 set(self, name, value)
36 raise AttributeError(
"You cannot add instance attributes to %s" % self)
37 return set_instance_attr
41 def set_class_attr(cls, name, value):
42 if hasattr(cls, name)
and not isinstance(getattr(cls, name), property):
45 raise AttributeError(
"You cannot add class attributes to %s" % cls)
50 """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
52 return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
57 """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
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.
70 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
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
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
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
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
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.
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.
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.""")
112 _pywrapcp.DefaultPhaseParameters_swiginit(self, _pywrapcp.new_DefaultPhaseParameters())
113 __swig_destroy__ = _pywrapcp.delete_DefaultPhaseParameters
116_pywrapcp.DefaultPhaseParameters_swigregister(DefaultPhaseParameters)
120 A solver represents the main computation engine. It implements the
121 entire range of Constraint Programming protocols:
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.
134 For the time being, Solver is neither MT_SAFE nor MT_HOT.
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
145 Select the first unbound variable.
146 Variables are considered in the order of the vector of IntVars used
147 to create the selector.
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
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
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.
160 CHOOSE_MIN_SIZE_HIGHEST_MIN = _pywrapcp.Solver_CHOOSE_MIN_SIZE_HIGHEST_MIN
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
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.
169 CHOOSE_MIN_SIZE_LOWEST_MAX = _pywrapcp.Solver_CHOOSE_MIN_SIZE_LOWEST_MAX
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
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.
178 CHOOSE_MIN_SIZE_HIGHEST_MAX = _pywrapcp.Solver_CHOOSE_MIN_SIZE_HIGHEST_MAX
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
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.
187 CHOOSE_LOWEST_MIN = _pywrapcp.Solver_CHOOSE_LOWEST_MIN
189 Among unbound variables, select the variable with the smallest minimal
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.
194 CHOOSE_HIGHEST_MAX = _pywrapcp.Solver_CHOOSE_HIGHEST_MAX
196 Among unbound variables, select the variable with the highest maximal
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.
201 CHOOSE_MIN_SIZE = _pywrapcp.Solver_CHOOSE_MIN_SIZE
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.
207 CHOOSE_MAX_SIZE = _pywrapcp.Solver_CHOOSE_MAX_SIZE
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.
213 CHOOSE_MAX_REGRET_ON_MIN = _pywrapcp.Solver_CHOOSE_MAX_REGRET_ON_MIN
215 Among unbound variables, select the variable with the largest
216 gap between the first and the second values of the domain.
218 CHOOSE_PATH = _pywrapcp.Solver_CHOOSE_PATH
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.
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
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.
239 SPLIT_LOWER_HALF = _pywrapcp.Solver_SPLIT_LOWER_HALF
241 Split the domain in two around the center, and choose the lower
244 SPLIT_UPPER_HALF = _pywrapcp.Solver_SPLIT_UPPER_HALF
246 Split the domain in two around the center, and choose the lower
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
259 Selects the variable with the lowest starting time of all variables,
260 and fixes its starting time to this lowest value.
262 INTERVAL_SET_TIMES_BACKWARD = _pywrapcp.Solver_INTERVAL_SET_TIMES_BACKWARD
264 Selects the variable with the highest ending time of all variables,
265 and fixes the ending time to this highest values.
267 TWOOPT = _pywrapcp.Solver_TWOOPT
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
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
278 1 -> [3 -> 2] -> 4 -> 5
279 1 -> [4 -> 3 -> 2] -> 5
280 1 -> 2 -> [4 -> 3] -> 5
282 OROPT = _pywrapcp.Solver_OROPT
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
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):
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).
301 RELOCATE = _pywrapcp.Solver_RELOCATE
302 r"""Relocate neighborhood with length of 1 (see OROPT comment)."""
303 EXCHANGE = _pywrapcp.Solver_EXCHANGE
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
312 1 -> [3] -> [2] -> 4 -> 5
313 1 -> [4] -> 3 -> [2] -> 5
314 1 -> 2 -> [4] -> [3] -> 5
316 CROSS = _pywrapcp.Solver_CROSS
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):
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
331 MAKEACTIVE = _pywrapcp.Solver_MAKEACTIVE
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:
339 1 -> [5] -> 2 -> 3 -> 4
340 1 -> 2 -> [5] -> 3 -> 4
341 1 -> 2 -> 3 -> [5] -> 4
343 MAKEINACTIVE = _pywrapcp.Solver_MAKEINACTIVE
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:
351 1 -> 3 -> 4 with 2 inactive
352 1 -> 2 -> 4 with 3 inactive
354 MAKECHAININACTIVE = _pywrapcp.Solver_MAKECHAININACTIVE
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:
362 1 -> 3 -> 4 with 2 inactive
363 1 -> 2 -> 4 with 3 inactive
364 1 -> 4 with 2 and 3 inactive
366 SWAPACTIVE = _pywrapcp.Solver_SWAPACTIVE
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:
374 1 -> [5] -> 3 -> 4 with 2 inactive
375 1 -> 2 -> [5] -> 4 with 3 inactive
377 EXTENDEDSWAPACTIVE = _pywrapcp.Solver_EXTENDEDSWAPACTIVE
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:
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
393 PATHLNS = _pywrapcp.Solver_PATHLNS
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
403 FULLPATHLNS = _pywrapcp.Solver_FULLPATHLNS
405 Operator which relaxes one entire path and all inactive nodes, thus
406 defining num_paths neighbors.
408 UNACTIVELNS = _pywrapcp.Solver_UNACTIVELNS
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.
414 INCREMENT = _pywrapcp.Solver_INCREMENT
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
425 DECREMENT = _pywrapcp.Solver_DECREMENT
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.
431 SIMPLELNS = _pywrapcp.Solver_SIMPLELNS
433 Operator which defines one neighbor per variable. Each neighbor relaxes
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.
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
447 Move is accepted when the current objective value is in the interval
448 objective.Min .. objective.Max.
450 DELAYED_PRIORITY = _pywrapcp.Solver_DELAYED_PRIORITY
452 DELAYED_PRIORITY is the lowest priority: Demons will be processed after
453 VAR_PRIORITY and NORMAL_PRIORITY demons.
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."""
462 _pywrapcp.Solver_swiginit(self, _pywrapcp.new_Solver(*args))
468 __swig_destroy__ = _pywrapcp.delete_Solver
471 r"""Stored Parameters."""
472 return _pywrapcp.Solver_Parameters(self)
476 r"""Create a ConstraintSolverParameters proto with all the default values."""
477 return _pywrapcp.Solver_DefaultSolverParameters()
481 Adds the constraint 'c' to the model.
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
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.
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
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
515 return _pywrapcp.Solver_AddConstraint(self, c)
519 Solves the problem using the given DecisionBuilder and returns true if a
520 solution was found and accepted.
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
535 This function must be called either from outside of search,
536 or from within the Next() method of a decision builder.
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.
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
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().
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.
562 return _pywrapcp.Solver_Solve(self, *args)
567 The code for a top level search should look like
568 solver->NewSearch(db);
569 while (solver->NextSolution()) {
570 .. use the current solution
572 solver()->EndSearch();
574 return _pywrapcp.Solver_NewSearch(self, *args)
577 return _pywrapcp.Solver_NextSolution(self)
580 return _pywrapcp.Solver_RestartSearch(self)
583 return _pywrapcp.Solver_EndSearch(self)
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.
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.
596 return _pywrapcp.Solver_SolveAndCommit(self, *args)
599 r"""Checks whether the given assignment satisfies all relevant constraints."""
600 return _pywrapcp.Solver_CheckAssignment(self, solution)
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.
608 return _pywrapcp.Solver_CheckConstraint(self, ct)
611 r"""Abandon the current branch in the search tree. A backtrack will follow."""
612 return _pywrapcp.Solver_Fail(self)
616 r"""Current memory usage in bytes"""
617 return _pywrapcp.Solver_MemoryUsage()
621 Deprecated: Use Now() instead.
622 Time elapsed, in ms since the creation of the solver.
624 return _pywrapcp.Solver_WallTime(self)
627 r"""The number of branches explored since the creation of the solver."""
628 return _pywrapcp.Solver_Branches(self)
631 r"""The number of solutions found since the start of the search."""
632 return _pywrapcp.Solver_Solutions(self)
635 r"""The number of failures encountered since the creation of the solver."""
636 return _pywrapcp.Solver_Failures(self)
639 r"""The number of accepted neighbors."""
640 return _pywrapcp.Solver_AcceptedNeighbors(self)
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.
647 return _pywrapcp.Solver_Stamp(self)
650 r"""The fail_stamp() is incremented after each backtrack."""
651 return _pywrapcp.Solver_FailStamp(self)
656 MakeIntVar will create the best range based int var for the bounds given.
661 MakeIntVar will create a variable with the given sparse domain.
666 MakeIntVar will create a variable with the given sparse domain.
671 MakeIntVar will create the best range based int var for the bounds given.
676 MakeIntVar will create a variable with the given sparse domain.
681 MakeIntVar will create a variable with the given sparse domain.
683 return _pywrapcp.Solver_IntVar(self, *args)
688 MakeBoolVar will create a variable with a {0, 1} domain.
693 MakeBoolVar will create a variable with a {0, 1} domain.
695 return _pywrapcp.Solver_BoolVar(self, *args)
700 IntConst will create a constant expression.
705 IntConst will create a constant expression.
707 return _pywrapcp.Solver_IntConst(self, *args)
710 r"""sum of all vars."""
711 return _pywrapcp.Solver_Sum(self, vars)
723 return _pywrapcp.Solver_ScalProd(self, *args)
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.
734 return _pywrapcp.Solver_MonotonicElement(self, values, increasing, index)
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).
756 2D version of function-based element expression, values(expr1, expr2).
763 return _pywrapcp.Solver_Element(self, *args)
767 Returns the expression expr such that vars[expr] == value.
768 It assumes that vars are all different.
770 return _pywrapcp.Solver_IndexExpression(self, vars, value)
780 std::min (left, right)
785 std::min(expr, value)
790 std::min(expr, value)
792 return _pywrapcp.Solver_Min(self, *args)
802 std::max(left, right)
807 std::max(expr, value)
812 std::max(expr, value)
814 return _pywrapcp.Solver_Max(self, *args)
817 r"""Convex piecewise function."""
818 return _pywrapcp.Solver_ConvexPiecewiseExpr(self, expr, early_cost, early_date, late_date, late_cost)
822 Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b)
825 return _pywrapcp.Solver_SemiContinuousExpr(self, expr, fixed_charge, step)
828 r"""Conditional Expr condition ? expr : unperformed_value"""
829 return _pywrapcp.Solver_ConditionalExpression(self, condition, expr, unperformed_value)
832 r"""This constraint always succeeds."""
833 return _pywrapcp.Solver_TrueConstraint(self)
836 r"""This constraint always fails."""
837 return _pywrapcp.Solver_FalseConstraint(self, *args)
840 r"""boolvar == (var == value)"""
841 return _pywrapcp.Solver_IsEqualCstCt(self, var, value, boolvar)
844 r"""status var of (var == value)"""
845 return _pywrapcp.Solver_IsEqualCstVar(self, var, value)
848 r"""b == (v1 == v2)"""
849 return _pywrapcp.Solver_IsEqualCt(self, v1, v2, b)
852 r"""status var of (v1 == v2)"""
853 return _pywrapcp.Solver_IsEqualVar(self, v1, v2)
856 r"""boolvar == (var != value)"""
857 return _pywrapcp.Solver_IsDifferentCstCt(self, var, value, boolvar)
860 r"""status var of (var != value)"""
861 return _pywrapcp.Solver_IsDifferentCstVar(self, var, value)
864 r"""status var of (v1 != v2)"""
865 return _pywrapcp.Solver_IsDifferentVar(self, v1, v2)
868 r"""b == (v1 != v2)"""
869 return _pywrapcp.Solver_IsDifferentCt(self, v1, v2, b)
872 r"""boolvar == (var <= value)"""
873 return _pywrapcp.Solver_IsLessOrEqualCstCt(self, var, value, boolvar)
876 r"""status var of (var <= value)"""
877 return _pywrapcp.Solver_IsLessOrEqualCstVar(self, var, value)
880 r"""status var of (left <= right)"""
881 return _pywrapcp.Solver_IsLessOrEqualVar(self, left, right)
884 r"""b == (left <= right)"""
885 return _pywrapcp.Solver_IsLessOrEqualCt(self, left, right, b)
888 r"""boolvar == (var >= value)"""
889 return _pywrapcp.Solver_IsGreaterOrEqualCstCt(self, var, value, boolvar)
892 r"""status var of (var >= value)"""
893 return _pywrapcp.Solver_IsGreaterOrEqualCstVar(self, var, value)
896 r"""status var of (left >= right)"""
897 return _pywrapcp.Solver_IsGreaterOrEqualVar(self, left, right)
900 r"""b == (left >= right)"""
901 return _pywrapcp.Solver_IsGreaterOrEqualCt(self, left, right, b)
905 return _pywrapcp.Solver_IsGreaterCstCt(self, v, c, b)
908 r"""status var of (var > value)"""
909 return _pywrapcp.Solver_IsGreaterCstVar(self, var, value)
912 r"""status var of (left > right)"""
913 return _pywrapcp.Solver_IsGreaterVar(self, left, right)
916 r"""b == (left > right)"""
917 return _pywrapcp.Solver_IsGreaterCt(self, left, right, b)
921 return _pywrapcp.Solver_IsLessCstCt(self, v, c, b)
924 r"""status var of (var < value)"""
925 return _pywrapcp.Solver_IsLessCstVar(self, var, value)
928 r"""status var of (left < right)"""
929 return _pywrapcp.Solver_IsLessVar(self, left, right)
932 r"""b == (left < right)"""
933 return _pywrapcp.Solver_IsLessCt(self, left, right, b)
936 r"""Variation on arrays."""
937 return _pywrapcp.Solver_SumLessOrEqual(self, vars, cst)
940 return _pywrapcp.Solver_SumGreaterOrEqual(self, vars, cst)
943 return _pywrapcp.Solver_SumEquality(self, *args)
946 return _pywrapcp.Solver_ScalProdEquality(self, *args)
949 return _pywrapcp.Solver_ScalProdGreaterOrEqual(self, *args)
952 return _pywrapcp.Solver_ScalProdLessOrEqual(self, *args)
955 return _pywrapcp.Solver_MinEquality(self, vars, min_var)
958 return _pywrapcp.Solver_MaxEquality(self, vars, max_var)
961 return _pywrapcp.Solver_ElementEquality(self, *args)
964 r"""Creates the constraint abs(var) == abs_var."""
965 return _pywrapcp.Solver_AbsEquality(self, var, abs_var)
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.
974 return _pywrapcp.Solver_IndexOfConstraint(self, vars, index, target)
978 This method is a specialized case of the MakeConstraintDemon
979 method to call the InitiatePropagate of the constraint 'ct'.
981 return _pywrapcp.Solver_ConstraintInitialPropagateCallback(self, ct)
985 This method is a specialized case of the MakeConstraintDemon
986 method to call the InitiatePropagate of the constraint 'ct' with
989 return _pywrapcp.Solver_DelayedConstraintInitialPropagateCallback(self, ct)
992 r"""Creates a demon from a closure."""
993 return _pywrapcp.Solver_ClosureDemon(self, closure)
996 r"""(l <= expr <= u)"""
997 return _pywrapcp.Solver_BetweenCt(self, expr, l, u)
1000 r"""b == (l <= expr <= u)"""
1001 return _pywrapcp.Solver_IsBetweenCt(self, expr, l, u, b)
1004 return _pywrapcp.Solver_IsBetweenVar(self, v, l, u)
1008 expr in set. Propagation is lazy, i.e. this constraint does not
1009 creates holes in the domain of the variable.
1011 return _pywrapcp.Solver_MemberCt(self, *args)
1021 expr should not be in the list of forbidden intervals [start[i]..end[i]].
1026 expr should not be in the list of forbidden intervals [start[i]..end[i]].
1028 return _pywrapcp.Solver_NotMemberCt(self, *args)
1031 r"""boolvar == (expr in set)"""
1032 return _pywrapcp.Solver_IsMemberCt(self, *args)
1035 return _pywrapcp.Solver_IsMemberVar(self, *args)
1040 |{i | vars[i] == value}| == max_count
1045 |{i | vars[i] == value}| == max_count
1047 return _pywrapcp.Solver_Count(self, *args)
1052 Aggregated version of count: |{i | v[i] == values[j]}| == cards[j]
1057 Aggregated version of count: |{i | v[i] == values[j]}| == cards[j]
1062 Aggregated version of count: |{i | v[i] == j}| == cards[j]
1067 Aggregated version of count with bounded cardinalities:
1068 forall j in 0 .. card_size - 1: card_min <= |{i | v[i] == j}| <= card_max
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]
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]
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]
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]
1098 return _pywrapcp.Solver_Distribute(self, *args)
1102 Deviation constraint:
1103 sum_i |n * vars[i] - total_sum| <= deviation_var and
1104 sum_i vars[i] == total_sum
1107 return _pywrapcp.Solver_Deviation(self, vars, deviation_var, total_sum)
1112 All variables are pairwise different. This corresponds to the
1113 stronger version of the propagation algorithm.
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.
1122 return _pywrapcp.Solver_AllDifferent(self, *args)
1126 All variables are pairwise different, unless they are assigned to
1129 return _pywrapcp.Solver_AllDifferentExcept(self, vars, escape_value)
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.
1138 This constraint propagates in both directions: from "vars" to
1139 "sorted_vars" and vice-versa.
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.
1146 For more info, please have a look at:
1147 https://mpi-inf.mpg.de/~mehlhorn/ftp/Mehlhorn-Thiel.pdf
1149 return _pywrapcp.Solver_SortingConstraint(self, vars, sorted)
1153 Creates a constraint that enforces that left is lexicographically less
1156 return _pywrapcp.Solver_LexicalLess(self, left, right)
1160 Creates a constraint that enforces that left is lexicographically less
1161 than or equal to right.
1163 return _pywrapcp.Solver_LexicalLessOrEqual(self, left, right)
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.
1172 return _pywrapcp.Solver_InversePermutationConstraint(self, left, right)
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.
1181 return _pywrapcp.Solver_NullIntersect(self, first_vars, second_vars)
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.
1191 return _pywrapcp.Solver_NullIntersectExcept(self, first_vars, second_vars, escape_value)
1194 r"""Force the "nexts" variable to create a complete Hamiltonian path."""
1195 return _pywrapcp.Solver_Circuit(self, nexts)
1199 Force the "nexts" variable to create a complete Hamiltonian path
1200 for those that do not loop upon themselves.
1202 return _pywrapcp.Solver_SubCircuit(self, nexts)
1206 Delayed version of the same constraint: propagation on the nexts variables
1207 is delayed until all constraints have propagated.
1209 return _pywrapcp.Solver_DelayedPathCumul(self, nexts, active, cumuls, transits)
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.
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
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
1239 return _pywrapcp.Solver_PathCumul(self, *args)
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
1252 Compatibility layer for Python API.
1254 return _pywrapcp.Solver_AllowedAssignments(self, *args)
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.
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.
1278 return _pywrapcp.Solver_TransitionConstraint(self, *args)
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.
1291 return _pywrapcp.Solver_NonOverlappingBoxesConstraint(self, *args)
1293 def Pack(self, vars, number_of_bins):
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.
1301 return _pywrapcp.Solver_Pack(self, vars, number_of_bins)
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.
1314 Creates a performed interval var with a fixed duration. The duration must
1320 Creates an interval var with a fixed duration, and performed_variable.
1321 The duration must be greater than 0.
1323 return _pywrapcp.Solver_FixedDurationIntervalVar(self, *args)
1326 r"""Creates a fixed and performed interval."""
1327 return _pywrapcp.Solver_FixedInterval(self, start, duration, name)
1329 def IntervalVar(self, start_min, start_max, duration_min, duration_max, end_min, end_max, optional, name):
1331 Creates an interval var by specifying the bounds on start,
1334 return _pywrapcp.Solver_IntervalVar(self, start_min, start_max, duration_min, duration_max, end_min, end_max, optional, name)
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.
1341 return _pywrapcp.Solver_MirrorInterval(self, interval_var)
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.
1350 return _pywrapcp.Solver_FixedDurationStartSyncedOnStartIntervalVar(self, interval_var, duration, offset)
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.
1359 return _pywrapcp.Solver_FixedDurationStartSyncedOnEndIntervalVar(self, interval_var, duration, offset)
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.
1368 return _pywrapcp.Solver_FixedDurationEndSyncedOnStartIntervalVar(self, interval_var, duration, offset)
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.
1377 return _pywrapcp.Solver_FixedDurationEndSyncedOnEndIntervalVar(self, interval_var, duration, offset)
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
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
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
1396 This is very useful to implement propagators that may only modify
1397 the start max or end max.
1399 return _pywrapcp.Solver_IntervalRelaxedMin(self, interval_var)
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
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
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
1418 This is very useful for implementing propagators that may only modify
1419 the start min or end min.
1421 return _pywrapcp.Solver_IntervalRelaxedMax(self, interval_var)
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).
1433 This constraint implements a temporal disjunction between two
1436 return _pywrapcp.Solver_TemporalDisjunction(self, *args)
1440 This constraint forces all interval vars into an non-overlapping
1441 sequence. Intervals with zero duration can be scheduled anywhere.
1443 return _pywrapcp.Solver_DisjunctiveConstraint(self, intervals, name)
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
1452 Intervals and demands should be vectors of equal size.
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.
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
1465 Intervals and demands should be vectors of equal size.
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.
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
1478 Intervals and demands should be vectors of equal size.
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.
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
1491 Intervals and demands should be vectors of equal size.
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.
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
1504 Intervals and demands should be vectors of equal size.
1506 Demands should be positive.
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
1515 Intervals and demands should be vectors of equal size.
1517 Demands should be positive.
1519 return _pywrapcp.Solver_Cumulative(self, *args)
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
1529 return _pywrapcp.Solver_Cover(self, vars, target_var)
1534 This method creates an empty assignment.
1539 This method creates an assignment which is a copy of 'a'.
1541 return _pywrapcp.Solver_Assignment(self, *args)
1546 Collect the first solution of the search.
1551 Collect the first solution of the search. The variables will need to
1554 return _pywrapcp.Solver_FirstSolutionCollector(self, *args)
1559 Collect the last solution of the search.
1564 Collect the last solution of the search. The variables will need to
1567 return _pywrapcp.Solver_LastSolutionCollector(self, *args)
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).
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.
1586 return _pywrapcp.Solver_BestValueSolutionCollector(self, *args)
1591 Collect all solutions of the search.
1596 Collect all solutions of the search. The variables will need to
1599 return _pywrapcp.Solver_AllSolutionCollector(self, *args)
1602 r"""Creates a minimization objective."""
1603 return _pywrapcp.Solver_Minimize(self, v, step)
1606 r"""Creates a maximization objective."""
1607 return _pywrapcp.Solver_Maximize(self, v, step)
1610 r"""Creates a objective with a given sense (true = maximization)."""
1611 return _pywrapcp.Solver_Optimize(self, maximize, v, step)
1616 Creates a minimization weighted objective. The actual objective is
1617 scalar_prod(sub_objectives, weights).
1622 Creates a minimization weighted objective. The actual objective is
1623 scalar_prod(sub_objectives, weights).
1625 return _pywrapcp.Solver_WeightedMinimize(self, *args)
1630 Creates a maximization weigthed objective.
1635 Creates a maximization weigthed objective.
1637 return _pywrapcp.Solver_WeightedMaximize(self, *args)
1642 Creates a weighted objective with a given sense (true = maximization).
1647 Creates a weighted objective with a given sense (true = maximization).
1649 return _pywrapcp.Solver_WeightedOptimize(self, *args)
1651 def TabuSearch(self, maximize, objective, step, vars, keep_tenure, forbid_tenure, tabu_factor):
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.
1670 return _pywrapcp.Solver_TabuSearch(self, maximize, objective, step, vars, keep_tenure, forbid_tenure, tabu_factor)
1673 r"""Creates a Simulated Annealing monitor."""
1674 return _pywrapcp.Solver_SimulatedAnnealing(self, maximize, v, step, initial_temperature)
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...).
1682 return _pywrapcp.Solver_LubyRestart(self, scale_factor)
1686 This search monitor will restart the search periodically after 'frequency'
1689 return _pywrapcp.Solver_ConstantRestart(self, frequency)
1692 r"""Creates a search limit that constrains the running time."""
1693 return _pywrapcp.Solver_TimeLimit(self, *args)
1697 Creates a search limit that constrains the number of branches
1698 explored in the search tree.
1700 return _pywrapcp.Solver_BranchesLimit(self, branches)
1704 Creates a search limit that constrains the number of failures
1705 that can happen when exploring the search tree.
1707 return _pywrapcp.Solver_FailuresLimit(self, failures)
1711 Creates a search limit that constrains the number of solutions found
1714 return _pywrapcp.Solver_SolutionsLimit(self, solutions)
1719 Limits the search with the 'time', 'branches', 'failures' and
1720 'solutions' limits. 'smart_time_check' reduces the calls to the wall
1725 Creates a search limit from its protobuf description
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
1734 return _pywrapcp.Solver_Limit(self, *args)
1738 Callback-based search limit. Search stops when limiter returns true; if
1739 this happens at a leaf the corresponding solution will be rejected.
1741 return _pywrapcp.Solver_CustomLimit(self, limiter)
1746 The SearchMonitors below will display a periodic search log
1747 on LOG(INFO) every branch_period branches explored.
1752 At each solution, this monitor also display the var value.
1757 At each solution, this monitor will also display result of
1758 ``display_callback``.
1763 At each solution, this monitor will display the 'var' value and the
1764 result of ``display_callback``.
1769 At each solution, this monitor will display the 'vars' values and the
1770 result of ``display_callback``.
1775 OptimizeVar Search Logs
1776 At each solution, this monitor will also display the 'opt_var' value.
1781 Creates a search monitor that will also print the result of the
1784 return _pywrapcp.Solver_SearchLog(self, *args)
1788 Creates a search monitor that will trace precisely the behavior of the
1789 search. Use this only for low level debugging.
1791 return _pywrapcp.Solver_SearchTrace(self, prefix)
1794 r"""Prints the model."""
1795 return _pywrapcp.Solver_PrintModelVisitor(self)
1798 r"""Displays some nice statistics on the model."""
1799 return _pywrapcp.Solver_StatisticsModelVisitor(self)
1803 return _pywrapcp.Solver_AssignVariableValue(self, var, val)
1806 return _pywrapcp.Solver_VariableLessOrEqualValue(self, var, value)
1809 return _pywrapcp.Solver_VariableGreaterOrEqualValue(self, var, value)
1812 return _pywrapcp.Solver_SplitVariableDomain(self, var, val, start_with_lower_half)
1815 return _pywrapcp.Solver_AssignVariableValueOrFail(self, var, value)
1818 return _pywrapcp.Solver_AssignVariablesValues(self, vars, values)
1821 return _pywrapcp.Solver_FailDecision(self)
1824 return _pywrapcp.Solver_Decision(self, apply, refute)
1827 return _pywrapcp.Solver_Compose(self, dbs)
1830 return _pywrapcp.Solver_Try(self, dbs)
1833 return _pywrapcp.Solver_DefaultPhase(self, *args)
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.
1843 return _pywrapcp.Solver_ScheduleOrPostpone(self, var, est, marker)
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.
1853 return _pywrapcp.Solver_ScheduleOrExpedite(self, var, est, marker)
1857 Returns a decision that tries to rank first the ith interval var
1858 in the sequence variable.
1860 return _pywrapcp.Solver_RankFirstInterval(self, sequence, index)
1864 Returns a decision that tries to rank last the ith interval var
1865 in the sequence variable.
1867 return _pywrapcp.Solver_RankLastInterval(self, sequence, index)
1872 Phases on IntVar arrays.
1873 for all other functions that have several homonyms in this .h).
1880 return _pywrapcp.Solver_Phase(self, *args)
1884 Returns a decision builder for which the left-most leaf corresponds
1885 to assignment, the rest of the tree being explored using 'db'.
1887 return _pywrapcp.Solver_DecisionBuilderFromAssignment(self, assignment, db, vars)
1891 Returns a decision builder that will add the given constraint to
1894 return _pywrapcp.Solver_ConstraintAdder(self, ct)
1897 return _pywrapcp.Solver_SolveOnce(self, db, monitors)
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.
1909 return _pywrapcp.Solver_NestedOptimize(self, *args)
1913 Returns a DecisionBuilder which restores an Assignment
1914 (calls void Assignment::Restore())
1916 return _pywrapcp.Solver_RestoreAssignment(self, assignment)
1920 Returns a DecisionBuilder which stores an Assignment
1921 (calls void Assignment::Store())
1923 return _pywrapcp.Solver_StoreAssignment(self, assignment)
1926 r"""Local Search Operators."""
1927 return _pywrapcp.Solver_Operator(self, *args)
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
1937 Optionally a random seed can be specified.
1939 return _pywrapcp.Solver_RandomLnsOperator(self, *args)
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.
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.
1960 return _pywrapcp.Solver_MoveTowardTargetOperator(self, *args)
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.
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.
1980 const int kPriorities = {10, 100, 10, 0};
1981 int64_t Evaluate(int active_operator, int current_operator) {
1982 return kPriorities[current_operator];
1985 LocalSearchOperator* concat =
1986 solver.ConcatenateOperators(operators,
1987 NewPermanentCallback(&Evaluate));
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].
1994 return _pywrapcp.Solver_ConcatenateOperators(self, *args)
1999 Randomized version of local search concatenator; calls a random operator
2000 at each call to MakeNextNeighbor().
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.
2009 return _pywrapcp.Solver_RandomConcatenateOperators(self, *args)
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.
2019 return _pywrapcp.Solver_NeighborhoodLimit(self, op, limit)
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
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.
2051 Variant with a sub_decison_builder specific to the first solution.
2053 return _pywrapcp.Solver_LocalSearchPhase(self, *args)
2056 r"""Local Search Phase Parameters"""
2057 return _pywrapcp.Solver_LocalSearchPhaseParameters(self, *args)
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
2065 return _pywrapcp.Solver_TopProgressPercent(self)
2069 Gets the search depth of the current active search. Returns -1 if
2070 there is no active search opened.
2072 return _pywrapcp.Solver_SearchDepth(self)
2076 Gets the search left depth of the current active search. Returns -1 if
2077 there is no active search opened.
2079 return _pywrapcp.Solver_SearchLeftDepth(self)
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.
2086 return _pywrapcp.Solver_SolveDepth(self)
2089 r"""Returns a random value between 0 and 'size' - 1;"""
2090 return _pywrapcp.Solver_Rand64(self, size)
2093 r"""Returns a random value between 0 and 'size' - 1;"""
2094 return _pywrapcp.Solver_Rand32(self, size)
2097 r"""Reseed the solver random generator."""
2098 return _pywrapcp.Solver_ReSeed(self, seed)
2101 r"""Returns local search profiling information in a human readable format."""
2102 return _pywrapcp.Solver_LocalSearchProfile(self)
2106 Counts the number of constraints that have been added
2107 to the solver before the search.
2109 return _pywrapcp.Solver_Constraints(self)
2112 r"""Accepts the given model visitor."""
2113 return _pywrapcp.Solver_Accept(self, visitor)
2116 r"""Tells the solver to kill or restart the current search."""
2117 return _pywrapcp.Solver_FinishCurrentSearch(self)
2120 return _pywrapcp.Solver_RestartCurrentSearch(self)
2124 These methods are only useful for the SWIG wrappers, which need a way
2125 to externally cause the Solver to fail.
2127 return _pywrapcp.Solver_ShouldFail(self)
2130 return _pywrapcp.Solver___str__(self)
2133 if isinstance(ct, PyConstraint):
2139 return _pywrapcp.Solver_TreeNoCycle(self, nexts, active, callback)
2142 return _pywrapcp.Solver_SearchLogWithCallback(self, period, callback)
2145 return _pywrapcp.Solver_ElementFunction(self, values, index)
2148 return _pywrapcp.Solver_VarEvalValStrPhase(self, vars, var_evaluator, val_str)
2151 return _pywrapcp.Solver_VarStrValEvalPhase(self, vars, var_str, val_eval)
2154 return _pywrapcp.Solver_VarEvalValEvalPhase(self, vars, var_eval, val_eval)
2157 return _pywrapcp.Solver_VarStrValEvalTieBreakPhase(self, vars, var_str, val_eval, tie_breaker)
2160 return _pywrapcp.Solver_VarEvalValEvalTieBreakPhase(self, vars, var_eval, val_eval, tie_breaker)
2163 return _pywrapcp.Solver_EvalEvalStrPhase(self, vars, evaluator, str)
2166 return _pywrapcp.Solver_EvalEvalStrTieBreakPhase(self, vars, evaluator, tie_breaker, str)
2169 return _pywrapcp.Solver_GuidedLocalSearch(self, maximize, objective, objective_function, step, vars, penalty_factor)
2172 return _pywrapcp.Solver_SumObjectiveFilter(self, vars, values, filter_enum)
2175_pywrapcp.Solver_swigregister(Solver)
2178 A BaseObject is the root of all reversibly allocated objects.
2179 A DebugString method and the associated << operator are implemented
2183 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2190 _pywrapcp.BaseObject_swiginit(self, _pywrapcp.new_BaseObject(_self, ))
2191 __swig_destroy__ = _pywrapcp.delete_BaseObject
2194 return _pywrapcp.BaseObject_DebugString(self)
2197 return _pywrapcp.BaseObject___str__(self)
2200 return _pywrapcp.BaseObject___repr__(self)
2203 _pywrapcp.disown_BaseObject(self)
2204 return weakref.proxy(self)
2207_pywrapcp.BaseObject_swigregister(BaseObject)
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.
2216 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2217 __repr__ = _swig_repr
2220 if self.
__class__ == PropagationBaseObject:
2224 _pywrapcp.PropagationBaseObject_swiginit(self, _pywrapcp.new_PropagationBaseObject(_self, s))
2225 __swig_destroy__ = _pywrapcp.delete_PropagationBaseObject
2228 return _pywrapcp.PropagationBaseObject_DebugString(self)
2231 return _pywrapcp.PropagationBaseObject_solver(self)
2234 r"""Object naming."""
2235 return _pywrapcp.PropagationBaseObject_Name(self)
2238 _pywrapcp.disown_PropagationBaseObject(self)
2239 return weakref.proxy(self)
2242_pywrapcp.PropagationBaseObject_swigregister(PropagationBaseObject)
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.
2249 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2256 _pywrapcp.Decision_swiginit(self, _pywrapcp.new_Decision(_self, ))
2257 __swig_destroy__ = _pywrapcp.delete_Decision
2260 r"""Apply will be called first when the decision is executed."""
2261 return _pywrapcp.Decision_ApplyWrapper(self, s)
2264 r"""Refute will be called after a backtrack."""
2265 return _pywrapcp.Decision_RefuteWrapper(self, s)
2268 return _pywrapcp.Decision_DebugString(self)
2271 return _pywrapcp.Decision___repr__(self)
2274 return _pywrapcp.Decision___str__(self)
2277 _pywrapcp.disown_Decision(self)
2278 return weakref.proxy(self)
2281_pywrapcp.Decision_swigregister(Decision)
2284 A DecisionBuilder is responsible for creating the search tree. The
2285 important method is Next(), which returns the next decision to execute.
2288 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2295 _pywrapcp.DecisionBuilder_swiginit(self, _pywrapcp.new_DecisionBuilder(_self, ))
2296 __swig_destroy__ = _pywrapcp.delete_DecisionBuilder
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
2305 return _pywrapcp.DecisionBuilder_NextWrapper(self, s)
2308 return _pywrapcp.DecisionBuilder_DebugString(self)
2311 return _pywrapcp.DecisionBuilder___repr__(self)
2314 return _pywrapcp.DecisionBuilder___str__(self)
2317 _pywrapcp.disown_DecisionBuilder(self)
2318 return weakref.proxy(self)
2321_pywrapcp.DecisionBuilder_swigregister(DecisionBuilder)
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.
2335 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2336 __repr__ = _swig_repr
2340 This indicates the priority of a demon. Immediate demons are treated
2341 separately and corresponds to variables.
2347 _pywrapcp.Demon_swiginit(self, _pywrapcp.new_Demon(_self, ))
2348 __swig_destroy__ = _pywrapcp.delete_Demon
2351 r"""This is the main callback of the demon."""
2352 return _pywrapcp.Demon_RunWrapper(self, s)
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.
2360 return _pywrapcp.Demon_Priority(self)
2363 return _pywrapcp.Demon_DebugString(self)
2367 This method inhibits the demon in the search tree below the
2370 return _pywrapcp.Demon_Inhibit(self, s)
2373 r"""This method un-inhibits the demon that was previously inhibited."""
2374 return _pywrapcp.Demon_Desinhibit(self, s)
2377 _pywrapcp.disown_Demon(self)
2378 return weakref.proxy(self)
2381_pywrapcp.Demon_swigregister(Demon)
2384 A constraint is the main modeling object. It provides two methods:
2385 - Post() is responsible for creating the demons and attaching them to
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.
2392 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2399 _pywrapcp.Constraint_swiginit(self, _pywrapcp.new_Constraint(_self, solver))
2400 __swig_destroy__ = _pywrapcp.delete_Constraint
2404 This method is called when the constraint is processed by the
2405 solver. Its main usage is to attach demons to variables.
2407 return _pywrapcp.Constraint_Post(self)
2411 This method performs the initial propagation of the
2412 constraint. It is called just after the post.
2414 return _pywrapcp.Constraint_InitialPropagateWrapper(self)
2417 return _pywrapcp.Constraint_DebugString(self)
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.
2425 return _pywrapcp.Constraint_Var(self)
2428 return _pywrapcp.Constraint___repr__(self)
2431 return _pywrapcp.Constraint___str__(self)
2434 return _pywrapcp.Constraint___add__(self, *args)
2437 return _pywrapcp.Constraint___radd__(self, v)
2440 return _pywrapcp.Constraint___sub__(self, *args)
2443 return _pywrapcp.Constraint___rsub__(self, v)
2446 return _pywrapcp.Constraint___mul__(self, *args)
2449 return _pywrapcp.Constraint___rmul__(self, v)
2452 return _pywrapcp.Constraint___floordiv__(self, v)
2455 return _pywrapcp.Constraint___neg__(self)
2458 return _pywrapcp.Constraint___abs__(self)
2461 return _pywrapcp.Constraint_Square(self)
2464 return _pywrapcp.Constraint___eq__(self, *args)
2467 return _pywrapcp.Constraint___ne__(self, *args)
2470 return _pywrapcp.Constraint___ge__(self, *args)
2473 return _pywrapcp.Constraint___gt__(self, *args)
2476 return _pywrapcp.Constraint___le__(self, *args)
2479 return _pywrapcp.Constraint___lt__(self, *args)
2482 return _pywrapcp.Constraint_MapTo(self, vars)
2485 return _pywrapcp.Constraint_IndexOf(self, *args)
2488 _pywrapcp.disown_Constraint(self)
2489 return weakref.proxy(self)
2492_pywrapcp.Constraint_swigregister(Constraint)
2494 r"""A search monitor is a simple set of callbacks to monitor all search events"""
2496 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2497 kNoProgress = _pywrapcp.SearchMonitor_kNoProgress
2504 _pywrapcp.SearchMonitor_swiginit(self, _pywrapcp.new_SearchMonitor(_self, s))
2505 __swig_destroy__ = _pywrapcp.delete_SearchMonitor
2508 r"""Beginning of the search."""
2509 return _pywrapcp.SearchMonitor_EnterSearch(self)
2512 r"""Restart the search."""
2513 return _pywrapcp.SearchMonitor_RestartSearch(self)
2516 r"""End of the search."""
2517 return _pywrapcp.SearchMonitor_ExitSearch(self)
2520 r"""Before calling DecisionBuilder::Next."""
2521 return _pywrapcp.SearchMonitor_BeginNextDecision(self, b)
2524 r"""After calling DecisionBuilder::Next, along with the returned decision."""
2525 return _pywrapcp.SearchMonitor_EndNextDecision(self, b, d)
2528 r"""Before applying the decision."""
2529 return _pywrapcp.SearchMonitor_ApplyDecision(self, d)
2532 r"""Before refuting the decision."""
2533 return _pywrapcp.SearchMonitor_RefuteDecision(self, d)
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.
2540 return _pywrapcp.SearchMonitor_AfterDecision(self, d, apply)
2543 r"""Just when the failure occurs."""
2544 return _pywrapcp.SearchMonitor_BeginFail(self)
2547 r"""After completing the backtrack."""
2548 return _pywrapcp.SearchMonitor_EndFail(self)
2551 r"""Before the initial propagation."""
2552 return _pywrapcp.SearchMonitor_BeginInitialPropagation(self)
2555 r"""After the initial propagation."""
2556 return _pywrapcp.SearchMonitor_EndInitialPropagation(self)
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.
2564 return _pywrapcp.SearchMonitor_AcceptSolution(self)
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.
2572 return _pywrapcp.SearchMonitor_AtSolution(self)
2575 r"""When the search tree is finished."""
2576 return _pywrapcp.SearchMonitor_NoMoreSolutions(self)
2580 return _pywrapcp.SearchMonitor_AcceptDelta(self, delta, deltadelta)
2583 r"""After accepting a neighbor during local search."""
2584 return _pywrapcp.SearchMonitor_AcceptNeighbor(self)
2588 Returns a percentage representing the propress of the search before
2591 return _pywrapcp.SearchMonitor_ProgressPercent(self)
2594 return _pywrapcp.SearchMonitor_solver(self)
2597 return _pywrapcp.SearchMonitor___repr__(self)
2600 return _pywrapcp.SearchMonitor___str__(self)
2603 _pywrapcp.disown_SearchMonitor(self)
2604 return weakref.proxy(self)
2607_pywrapcp.SearchMonitor_swigregister(SearchMonitor)
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)
2619 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2622 raise AttributeError(
"No constructor defined - class is abstract")
2625 return _pywrapcp.IntExpr_Min(self)
2628 return _pywrapcp.IntExpr_SetMin(self, m)
2631 return _pywrapcp.IntExpr_Max(self)
2634 return _pywrapcp.IntExpr_SetMax(self, m)
2637 r"""This method sets both the min and the max of the expression."""
2638 return _pywrapcp.IntExpr_SetRange(self, l, u)
2641 r"""This method sets the value of the expression."""
2642 return _pywrapcp.IntExpr_SetValue(self, v)
2645 r"""Returns true if the min and the max of the expression are equal."""
2646 return _pywrapcp.IntExpr_Bound(self)
2649 r"""Returns true if the expression is indeed a variable."""
2650 return _pywrapcp.IntExpr_IsVar(self)
2653 r"""Creates a variable from the expression."""
2654 return _pywrapcp.IntExpr_Var(self)
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().
2663 return _pywrapcp.IntExpr_VarWithName(self, name)
2668 Attach a demon that will watch the min or the max of the expression.
2673 Attach a demon that will watch the min or the max of the expression.
2675 return _pywrapcp.IntExpr_WhenRange(self, *args)
2678 return _pywrapcp.IntExpr___repr__(self)
2681 return _pywrapcp.IntExpr___str__(self)
2684 return _pywrapcp.IntExpr___add__(self, *args)
2687 return _pywrapcp.IntExpr___radd__(self, v)
2690 return _pywrapcp.IntExpr___sub__(self, *args)
2693 return _pywrapcp.IntExpr___rsub__(self, v)
2696 return _pywrapcp.IntExpr___mul__(self, *args)
2699 return _pywrapcp.IntExpr___rmul__(self, v)
2702 return _pywrapcp.IntExpr___floordiv__(self, *args)
2705 return _pywrapcp.IntExpr___mod__(self, *args)
2708 return _pywrapcp.IntExpr___neg__(self)
2711 return _pywrapcp.IntExpr___abs__(self)
2714 return _pywrapcp.IntExpr_Square(self)
2717 return _pywrapcp.IntExpr___eq__(self, *args)
2720 return _pywrapcp.IntExpr___ne__(self, *args)
2723 return _pywrapcp.IntExpr___ge__(self, *args)
2726 return _pywrapcp.IntExpr___gt__(self, *args)
2729 return _pywrapcp.IntExpr___le__(self, *args)
2732 return _pywrapcp.IntExpr___lt__(self, *args)
2735 return _pywrapcp.IntExpr_MapTo(self, vars)
2738 return _pywrapcp.IntExpr_IndexOf(self, *args)
2741 return _pywrapcp.IntExpr_IsMember(self, values)
2744 return _pywrapcp.IntExpr_Member(self, values)
2747 return _pywrapcp.IntExpr_NotMember(self, starts, ends)
2750_pywrapcp.IntExpr_swigregister(IntExpr)
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)) {
2769 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2772 raise AttributeError(
"No constructor defined - class is abstract")
2773 __repr__ = _swig_repr
2776 r"""This method must be called before each loop."""
2777 return _pywrapcp.IntVarIterator_Init(self)
2780 r"""This method indicates if we can call Value() or not."""
2781 return _pywrapcp.IntVarIterator_Ok(self)
2784 r"""This method returns the current value of the iterator."""
2785 return _pywrapcp.IntVarIterator_Value(self)
2788 r"""This method moves the iterator to the next value."""
2789 return _pywrapcp.IntVarIterator_Next(self)
2792 r"""Pretty Print."""
2793 return _pywrapcp.IntVarIterator_DebugString(self)
2801 result = self.
Value()
2805 raise StopIteration()
2812_pywrapcp.IntVarIterator_swigregister(IntVarIterator)
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.
2820 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2823 raise AttributeError(
"No constructor defined - class is abstract")
2826 return _pywrapcp.IntVar_IsVar(self)
2829 return _pywrapcp.IntVar_Var(self)
2833 This method returns the value of the variable. This method checks
2834 before that the variable is bound.
2836 return _pywrapcp.IntVar_Value(self)
2839 r"""This method removes the value 'v' from the domain of the variable."""
2840 return _pywrapcp.IntVar_RemoveValue(self, v)
2844 This method removes the interval 'l' .. 'u' from the domain of
2845 the variable. It assumes that 'l' <= 'u'.
2847 return _pywrapcp.IntVar_RemoveInterval(self, l, u)
2850 r"""This method remove the values from the domain of the variable."""
2851 return _pywrapcp.IntVar_RemoveValues(self, values)
2854 r"""This method intersects the current domain with the values in the array."""
2855 return _pywrapcp.IntVar_SetValues(self, values)
2860 This method attaches a demon that will be awakened when the
2866 This method attaches a closure that will be awakened when the
2869 return _pywrapcp.IntVar_WhenBound(self, *args)
2874 This method attaches a demon that will watch any domain
2875 modification of the domain of the variable.
2880 This method attaches a closure that will watch any domain
2881 modification of the domain of the variable.
2883 return _pywrapcp.IntVar_WhenDomain(self, *args)
2886 r"""This method returns the number of values in the domain of the variable."""
2887 return _pywrapcp.IntVar_Size(self)
2891 This method returns whether the value 'v' is in the domain of the
2894 return _pywrapcp.IntVar_Contains(self, v)
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.
2902 return _pywrapcp.IntVar_HoleIteratorAux(self, reversible)
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.
2910 return _pywrapcp.IntVar_DomainIteratorAux(self, reversible)
2913 r"""Returns the previous min."""
2914 return _pywrapcp.IntVar_OldMin(self)
2917 r"""Returns the previous max."""
2918 return _pywrapcp.IntVar_OldMax(self)
2921 return _pywrapcp.IntVar___repr__(self)
2924 return _pywrapcp.IntVar___str__(self)
2934_pywrapcp.IntVar_swigregister(IntVar)
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.
2942 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
2945 raise AttributeError(
"No constructor defined")
2946 __repr__ = _swig_repr
2949 return _pywrapcp.SolutionCollector_DebugString(self)
2953 return _pywrapcp.SolutionCollector_Add(self, *args)
2956 return _pywrapcp.SolutionCollector_AddObjective(self, objective)
2959 r"""Beginning of the search."""
2960 return _pywrapcp.SolutionCollector_EnterSearch(self)
2963 r"""Returns how many solutions were stored during the search."""
2964 return _pywrapcp.SolutionCollector_SolutionCount(self)
2967 r"""Returns the nth solution."""
2968 return _pywrapcp.SolutionCollector_Solution(self, n)
2971 r"""Returns the wall time in ms for the nth solution."""
2972 return _pywrapcp.SolutionCollector_WallTime(self, n)
2975 r"""Returns the number of branches when the nth solution was found."""
2976 return _pywrapcp.SolutionCollector_Branches(self, n)
2980 Returns the number of failures encountered at the time of the nth
2983 return _pywrapcp.SolutionCollector_Failures(self, n)
2986 r"""Returns the objective value of the nth solution."""
2987 return _pywrapcp.SolutionCollector_ObjectiveValue(self, n)
2990 r"""This is a shortcut to get the Value of 'var' in the nth solution."""
2991 return _pywrapcp.SolutionCollector_Value(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)
2998 r"""This is a shortcut to get the EndValue of 'var' in the nth solution."""
2999 return _pywrapcp.SolutionCollector_EndValue(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)
3006 r"""This is a shortcut to get the PerformedValue of 'var' in the nth solution."""
3007 return _pywrapcp.SolutionCollector_PerformedValue(self, n, var)
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.
3015 return _pywrapcp.SolutionCollector_ForwardSequence(self, n, var)
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.
3023 return _pywrapcp.SolutionCollector_BackwardSequence(self, n, var)
3027 This is a shortcut to get the list of unperformed of 'var' in the
3030 return _pywrapcp.SolutionCollector_Unperformed(self, n, var)
3033_pywrapcp.SolutionCollector_swigregister(SolutionCollector)
3036 This class encapsulates an objective. It requires the direction
3037 (minimize or maximize), the variable to optimize, and the
3041 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3044 raise AttributeError(
"No constructor defined")
3045 __repr__ = _swig_repr
3048 r"""Returns the best value found during search."""
3049 return _pywrapcp.OptimizeVar_Best(self)
3052 r"""Internal methods."""
3053 return _pywrapcp.OptimizeVar_BeginNextDecision(self, db)
3056 return _pywrapcp.OptimizeVar_RefuteDecision(self, d)
3059 return _pywrapcp.OptimizeVar_AtSolution(self)
3062 return _pywrapcp.OptimizeVar_AcceptSolution(self)
3065 return _pywrapcp.OptimizeVar_DebugString(self)
3066 __swig_destroy__ = _pywrapcp.delete_OptimizeVar
3069_pywrapcp.OptimizeVar_swigregister(OptimizeVar)
3071 r"""Base class of all search limits."""
3073 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3076 raise AttributeError(
"No constructor defined - class is abstract")
3077 __repr__ = _swig_repr
3078 __swig_destroy__ = _pywrapcp.delete_SearchLimit
3081 r"""Returns true if the limit has been crossed."""
3082 return _pywrapcp.SearchLimit_Crossed(self)
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.
3091 return _pywrapcp.SearchLimit_Check(self)
3094 r"""This method is called when the search limit is initialized."""
3095 return _pywrapcp.SearchLimit_Init(self)
3098 r"""Internal methods."""
3099 return _pywrapcp.SearchLimit_EnterSearch(self)
3102 return _pywrapcp.SearchLimit_BeginNextDecision(self, b)
3105 return _pywrapcp.SearchLimit_RefuteDecision(self, d)
3108 return _pywrapcp.SearchLimit_DebugString(self)
3111_pywrapcp.SearchLimit_swigregister(SearchLimit)
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.
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...)
3126 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3129 raise AttributeError(
"No constructor defined - class is abstract")
3133 These methods query, set, and watch the start position of the
3136 return _pywrapcp.IntervalVar_StartMin(self)
3139 return _pywrapcp.IntervalVar_StartMax(self)
3142 return _pywrapcp.IntervalVar_SetStartMin(self, m)
3145 return _pywrapcp.IntervalVar_SetStartMax(self, m)
3148 return _pywrapcp.IntervalVar_SetStartRange(self, mi, ma)
3151 return _pywrapcp.IntervalVar_OldStartMin(self)
3154 return _pywrapcp.IntervalVar_OldStartMax(self)
3157 return _pywrapcp.IntervalVar_WhenStartRange(self, *args)
3160 return _pywrapcp.IntervalVar_WhenStartBound(self, *args)
3163 r"""These methods query, set, and watch the duration of the interval var."""
3164 return _pywrapcp.IntervalVar_DurationMin(self)
3167 return _pywrapcp.IntervalVar_DurationMax(self)
3170 return _pywrapcp.IntervalVar_SetDurationMin(self, m)
3173 return _pywrapcp.IntervalVar_SetDurationMax(self, m)
3176 return _pywrapcp.IntervalVar_SetDurationRange(self, mi, ma)
3179 return _pywrapcp.IntervalVar_OldDurationMin(self)
3182 return _pywrapcp.IntervalVar_OldDurationMax(self)
3185 return _pywrapcp.IntervalVar_WhenDurationRange(self, *args)
3188 return _pywrapcp.IntervalVar_WhenDurationBound(self, *args)
3191 r"""These methods query, set, and watch the end position of the interval var."""
3192 return _pywrapcp.IntervalVar_EndMin(self)
3195 return _pywrapcp.IntervalVar_EndMax(self)
3198 return _pywrapcp.IntervalVar_SetEndMin(self, m)
3201 return _pywrapcp.IntervalVar_SetEndMax(self, m)
3204 return _pywrapcp.IntervalVar_SetEndRange(self, mi, ma)
3207 return _pywrapcp.IntervalVar_OldEndMin(self)
3210 return _pywrapcp.IntervalVar_OldEndMax(self)
3213 return _pywrapcp.IntervalVar_WhenEndRange(self, *args)
3216 return _pywrapcp.IntervalVar_WhenEndBound(self, *args)
3220 These methods query, set, and watch the performed status of the
3223 return _pywrapcp.IntervalVar_MustBePerformed(self)
3226 return _pywrapcp.IntervalVar_MayBePerformed(self)
3229 return _pywrapcp.IntervalVar_CannotBePerformed(self)
3232 return _pywrapcp.IntervalVar_IsPerformedBound(self)
3235 return _pywrapcp.IntervalVar_SetPerformed(self, val)
3238 return _pywrapcp.IntervalVar_WasPerformedBound(self)
3241 return _pywrapcp.IntervalVar_WhenPerformedBound(self, *args)
3246 Attaches a demon awakened when anything about this interval changes.
3251 Attaches a closure awakened when anything about this interval changes.
3253 return _pywrapcp.IntervalVar_WhenAnything(self, *args)
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.
3261 return _pywrapcp.IntervalVar_StartExpr(self)
3264 return _pywrapcp.IntervalVar_DurationExpr(self)
3267 return _pywrapcp.IntervalVar_EndExpr(self)
3270 return _pywrapcp.IntervalVar_PerformedExpr(self)
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.
3278 return _pywrapcp.IntervalVar_SafeStartExpr(self, unperformed_value)
3281 return _pywrapcp.IntervalVar_SafeDurationExpr(self, unperformed_value)
3284 return _pywrapcp.IntervalVar_SafeEndExpr(self, unperformed_value)
3287 return _pywrapcp.IntervalVar_EndsAfterEnd(self, other)
3290 return _pywrapcp.IntervalVar_EndsAfterEndWithDelay(self, other, delay)
3293 return _pywrapcp.IntervalVar_EndsAfterStart(self, other)
3296 return _pywrapcp.IntervalVar_EndsAfterStartWithDelay(self, other, delay)
3299 return _pywrapcp.IntervalVar_EndsAtEnd(self, other)
3302 return _pywrapcp.IntervalVar_EndsAtEndWithDelay(self, other, delay)
3305 return _pywrapcp.IntervalVar_EndsAtStart(self, other)
3308 return _pywrapcp.IntervalVar_EndsAtStartWithDelay(self, other, delay)
3311 return _pywrapcp.IntervalVar_StartsAfterEnd(self, other)
3314 return _pywrapcp.IntervalVar_StartsAfterEndWithDelay(self, other, delay)
3317 return _pywrapcp.IntervalVar_StartsAfterStart(self, other)
3320 return _pywrapcp.IntervalVar_StartsAfterStartWithDelay(self, other, delay)
3323 return _pywrapcp.IntervalVar_StartsAtEnd(self, other)
3326 return _pywrapcp.IntervalVar_StartsAtEndWithDelay(self, other, delay)
3329 return _pywrapcp.IntervalVar_StartsAtStart(self, other)
3332 return _pywrapcp.IntervalVar_StartsAtStartWithDelay(self, other, delay)
3335 return _pywrapcp.IntervalVar_StaysInSync(self, other)
3338 return _pywrapcp.IntervalVar_StaysInSyncWithDelay(self, other, delay)
3341 return _pywrapcp.IntervalVar_EndsAfter(self, date)
3344 return _pywrapcp.IntervalVar_EndsAt(self, date)
3347 return _pywrapcp.IntervalVar_EndsBefore(self, date)
3350 return _pywrapcp.IntervalVar_StartsAfter(self, date)
3353 return _pywrapcp.IntervalVar_StartsAt(self, date)
3356 return _pywrapcp.IntervalVar_StartsBefore(self, date)
3359 return _pywrapcp.IntervalVar_CrossesDate(self, date)
3362 return _pywrapcp.IntervalVar_AvoidsDate(self, date)
3365 return _pywrapcp.IntervalVar___repr__(self)
3368 return _pywrapcp.IntervalVar___str__(self)
3371_pywrapcp.IntervalVar_swigregister(IntervalVar)
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.
3382 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3385 raise AttributeError(
"No constructor defined")
3388 return _pywrapcp.SequenceVar_DebugString(self)
3392 Ranks the index_th interval var first of all unranked interval
3393 vars. After that, it will no longer be considered ranked.
3395 return _pywrapcp.SequenceVar_RankFirst(self, index)
3399 Indicates that the index_th interval var will not be ranked first
3400 of all currently unranked interval vars.
3402 return _pywrapcp.SequenceVar_RankNotFirst(self, index)
3406 Ranks the index_th interval var first of all unranked interval
3407 vars. After that, it will no longer be considered ranked.
3409 return _pywrapcp.SequenceVar_RankLast(self, index)
3413 Indicates that the index_th interval var will not be ranked first
3414 of all currently unranked interval vars.
3416 return _pywrapcp.SequenceVar_RankNotLast(self, index)
3419 r"""Returns the index_th interval of the sequence."""
3420 return _pywrapcp.SequenceVar_Interval(self, index)
3423 r"""Returns the next of the index_th interval of the sequence."""
3424 return _pywrapcp.SequenceVar_Next(self, index)
3427 r"""Returns the number of interval vars in the sequence."""
3428 return _pywrapcp.SequenceVar_Size(self)
3431 return _pywrapcp.SequenceVar___repr__(self)
3434 return _pywrapcp.SequenceVar___str__(self)
3437_pywrapcp.SequenceVar_swigregister(SequenceVar)
3439 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3442 raise AttributeError(
"No constructor defined")
3443 __repr__ = _swig_repr
3446 return _pywrapcp.AssignmentElement_Activate(self)
3449 return _pywrapcp.AssignmentElement_Deactivate(self)
3452 return _pywrapcp.AssignmentElement_Activated(self)
3453 __swig_destroy__ = _pywrapcp.delete_AssignmentElement
3456_pywrapcp.AssignmentElement_swigregister(AssignmentElement)
3458 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3461 raise AttributeError(
"No constructor defined")
3462 __repr__ = _swig_repr
3465 return _pywrapcp.IntVarElement_Var(self)
3468 return _pywrapcp.IntVarElement_Min(self)
3471 return _pywrapcp.IntVarElement_SetMin(self, m)
3474 return _pywrapcp.IntVarElement_Max(self)
3477 return _pywrapcp.IntVarElement_SetMax(self, m)
3480 return _pywrapcp.IntVarElement_Value(self)
3483 return _pywrapcp.IntVarElement_Bound(self)
3486 return _pywrapcp.IntVarElement_SetRange(self, l, u)
3489 return _pywrapcp.IntVarElement_SetValue(self, v)
3492 return _pywrapcp.IntVarElement___eq__(self, element)
3495 return _pywrapcp.IntVarElement___ne__(self, element)
3496 __swig_destroy__ = _pywrapcp.delete_IntVarElement
3499_pywrapcp.IntVarElement_swigregister(IntVarElement)
3501 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3504 raise AttributeError(
"No constructor defined")
3505 __repr__ = _swig_repr
3508 return _pywrapcp.IntervalVarElement_Var(self)
3511 return _pywrapcp.IntervalVarElement_StartMin(self)
3514 return _pywrapcp.IntervalVarElement_StartMax(self)
3517 return _pywrapcp.IntervalVarElement_StartValue(self)
3520 return _pywrapcp.IntervalVarElement_DurationMin(self)
3523 return _pywrapcp.IntervalVarElement_DurationMax(self)
3526 return _pywrapcp.IntervalVarElement_DurationValue(self)
3529 return _pywrapcp.IntervalVarElement_EndMin(self)
3532 return _pywrapcp.IntervalVarElement_EndMax(self)
3535 return _pywrapcp.IntervalVarElement_EndValue(self)
3538 return _pywrapcp.IntervalVarElement_PerformedMin(self)
3541 return _pywrapcp.IntervalVarElement_PerformedMax(self)
3544 return _pywrapcp.IntervalVarElement_PerformedValue(self)
3547 return _pywrapcp.IntervalVarElement_SetStartMin(self, m)
3550 return _pywrapcp.IntervalVarElement_SetStartMax(self, m)
3553 return _pywrapcp.IntervalVarElement_SetStartRange(self, mi, ma)
3556 return _pywrapcp.IntervalVarElement_SetStartValue(self, v)
3559 return _pywrapcp.IntervalVarElement_SetDurationMin(self, m)
3562 return _pywrapcp.IntervalVarElement_SetDurationMax(self, m)
3565 return _pywrapcp.IntervalVarElement_SetDurationRange(self, mi, ma)
3568 return _pywrapcp.IntervalVarElement_SetDurationValue(self, v)
3571 return _pywrapcp.IntervalVarElement_SetEndMin(self, m)
3574 return _pywrapcp.IntervalVarElement_SetEndMax(self, m)
3577 return _pywrapcp.IntervalVarElement_SetEndRange(self, mi, ma)
3580 return _pywrapcp.IntervalVarElement_SetEndValue(self, v)
3583 return _pywrapcp.IntervalVarElement_SetPerformedMin(self, m)
3586 return _pywrapcp.IntervalVarElement_SetPerformedMax(self, m)
3589 return _pywrapcp.IntervalVarElement_SetPerformedRange(self, mi, ma)
3592 return _pywrapcp.IntervalVarElement_SetPerformedValue(self, v)
3595 return _pywrapcp.IntervalVarElement___eq__(self, element)
3598 return _pywrapcp.IntervalVarElement___ne__(self, element)
3599 __swig_destroy__ = _pywrapcp.delete_IntervalVarElement
3602_pywrapcp.IntervalVarElement_swigregister(IntervalVarElement)
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.
3620 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3623 raise AttributeError(
"No constructor defined")
3624 __repr__ = _swig_repr
3627 return _pywrapcp.SequenceVarElement_Var(self)
3630 return _pywrapcp.SequenceVarElement_ForwardSequence(self)
3633 return _pywrapcp.SequenceVarElement_BackwardSequence(self)
3636 return _pywrapcp.SequenceVarElement_Unperformed(self)
3638 def SetSequence(self, forward_sequence, backward_sequence, unperformed):
3639 return _pywrapcp.SequenceVarElement_SetSequence(self, forward_sequence, backward_sequence, unperformed)
3642 return _pywrapcp.SequenceVarElement_SetForwardSequence(self, forward_sequence)
3645 return _pywrapcp.SequenceVarElement_SetBackwardSequence(self, backward_sequence)
3648 return _pywrapcp.SequenceVarElement_SetUnperformed(self, unperformed)
3651 return _pywrapcp.SequenceVarElement___eq__(self, element)
3654 return _pywrapcp.SequenceVarElement___ne__(self, element)
3655 __swig_destroy__ = _pywrapcp.delete_SequenceVarElement
3658_pywrapcp.SequenceVarElement_swigregister(SequenceVarElement)
3661 An Assignment is a variable -> domains mapping, used
3662 to report solutions to the user.
3665 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3668 raise AttributeError(
"No constructor defined")
3669 __repr__ = _swig_repr
3672 return _pywrapcp.Assignment_Clear(self)
3675 return _pywrapcp.Assignment_Empty(self)
3678 return _pywrapcp.Assignment_Size(self)
3681 return _pywrapcp.Assignment_NumIntVars(self)
3684 return _pywrapcp.Assignment_NumIntervalVars(self)
3687 return _pywrapcp.Assignment_NumSequenceVars(self)
3690 return _pywrapcp.Assignment_Store(self)
3693 return _pywrapcp.Assignment_Restore(self)
3697 Loads an assignment from a file; does not add variables to the
3698 assignment (only the variables contained in the assignment are modified).
3700 return _pywrapcp.Assignment_Load(self, *args)
3703 r"""Saves the assignment to a file."""
3704 return _pywrapcp.Assignment_Save(self, *args)
3707 return _pywrapcp.Assignment_AddObjective(self, v)
3710 return _pywrapcp.Assignment_Objective(self)
3713 return _pywrapcp.Assignment_HasObjective(self)
3716 return _pywrapcp.Assignment_ObjectiveMin(self)
3719 return _pywrapcp.Assignment_ObjectiveMax(self)
3722 return _pywrapcp.Assignment_ObjectiveValue(self)
3725 return _pywrapcp.Assignment_ObjectiveBound(self)
3728 return _pywrapcp.Assignment_SetObjectiveMin(self, m)
3731 return _pywrapcp.Assignment_SetObjectiveMax(self, m)
3734 return _pywrapcp.Assignment_SetObjectiveValue(self, value)
3737 return _pywrapcp.Assignment_SetObjectiveRange(self, l, u)
3740 return _pywrapcp.Assignment_Min(self, var)
3743 return _pywrapcp.Assignment_Max(self, var)
3746 return _pywrapcp.Assignment_Value(self, var)
3749 return _pywrapcp.Assignment_Bound(self, var)
3752 return _pywrapcp.Assignment_SetMin(self, var, m)
3755 return _pywrapcp.Assignment_SetMax(self, var, m)
3758 return _pywrapcp.Assignment_SetRange(self, var, l, u)
3761 return _pywrapcp.Assignment_SetValue(self, var, value)
3764 return _pywrapcp.Assignment_StartMin(self, var)
3767 return _pywrapcp.Assignment_StartMax(self, var)
3770 return _pywrapcp.Assignment_StartValue(self, var)
3773 return _pywrapcp.Assignment_DurationMin(self, var)
3776 return _pywrapcp.Assignment_DurationMax(self, var)
3779 return _pywrapcp.Assignment_DurationValue(self, var)
3782 return _pywrapcp.Assignment_EndMin(self, var)
3785 return _pywrapcp.Assignment_EndMax(self, var)
3788 return _pywrapcp.Assignment_EndValue(self, var)
3791 return _pywrapcp.Assignment_PerformedMin(self, var)
3794 return _pywrapcp.Assignment_PerformedMax(self, var)
3797 return _pywrapcp.Assignment_PerformedValue(self, var)
3800 return _pywrapcp.Assignment_SetStartMin(self, var, m)
3803 return _pywrapcp.Assignment_SetStartMax(self, var, m)
3806 return _pywrapcp.Assignment_SetStartRange(self, var, mi, ma)
3809 return _pywrapcp.Assignment_SetStartValue(self, var, value)
3812 return _pywrapcp.Assignment_SetDurationMin(self, var, m)
3815 return _pywrapcp.Assignment_SetDurationMax(self, var, m)
3818 return _pywrapcp.Assignment_SetDurationRange(self, var, mi, ma)
3821 return _pywrapcp.Assignment_SetDurationValue(self, var, value)
3824 return _pywrapcp.Assignment_SetEndMin(self, var, m)
3827 return _pywrapcp.Assignment_SetEndMax(self, var, m)
3830 return _pywrapcp.Assignment_SetEndRange(self, var, mi, ma)
3833 return _pywrapcp.Assignment_SetEndValue(self, var, value)
3836 return _pywrapcp.Assignment_SetPerformedMin(self, var, m)
3839 return _pywrapcp.Assignment_SetPerformedMax(self, var, m)
3842 return _pywrapcp.Assignment_SetPerformedRange(self, var, mi, ma)
3845 return _pywrapcp.Assignment_SetPerformedValue(self, var, value)
3848 return _pywrapcp.Assignment_Add(self, *args)
3851 return _pywrapcp.Assignment_ForwardSequence(self, var)
3854 return _pywrapcp.Assignment_BackwardSequence(self, var)
3857 return _pywrapcp.Assignment_Unperformed(self, var)
3859 def SetSequence(self, var, forward_sequence, backward_sequence, unperformed):
3860 return _pywrapcp.Assignment_SetSequence(self, var, forward_sequence, backward_sequence, unperformed)
3863 return _pywrapcp.Assignment_SetForwardSequence(self, var, forward_sequence)
3866 return _pywrapcp.Assignment_SetBackwardSequence(self, var, backward_sequence)
3869 return _pywrapcp.Assignment_SetUnperformed(self, var, unperformed)
3872 return _pywrapcp.Assignment_Activate(self, *args)
3875 return _pywrapcp.Assignment_Deactivate(self, *args)
3878 return _pywrapcp.Assignment_Activated(self, *args)
3881 return _pywrapcp.Assignment_DebugString(self)
3884 return _pywrapcp.Assignment_IntVarContainer(self)
3887 return _pywrapcp.Assignment_MutableIntVarContainer(self)
3890 return _pywrapcp.Assignment_IntervalVarContainer(self)
3893 return _pywrapcp.Assignment_MutableIntervalVarContainer(self)
3896 return _pywrapcp.Assignment_SequenceVarContainer(self)
3899 return _pywrapcp.Assignment_MutableSequenceVarContainer(self)
3902 return _pywrapcp.Assignment___eq__(self, assignment)
3905 return _pywrapcp.Assignment___ne__(self, assignment)
3908_pywrapcp.Assignment_swigregister(Assignment)
3911 return _pywrapcp.__lshift__(*args)
3913 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
3916 raise AttributeError(
"No constructor defined")
3917 __repr__ = _swig_repr
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
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
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.
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.
3946 return _pywrapcp.Pack_AddWeightedSumLessOrEqualConstantDimension(self, *args)
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].
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
3961 return _pywrapcp.Pack_AddWeightedSumEqualVarDimension(self, *args)
3965 This dimension imposes:
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
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
3975 return _pywrapcp.Pack_AddSumVariableWeightsLessOrEqualConstantDimension(self, usage, capacity)
3979 This dimension enforces that cost_var == sum of weights[i] for
3980 all objects 'i' assigned to a bin.
3982 return _pywrapcp.Pack_AddWeightedSumOfAssignedDimension(self, weights, cost_var)
3986 This dimension links 'count_var' to the actual number of bins used in the
3989 return _pywrapcp.Pack_AddCountUsedBinDimension(self, count_var)
3993 This dimension links 'count_var' to the actual number of items
3994 assigned to a bin in the pack.
3996 return _pywrapcp.Pack_AddCountAssignedItemsDimension(self, count_var)
3999 return _pywrapcp.Pack_Post(self)
4002 return _pywrapcp.Pack_InitialPropagateWrapper(self)
4005 return _pywrapcp.Pack_DebugString(self)
4008_pywrapcp.Pack_swigregister(Pack)
4010 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4013 raise AttributeError(
"No constructor defined - class is abstract")
4014 __repr__ = _swig_repr
4017 r"""Creates a sequence variable from the constraint."""
4018 return _pywrapcp.DisjunctiveConstraint_SequenceVar(self)
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.
4027 return _pywrapcp.DisjunctiveConstraint_SetTransitionTime(self, transition_time)
4030 return _pywrapcp.DisjunctiveConstraint_TransitionTime(self, before_index, after_index)
4033_pywrapcp.DisjunctiveConstraint_swigregister(DisjunctiveConstraint)
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.
4043 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4044 __repr__ = _swig_repr
4047 _pywrapcp.RevInteger_swiginit(self, _pywrapcp.new_RevInteger(val))
4050 return _pywrapcp.RevInteger_Value(self)
4053 return _pywrapcp.RevInteger_SetValue(self, s, val)
4054 __swig_destroy__ = _pywrapcp.delete_RevInteger
4057_pywrapcp.RevInteger_swigregister(RevInteger)
4059 r"""Subclass of Rev<T> which adds numerical operations."""
4061 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4062 __repr__ = _swig_repr
4065 _pywrapcp.NumericalRevInteger_swiginit(self, _pywrapcp.new_NumericalRevInteger(val))
4068 return _pywrapcp.NumericalRevInteger_Add(self, s, to_add)
4071 return _pywrapcp.NumericalRevInteger_Incr(self, s)
4074 return _pywrapcp.NumericalRevInteger_Decr(self, s)
4075 __swig_destroy__ = _pywrapcp.delete_NumericalRevInteger
4078_pywrapcp.NumericalRevInteger_swigregister(NumericalRevInteger)
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.
4088 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4089 __repr__ = _swig_repr
4092 _pywrapcp.RevBool_swiginit(self, _pywrapcp.new_RevBool(val))
4095 return _pywrapcp.RevBool_Value(self)
4098 return _pywrapcp.RevBool_SetValue(self, s, val)
4099 __swig_destroy__ = _pywrapcp.delete_RevBool
4102_pywrapcp.RevBool_swigregister(RevBool)
4104 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4107 raise AttributeError(
"No constructor defined")
4108 __repr__ = _swig_repr
4111 return _pywrapcp.IntVarContainer_Contains(self, var)
4114 return _pywrapcp.IntVarContainer_Element(self, index)
4117 return _pywrapcp.IntVarContainer_Size(self)
4120 return _pywrapcp.IntVarContainer_Store(self)
4123 return _pywrapcp.IntVarContainer_Restore(self)
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
4131 return _pywrapcp.IntVarContainer___eq__(self, container)
4134 return _pywrapcp.IntVarContainer___ne__(self, container)
4135 __swig_destroy__ = _pywrapcp.delete_IntVarContainer
4138_pywrapcp.IntVarContainer_swigregister(IntVarContainer)
4140 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4143 raise AttributeError(
"No constructor defined")
4144 __repr__ = _swig_repr
4147 return _pywrapcp.IntervalVarContainer_Contains(self, var)
4150 return _pywrapcp.IntervalVarContainer_Element(self, index)
4153 return _pywrapcp.IntervalVarContainer_Size(self)
4156 return _pywrapcp.IntervalVarContainer_Store(self)
4159 return _pywrapcp.IntervalVarContainer_Restore(self)
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
4167 return _pywrapcp.IntervalVarContainer___eq__(self, container)
4170 return _pywrapcp.IntervalVarContainer___ne__(self, container)
4171 __swig_destroy__ = _pywrapcp.delete_IntervalVarContainer
4174_pywrapcp.IntervalVarContainer_swigregister(IntervalVarContainer)
4176 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4179 raise AttributeError(
"No constructor defined")
4180 __repr__ = _swig_repr
4183 return _pywrapcp.SequenceVarContainer_Contains(self, var)
4186 return _pywrapcp.SequenceVarContainer_Element(self, index)
4189 return _pywrapcp.SequenceVarContainer_Size(self)
4192 return _pywrapcp.SequenceVarContainer_Store(self)
4195 return _pywrapcp.SequenceVarContainer_Restore(self)
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
4203 return _pywrapcp.SequenceVarContainer___eq__(self, container)
4206 return _pywrapcp.SequenceVarContainer___ne__(self, container)
4207 __swig_destroy__ = _pywrapcp.delete_SequenceVarContainer
4210_pywrapcp.SequenceVarContainer_swigregister(SequenceVarContainer)
4213 The base class for all local search operators.
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.
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.
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
4231 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4234 raise AttributeError(
"No constructor defined - class is abstract")
4235 __repr__ = _swig_repr
4238 return _pywrapcp.LocalSearchOperator_NextNeighbor(self, delta, deltadelta)
4241 return _pywrapcp.LocalSearchOperator_Start(self, assignment)
4244 _pywrapcp.disown_LocalSearchOperator(self)
4245 return weakref.proxy(self)
4248_pywrapcp.LocalSearchOperator_swigregister(LocalSearchOperator)
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.
4258 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4259 __repr__ = _swig_repr
4262 if self.
__class__ == IntVarLocalSearchOperator:
4266 _pywrapcp.IntVarLocalSearchOperator_swiginit(self, _pywrapcp.new_IntVarLocalSearchOperator(_self, vars, keep_inverse_values))
4267 __swig_destroy__ = _pywrapcp.delete_IntVarLocalSearchOperator
4271 This method should not be overridden. Override OnStart() instead which is
4272 called before exiting this method.
4274 return _pywrapcp.IntVarLocalSearchOperator_Start(self, assignment)
4277 return _pywrapcp.IntVarLocalSearchOperator_IsIncremental(self)
4280 return _pywrapcp.IntVarLocalSearchOperator_Size(self)
4284 Returns the value in the current assignment of the variable of given
4287 return _pywrapcp.IntVarLocalSearchOperator_Value(self, index)
4290 r"""Returns the variable of given index."""
4291 return _pywrapcp.IntVarLocalSearchOperator_Var(self, index)
4294 return _pywrapcp.IntVarLocalSearchOperator_OldValue(self, index)
4297 return _pywrapcp.IntVarLocalSearchOperator_PrevValue(self, index)
4300 return _pywrapcp.IntVarLocalSearchOperator_SetValue(self, index, value)
4303 return _pywrapcp.IntVarLocalSearchOperator_Activated(self, index)
4306 return _pywrapcp.IntVarLocalSearchOperator_Activate(self, index)
4309 return _pywrapcp.IntVarLocalSearchOperator_Deactivate(self, index)
4312 return _pywrapcp.IntVarLocalSearchOperator_AddVars(self, vars)
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.
4320 return _pywrapcp.IntVarLocalSearchOperator_OnStart(self)
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
4330 Therefore this method should not be overridden. Override MakeOneNeighbor()
4333 return _pywrapcp.IntVarLocalSearchOperator_NextNeighbor(self, delta, deltadelta)
4337 Creates a new neighbor. It returns false when the neighborhood is
4338 completely explored.
4339 MakeNextNeighbor() in a subclass of IntVarLocalSearchOperator.
4341 return _pywrapcp.IntVarLocalSearchOperator_OneNeighbor(self)
4344 _pywrapcp.disown_IntVarLocalSearchOperator(self)
4345 return weakref.proxy(self)
4348_pywrapcp.IntVarLocalSearchOperator_swigregister(IntVarLocalSearchOperator)
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.
4357 Here's a sample relaxing one variable at a time:
4359 class OneVarLns : public BaseLns {
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_);
4380 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4381 __repr__ = _swig_repr
4388 _pywrapcp.BaseLns_swiginit(self, _pywrapcp.new_BaseLns(_self, vars))
4389 __swig_destroy__ = _pywrapcp.delete_BaseLns
4392 return _pywrapcp.BaseLns_InitFragments(self)
4395 return _pywrapcp.BaseLns_NextFragment(self)
4398 return _pywrapcp.BaseLns_AppendToFragment(self, index)
4401 return _pywrapcp.BaseLns_FragmentSize(self)
4404 return _pywrapcp.BaseLns___getitem__(self, index)
4407 return _pywrapcp.BaseLns___len__(self)
4410 _pywrapcp.disown_BaseLns(self)
4411 return weakref.proxy(self)
4414_pywrapcp.BaseLns_swigregister(BaseLns)
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).
4423 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4424 __repr__ = _swig_repr
4431 _pywrapcp.ChangeValue_swiginit(self, _pywrapcp.new_ChangeValue(_self, vars))
4432 __swig_destroy__ = _pywrapcp.delete_ChangeValue
4435 return _pywrapcp.ChangeValue_ModifyValue(self, index, value)
4438 r"""This method should not be overridden. Override ModifyValue() instead."""
4439 return _pywrapcp.ChangeValue_OneNeighbor(self)
4442 _pywrapcp.disown_ChangeValue(self)
4443 return weakref.proxy(self)
4446_pywrapcp.ChangeValue_swigregister(ChangeValue)
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'
4467 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4470 raise AttributeError(
"No constructor defined - class is abstract")
4471 __repr__ = _swig_repr
4473 def Accept(self, delta, deltadelta, objective_min, objective_max):
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
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.
4485 return _pywrapcp.LocalSearchFilter_Accept(self, delta, deltadelta, objective_min, objective_max)
4488 return _pywrapcp.LocalSearchFilter_IsIncremental(self)
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
4498 return _pywrapcp.LocalSearchFilter_Synchronize(self, assignment, delta)
4499 __swig_destroy__ = _pywrapcp.delete_LocalSearchFilter
4502_pywrapcp.LocalSearchFilter_swigregister(LocalSearchFilter)
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.
4510 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4511 __repr__ = _swig_repr
4514 return _pywrapcp.LocalSearchFilterManager_DebugString(self)
4517 _pywrapcp.LocalSearchFilterManager_swiginit(self, _pywrapcp.new_LocalSearchFilterManager(*args))
4519 def Accept(self, monitor, delta, deltadelta, objective_min, objective_max):
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.
4525 return _pywrapcp.LocalSearchFilterManager_Accept(self, monitor, delta, deltadelta, objective_min, objective_max)
4528 r"""Synchronizes all filters to assignment."""
4529 return _pywrapcp.LocalSearchFilterManager_Synchronize(self, assignment, delta)
4530 __swig_destroy__ = _pywrapcp.delete_LocalSearchFilterManager
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
4539 if self.
__class__ == IntVarLocalSearchFilter:
4543 _pywrapcp.IntVarLocalSearchFilter_swiginit(self, _pywrapcp.new_IntVarLocalSearchFilter(_self, vars))
4544 __swig_destroy__ = _pywrapcp.delete_IntVarLocalSearchFilter
4548 This method should not be overridden. Override OnSynchronize() instead
4549 which is called before exiting this method.
4551 return _pywrapcp.IntVarLocalSearchFilter_Synchronize(self, assignment, delta)
4554 return _pywrapcp.IntVarLocalSearchFilter_Size(self)
4557 return _pywrapcp.IntVarLocalSearchFilter_Value(self, index)
4560 return _pywrapcp.IntVarLocalSearchFilter_IndexFromVar(self, var)
4563 _pywrapcp.disown_IntVarLocalSearchFilter(self)
4564 return weakref.proxy(self)
4567_pywrapcp.IntVarLocalSearchFilter_swigregister(IntVarLocalSearchFilter)
4569 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4572 raise AttributeError(
"No constructor defined - class is abstract")
4573 __repr__ = _swig_repr
4576 return _pywrapcp.BooleanVar_Min(self)
4579 return _pywrapcp.BooleanVar_SetMin(self, m)
4582 return _pywrapcp.BooleanVar_Max(self)
4585 return _pywrapcp.BooleanVar_SetMax(self, m)
4588 return _pywrapcp.BooleanVar_SetRange(self, mi, ma)
4591 return _pywrapcp.BooleanVar_Bound(self)
4594 return _pywrapcp.BooleanVar_Value(self)
4597 return _pywrapcp.BooleanVar_RemoveValue(self, v)
4600 return _pywrapcp.BooleanVar_RemoveInterval(self, l, u)
4603 return _pywrapcp.BooleanVar_WhenBound(self, d)
4606 return _pywrapcp.BooleanVar_WhenRange(self, d)
4609 return _pywrapcp.BooleanVar_WhenDomain(self, d)
4612 return _pywrapcp.BooleanVar_Size(self)
4615 return _pywrapcp.BooleanVar_Contains(self, v)
4618 return _pywrapcp.BooleanVar_HoleIteratorAux(self, reversible)
4621 return _pywrapcp.BooleanVar_DomainIteratorAux(self, reversible)
4624 return _pywrapcp.BooleanVar_DebugString(self)
4627_pywrapcp.BooleanVar_swigregister(BooleanVar)
4633 except Exception
as e:
4634 if 'CP Solver fail' in str(e):
4642 except Exception
as e:
4643 if 'CP Solver fail' in str(e):
4655 return self.Next(solver)
4656 except Exception
as e:
4657 if 'CP Solver fail' in str(e):
4658 return solver.FailDecision()
4663 return "PyDecisionBuilder"
4670 except Exception
as e:
4671 if 'CP Solver fail' in str(e):
4692 return Solver.DELAYED_PRIORITY
if self.
__delayed else Solver.NORMAL_PRIORITY
4695 return 'PyConstraintDemon'
4714 return self.
solver().ConstraintInitialPropagateCallback(self)
4717 return self.
solver().DelayedConstraintInitialPropagateCallback(self)
4721 self.InitialPropagate()
4722 except Exception
as e:
4723 if 'CP Solver fail' in str(e):
4724 self.
solver().ShouldFail()
4729 return "PyConstraint"
4733 Manager for any NodeIndex <-> variable index conversion.
4734 The routing solver uses variable indices internally and through
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
4746 auto starts_ends = ...; /// These are NodeIndex.
4747 RoutingIndexManager manager(10, 4, starts_ends); // 10 nodes, 4 vehicles.
4748 RoutingModel model(manager);
4750 Then, use 'manager.NodeToIndex(node)' whenever model requires a variable
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.
4759 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4760 __repr__ = _swig_repr
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.
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'
4792 _pywrapcp.RoutingIndexManager_swiginit(self, _pywrapcp.new_RoutingIndexManager(*args))
4795 return _pywrapcp.RoutingIndexManager_GetNumberOfNodes(self)
4798 return _pywrapcp.RoutingIndexManager_GetNumberOfVehicles(self)
4801 return _pywrapcp.RoutingIndexManager_GetNumberOfIndices(self)
4804 return _pywrapcp.RoutingIndexManager_GetStartIndex(self, vehicle)
4807 return _pywrapcp.RoutingIndexManager_GetEndIndex(self, vehicle)
4810 return _pywrapcp.RoutingIndexManager_NodeToIndex(self, node)
4813 return _pywrapcp.RoutingIndexManager_IndexToNode(self, index)
4814 __swig_destroy__ = _pywrapcp.delete_RoutingIndexManager
4817_pywrapcp.RoutingIndexManager_swigregister(RoutingIndexManager)
4820 return _pywrapcp.DefaultRoutingModelParameters()
4823 return _pywrapcp.DefaultRoutingSearchParameters()
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.
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
4839 _pywrapcp.FirstSolutionStrategy_swiginit(self, _pywrapcp.new_FirstSolutionStrategy())
4840 __swig_destroy__ = _pywrapcp.delete_FirstSolutionStrategy
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
4849 _pywrapcp.LocalSearchMetaheuristic_swiginit(self, _pywrapcp.new_LocalSearchMetaheuristic())
4850 __swig_destroy__ = _pywrapcp.delete_LocalSearchMetaheuristic
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
4859 _pywrapcp.RoutingSearchStatus_swiginit(self, _pywrapcp.new_RoutingSearchStatus())
4860 __swig_destroy__ = _pywrapcp.delete_RoutingSearchStatus
4863_pywrapcp.RoutingSearchStatus_swigregister(RoutingSearchStatus)
4865 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
4866 __repr__ = _swig_repr
4869 _pywrapcp.PathsMetadata_swiginit(self, _pywrapcp.new_PathsMetadata(manager))
4872 return _pywrapcp.PathsMetadata_IsStart(self, node)
4875 return _pywrapcp.PathsMetadata_IsEnd(self, node)
4878 return _pywrapcp.PathsMetadata_GetPath(self, start_or_end_node)
4881 return _pywrapcp.PathsMetadata_NumPaths(self)
4884 return _pywrapcp.PathsMetadata_Paths(self)
4887 return _pywrapcp.PathsMetadata_Starts(self)
4890 return _pywrapcp.PathsMetadata_Start(self, path)
4893 return _pywrapcp.PathsMetadata_End(self, path)
4896 return _pywrapcp.PathsMetadata_Ends(self)
4897 __swig_destroy__ = _pywrapcp.delete_PathsMetadata
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)
4911 _pywrapcp.RoutingSearchStats_swiginit(self, _pywrapcp.new_RoutingSearchStats())
4912 __swig_destroy__ = _pywrapcp.delete_RoutingSearchStats
4915_pywrapcp.RoutingSearchStats_swigregister(RoutingSearchStats)
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."""
4928 Constructor taking an index manager. The version which does not take
4929 RoutingModelParameters is equivalent to passing
4930 DefaultRoutingModelParameters().
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
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.
4946 return _pywrapcp.RoutingModel_RegisterUnaryTransitVector(self, values)
4949 return _pywrapcp.RoutingModel_RegisterUnaryTransitCallback(self, *args)
4952 return _pywrapcp.RoutingModel_RegisterTransitMatrix(self, values)
4955 return _pywrapcp.RoutingModel_RegisterTransitCallback(self, *args)
4958 return _pywrapcp.RoutingModel_RegisterCumulDependentTransitCallback(self, callback)
4961 return _pywrapcp.RoutingModel_TransitCallback(self, callback_index)
4964 return _pywrapcp.RoutingModel_UnaryTransitCallbackOrNull(self, callback_index)
4967 return _pywrapcp.RoutingModel_CumulDependentTransitCallback(self, callback_index)
4969 def AddDimension(self, evaluator_index, slack_max, capacity, fix_start_cumul_to_zero, name):
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
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'.
4992 return _pywrapcp.RoutingModel_AddDimension(self, evaluator_index, 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)
4998 return _pywrapcp.RoutingModel_AddDimensionWithVehicleCapacity(self, evaluator_index, 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)
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_.
5012 return _pywrapcp.RoutingModel_AddDimensionWithCumulDependentVehicleTransitAndCapacity(self, fixed_evaluator_indices, cumul_dependent_evaluator_indices, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name)
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).
5025 return _pywrapcp.RoutingModel_AddConstantDimensionWithSlack(self, value, capacity, slack_max, fix_start_cumul_to_zero, name)
5028 return _pywrapcp.RoutingModel_AddConstantDimension(self, value, capacity, fix_start_cumul_to_zero, name)
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
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).
5042 return _pywrapcp.RoutingModel_AddVectorDimension(self, values, capacity, fix_start_cumul_to_zero, name)
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
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).
5056 return _pywrapcp.RoutingModel_AddMatrixDimension(self, values, capacity, fix_start_cumul_to_zero, name)
5059 r"""Outputs the names of all dimensions added to the routing engine."""
5060 return _pywrapcp.RoutingModel_GetAllDimensionNames(self)
5063 r"""Returns all dimensions of the model."""
5064 return _pywrapcp.RoutingModel_GetDimensions(self)
5067 r"""Returns dimensions with soft or vehicle span costs."""
5068 return _pywrapcp.RoutingModel_GetDimensionsWithSoftOrSpanCosts(self)
5071 r"""Returns dimensions for which all transit evaluators are unary."""
5072 return _pywrapcp.RoutingModel_GetUnaryDimensions(self)
5075 r"""Returns the dimensions which have [global|local]_dimension_optimizers_."""
5076 return _pywrapcp.RoutingModel_GetDimensionsWithGlobalCumulOptimizers(self)
5079 return _pywrapcp.RoutingModel_GetDimensionsWithLocalCumulOptimizers(self)
5082 r"""Returns whether the given dimension has global/local cumul optimizers."""
5083 return _pywrapcp.RoutingModel_HasGlobalCumulOptimizer(self, dimension)
5086 return _pywrapcp.RoutingModel_HasLocalCumulOptimizer(self, dimension)
5090 Returns the global/local dimension cumul optimizer for a given dimension,
5091 or nullptr if there is none.
5093 return _pywrapcp.RoutingModel_GetMutableGlobalCumulLPOptimizer(self, dimension)
5096 return _pywrapcp.RoutingModel_GetMutableGlobalCumulMPOptimizer(self, dimension)
5099 return _pywrapcp.RoutingModel_GetMutableLocalCumulLPOptimizer(self, dimension)
5102 return _pywrapcp.RoutingModel_GetMutableLocalCumulMPOptimizer(self, dimension)
5105 r"""Returns true if a dimension exists for a given dimension name."""
5106 return _pywrapcp.RoutingModel_HasDimension(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)
5114 Returns a dimension from its name. Returns nullptr if the dimension does
5117 return _pywrapcp.RoutingModel_GetMutableDimension(self, dimension_name)
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.
5126 return _pywrapcp.RoutingModel_SetPrimaryConstrainedDimension(self, dimension_name)
5129 r"""Get the primary constrained dimension, or an empty string if it is unset."""
5130 return _pywrapcp.RoutingModel_GetPrimaryConstrainedDimension(self)
5133 return _pywrapcp.RoutingModel_GetResourceGroup(self, rg_index)
5137 Returns the indices of resource groups for this dimension. This method can
5138 only be called after the model has been closed.
5140 return _pywrapcp.RoutingModel_GetDimensionResourceGroupIndices(self, dimension)
5144 Returns the index of the resource group attached to the dimension.
5145 DCHECKS that there's exactly one resource group for this dimension.
5147 return _pywrapcp.RoutingModel_GetDimensionResourceGroupIndex(self, dimension)
5148 PENALIZE_ONCE = _pywrapcp.RoutingModel_PENALIZE_ONCE
5149 PENALIZE_PER_INACTIVE = _pywrapcp.RoutingModel_PENALIZE_PER_INACTIVE
5153 Adds a disjunction constraint on the indices.
5154 Exactly 'max_cardinality' of the indices are active.
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
5177 return _pywrapcp.RoutingModel_AddDisjunction(self, *args)
5180 r"""Returns the indices of the disjunctions to which an index belongs."""
5181 return _pywrapcp.RoutingModel_GetDisjunctionIndices(self, index)
5184 r"""Returns the penalty of the node disjunction of index 'index'."""
5185 return _pywrapcp.RoutingModel_GetDisjunctionPenalty(self, index)
5189 Returns the maximum number of possible active nodes of the node
5190 disjunction of index 'index'.
5192 return _pywrapcp.RoutingModel_GetDisjunctionMaxCardinality(self, index)
5196 Returns the 'PenaltyCostBehavior' used by the disjunction of index
5199 return _pywrapcp.RoutingModel_GetDisjunctionPenaltyCostBehavior(self, index)
5202 r"""Returns the number of node disjunctions in the model."""
5203 return _pywrapcp.RoutingModel_GetNumberOfDisjunctions(self)
5207 Returns true if the model contains mandatory disjunctions (ones with
5208 kNoPenalty as penalty).
5210 return _pywrapcp.RoutingModel_HasMandatoryDisjunctions(self)
5214 Returns true if the model contains at least one disjunction which is
5215 constrained by its max_cardinality.
5217 return _pywrapcp.RoutingModel_HasMaxCardinalityConstrainedDisjunctions(self)
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).
5226 return _pywrapcp.RoutingModel_GetPerfectBinaryDisjunctions(self)
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.
5236 return _pywrapcp.RoutingModel_IgnoreDisjunctionsAlreadyForcedToZero(self)
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
5246 return _pywrapcp.RoutingModel_AddSoftSameVehicleConstraint(self, indices, cost)
5249 r"""Returns the number of soft same vehicle constraints in the model."""
5250 return _pywrapcp.RoutingModel_GetNumberOfSoftSameVehicleConstraints(self)
5254 Returns the indices of the nodes in the soft same vehicle constraint of
5257 return _pywrapcp.RoutingModel_GetSoftSameVehicleIndices(self, index)
5260 r"""Returns the cost of the soft same vehicle constraint of index 'index'."""
5261 return _pywrapcp.RoutingModel_GetSoftSameVehicleCost(self, index)
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).
5270 return _pywrapcp.RoutingModel_SetAllowedVehiclesForIndex(self, vehicles, index)
5273 r"""Returns true if a vehicle is allowed to visit a given node."""
5274 return _pywrapcp.RoutingModel_IsVehicleAllowedForIndex(self, vehicle, index)
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
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);
5292 return _pywrapcp.RoutingModel_AddPickupAndDelivery(self, pickup, delivery)
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'.
5300 return _pywrapcp.RoutingModel_AddPickupAndDeliverySets(self, pickup_disjunction, delivery_disjunction)
5303 r"""Returns the pickup and delivery positions where the node is a pickup."""
5304 return _pywrapcp.RoutingModel_GetPickupPosition(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)
5311 r"""Returns whether the node is a pickup (resp. delivery)."""
5312 return _pywrapcp.RoutingModel_IsPickup(self, node_index)
5315 return _pywrapcp.RoutingModel_IsDelivery(self, node_index)
5319 Sets the Pickup and delivery policy of all vehicles. It is equivalent to
5320 calling SetPickupAndDeliveryPolicyOfVehicle on all vehicles.
5322 return _pywrapcp.RoutingModel_SetPickupAndDeliveryPolicyOfAllVehicles(self, policy)
5325 return _pywrapcp.RoutingModel_SetPickupAndDeliveryPolicyOfVehicle(self, policy, vehicle)
5328 return _pywrapcp.RoutingModel_GetPickupAndDeliveryPolicyOfVehicle(self, vehicle)
5332 Returns the number of non-start/end nodes which do not appear in a
5333 pickup/delivery pair.
5335 return _pywrapcp.RoutingModel_GetNumOfSingletonNodes(self)
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
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.
5348 TYPE_ON_VEHICLE_UP_TO_VISIT = _pywrapcp.RoutingModel_TYPE_ON_VEHICLE_UP_TO_VISIT
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.
5353 TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED = _pywrapcp.RoutingModel_TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED
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.
5362 return _pywrapcp.RoutingModel_SetVisitType(self, index, type, type_policy)
5365 return _pywrapcp.RoutingModel_GetVisitType(self, index)
5368 return _pywrapcp.RoutingModel_GetSingleNodesOfType(self, type)
5371 return _pywrapcp.RoutingModel_GetPairIndicesOfType(self, type)
5374 return _pywrapcp.RoutingModel_GetVisitTypePolicy(self, index)
5377 return _pywrapcp.RoutingModel_GetNumberOfVisitTypes(self)
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
5389 return _pywrapcp.RoutingModel_AddHardTypeIncompatibility(self, type1, type2)
5392 return _pywrapcp.RoutingModel_AddTemporalTypeIncompatibility(self, type1, type2)
5395 r"""Returns visit types incompatible with a given type."""
5396 return _pywrapcp.RoutingModel_GetHardTypeIncompatibilitiesOfType(self, type)
5399 return _pywrapcp.RoutingModel_GetTemporalTypeIncompatibilitiesOfType(self, type)
5403 Returns true iff any hard (resp. temporal) type incompatibilities have
5404 been added to the model.
5406 return _pywrapcp.RoutingModel_HasHardTypeIncompatibilities(self)
5409 return _pywrapcp.RoutingModel_HasTemporalTypeIncompatibilities(self)
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".
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
5423 NOTE: To avoid unnecessary memory reallocations, it is recommended to only
5424 add requirements once all the existing types have been set with
5427 return _pywrapcp.RoutingModel_AddSameVehicleRequiredTypeAlternatives(self, dependent_type, required_type_alternatives)
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.
5436 return _pywrapcp.RoutingModel_AddRequiredTypeAlternativesWhenAddingType(self, dependent_type, required_type_alternatives)
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
5446 return _pywrapcp.RoutingModel_AddRequiredTypeAlternativesWhenRemovingType(self, dependent_type, required_type_alternatives)
5450 Returns the set of same-vehicle requirement alternatives for the given
5453 return _pywrapcp.RoutingModel_GetSameVehicleRequiredTypeAlternativesOfType(self, type)
5456 r"""Returns the set of requirement alternatives when adding the given type."""
5457 return _pywrapcp.RoutingModel_GetRequiredTypeAlternativesWhenAddingType(self, type)
5460 r"""Returns the set of requirement alternatives when removing the given type."""
5461 return _pywrapcp.RoutingModel_GetRequiredTypeAlternativesWhenRemovingType(self, type)
5465 Returns true iff any same-route (resp. temporal) type requirements have
5466 been added to the model.
5468 return _pywrapcp.RoutingModel_HasSameVehicleTypeRequirements(self)
5471 return _pywrapcp.RoutingModel_HasTemporalTypeRequirements(self)
5475 Returns true iff the model has any incompatibilities or requirements set
5478 return _pywrapcp.RoutingModel_HasTypeRegulations(self)
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,
5487 return _pywrapcp.RoutingModel_UnperformedPenalty(self, var_index)
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).
5495 return _pywrapcp.RoutingModel_UnperformedPenaltyOrValue(self, default_value, var_index)
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.
5503 return _pywrapcp.RoutingModel_GetDepot(self)
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.
5512 return _pywrapcp.RoutingModel_SetMaximumNumberOfActiveVehicles(self, max_active_vehicles)
5515 r"""Returns the maximum number of active vehicles."""
5516 return _pywrapcp.RoutingModel_GetMaximumNumberOfActiveVehicles(self)
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.
5524 return _pywrapcp.RoutingModel_SetArcCostEvaluatorOfAllVehicles(self, evaluator_index)
5527 r"""Sets the cost function for a given vehicle route."""
5528 return _pywrapcp.RoutingModel_SetArcCostEvaluatorOfVehicle(self, evaluator_index, vehicle)
5532 Sets the fixed cost of all vehicle routes. It is equivalent to calling
5533 SetFixedCostOfVehicle on all vehicle routes.
5535 return _pywrapcp.RoutingModel_SetFixedCostOfAllVehicles(self, cost)
5538 r"""Sets the fixed cost of one vehicle route."""
5539 return _pywrapcp.RoutingModel_SetFixedCostOfVehicle(self, cost, vehicle)
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.
5547 return _pywrapcp.RoutingModel_GetFixedCostOfVehicle(self, vehicle)
5550 return _pywrapcp.RoutingModel_SetPathEnergyCostOfVehicle(self, force, distance, cost_per_unit, vehicle)
5553 return _pywrapcp.RoutingModel_SetPathEnergyCostsOfVehicle(self, force, distance, threshold, cost_per_unit_below_threshold, cost_per_unit_above_threshold, vehicle)
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.
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.
5571 Sets the linear and quadratic cost factor of all vehicles.
5573 return _pywrapcp.RoutingModel_SetAmortizedCostFactorsOfAllVehicles(self, linear_cost_factor, quadratic_cost_factor)
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)
5580 return _pywrapcp.RoutingModel_GetAmortizedLinearCostFactorOfVehicles(self)
5583 return _pywrapcp.RoutingModel_GetAmortizedQuadraticCostFactorOfVehicles(self)
5586 return _pywrapcp.RoutingModel_GetRouteCost(self, route)
5589 return _pywrapcp.RoutingModel_SetVehicleUsedWhenEmpty(self, is_used, vehicle)
5592 return _pywrapcp.RoutingModel_IsVehicleUsedWhenEmpty(self, vehicle)
5596 Gets/sets the evaluator used during the search. Only relevant when
5597 RoutingSearchParameters.first_solution_strategy = EVALUATOR_STRATEGY.
5598 Takes ownership of evaluator.
5600 return _pywrapcp.RoutingModel_SetFirstSolutionEvaluator(self, evaluator)
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.
5609 return _pywrapcp.RoutingModel_SetFirstSolutionHint(self, hint)
5612 r"""Returns the current hint assignment."""
5613 return _pywrapcp.RoutingModel_GetFirstSolutionHint(self)
5617 Adds a local search operator to the set of operators used to solve the
5618 vehicle routing problem.
5620 return _pywrapcp.RoutingModel_AddLocalSearchOperator(self, ls_operator)
5623 r"""Adds a search monitor to the search used to solve the routing model."""
5624 return _pywrapcp.RoutingModel_AddSearchMonitor(self, monitor)
5627 return _pywrapcp.RoutingModel_AddEnterSearchCallback(self, callback)
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).
5638 return _pywrapcp.RoutingModel_AddAtSolutionCallback(self, callback, track_unchecked_neighbors)
5641 return _pywrapcp.RoutingModel_AddRestoreDimensionValuesResetCallback(self, callback)
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
5650 return _pywrapcp.RoutingModel_AddVariableMinimizedByFinalizer(self, var)
5654 Adds a variable to maximize in the solution finalizer (see above for
5655 information on the solution finalizer).
5657 return _pywrapcp.RoutingModel_AddVariableMaximizedByFinalizer(self, var)
5661 Adds a variable to minimize in the solution finalizer, with a weighted
5662 priority: the higher the more priority it has.
5664 return _pywrapcp.RoutingModel_AddWeightedVariableMinimizedByFinalizer(self, var, cost)
5668 Adds a variable to maximize in the solution finalizer, with a weighted
5669 priority: the higher the more priority it has.
5671 return _pywrapcp.RoutingModel_AddWeightedVariableMaximizedByFinalizer(self, var, cost)
5675 Add a variable to set the closest possible to the target value in the
5678 return _pywrapcp.RoutingModel_AddVariableTargetToFinalizer(self, var, target)
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.
5685 return _pywrapcp.RoutingModel_AddWeightedVariableTargetToFinalizer(self, var, target, cost)
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()).
5696 return _pywrapcp.RoutingModel_CloseModel(self)
5700 Same as above taking search parameters (as of 10/2015 some the parameters
5701 have to be set when closing the model).
5703 return _pywrapcp.RoutingModel_CloseModelWithParameters(self, search_parameters)
5707 Solves the current routing model; closes the current model.
5708 This is equivalent to calling
5709 SolveWithParameters(DefaultRoutingSearchParameters())
5711 SolveFromAssignmentWithParameters(assignment,
5712 DefaultRoutingSearchParameters()).
5714 return _pywrapcp.RoutingModel_Solve(self, assignment)
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
5726 return _pywrapcp.RoutingModel_SolveWithParameters(self, search_parameters, solutions)
5730 Same as above, except that if assignment is not null, it will be used as
5731 the initial solution.
5733 return _pywrapcp.RoutingModel_SolveFromAssignmentWithParameters(self, assignment, search_parameters, solutions)
5737 Improves a given assignment using unchecked local search.
5738 If check_solution_in_cp is true the final solution will be checked with
5740 As of 11/2023, only works with greedy descent.
5742 return _pywrapcp.RoutingModel_FastSolveFromAssignmentWithParameters(self, assignment, search_parameters, check_solution_in_cp, touched)
5746 Same as above but will try all assignments in order as first solutions
5749 return _pywrapcp.RoutingModel_SolveFromAssignmentsWithParameters(self, assignments, search_parameters, solutions)
5753 Solves the current routing model by using an Iterated Local Search
5756 return _pywrapcp.RoutingModel_SolveWithIteratedLocalSearch(self, search_parameters)
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_.
5766 return _pywrapcp.RoutingModel_SetAssignmentFromOtherModelAssignment(self, target_assignment, source_model, source_assignment)
5769 r"""Returns detailed search statistics."""
5770 return _pywrapcp.RoutingModel_GetSubSolverStatistics(self)
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
5780 return _pywrapcp.RoutingModel_ComputeLowerBound(self)
5784 Returns the current lower bound found by internal solvers during the
5787 return _pywrapcp.RoutingModel_objective_lower_bound(self)
5790 r"""Returns the current status of the routing model."""
5791 return _pywrapcp.RoutingModel_status(self)
5794 r"""Returns search statistics."""
5795 return _pywrapcp.RoutingModel_search_stats(self)
5798 r"""Returns the value of the internal enable_deep_serialization_ parameter."""
5799 return _pywrapcp.RoutingModel_enable_deep_serialization(self)
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].
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
5812 return _pywrapcp.RoutingModel_ApplyLocks(self, locks)
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
5825 return _pywrapcp.RoutingModel_ApplyLocksToAllVehicles(self, locks, close_routes)
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.
5834 return _pywrapcp.RoutingModel_PreAssignment(self)
5837 return _pywrapcp.RoutingModel_MutablePreAssignment(self)
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
5845 return _pywrapcp.RoutingModel_WriteAssignment(self, file_name)
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
5853 return _pywrapcp.RoutingModel_ReadAssignment(self, file_name)
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.
5860 return _pywrapcp.RoutingModel_RestoreAssignment(self, solution)
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.
5870 return _pywrapcp.RoutingModel_ReadAssignmentFromRoutes(self, routes, ignore_inactive_indices)
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.
5891 return _pywrapcp.RoutingModel_RoutesToAssignment(self, routes, ignore_inactive_indices, close_routes, assignment)
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).
5899 return _pywrapcp.RoutingModel_AssignmentToRoutes(self, assignment, routes)
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
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
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).
5925 return _pywrapcp.RoutingModel_CompactAssignment(self, assignment)
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).
5933 return _pywrapcp.RoutingModel_CompactAndCheckAssignment(self, assignment)
5936 r"""Adds an extra variable to the vehicle routing assignment."""
5937 return _pywrapcp.RoutingModel_AddToAssignment(self, var)
5940 return _pywrapcp.RoutingModel_AddIntervalToAssignment(self, interval)
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
5949 - The cumuls of the ends of the routes are minimized for this given
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.
5955 return _pywrapcp.RoutingModel_PackCumulsOfOptimizerDimensionsFromAssignment(self, original_assignment, duration_limit, time_limit_was_reached)
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.
5968 Returns parameters.num_neighbors neighbors of all nodes for every cost
5969 class. The result is cached and is computed once.
5971 return _pywrapcp.RoutingModel_GetOrCreateNodeNeighborsByCostClass(self, *args)
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.
5981 return _pywrapcp.RoutingModel_AddLocalSearchFilter(self, filter)
5986 Returns the variable index of the starting node of a vehicle route.
5988 return _pywrapcp.RoutingModel_Start(self, vehicle)
5991 r"""Returns the variable index of the ending node of a vehicle route."""
5992 return _pywrapcp.RoutingModel_End(self, vehicle)
5995 r"""Returns true if 'index' represents the first node of a route."""
5996 return _pywrapcp.RoutingModel_IsStart(self, index)
5999 r"""Returns true if 'index' represents the last node of a route."""
6000 return _pywrapcp.RoutingModel_IsEnd(self, index)
6004 Returns the vehicle of the given start/end index, and -1 if the given
6005 index is not a vehicle start/end.
6007 return _pywrapcp.RoutingModel_VehicleIndex(self, index)
6011 Assignment inspection
6012 Returns the variable index of the node directly after the node
6013 corresponding to 'index' in 'assignment'.
6015 return _pywrapcp.RoutingModel_Next(self, assignment, index)
6018 r"""Returns true if the route of 'vehicle' is non empty in 'assignment'."""
6019 return _pywrapcp.RoutingModel_IsVehicleUsed(self, assignment, vehicle)
6023 Returns the next variable of the node corresponding to index. Note that
6024 NextVar(index) == index is equivalent to ActiveVar(index) == 0.
6026 return _pywrapcp.RoutingModel_NextVar(self, index)
6029 r"""Returns the active variable of the node corresponding to index."""
6030 return _pywrapcp.RoutingModel_ActiveVar(self, index)
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.
6037 return _pywrapcp.RoutingModel_ActiveVehicleVar(self, vehicle)
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.
6045 return _pywrapcp.RoutingModel_VehicleRouteConsideredVar(self, vehicle)
6049 Returns the vehicle variable of the node corresponding to index. Note that
6050 VehicleVar(index) == -1 is equivalent to ActiveVar(index) == 0.
6052 return _pywrapcp.RoutingModel_VehicleVar(self, index)
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.
6060 return _pywrapcp.RoutingModel_ResourceVar(self, vehicle, resource_group)
6063 r"""Returns the global cost variable which is being minimized."""
6064 return _pywrapcp.RoutingModel_CostVar(self)
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.
6071 return _pywrapcp.RoutingModel_GetArcCostForVehicle(self, from_index, to_index, vehicle)
6074 r"""Whether costs are homogeneous across all vehicles."""
6075 return _pywrapcp.RoutingModel_CostsAreHomogeneousAcrossVehicles(self)
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).
6082 return _pywrapcp.RoutingModel_GetHomogeneousCost(self, from_index, to_index)
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.
6089 return _pywrapcp.RoutingModel_GetArcCostForFirstSolution(self, from_index, to_index)
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
6100 return _pywrapcp.RoutingModel_GetArcCostForClass(self, from_index, to_index, cost_class_index)
6103 r"""Get the cost class index of the given vehicle."""
6104 return _pywrapcp.RoutingModel_GetCostClassIndexOfVehicle(self, vehicle)
6108 Returns true iff the model contains a vehicle with the given
6111 return _pywrapcp.RoutingModel_HasVehicleWithCostClassIndex(self, cost_class_index)
6114 r"""Returns the number of different cost classes in the model."""
6115 return _pywrapcp.RoutingModel_GetCostClassesCount(self)
6118 r"""Ditto, minus the 'always zero', built-in cost class."""
6119 return _pywrapcp.RoutingModel_GetNonZeroCostClassesCount(self)
6122 return _pywrapcp.RoutingModel_GetVehicleClassIndexOfVehicle(self, vehicle)
6126 Returns a vehicle of the given vehicle class, and -1 if there are no
6127 vehicles for this class.
6129 return _pywrapcp.RoutingModel_GetVehicleOfClass(self, vehicle_class)
6132 r"""Returns the number of different vehicle classes in the model."""
6133 return _pywrapcp.RoutingModel_GetVehicleClassesCount(self)
6136 r"""Returns variable indices of nodes constrained to be on the same route."""
6137 return _pywrapcp.RoutingModel_GetSameVehicleIndicesOfIndex(self, node)
6140 return _pywrapcp.RoutingModel_AddSameActivityGroup(self, nodes)
6143 r"""Returns variable indices of nodes constrained to have the same activity."""
6144 return _pywrapcp.RoutingModel_GetSameActivityIndicesOfIndex(self, node)
6147 r"""Returns the same activity group of the node."""
6148 return _pywrapcp.RoutingModel_GetSameActivityGroupOfIndex(self, node)
6151 r"""Returns same activity groups of all nodes."""
6152 return _pywrapcp.RoutingModel_GetSameActivityGroups(self)
6155 r"""Returns the number of same activity groups."""
6156 return _pywrapcp.RoutingModel_GetSameActivityGroupsCount(self)
6159 r"""Returns variable indices of nodes in the same activity group."""
6160 return _pywrapcp.RoutingModel_GetSameActivityIndicesOfGroup(self, group)
6163 return _pywrapcp.RoutingModel_GetVehicleTypeContainer(self)
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.
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.
6186 return _pywrapcp.RoutingModel_ArcIsMoreConstrainedThanArc(self, _from, to1, to2)
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.
6195 return _pywrapcp.RoutingModel_DebugOutputAssignment(self, solution_assignment, dimension_to_print)
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
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.
6206 return _pywrapcp.RoutingModel_CheckIfAssignmentIsFeasible(self, assignment, call_at_solution_monitors)
6210 Returns the underlying constraint solver. Can be used to add extra
6211 constraints and/or modify search algorithms.
6213 return _pywrapcp.RoutingModel_solver(self)
6217 Returns true if the search limit has been crossed with the given time
6220 return _pywrapcp.RoutingModel_CheckLimit(self, *args)
6223 r"""Returns the time left in the search limit."""
6224 return _pywrapcp.RoutingModel_RemainingTime(self)
6227 r"""Updates the time limit of the search limit."""
6228 return _pywrapcp.RoutingModel_UpdateTimeLimit(self, time_limit)
6231 r"""Returns the time buffer to safely return a solution."""
6232 return _pywrapcp.RoutingModel_TimeBuffer(self)
6235 r"""Returns the atomic<bool> to stop the CP-SAT solver."""
6236 return _pywrapcp.RoutingModel_GetMutableCPSatInterrupt(self)
6239 r"""Returns the atomic<bool> to stop the CP solver."""
6240 return _pywrapcp.RoutingModel_GetMutableCPInterrupt(self)
6243 r"""Cancels the current search."""
6244 return _pywrapcp.RoutingModel_CancelSearch(self)
6249 Returns the number of nodes in the model.
6251 return _pywrapcp.RoutingModel_nodes(self)
6254 r"""Returns the number of vehicle routes in the model."""
6255 return _pywrapcp.RoutingModel_vehicles(self)
6258 r"""Returns the number of next variables in the model."""
6259 return _pywrapcp.RoutingModel_Size(self)
6263 Returns statistics on first solution search, number of decisions sent to
6264 filters, number of decisions rejected by filters.
6266 return _pywrapcp.RoutingModel_GetNumberOfDecisionsInFirstSolution(self, search_parameters)
6269 return _pywrapcp.RoutingModel_GetNumberOfRejectsInFirstSolution(self, search_parameters)
6272 r"""Returns the automatic first solution strategy selected."""
6273 return _pywrapcp.RoutingModel_GetAutomaticFirstSolutionStrategy(self)
6276 r"""Returns true if a vehicle/node matching problem is detected."""
6277 return _pywrapcp.RoutingModel_IsMatchingModel(self)
6281 Returns true if routes are interdependent. This means that any
6282 modification to a route might impact another.
6284 return _pywrapcp.RoutingModel_AreRoutesInterdependent(self, parameters)
6288 The next few members are in the public section only for testing purposes.
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.
6301 return _pywrapcp.RoutingModel_MakeGuidedSlackFinalizer(self, dimension, initializer)
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
6319 return _pywrapcp.RoutingModel_MakeSelfDependentDimensionFinalizer(self, dimension)
6322 return _pywrapcp.RoutingModel_GetPathsMetadata(self)
6326 Returns indices of the vehicles which are in the same vehicle class as the
6327 vehicle starting or ending at start_end_index.
6329 return _pywrapcp.RoutingModel_GetVehiclesOfSameClass(self, start_end_index)
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.
6339 return _pywrapcp.RoutingModel_GetSameVehicleClassArcs(self, from_index, to_index)
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
6349 r"""Routing model visitor."""
6351 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6352 __repr__ = _swig_repr
6355 _pywrapcp.RoutingModelVisitor_swiginit(self, _pywrapcp.new_RoutingModelVisitor())
6356 __swig_destroy__ = _pywrapcp.delete_RoutingModelVisitor
6359_pywrapcp.RoutingModelVisitor_swigregister(RoutingModelVisitor)
6360RoutingModelVisitor.kLightElement = _pywrapcp.cvar.RoutingModelVisitor_kLightElement
6361RoutingModelVisitor.kLightElement2 = _pywrapcp.cvar.RoutingModelVisitor_kLightElement2
6362RoutingModelVisitor.kRemoveValues = _pywrapcp.cvar.RoutingModelVisitor_kRemoveValues
6365 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6368 raise AttributeError(
"No constructor defined - class is abstract")
6369 __repr__ = _swig_repr
6370 __swig_destroy__ = _pywrapcp.delete_TypeRegulationsChecker
6373 return _pywrapcp.TypeRegulationsChecker_CheckVehicle(self, vehicle, next_accessor)
6376_pywrapcp.TypeRegulationsChecker_swigregister(TypeRegulationsChecker)
6378 r"""Checker for type incompatibilities."""
6380 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6381 __repr__ = _swig_repr
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
6388_pywrapcp.TypeIncompatibilityChecker_swigregister(TypeIncompatibilityChecker)
6390 r"""Checker for type requirements."""
6392 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6393 __repr__ = _swig_repr
6396 _pywrapcp.TypeRequirementChecker_swiginit(self, _pywrapcp.new_TypeRequirementChecker(model))
6397 __swig_destroy__ = _pywrapcp.delete_TypeRequirementChecker
6400_pywrapcp.TypeRequirementChecker_swigregister(TypeRequirementChecker)
6403 The following constraint ensures that incompatibilities and requirements
6404 between types are respected.
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
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
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.
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
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
6442 ... --> A --> ... --> r1 --> ... OR ... --> r1 --> ... --> UV --> ...
6445 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6446 __repr__ = _swig_repr
6449 _pywrapcp.TypeRegulationsConstraint_swiginit(self, _pywrapcp.new_TypeRegulationsConstraint(model))
6452 return _pywrapcp.TypeRegulationsConstraint_Post(self)
6455 return _pywrapcp.TypeRegulationsConstraint_InitialPropagateWrapper(self)
6456 __swig_destroy__ = _pywrapcp.delete_TypeRegulationsConstraint
6459_pywrapcp.TypeRegulationsConstraint_swigregister(TypeRegulationsConstraint)
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.
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)
6482 _pywrapcp.BoundCost_swiginit(self, _pywrapcp.new_BoundCost(*args))
6483 __swig_destroy__ = _pywrapcp.delete_BoundCost
6486_pywrapcp.BoundCost_swigregister(BoundCost)
6488 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6489 __repr__ = _swig_repr
6492 _pywrapcp.SimpleBoundCosts_swiginit(self, _pywrapcp.new_SimpleBoundCosts(num_bounds, default_bound_cost))
6495 return _pywrapcp.SimpleBoundCosts_bound_cost(self, element)
6498 return _pywrapcp.SimpleBoundCosts_size(self)
6499 __swig_destroy__ = _pywrapcp.delete_SimpleBoundCosts
6502_pywrapcp.SimpleBoundCosts_swigregister(SimpleBoundCosts)
6505 Dimensions represent quantities accumulated at nodes along the routes. They
6506 represent quantities such as weights or volumes carried along the route, or
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:
6514 cumuls(j) = cumuls(i) + transits(i) + slacks(i) +
6515 state_dependent_transits(i)
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.
6526 thisown = property(
lambda x: x.this.own(),
lambda x, v: x.this.own(v), doc=
"The membership flag")
6529 raise AttributeError(
"No constructor defined")
6530 __repr__ = _swig_repr
6531 __swig_destroy__ = _pywrapcp.delete_RoutingDimension
6534 r"""Returns the model on which the dimension was created."""
6535 return _pywrapcp.RoutingDimension_model(self)
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'.
6543 return _pywrapcp.RoutingDimension_GetTransitValue(self, from_index, to_index, vehicle)
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()).
6550 return _pywrapcp.RoutingDimension_GetTransitValueFromClass(self, from_index, to_index, vehicle_class)
6554 Get the cumul, transit and slack variables for the given node (given as
6557 return _pywrapcp.RoutingDimension_CumulVar(self, index)
6560 return _pywrapcp.RoutingDimension_TransitVar(self, index)
6563 return _pywrapcp.RoutingDimension_FixedTransitVar(self, index)
6566 return _pywrapcp.RoutingDimension_SlackVar(self, index)
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.
6574 return _pywrapcp.RoutingDimension_SetCumulVarRange(self, index, min, max)
6577 r"""Gets the current minimum of the cumul variable associated to index."""
6578 return _pywrapcp.RoutingDimension_GetCumulVarMin(self, index)
6581 r"""Gets the current maximum of the cumul variable associated to index."""
6582 return _pywrapcp.RoutingDimension_GetCumulVarMax(self, index)
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
6590 return _pywrapcp.RoutingDimension_SetSpanUpperBoundForVehicle(self, upper_bound, vehicle)
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
6598 The cost for a vehicle is
6599 span_cost = coefficient * (dimension end value - dimension start value).
6601 return _pywrapcp.RoutingDimension_SetSpanCostCoefficientForVehicle(self, coefficient, vehicle)
6604 return _pywrapcp.RoutingDimension_SetSpanCostCoefficientForAllVehicles(self, coefficient)
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).
6616 return _pywrapcp.RoutingDimension_SetSlackCostCoefficientForVehicle(self, coefficient, vehicle)
6619 return _pywrapcp.RoutingDimension_SetSlackCostCoefficientForAllVehicles(self, coefficient)
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.
6628 coefficient * (Max(dimension end value) - Min(dimension start value)).
6630 return _pywrapcp.RoutingDimension_SetGlobalSpanCostCoefficient(self, coefficient)
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
6643 return _pywrapcp.RoutingDimension_SetCumulVarSoftUpperBound(self, index, upper_bound, coefficient)
6647 Returns true if a soft upper bound has been set for a given variable
6650 return _pywrapcp.RoutingDimension_HasCumulVarSoftUpperBound(self, index)
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
6658 return _pywrapcp.RoutingDimension_GetCumulVarSoftUpperBound(self, index)
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
6666 return _pywrapcp.RoutingDimension_GetCumulVarSoftUpperBoundCoefficient(self, index)
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 -
6677 This is also handy to model earliness costs when the dimension represents
6680 return _pywrapcp.RoutingDimension_SetCumulVarSoftLowerBound(self, index, lower_bound, coefficient)
6684 Returns true if a soft lower bound has been set for a given variable
6687 return _pywrapcp.RoutingDimension_HasCumulVarSoftLowerBound(self, index)
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
6695 return _pywrapcp.RoutingDimension_GetCumulVarSoftLowerBound(self, index)
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
6703 return _pywrapcp.RoutingDimension_GetCumulVarSoftLowerBoundCoefficient(self, index)
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.
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
6722 Deprecated, sets pre_travel(i, j) = node_visit_transit[i].
6724 return _pywrapcp.RoutingDimension_SetBreakIntervalsOfVehicle(self, breaks, vehicle, node_visit_transits)
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
6733 return _pywrapcp.RoutingDimension_SetBreakDistanceDurationOfVehicle(self, distance, duration, vehicle)
6737 Sets up vehicle_break_intervals_, vehicle_break_distance_duration_,
6738 pre_travel_evaluators and post_travel_evaluators.
6740 return _pywrapcp.RoutingDimension_InitializeBreaks(self)
6743 r"""Returns true if any break interval or break distance was defined."""
6744 return _pywrapcp.RoutingDimension_HasBreakConstraints(self)
6747 return _pywrapcp.RoutingDimension_GetPreTravelEvaluatorOfVehicle(self, vehicle)
6750 return _pywrapcp.RoutingDimension_GetPostTravelEvaluatorOfVehicle(self, vehicle)
6753 r"""Returns the parent in the dependency tree if any or nullptr otherwise."""
6754 return _pywrapcp.RoutingDimension_base_dimension(self)
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.
6766 return _pywrapcp.RoutingDimension_ShortestTransitionSlack(self, node)
6769 r"""Returns the index of the dimension in the model."""
6770 return _pywrapcp.RoutingDimension_index(self)
6773 r"""Returns the name of the dimension."""
6774 return _pywrapcp.RoutingDimension_name(self)
6777 return _pywrapcp.RoutingDimension_SetPickupToDeliveryLimitFunctionForPair(self, limit_function, pair_index)
6780 return _pywrapcp.RoutingDimension_HasPickupToDeliveryLimits(self)
6783 return _pywrapcp.RoutingDimension_AddNodePrecedence(self, first_node, second_node, offset)
6786 return _pywrapcp.RoutingDimension_GetSpanUpperBoundForVehicle(self, vehicle)
6789 return _pywrapcp.RoutingDimension_GetSpanCostCoefficientForVehicle(self, vehicle)
6792 return _pywrapcp.RoutingDimension_GetSlackCostCoefficientForVehicle(self, vehicle)
6795 return _pywrapcp.RoutingDimension_global_span_cost_coefficient(self)
6798 return _pywrapcp.RoutingDimension_GetGlobalOptimizerOffset(self)
6801 return _pywrapcp.RoutingDimension_GetLocalOptimizerOffsetForVehicle(self, vehicle)
6805 If the span of vehicle on this dimension is larger than bound,
6806 the cost will be increased by cost * (span - bound).
6808 return _pywrapcp.RoutingDimension_SetSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
6811 return _pywrapcp.RoutingDimension_HasSoftSpanUpperBounds(self)
6814 return _pywrapcp.RoutingDimension_GetSoftSpanUpperBoundForVehicle(self, vehicle)
6818 If the span of vehicle on this dimension is larger than bound,
6819 the cost will be increased by cost * (span - bound)^2.
6821 return _pywrapcp.RoutingDimension_SetQuadraticCostSoftSpanUpperBoundForVehicle(self, bound_cost, vehicle)
6824 return _pywrapcp.RoutingDimension_HasQuadraticCostSoftSpanUpperBounds(self)
6827 return _pywrapcp.RoutingDimension_GetQuadraticCostSoftSpanUpperBoundForVehicle(self, vehicle)
6830_pywrapcp.RoutingDimension_swigregister(RoutingDimension)
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.
6839 return _pywrapcp.SolveModelWithSat(model, search_stats, search_parameters, initial_solution, solution)