ortools.linear_solver.pywraplp

  1# This file was automatically generated by SWIG (https://www.swig.org).
  2# Version 4.4.0
  3#
  4# Do not make changes to this file unless you know what you are doing - modify
  5# the SWIG interface file instead.
  6
  7from sys import version_info as _swig_python_version_info
  8# Import the low-level C/C++ module
  9if getattr(globals().get("__spec__"), "parent", None) or __package__ or "." in __name__:
 10    from . import _pywraplp
 11else:
 12    import _pywraplp
 13
 14try:
 15    import builtins as __builtin__
 16except ImportError:
 17    import __builtin__
 18
 19def _swig_repr(self):
 20    try:
 21        strthis = "proxy of " + self.this.__repr__()
 22    except __builtin__.Exception:
 23        strthis = ""
 24    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
 25
 26
 27def _swig_setattr_nondynamic_instance_variable(set):
 28    def set_instance_attr(self, name, value):
 29        if name == "this":
 30            set(self, name, value)
 31        elif name == "thisown":
 32            self.this.own(value)
 33        elif hasattr(self, name) and isinstance(getattr(type(self), name), property):
 34            set(self, name, value)
 35        else:
 36            raise AttributeError("You cannot add instance attributes to %s" % self)
 37    return set_instance_attr
 38
 39
 40def _swig_setattr_nondynamic_class_variable(set):
 41    def set_class_attr(cls, name, value):
 42        if hasattr(cls, name) and not isinstance(getattr(cls, name), property):
 43            set(cls, name, value)
 44        else:
 45            raise AttributeError("You cannot add class attributes to %s" % cls)
 46    return set_class_attr
 47
 48
 49def _swig_add_metaclass(metaclass):
 50    """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
 51    def wrapper(cls):
 52        return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
 53    return wrapper
 54
 55
 56class _SwigNonDynamicMeta(type):
 57    """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
 58    __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)
 59
 60
 61
 62import numbers
 63from ortools.linear_solver.python.linear_solver_natural_api import OFFSET_KEY
 64from ortools.linear_solver.python.linear_solver_natural_api import inf
 65from ortools.linear_solver.python.linear_solver_natural_api import LinearExpr
 66from ortools.linear_solver.python.linear_solver_natural_api import ProductCst
 67from ortools.linear_solver.python.linear_solver_natural_api import Sum
 68from ortools.linear_solver.python.linear_solver_natural_api import SumArray
 69from ortools.linear_solver.python.linear_solver_natural_api import SumCst
 70from ortools.linear_solver.python.linear_solver_natural_api import LinearConstraint
 71from ortools.linear_solver.python.linear_solver_natural_api import VariableExpr
 72
 73class Solver(object):
 74    r"""
 75    This mathematical programming (MP) solver class is the main class
 76    though which users build and solve problems.
 77    """
 78
 79    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
 80    __repr__ = _swig_repr
 81    CLP_LINEAR_PROGRAMMING = _pywraplp.Solver_CLP_LINEAR_PROGRAMMING
 82    GLPK_LINEAR_PROGRAMMING = _pywraplp.Solver_GLPK_LINEAR_PROGRAMMING
 83    GLOP_LINEAR_PROGRAMMING = _pywraplp.Solver_GLOP_LINEAR_PROGRAMMING
 84    PDLP_LINEAR_PROGRAMMING = _pywraplp.Solver_PDLP_LINEAR_PROGRAMMING
 85    SCIP_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_SCIP_MIXED_INTEGER_PROGRAMMING
 86    GLPK_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GLPK_MIXED_INTEGER_PROGRAMMING
 87    CBC_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CBC_MIXED_INTEGER_PROGRAMMING
 88    BOP_INTEGER_PROGRAMMING = _pywraplp.Solver_BOP_INTEGER_PROGRAMMING
 89    SAT_INTEGER_PROGRAMMING = _pywraplp.Solver_SAT_INTEGER_PROGRAMMING
 90    GUROBI_LINEAR_PROGRAMMING = _pywraplp.Solver_GUROBI_LINEAR_PROGRAMMING
 91    GUROBI_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GUROBI_MIXED_INTEGER_PROGRAMMING
 92    CPLEX_LINEAR_PROGRAMMING = _pywraplp.Solver_CPLEX_LINEAR_PROGRAMMING
 93    CPLEX_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CPLEX_MIXED_INTEGER_PROGRAMMING
 94    XPRESS_LINEAR_PROGRAMMING = _pywraplp.Solver_XPRESS_LINEAR_PROGRAMMING
 95    XPRESS_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_XPRESS_MIXED_INTEGER_PROGRAMMING
 96
 97    def __init__(self, name, problem_type):
 98        r"""Create a solver with the given name and underlying solver backend."""
 99        _pywraplp.Solver_swiginit(self, _pywraplp.new_Solver(name, problem_type))
100    __swig_destroy__ = _pywraplp.delete_Solver
101
102    @staticmethod
103    def CreateSolver(solver_id):
104        r"""
105        Recommended factory method to create a MPSolver instance, especially in
106        non C++ languages.
107
108        It returns a newly created solver instance if successful, or a nullptr
109        otherwise. This can occur if the relevant interface is not linked in, or if
110        a needed license is not accessible for commercial solvers.
111
112        Ownership of the solver is passed on to the caller of this method.
113        It will accept both string names of the OptimizationProblemType enum, as
114        well as a short version (i.e. "SCIP_MIXED_INTEGER_PROGRAMMING" or "SCIP").
115
116        solver_id is case insensitive, and the following names are supported:
117          - CLP_LINEAR_PROGRAMMING or CLP
118          - CBC_MIXED_INTEGER_PROGRAMMING or CBC
119          - GLOP_LINEAR_PROGRAMMING or GLOP
120          - BOP_INTEGER_PROGRAMMING or BOP
121          - SAT_INTEGER_PROGRAMMING or SAT or CP_SAT
122          - SCIP_MIXED_INTEGER_PROGRAMMING or SCIP
123          - GUROBI_LINEAR_PROGRAMMING or GUROBI_LP
124          - GUROBI_MIXED_INTEGER_PROGRAMMING or GUROBI or GUROBI_MIP
125          - CPLEX_LINEAR_PROGRAMMING or CPLEX_LP
126          - CPLEX_MIXED_INTEGER_PROGRAMMING or CPLEX or CPLEX_MIP
127          - XPRESS_LINEAR_PROGRAMMING or XPRESS_LP
128          - XPRESS_MIXED_INTEGER_PROGRAMMING or XPRESS or XPRESS_MIP
129          - GLPK_LINEAR_PROGRAMMING or GLPK_LP
130          - GLPK_MIXED_INTEGER_PROGRAMMING or GLPK or GLPK_MIP
131        """
132        return _pywraplp.Solver_CreateSolver(solver_id)
133
134    @staticmethod
135    def SupportsProblemType(problem_type):
136        r"""
137        Whether the given problem type is supported (this will depend on the
138        targets that you linked).
139        """
140        return _pywraplp.Solver_SupportsProblemType(problem_type)
141
142    def IsMip(self):
143        return _pywraplp.Solver_IsMip(self)
144
145    def Clear(self):
146        r"""
147        Clears the objective (including the optimization direction), all variables
148        and constraints. All the other properties of the MPSolver (like the time
149        limit) are kept untouched.
150        """
151        return _pywraplp.Solver_Clear(self)
152
153    def NumVariables(self):
154        r"""Returns the number of variables."""
155        return _pywraplp.Solver_NumVariables(self)
156
157    def variables(self):
158        r"""
159        Returns the array of variables handled by the MPSolver. (They are listed in
160        the order in which they were created.)
161        """
162        return _pywraplp.Solver_variables(self)
163
164    def variable(self, index):
165        r"""Returns the variable at position index."""
166        return _pywraplp.Solver_variable(self, index)
167
168    def LookupVariable(self, var_name):
169        r"""
170        Looks up a variable by name, and returns nullptr if it does not exist. The
171        first call has a O(n) complexity, as the variable name index is lazily
172        created upon first use. Will crash if variable names are not unique.
173        """
174        return _pywraplp.Solver_LookupVariable(self, var_name)
175
176    def Var(self, lb, ub, integer, name):
177        r"""
178        Creates a variable with the given bounds, integrality requirement and
179        name. Bounds can be finite or +/- MPSolver::infinity(). The MPSolver owns
180        the variable (i.e. the returned pointer is borrowed). Variable names are
181        optional. If you give an empty name, name() will auto-generate one for you
182        upon request.
183        """
184        return _pywraplp.Solver_Var(self, lb, ub, integer, name)
185
186    def NumVar(self, lb, ub, name):
187        r"""Creates a continuous variable."""
188        return _pywraplp.Solver_NumVar(self, lb, ub, name)
189
190    def IntVar(self, lb, ub, name):
191        r"""Creates an integer variable."""
192        return _pywraplp.Solver_IntVar(self, lb, ub, name)
193
194    def BoolVar(self, name):
195        r"""Creates a boolean variable."""
196        return _pywraplp.Solver_BoolVar(self, name)
197
198    def NumConstraints(self):
199        r"""Returns the number of constraints."""
200        return _pywraplp.Solver_NumConstraints(self)
201
202    def constraints(self):
203        r"""
204        Returns the array of constraints handled by the MPSolver.
205
206        They are listed in the order in which they were created.
207        """
208        return _pywraplp.Solver_constraints(self)
209
210    def constraint(self, index):
211        r"""Returns the constraint at the given index."""
212        return _pywraplp.Solver_constraint(self, index)
213
214    def LookupConstraint(self, constraint_name):
215        r"""
216         Looks up a constraint by name, and returns nullptr if it does not exist.
217
218        The first call has a O(n) complexity, as the constraint name index is
219        lazily created upon first use. Will crash if constraint names are not
220        unique.
221        """
222        return _pywraplp.Solver_LookupConstraint(self, constraint_name)
223
224    def Constraint(self, *args):
225        r"""
226        *Overload 1:*
227
228        Creates a linear constraint with given bounds.
229
230        Bounds can be finite or +/- MPSolver::infinity(). The MPSolver class
231        assumes ownership of the constraint.
232
233        :rtype: :py:class:`MPConstraint`
234        :return: a pointer to the newly created constraint.
235
236        |
237
238        *Overload 2:*
239         Creates a constraint with -infinity and +infinity bounds.
240
241        |
242
243        *Overload 3:*
244         Creates a named constraint with given bounds.
245
246        |
247
248        *Overload 4:*
249         Creates a named constraint with -infinity and +infinity bounds.
250        """
251        return _pywraplp.Solver_Constraint(self, *args)
252
253    def Objective(self):
254        r"""Returns the mutable objective object."""
255        return _pywraplp.Solver_Objective(self)
256    OPTIMAL = _pywraplp.Solver_OPTIMAL
257    r"""optimal."""
258    FEASIBLE = _pywraplp.Solver_FEASIBLE
259    r"""feasible, or stopped by limit."""
260    INFEASIBLE = _pywraplp.Solver_INFEASIBLE
261    r"""proven infeasible."""
262    UNBOUNDED = _pywraplp.Solver_UNBOUNDED
263    r"""proven unbounded."""
264    ABNORMAL = _pywraplp.Solver_ABNORMAL
265    r"""abnormal, i.e., error of some kind."""
266    MODEL_INVALID = _pywraplp.Solver_MODEL_INVALID
267    r"""the model is trivially invalid (NaN coefficients, etc)."""
268    NOT_SOLVED = _pywraplp.Solver_NOT_SOLVED
269    r"""not been solved yet."""
270
271    def Solve(self, *args):
272        r"""
273        *Overload 1:*
274        Solves the problem using the default parameter values.
275
276        |
277
278        *Overload 2:*
279        Solves the problem using the specified parameter values.
280        """
281        return _pywraplp.Solver_Solve(self, *args)
282
283    def Write(self, file_name):
284        r"""
285        Writes the model using the solver internal write function.  Currently only
286        available for Gurobi.
287        """
288        return _pywraplp.Solver_Write(self, file_name)
289
290    def ComputeConstraintActivities(self):
291        r"""
292        Advanced usage: compute the "activities" of all constraints, which are the
293        sums of their linear terms. The activities are returned in the same order
294        as constraints(), which is the order in which constraints were added; but
295        you can also use MPConstraint::index() to get a constraint's index.
296        """
297        return _pywraplp.Solver_ComputeConstraintActivities(self)
298
299    def VerifySolution(self, tolerance, log_errors):
300        r"""
301        Advanced usage: Verifies the *correctness* of the solution.
302
303        It verifies that all variables must be within their domains, all
304        constraints must be satisfied, and the reported objective value must be
305        accurate.
306
307        Usage:
308        - This can only be called after Solve() was called.
309        - "tolerance" is interpreted as an absolute error threshold.
310        - For the objective value only, if the absolute error is too large,
311          the tolerance is interpreted as a relative error threshold instead.
312        - If "log_errors" is true, every single violation will be logged.
313        - If "tolerance" is negative, it will be set to infinity().
314
315        Most users should just set the --verify_solution flag and not bother using
316        this method directly.
317        """
318        return _pywraplp.Solver_VerifySolution(self, tolerance, log_errors)
319
320    def InterruptSolve(self):
321        r"""
322         Interrupts the Solve() execution to terminate processing if possible.
323
324        If the underlying interface supports interruption; it does that and returns
325        true regardless of whether there's an ongoing Solve() or not. The Solve()
326        call may still linger for a while depending on the conditions.  If
327        interruption is not supported; returns false and does nothing.
328        MPSolver::SolverTypeSupportsInterruption can be used to check if
329        interruption is supported for a given solver type.
330        """
331        return _pywraplp.Solver_InterruptSolve(self)
332
333    def FillSolutionResponseProto(self, response):
334        r"""Encodes the current solution in a solution response protocol buffer."""
335        return _pywraplp.Solver_FillSolutionResponseProto(self, response)
336
337    @staticmethod
338    def SolveWithProto(model_request, response, interrupt=None):
339        r"""
340        Solves the model encoded by a MPModelRequest protocol buffer and fills the
341        solution encoded as a MPSolutionResponse. The solve is stopped prematurely
342        if interrupt is non-null at set to true during (or before) solving.
343        Interruption is only supported if SolverTypeSupportsInterruption() returns
344        true for the requested solver. Passing a non-null interruption with any
345        other solver type immediately returns an MPSOLVER_INCOMPATIBLE_OPTIONS
346        error.
347
348        `interrupt` is non-const because the internal solver may set it to true
349        itself, in some cases.
350
351        Note(user): This attempts to first use `DirectlySolveProto()` (if
352        implemented). Consequently, this most likely does *not* override any of
353        the default parameters of the underlying solver. This behavior *differs*
354        from `MPSolver::Solve()` which by default sets the feasibility tolerance
355        and the gap limit (as of 2020/02/11, to 1e-7 and 0.0001, respectively).
356        """
357        return _pywraplp.Solver_SolveWithProto(model_request, response, interrupt)
358
359    def ExportModelToProto(self, output_model):
360        r"""Exports model to protocol buffer."""
361        return _pywraplp.Solver_ExportModelToProto(self, output_model)
362
363    def SetSolverSpecificParametersAsString(self, parameters):
364        r"""
365        Advanced usage: pass solver specific parameters in text format.
366
367        The format is solver-specific and is the same as the corresponding solver
368        configuration file format. Returns true if the operation was successful.
369        """
370        return _pywraplp.Solver_SetSolverSpecificParametersAsString(self, parameters)
371    FREE = _pywraplp.Solver_FREE
372    AT_LOWER_BOUND = _pywraplp.Solver_AT_LOWER_BOUND
373    AT_UPPER_BOUND = _pywraplp.Solver_AT_UPPER_BOUND
374    FIXED_VALUE = _pywraplp.Solver_FIXED_VALUE
375    BASIC = _pywraplp.Solver_BASIC
376
377    @staticmethod
378    def infinity():
379        r"""
380        Infinity.
381
382        You can use -MPSolver::infinity() for negative infinity.
383        """
384        return _pywraplp.Solver_infinity()
385
386    def EnableOutput(self):
387        r"""Enables solver logging."""
388        return _pywraplp.Solver_EnableOutput(self)
389
390    def SuppressOutput(self):
391        r"""Suppresses solver logging."""
392        return _pywraplp.Solver_SuppressOutput(self)
393
394    def iterations(self):
395        r"""Returns the number of simplex iterations."""
396        return _pywraplp.Solver_iterations(self)
397
398    def nodes(self):
399        r"""
400        Returns the number of branch-and-bound nodes evaluated during the solve.
401
402        Only available for discrete problems.
403        """
404        return _pywraplp.Solver_nodes(self)
405
406    def SolverVersion(self):
407        r"""Returns a string describing the underlying solver and its version."""
408        return _pywraplp.Solver_SolverVersion(self)
409
410    def ComputeExactConditionNumber(self):
411        r"""
412         Advanced usage: computes the exact condition number of the current scaled
413        basis: L1norm(B) * L1norm(inverse(B)), where B is the scaled basis.
414
415        This method requires that a basis exists: it should be called after Solve.
416        It is only available for continuous problems. It is implemented for GLPK
417        but not CLP because CLP does not provide the API for doing it.
418
419        The condition number measures how well the constraint matrix is conditioned
420        and can be used to predict whether numerical issues will arise during the
421        solve: the model is declared infeasible whereas it is feasible (or
422        vice-versa), the solution obtained is not optimal or violates some
423        constraints, the resolution is slow because of repeated singularities.
424
425        The rule of thumb to interpret the condition number kappa is:
426          - o kappa <= 1e7: virtually no chance of numerical issues
427          - o 1e7 < kappa <= 1e10: small chance of numerical issues
428          - o 1e10 < kappa <= 1e13: medium chance of numerical issues
429          - o kappa > 1e13: high chance of numerical issues
430
431        The computation of the condition number depends on the quality of the LU
432        decomposition, so it is not very accurate when the matrix is ill
433        conditioned.
434        """
435        return _pywraplp.Solver_ComputeExactConditionNumber(self)
436
437    def NextSolution(self):
438        r"""
439        Some solvers (MIP only, not LP) can produce multiple solutions to the
440        problem. Returns true when another solution is available, and updates the
441        MPVariable* objects to make the new solution queryable. Call only after
442        calling solve.
443
444        The optimality properties of the additional solutions found, and whether or
445        not the solver computes them ahead of time or when NextSolution() is called
446        is solver specific.
447
448        As of 2020-02-10, only Gurobi and SCIP support NextSolution(), see
449        linear_solver_interfaces_test for an example of how to configure these
450        solvers for multiple solutions. Other solvers return false unconditionally.
451        """
452        return _pywraplp.Solver_NextSolution(self)
453
454    def set_time_limit(self, time_limit_milliseconds):
455        return _pywraplp.Solver_set_time_limit(self, time_limit_milliseconds)
456
457    def wall_time(self):
458        r"""Deprecated: Use DurationSinceConstruction() instead."""
459        return _pywraplp.Solver_wall_time(self)
460
461    def LoadModelFromProto(self, input_model):
462        return _pywraplp.Solver_LoadModelFromProto(self, input_model)
463
464    def LoadModelFromProtoKeepNames(self, input_model):
465        return _pywraplp.Solver_LoadModelFromProtoKeepNames(self, input_model)
466
467    def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
468        return _pywraplp.Solver_LoadModelFromProtoWithUniqueNamesOrDie(self, input_model)
469
470    def LoadSolutionFromProto(self, *args):
471        return _pywraplp.Solver_LoadSolutionFromProto(self, *args)
472
473    def ExportModelAsLpFormat(self, obfuscate):
474        return _pywraplp.Solver_ExportModelAsLpFormat(self, obfuscate)
475
476    def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
477        return _pywraplp.Solver_ExportModelAsMpsFormat(self, fixed_format, obfuscate)
478
479    def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
480        return _pywraplp.Solver_WriteModelToMpsFile(self, filename, fixed_format, obfuscate)
481
482    def SetHint(self, variables, values):
483        r"""
484        Set a hint for solution.
485
486        If a feasible or almost-feasible solution to the problem is already known,
487        it may be helpful to pass it to the solver so that it can be used. A
488        solver that supports this feature will try to use this information to
489        create its initial feasible solution.
490
491        Note that it may not always be faster to give a hint like this to the
492        solver. There is also no guarantee that the solver will use this hint or
493        try to return a solution "close" to this assignment in case of multiple
494        optimal solutions.
495        """
496        return _pywraplp.Solver_SetHint(self, variables, values)
497
498    def SetNumThreads(self, num_theads):
499        r"""Sets the number of threads to be used by the solver."""
500        return _pywraplp.Solver_SetNumThreads(self, num_theads)
501
502    def Add(self, constraint, name=''):
503      if isinstance(constraint, bool):
504        if constraint:
505          return self.RowConstraint(0, 0, name)
506        else:
507          return self.RowConstraint(1, 1, name)
508      else:
509        return constraint.Extract(self, name)
510
511    def Sum(self, expr_array):
512      result = SumArray(expr_array)
513      return result
514
515    def RowConstraint(self, *args):
516      return self.Constraint(*args)
517
518    def Minimize(self, expr):
519      objective = self.Objective()
520      objective.Clear()
521      objective.SetMinimization()
522      if isinstance(expr, numbers.Number):
523          objective.SetOffset(expr)
524      else:
525          coeffs = expr.GetCoeffs()
526          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
527          for v, c, in list(coeffs.items()):
528            objective.SetCoefficient(v, float(c))
529
530    def Maximize(self, expr):
531      objective = self.Objective()
532      objective.Clear()
533      objective.SetMaximization()
534      if isinstance(expr, numbers.Number):
535          objective.SetOffset(expr)
536      else:
537          coeffs = expr.GetCoeffs()
538          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
539          for v, c, in list(coeffs.items()):
540            objective.SetCoefficient(v, float(c))
541
542
543    @staticmethod
544    def Infinity():
545        return _pywraplp.Solver_Infinity()
546
547    def SetTimeLimit(self, x):
548        return _pywraplp.Solver_SetTimeLimit(self, x)
549
550    def WallTime(self):
551        return _pywraplp.Solver_WallTime(self)
552
553    def Iterations(self):
554        return _pywraplp.Solver_Iterations(self)
555
556# Register Solver in _pywraplp:
557_pywraplp.Solver_swigregister(Solver)
558
559def __lshift__(*args):
560    return _pywraplp.__lshift__(*args)
561class Objective(object):
562    r"""A class to express a linear objective."""
563
564    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
565
566    def __init__(self, *args, **kwargs):
567        raise AttributeError("No constructor defined")
568    __repr__ = _swig_repr
569
570    def Clear(self):
571        r"""
572         Clears the offset, all variables and coefficients, and the optimization
573        direction.
574        """
575        return _pywraplp.Objective_Clear(self)
576
577    def SetCoefficient(self, var, coeff):
578        r"""
579        Sets the coefficient of the variable in the objective.
580
581        If the variable does not belong to the solver, the function just returns,
582        or crashes in non-opt mode.
583        """
584        return _pywraplp.Objective_SetCoefficient(self, var, coeff)
585
586    def GetCoefficient(self, var):
587        r"""
588         Gets the coefficient of a given variable in the objective
589
590        It returns 0 if the variable does not appear in the objective).
591        """
592        return _pywraplp.Objective_GetCoefficient(self, var)
593
594    def SetOffset(self, value):
595        r"""Sets the constant term in the objective."""
596        return _pywraplp.Objective_SetOffset(self, value)
597
598    def offset(self):
599        r"""Gets the constant term in the objective."""
600        return _pywraplp.Objective_offset(self)
601
602    def SetOptimizationDirection(self, maximize):
603        r"""Sets the optimization direction (maximize: true or minimize: false)."""
604        return _pywraplp.Objective_SetOptimizationDirection(self, maximize)
605
606    def SetMinimization(self):
607        r"""Sets the optimization direction to minimize."""
608        return _pywraplp.Objective_SetMinimization(self)
609
610    def SetMaximization(self):
611        r"""Sets the optimization direction to maximize."""
612        return _pywraplp.Objective_SetMaximization(self)
613
614    def maximization(self):
615        r"""Is the optimization direction set to maximize?"""
616        return _pywraplp.Objective_maximization(self)
617
618    def minimization(self):
619        r"""Is the optimization direction set to minimize?"""
620        return _pywraplp.Objective_minimization(self)
621
622    def Value(self):
623        r"""
624        Returns the objective value of the best solution found so far.
625
626        It is the optimal objective value if the problem has been solved to
627        optimality.
628
629        Note: the objective value may be slightly different than what you could
630        compute yourself using ``MPVariable::solution_value();`` please use the
631        --verify_solution flag to gain confidence about the numerical stability of
632        your solution.
633        """
634        return _pywraplp.Objective_Value(self)
635
636    def BestBound(self):
637        r"""
638        Returns the best objective bound.
639
640        In case of minimization, it is a lower bound on the objective value of the
641        optimal integer solution. Only available for discrete problems.
642        """
643        return _pywraplp.Objective_BestBound(self)
644
645    def Offset(self):
646        return _pywraplp.Objective_Offset(self)
647    __swig_destroy__ = _pywraplp.delete_Objective
648
649# Register Objective in _pywraplp:
650_pywraplp.Objective_swigregister(Objective)
651class Variable(object):
652    r"""The class for variables of a Mathematical Programming (MP) model."""
653
654    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
655
656    def __init__(self, *args, **kwargs):
657        raise AttributeError("No constructor defined")
658
659    def name(self):
660        r"""Returns the name of the variable."""
661        return _pywraplp.Variable_name(self)
662
663    def SetInteger(self, integer):
664        r"""Sets the integrality requirement of the variable."""
665        return _pywraplp.Variable_SetInteger(self, integer)
666
667    def integer(self):
668        r"""Returns the integrality requirement of the variable."""
669        return _pywraplp.Variable_integer(self)
670
671    def solution_value(self):
672        r"""
673        Returns the value of the variable in the current solution.
674
675        If the variable is integer, then the value will always be an integer (the
676        underlying solver handles floating-point values only, but this function
677        automatically rounds it to the nearest integer; see: man 3 round).
678        """
679        return _pywraplp.Variable_solution_value(self)
680
681    def index(self):
682        r"""Returns the index of the variable in the MPSolver::variables_."""
683        return _pywraplp.Variable_index(self)
684
685    def lb(self):
686        r"""Returns the lower bound."""
687        return _pywraplp.Variable_lb(self)
688
689    def ub(self):
690        r"""Returns the upper bound."""
691        return _pywraplp.Variable_ub(self)
692
693    def SetBounds(self, lb, ub):
694        r"""Sets both the lower and upper bounds."""
695        return _pywraplp.Variable_SetBounds(self, lb, ub)
696
697    def reduced_cost(self):
698        r"""
699        Advanced usage: returns the reduced cost of the variable in the current
700        solution (only available for continuous problems).
701        """
702        return _pywraplp.Variable_reduced_cost(self)
703
704    def basis_status(self):
705        r"""
706        Advanced usage: returns the basis status of the variable in the current
707        solution (only available for continuous problems).
708
709        See also: MPSolver::BasisStatus.
710        """
711        return _pywraplp.Variable_basis_status(self)
712
713    def branching_priority(self):
714        r"""
715        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
716        a per-variable priority for determining which variable to branch on.
717
718        A value of 0 is treated as default, and is equivalent to not setting the
719        branching priority. The solver looks first to branch on fractional
720        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
721        support setting branching priority; all other solvers will simply ignore
722        this annotation.
723        """
724        return _pywraplp.Variable_branching_priority(self)
725
726    def SetBranchingPriority(self, priority):
727        return _pywraplp.Variable_SetBranchingPriority(self, priority)
728
729    def __str__(self):
730        return _pywraplp.Variable___str__(self)
731
732    def __repr__(self):
733        return _pywraplp.Variable___repr__(self)
734
735    def __getattr__(self, name):
736      return getattr(VariableExpr(self), name)
737
738
739    def SolutionValue(self):
740        return _pywraplp.Variable_SolutionValue(self)
741
742    def Integer(self):
743        return _pywraplp.Variable_Integer(self)
744
745    def Lb(self):
746        return _pywraplp.Variable_Lb(self)
747
748    def Ub(self):
749        return _pywraplp.Variable_Ub(self)
750
751    def SetLb(self, x):
752        return _pywraplp.Variable_SetLb(self, x)
753
754    def SetUb(self, x):
755        return _pywraplp.Variable_SetUb(self, x)
756
757    def ReducedCost(self):
758        return _pywraplp.Variable_ReducedCost(self)
759    __swig_destroy__ = _pywraplp.delete_Variable
760
761# Register Variable in _pywraplp:
762_pywraplp.Variable_swigregister(Variable)
763class Constraint(object):
764    r"""
765    The class for constraints of a Mathematical Programming (MP) model.
766
767    A constraint is represented as a linear equation or inequality.
768    """
769
770    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
771
772    def __init__(self, *args, **kwargs):
773        raise AttributeError("No constructor defined")
774    __repr__ = _swig_repr
775
776    def name(self):
777        r"""Returns the name of the constraint."""
778        return _pywraplp.Constraint_name(self)
779
780    def Clear(self):
781        r"""Clears all variables and coefficients. Does not clear the bounds."""
782        return _pywraplp.Constraint_Clear(self)
783
784    def SetCoefficient(self, var, coeff):
785        r"""
786        Sets the coefficient of the variable on the constraint.
787
788        If the variable does not belong to the solver, the function just returns,
789        or crashes in non-opt mode.
790        """
791        return _pywraplp.Constraint_SetCoefficient(self, var, coeff)
792
793    def GetCoefficient(self, var):
794        r"""
795        Gets the coefficient of a given variable on the constraint (which is 0 if
796        the variable does not appear in the constraint).
797        """
798        return _pywraplp.Constraint_GetCoefficient(self, var)
799
800    def lb(self):
801        r"""Returns the lower bound."""
802        return _pywraplp.Constraint_lb(self)
803
804    def ub(self):
805        r"""Returns the upper bound."""
806        return _pywraplp.Constraint_ub(self)
807
808    def SetBounds(self, lb, ub):
809        r"""Sets both the lower and upper bounds."""
810        return _pywraplp.Constraint_SetBounds(self, lb, ub)
811
812    def set_is_lazy(self, laziness):
813        r"""
814        Advanced usage: sets the constraint "laziness".
815
816        **This is only supported for SCIP and has no effect on other
817        solvers.**
818
819        When **laziness** is true, the constraint is only considered by the Linear
820        Programming solver if its current solution violates the constraint. In this
821        case, the constraint is definitively added to the problem. This may be
822        useful in some MIP problems, and may have a dramatic impact on performance.
823
824        For more info see: http://tinyurl.com/lazy-constraints.
825        """
826        return _pywraplp.Constraint_set_is_lazy(self, laziness)
827
828    def index(self):
829        r"""Returns the index of the constraint in the MPSolver::constraints_."""
830        return _pywraplp.Constraint_index(self)
831
832    def dual_value(self):
833        r"""
834        Advanced usage: returns the dual value of the constraint in the current
835        solution (only available for continuous problems).
836        """
837        return _pywraplp.Constraint_dual_value(self)
838
839    def basis_status(self):
840        r"""
841        Advanced usage: returns the basis status of the constraint.
842
843        It is only available for continuous problems).
844
845        Note that if a constraint "linear_expression in [lb, ub]" is transformed
846        into "linear_expression + slack = 0" with slack in [-ub, -lb], then this
847        status is the same as the status of the slack variable with AT_UPPER_BOUND
848        and AT_LOWER_BOUND swapped.
849
850        See also: MPSolver::BasisStatus.
851        """
852        return _pywraplp.Constraint_basis_status(self)
853
854    def Lb(self):
855        return _pywraplp.Constraint_Lb(self)
856
857    def Ub(self):
858        return _pywraplp.Constraint_Ub(self)
859
860    def SetLb(self, x):
861        return _pywraplp.Constraint_SetLb(self, x)
862
863    def SetUb(self, x):
864        return _pywraplp.Constraint_SetUb(self, x)
865
866    def DualValue(self):
867        return _pywraplp.Constraint_DualValue(self)
868    __swig_destroy__ = _pywraplp.delete_Constraint
869
870# Register Constraint in _pywraplp:
871_pywraplp.Constraint_swigregister(Constraint)
872class MPSolverParameters(object):
873    r"""
874    This class stores parameter settings for LP and MIP solvers. Some parameters
875    are marked as advanced: do not change their values unless you know what you
876    are doing!
877
878    For developers: how to add a new parameter:
879    - Add the new Foo parameter in the DoubleParam or IntegerParam enum.
880    - If it is a categorical param, add a FooValues enum.
881    - Decide if the wrapper should define a default value for it: yes
882      if it controls the properties of the solution (example:
883      tolerances) or if it consistently improves performance, no
884      otherwise. If yes, define kDefaultFoo.
885    - Add a foo_value_ member and, if no default value is defined, a
886      foo_is_default_ member.
887    - Add code to handle Foo in Set...Param, Reset...Param,
888      Get...Param, Reset and the constructor.
889    - In class MPSolverInterface, add a virtual method SetFoo, add it
890      to SetCommonParameters or SetMIPParameters, and implement it for
891      each solver. Sometimes, parameters need to be implemented
892      differently, see for example the INCREMENTALITY implementation.
893    - Add a test in linear_solver_test.cc.
894
895    TODO(user): store the parameter values in a protocol buffer
896    instead. We need to figure out how to deal with the subtleties of
897    the default values.
898    """
899
900    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
901    __repr__ = _swig_repr
902    RELATIVE_MIP_GAP = _pywraplp.MPSolverParameters_RELATIVE_MIP_GAP
903    r"""Limit for relative MIP gap."""
904    PRIMAL_TOLERANCE = _pywraplp.MPSolverParameters_PRIMAL_TOLERANCE
905    r"""
906    Advanced usage: tolerance for primal feasibility of basic solutions.
907
908    This does not control the integer feasibility tolerance of integer
909    solutions for MIP or the tolerance used during presolve.
910    """
911    DUAL_TOLERANCE = _pywraplp.MPSolverParameters_DUAL_TOLERANCE
912    r"""Advanced usage: tolerance for dual feasibility of basic solutions."""
913    PRESOLVE = _pywraplp.MPSolverParameters_PRESOLVE
914    r"""Advanced usage: presolve mode."""
915    LP_ALGORITHM = _pywraplp.MPSolverParameters_LP_ALGORITHM
916    r"""Algorithm to solve linear programs."""
917    INCREMENTALITY = _pywraplp.MPSolverParameters_INCREMENTALITY
918    r"""Advanced usage: incrementality from one solve to the next."""
919    SCALING = _pywraplp.MPSolverParameters_SCALING
920    r"""Advanced usage: enable or disable matrix scaling."""
921    PRESOLVE_OFF = _pywraplp.MPSolverParameters_PRESOLVE_OFF
922    r"""Presolve is off."""
923    PRESOLVE_ON = _pywraplp.MPSolverParameters_PRESOLVE_ON
924    r"""Presolve is on."""
925    DUAL = _pywraplp.MPSolverParameters_DUAL
926    r"""Dual simplex."""
927    PRIMAL = _pywraplp.MPSolverParameters_PRIMAL
928    r"""Primal simplex."""
929    BARRIER = _pywraplp.MPSolverParameters_BARRIER
930    r"""Barrier algorithm."""
931    INCREMENTALITY_OFF = _pywraplp.MPSolverParameters_INCREMENTALITY_OFF
932    r"""Start solve from scratch."""
933    INCREMENTALITY_ON = _pywraplp.MPSolverParameters_INCREMENTALITY_ON
934    r"""
935    Reuse results from previous solve as much as the underlying solver
936    allows.
937    """
938    SCALING_OFF = _pywraplp.MPSolverParameters_SCALING_OFF
939    r"""Scaling is off."""
940    SCALING_ON = _pywraplp.MPSolverParameters_SCALING_ON
941    r"""Scaling is on."""
942
943    def __init__(self):
944        r"""The constructor sets all parameters to their default value."""
945        _pywraplp.MPSolverParameters_swiginit(self, _pywraplp.new_MPSolverParameters())
946
947    def SetDoubleParam(self, param, value):
948        r"""Sets a double parameter to a specific value."""
949        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)
950
951    def SetIntegerParam(self, param, value):
952        r"""Sets a integer parameter to a specific value."""
953        return _pywraplp.MPSolverParameters_SetIntegerParam(self, param, value)
954
955    def GetDoubleParam(self, param):
956        r"""Returns the value of a double parameter."""
957        return _pywraplp.MPSolverParameters_GetDoubleParam(self, param)
958
959    def GetIntegerParam(self, param):
960        r"""Returns the value of an integer parameter."""
961        return _pywraplp.MPSolverParameters_GetIntegerParam(self, param)
962    __swig_destroy__ = _pywraplp.delete_MPSolverParameters
963
964# Register MPSolverParameters in _pywraplp:
965_pywraplp.MPSolverParameters_swigregister(MPSolverParameters)
966cvar = _pywraplp.cvar
967MPSolverParameters.kDefaultRelativeMipGap = _pywraplp.cvar.MPSolverParameters_kDefaultRelativeMipGap
968MPSolverParameters.kDefaultPrimalTolerance = _pywraplp.cvar.MPSolverParameters_kDefaultPrimalTolerance
969MPSolverParameters.kDefaultDualTolerance = _pywraplp.cvar.MPSolverParameters_kDefaultDualTolerance
970MPSolverParameters.kDefaultPresolve = _pywraplp.cvar.MPSolverParameters_kDefaultPresolve
971MPSolverParameters.kDefaultIncrementality = _pywraplp.cvar.MPSolverParameters_kDefaultIncrementality
972
973class ModelExportOptions(object):
974    r"""Export options."""
975
976    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
977    __repr__ = _swig_repr
978
979    def __init__(self):
980        _pywraplp.ModelExportOptions_swiginit(self, _pywraplp.new_ModelExportOptions())
981    __swig_destroy__ = _pywraplp.delete_ModelExportOptions
982
983# Register ModelExportOptions in _pywraplp:
984_pywraplp.ModelExportOptions_swigregister(ModelExportOptions)
985
986def ExportModelAsLpFormat(*args):
987    return _pywraplp.ExportModelAsLpFormat(*args)
988
989def ExportModelAsMpsFormat(*args):
990    return _pywraplp.ExportModelAsMpsFormat(*args)
991
992def FindErrorInModelProto(input_model):
993    return _pywraplp.FindErrorInModelProto(input_model)
994
995def setup_variable_operator(opname):
996  setattr(Variable, opname,
997          lambda self, *args: getattr(VariableExpr(self), opname)(*args))
998for opname in LinearExpr.OVERRIDDEN_OPERATOR_METHODS:
999  setup_variable_operator(opname)
class Solver:
 74class Solver(object):
 75    r"""
 76    This mathematical programming (MP) solver class is the main class
 77    though which users build and solve problems.
 78    """
 79
 80    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
 81    __repr__ = _swig_repr
 82    CLP_LINEAR_PROGRAMMING = _pywraplp.Solver_CLP_LINEAR_PROGRAMMING
 83    GLPK_LINEAR_PROGRAMMING = _pywraplp.Solver_GLPK_LINEAR_PROGRAMMING
 84    GLOP_LINEAR_PROGRAMMING = _pywraplp.Solver_GLOP_LINEAR_PROGRAMMING
 85    PDLP_LINEAR_PROGRAMMING = _pywraplp.Solver_PDLP_LINEAR_PROGRAMMING
 86    SCIP_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_SCIP_MIXED_INTEGER_PROGRAMMING
 87    GLPK_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GLPK_MIXED_INTEGER_PROGRAMMING
 88    CBC_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CBC_MIXED_INTEGER_PROGRAMMING
 89    BOP_INTEGER_PROGRAMMING = _pywraplp.Solver_BOP_INTEGER_PROGRAMMING
 90    SAT_INTEGER_PROGRAMMING = _pywraplp.Solver_SAT_INTEGER_PROGRAMMING
 91    GUROBI_LINEAR_PROGRAMMING = _pywraplp.Solver_GUROBI_LINEAR_PROGRAMMING
 92    GUROBI_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GUROBI_MIXED_INTEGER_PROGRAMMING
 93    CPLEX_LINEAR_PROGRAMMING = _pywraplp.Solver_CPLEX_LINEAR_PROGRAMMING
 94    CPLEX_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CPLEX_MIXED_INTEGER_PROGRAMMING
 95    XPRESS_LINEAR_PROGRAMMING = _pywraplp.Solver_XPRESS_LINEAR_PROGRAMMING
 96    XPRESS_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_XPRESS_MIXED_INTEGER_PROGRAMMING
 97
 98    def __init__(self, name, problem_type):
 99        r"""Create a solver with the given name and underlying solver backend."""
100        _pywraplp.Solver_swiginit(self, _pywraplp.new_Solver(name, problem_type))
101    __swig_destroy__ = _pywraplp.delete_Solver
102
103    @staticmethod
104    def CreateSolver(solver_id):
105        r"""
106        Recommended factory method to create a MPSolver instance, especially in
107        non C++ languages.
108
109        It returns a newly created solver instance if successful, or a nullptr
110        otherwise. This can occur if the relevant interface is not linked in, or if
111        a needed license is not accessible for commercial solvers.
112
113        Ownership of the solver is passed on to the caller of this method.
114        It will accept both string names of the OptimizationProblemType enum, as
115        well as a short version (i.e. "SCIP_MIXED_INTEGER_PROGRAMMING" or "SCIP").
116
117        solver_id is case insensitive, and the following names are supported:
118          - CLP_LINEAR_PROGRAMMING or CLP
119          - CBC_MIXED_INTEGER_PROGRAMMING or CBC
120          - GLOP_LINEAR_PROGRAMMING or GLOP
121          - BOP_INTEGER_PROGRAMMING or BOP
122          - SAT_INTEGER_PROGRAMMING or SAT or CP_SAT
123          - SCIP_MIXED_INTEGER_PROGRAMMING or SCIP
124          - GUROBI_LINEAR_PROGRAMMING or GUROBI_LP
125          - GUROBI_MIXED_INTEGER_PROGRAMMING or GUROBI or GUROBI_MIP
126          - CPLEX_LINEAR_PROGRAMMING or CPLEX_LP
127          - CPLEX_MIXED_INTEGER_PROGRAMMING or CPLEX or CPLEX_MIP
128          - XPRESS_LINEAR_PROGRAMMING or XPRESS_LP
129          - XPRESS_MIXED_INTEGER_PROGRAMMING or XPRESS or XPRESS_MIP
130          - GLPK_LINEAR_PROGRAMMING or GLPK_LP
131          - GLPK_MIXED_INTEGER_PROGRAMMING or GLPK or GLPK_MIP
132        """
133        return _pywraplp.Solver_CreateSolver(solver_id)
134
135    @staticmethod
136    def SupportsProblemType(problem_type):
137        r"""
138        Whether the given problem type is supported (this will depend on the
139        targets that you linked).
140        """
141        return _pywraplp.Solver_SupportsProblemType(problem_type)
142
143    def IsMip(self):
144        return _pywraplp.Solver_IsMip(self)
145
146    def Clear(self):
147        r"""
148        Clears the objective (including the optimization direction), all variables
149        and constraints. All the other properties of the MPSolver (like the time
150        limit) are kept untouched.
151        """
152        return _pywraplp.Solver_Clear(self)
153
154    def NumVariables(self):
155        r"""Returns the number of variables."""
156        return _pywraplp.Solver_NumVariables(self)
157
158    def variables(self):
159        r"""
160        Returns the array of variables handled by the MPSolver. (They are listed in
161        the order in which they were created.)
162        """
163        return _pywraplp.Solver_variables(self)
164
165    def variable(self, index):
166        r"""Returns the variable at position index."""
167        return _pywraplp.Solver_variable(self, index)
168
169    def LookupVariable(self, var_name):
170        r"""
171        Looks up a variable by name, and returns nullptr if it does not exist. The
172        first call has a O(n) complexity, as the variable name index is lazily
173        created upon first use. Will crash if variable names are not unique.
174        """
175        return _pywraplp.Solver_LookupVariable(self, var_name)
176
177    def Var(self, lb, ub, integer, name):
178        r"""
179        Creates a variable with the given bounds, integrality requirement and
180        name. Bounds can be finite or +/- MPSolver::infinity(). The MPSolver owns
181        the variable (i.e. the returned pointer is borrowed). Variable names are
182        optional. If you give an empty name, name() will auto-generate one for you
183        upon request.
184        """
185        return _pywraplp.Solver_Var(self, lb, ub, integer, name)
186
187    def NumVar(self, lb, ub, name):
188        r"""Creates a continuous variable."""
189        return _pywraplp.Solver_NumVar(self, lb, ub, name)
190
191    def IntVar(self, lb, ub, name):
192        r"""Creates an integer variable."""
193        return _pywraplp.Solver_IntVar(self, lb, ub, name)
194
195    def BoolVar(self, name):
196        r"""Creates a boolean variable."""
197        return _pywraplp.Solver_BoolVar(self, name)
198
199    def NumConstraints(self):
200        r"""Returns the number of constraints."""
201        return _pywraplp.Solver_NumConstraints(self)
202
203    def constraints(self):
204        r"""
205        Returns the array of constraints handled by the MPSolver.
206
207        They are listed in the order in which they were created.
208        """
209        return _pywraplp.Solver_constraints(self)
210
211    def constraint(self, index):
212        r"""Returns the constraint at the given index."""
213        return _pywraplp.Solver_constraint(self, index)
214
215    def LookupConstraint(self, constraint_name):
216        r"""
217         Looks up a constraint by name, and returns nullptr if it does not exist.
218
219        The first call has a O(n) complexity, as the constraint name index is
220        lazily created upon first use. Will crash if constraint names are not
221        unique.
222        """
223        return _pywraplp.Solver_LookupConstraint(self, constraint_name)
224
225    def Constraint(self, *args):
226        r"""
227        *Overload 1:*
228
229        Creates a linear constraint with given bounds.
230
231        Bounds can be finite or +/- MPSolver::infinity(). The MPSolver class
232        assumes ownership of the constraint.
233
234        :rtype: :py:class:`MPConstraint`
235        :return: a pointer to the newly created constraint.
236
237        |
238
239        *Overload 2:*
240         Creates a constraint with -infinity and +infinity bounds.
241
242        |
243
244        *Overload 3:*
245         Creates a named constraint with given bounds.
246
247        |
248
249        *Overload 4:*
250         Creates a named constraint with -infinity and +infinity bounds.
251        """
252        return _pywraplp.Solver_Constraint(self, *args)
253
254    def Objective(self):
255        r"""Returns the mutable objective object."""
256        return _pywraplp.Solver_Objective(self)
257    OPTIMAL = _pywraplp.Solver_OPTIMAL
258    r"""optimal."""
259    FEASIBLE = _pywraplp.Solver_FEASIBLE
260    r"""feasible, or stopped by limit."""
261    INFEASIBLE = _pywraplp.Solver_INFEASIBLE
262    r"""proven infeasible."""
263    UNBOUNDED = _pywraplp.Solver_UNBOUNDED
264    r"""proven unbounded."""
265    ABNORMAL = _pywraplp.Solver_ABNORMAL
266    r"""abnormal, i.e., error of some kind."""
267    MODEL_INVALID = _pywraplp.Solver_MODEL_INVALID
268    r"""the model is trivially invalid (NaN coefficients, etc)."""
269    NOT_SOLVED = _pywraplp.Solver_NOT_SOLVED
270    r"""not been solved yet."""
271
272    def Solve(self, *args):
273        r"""
274        *Overload 1:*
275        Solves the problem using the default parameter values.
276
277        |
278
279        *Overload 2:*
280        Solves the problem using the specified parameter values.
281        """
282        return _pywraplp.Solver_Solve(self, *args)
283
284    def Write(self, file_name):
285        r"""
286        Writes the model using the solver internal write function.  Currently only
287        available for Gurobi.
288        """
289        return _pywraplp.Solver_Write(self, file_name)
290
291    def ComputeConstraintActivities(self):
292        r"""
293        Advanced usage: compute the "activities" of all constraints, which are the
294        sums of their linear terms. The activities are returned in the same order
295        as constraints(), which is the order in which constraints were added; but
296        you can also use MPConstraint::index() to get a constraint's index.
297        """
298        return _pywraplp.Solver_ComputeConstraintActivities(self)
299
300    def VerifySolution(self, tolerance, log_errors):
301        r"""
302        Advanced usage: Verifies the *correctness* of the solution.
303
304        It verifies that all variables must be within their domains, all
305        constraints must be satisfied, and the reported objective value must be
306        accurate.
307
308        Usage:
309        - This can only be called after Solve() was called.
310        - "tolerance" is interpreted as an absolute error threshold.
311        - For the objective value only, if the absolute error is too large,
312          the tolerance is interpreted as a relative error threshold instead.
313        - If "log_errors" is true, every single violation will be logged.
314        - If "tolerance" is negative, it will be set to infinity().
315
316        Most users should just set the --verify_solution flag and not bother using
317        this method directly.
318        """
319        return _pywraplp.Solver_VerifySolution(self, tolerance, log_errors)
320
321    def InterruptSolve(self):
322        r"""
323         Interrupts the Solve() execution to terminate processing if possible.
324
325        If the underlying interface supports interruption; it does that and returns
326        true regardless of whether there's an ongoing Solve() or not. The Solve()
327        call may still linger for a while depending on the conditions.  If
328        interruption is not supported; returns false and does nothing.
329        MPSolver::SolverTypeSupportsInterruption can be used to check if
330        interruption is supported for a given solver type.
331        """
332        return _pywraplp.Solver_InterruptSolve(self)
333
334    def FillSolutionResponseProto(self, response):
335        r"""Encodes the current solution in a solution response protocol buffer."""
336        return _pywraplp.Solver_FillSolutionResponseProto(self, response)
337
338    @staticmethod
339    def SolveWithProto(model_request, response, interrupt=None):
340        r"""
341        Solves the model encoded by a MPModelRequest protocol buffer and fills the
342        solution encoded as a MPSolutionResponse. The solve is stopped prematurely
343        if interrupt is non-null at set to true during (or before) solving.
344        Interruption is only supported if SolverTypeSupportsInterruption() returns
345        true for the requested solver. Passing a non-null interruption with any
346        other solver type immediately returns an MPSOLVER_INCOMPATIBLE_OPTIONS
347        error.
348
349        `interrupt` is non-const because the internal solver may set it to true
350        itself, in some cases.
351
352        Note(user): This attempts to first use `DirectlySolveProto()` (if
353        implemented). Consequently, this most likely does *not* override any of
354        the default parameters of the underlying solver. This behavior *differs*
355        from `MPSolver::Solve()` which by default sets the feasibility tolerance
356        and the gap limit (as of 2020/02/11, to 1e-7 and 0.0001, respectively).
357        """
358        return _pywraplp.Solver_SolveWithProto(model_request, response, interrupt)
359
360    def ExportModelToProto(self, output_model):
361        r"""Exports model to protocol buffer."""
362        return _pywraplp.Solver_ExportModelToProto(self, output_model)
363
364    def SetSolverSpecificParametersAsString(self, parameters):
365        r"""
366        Advanced usage: pass solver specific parameters in text format.
367
368        The format is solver-specific and is the same as the corresponding solver
369        configuration file format. Returns true if the operation was successful.
370        """
371        return _pywraplp.Solver_SetSolverSpecificParametersAsString(self, parameters)
372    FREE = _pywraplp.Solver_FREE
373    AT_LOWER_BOUND = _pywraplp.Solver_AT_LOWER_BOUND
374    AT_UPPER_BOUND = _pywraplp.Solver_AT_UPPER_BOUND
375    FIXED_VALUE = _pywraplp.Solver_FIXED_VALUE
376    BASIC = _pywraplp.Solver_BASIC
377
378    @staticmethod
379    def infinity():
380        r"""
381        Infinity.
382
383        You can use -MPSolver::infinity() for negative infinity.
384        """
385        return _pywraplp.Solver_infinity()
386
387    def EnableOutput(self):
388        r"""Enables solver logging."""
389        return _pywraplp.Solver_EnableOutput(self)
390
391    def SuppressOutput(self):
392        r"""Suppresses solver logging."""
393        return _pywraplp.Solver_SuppressOutput(self)
394
395    def iterations(self):
396        r"""Returns the number of simplex iterations."""
397        return _pywraplp.Solver_iterations(self)
398
399    def nodes(self):
400        r"""
401        Returns the number of branch-and-bound nodes evaluated during the solve.
402
403        Only available for discrete problems.
404        """
405        return _pywraplp.Solver_nodes(self)
406
407    def SolverVersion(self):
408        r"""Returns a string describing the underlying solver and its version."""
409        return _pywraplp.Solver_SolverVersion(self)
410
411    def ComputeExactConditionNumber(self):
412        r"""
413         Advanced usage: computes the exact condition number of the current scaled
414        basis: L1norm(B) * L1norm(inverse(B)), where B is the scaled basis.
415
416        This method requires that a basis exists: it should be called after Solve.
417        It is only available for continuous problems. It is implemented for GLPK
418        but not CLP because CLP does not provide the API for doing it.
419
420        The condition number measures how well the constraint matrix is conditioned
421        and can be used to predict whether numerical issues will arise during the
422        solve: the model is declared infeasible whereas it is feasible (or
423        vice-versa), the solution obtained is not optimal or violates some
424        constraints, the resolution is slow because of repeated singularities.
425
426        The rule of thumb to interpret the condition number kappa is:
427          - o kappa <= 1e7: virtually no chance of numerical issues
428          - o 1e7 < kappa <= 1e10: small chance of numerical issues
429          - o 1e10 < kappa <= 1e13: medium chance of numerical issues
430          - o kappa > 1e13: high chance of numerical issues
431
432        The computation of the condition number depends on the quality of the LU
433        decomposition, so it is not very accurate when the matrix is ill
434        conditioned.
435        """
436        return _pywraplp.Solver_ComputeExactConditionNumber(self)
437
438    def NextSolution(self):
439        r"""
440        Some solvers (MIP only, not LP) can produce multiple solutions to the
441        problem. Returns true when another solution is available, and updates the
442        MPVariable* objects to make the new solution queryable. Call only after
443        calling solve.
444
445        The optimality properties of the additional solutions found, and whether or
446        not the solver computes them ahead of time or when NextSolution() is called
447        is solver specific.
448
449        As of 2020-02-10, only Gurobi and SCIP support NextSolution(), see
450        linear_solver_interfaces_test for an example of how to configure these
451        solvers for multiple solutions. Other solvers return false unconditionally.
452        """
453        return _pywraplp.Solver_NextSolution(self)
454
455    def set_time_limit(self, time_limit_milliseconds):
456        return _pywraplp.Solver_set_time_limit(self, time_limit_milliseconds)
457
458    def wall_time(self):
459        r"""Deprecated: Use DurationSinceConstruction() instead."""
460        return _pywraplp.Solver_wall_time(self)
461
462    def LoadModelFromProto(self, input_model):
463        return _pywraplp.Solver_LoadModelFromProto(self, input_model)
464
465    def LoadModelFromProtoKeepNames(self, input_model):
466        return _pywraplp.Solver_LoadModelFromProtoKeepNames(self, input_model)
467
468    def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
469        return _pywraplp.Solver_LoadModelFromProtoWithUniqueNamesOrDie(self, input_model)
470
471    def LoadSolutionFromProto(self, *args):
472        return _pywraplp.Solver_LoadSolutionFromProto(self, *args)
473
474    def ExportModelAsLpFormat(self, obfuscate):
475        return _pywraplp.Solver_ExportModelAsLpFormat(self, obfuscate)
476
477    def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
478        return _pywraplp.Solver_ExportModelAsMpsFormat(self, fixed_format, obfuscate)
479
480    def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
481        return _pywraplp.Solver_WriteModelToMpsFile(self, filename, fixed_format, obfuscate)
482
483    def SetHint(self, variables, values):
484        r"""
485        Set a hint for solution.
486
487        If a feasible or almost-feasible solution to the problem is already known,
488        it may be helpful to pass it to the solver so that it can be used. A
489        solver that supports this feature will try to use this information to
490        create its initial feasible solution.
491
492        Note that it may not always be faster to give a hint like this to the
493        solver. There is also no guarantee that the solver will use this hint or
494        try to return a solution "close" to this assignment in case of multiple
495        optimal solutions.
496        """
497        return _pywraplp.Solver_SetHint(self, variables, values)
498
499    def SetNumThreads(self, num_theads):
500        r"""Sets the number of threads to be used by the solver."""
501        return _pywraplp.Solver_SetNumThreads(self, num_theads)
502
503    def Add(self, constraint, name=''):
504      if isinstance(constraint, bool):
505        if constraint:
506          return self.RowConstraint(0, 0, name)
507        else:
508          return self.RowConstraint(1, 1, name)
509      else:
510        return constraint.Extract(self, name)
511
512    def Sum(self, expr_array):
513      result = SumArray(expr_array)
514      return result
515
516    def RowConstraint(self, *args):
517      return self.Constraint(*args)
518
519    def Minimize(self, expr):
520      objective = self.Objective()
521      objective.Clear()
522      objective.SetMinimization()
523      if isinstance(expr, numbers.Number):
524          objective.SetOffset(expr)
525      else:
526          coeffs = expr.GetCoeffs()
527          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
528          for v, c, in list(coeffs.items()):
529            objective.SetCoefficient(v, float(c))
530
531    def Maximize(self, expr):
532      objective = self.Objective()
533      objective.Clear()
534      objective.SetMaximization()
535      if isinstance(expr, numbers.Number):
536          objective.SetOffset(expr)
537      else:
538          coeffs = expr.GetCoeffs()
539          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
540          for v, c, in list(coeffs.items()):
541            objective.SetCoefficient(v, float(c))
542
543
544    @staticmethod
545    def Infinity():
546        return _pywraplp.Solver_Infinity()
547
548    def SetTimeLimit(self, x):
549        return _pywraplp.Solver_SetTimeLimit(self, x)
550
551    def WallTime(self):
552        return _pywraplp.Solver_WallTime(self)
553
554    def Iterations(self):
555        return _pywraplp.Solver_Iterations(self)

This mathematical programming (MP) solver class is the main class though which users build and solve problems.

Solver(name, problem_type)
 98    def __init__(self, name, problem_type):
 99        r"""Create a solver with the given name and underlying solver backend."""
100        _pywraplp.Solver_swiginit(self, _pywraplp.new_Solver(name, problem_type))

Create a solver with the given name and underlying solver backend.

thisown
80    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

CLP_LINEAR_PROGRAMMING = 0
GLPK_LINEAR_PROGRAMMING = 1
GLOP_LINEAR_PROGRAMMING = 2
PDLP_LINEAR_PROGRAMMING = 8
SCIP_MIXED_INTEGER_PROGRAMMING = 3
GLPK_MIXED_INTEGER_PROGRAMMING = 4
CBC_MIXED_INTEGER_PROGRAMMING = 5
BOP_INTEGER_PROGRAMMING = 12
SAT_INTEGER_PROGRAMMING = 14
GUROBI_LINEAR_PROGRAMMING = 6
GUROBI_MIXED_INTEGER_PROGRAMMING = 7
CPLEX_LINEAR_PROGRAMMING = 10
CPLEX_MIXED_INTEGER_PROGRAMMING = 11
XPRESS_LINEAR_PROGRAMMING = 101
XPRESS_MIXED_INTEGER_PROGRAMMING = 102
@staticmethod
def CreateSolver(solver_id):
103    @staticmethod
104    def CreateSolver(solver_id):
105        r"""
106        Recommended factory method to create a MPSolver instance, especially in
107        non C++ languages.
108
109        It returns a newly created solver instance if successful, or a nullptr
110        otherwise. This can occur if the relevant interface is not linked in, or if
111        a needed license is not accessible for commercial solvers.
112
113        Ownership of the solver is passed on to the caller of this method.
114        It will accept both string names of the OptimizationProblemType enum, as
115        well as a short version (i.e. "SCIP_MIXED_INTEGER_PROGRAMMING" or "SCIP").
116
117        solver_id is case insensitive, and the following names are supported:
118          - CLP_LINEAR_PROGRAMMING or CLP
119          - CBC_MIXED_INTEGER_PROGRAMMING or CBC
120          - GLOP_LINEAR_PROGRAMMING or GLOP
121          - BOP_INTEGER_PROGRAMMING or BOP
122          - SAT_INTEGER_PROGRAMMING or SAT or CP_SAT
123          - SCIP_MIXED_INTEGER_PROGRAMMING or SCIP
124          - GUROBI_LINEAR_PROGRAMMING or GUROBI_LP
125          - GUROBI_MIXED_INTEGER_PROGRAMMING or GUROBI or GUROBI_MIP
126          - CPLEX_LINEAR_PROGRAMMING or CPLEX_LP
127          - CPLEX_MIXED_INTEGER_PROGRAMMING or CPLEX or CPLEX_MIP
128          - XPRESS_LINEAR_PROGRAMMING or XPRESS_LP
129          - XPRESS_MIXED_INTEGER_PROGRAMMING or XPRESS or XPRESS_MIP
130          - GLPK_LINEAR_PROGRAMMING or GLPK_LP
131          - GLPK_MIXED_INTEGER_PROGRAMMING or GLPK or GLPK_MIP
132        """
133        return _pywraplp.Solver_CreateSolver(solver_id)

Recommended factory method to create a MPSolver instance, especially in non C++ languages.

It returns a newly created solver instance if successful, or a nullptr otherwise. This can occur if the relevant interface is not linked in, or if a needed license is not accessible for commercial solvers.

Ownership of the solver is passed on to the caller of this method. It will accept both string names of the OptimizationProblemType enum, as well as a short version (i.e. "SCIP_MIXED_INTEGER_PROGRAMMING" or "SCIP").

solver_id is case insensitive, and the following names are supported:

  • CLP_LINEAR_PROGRAMMING or CLP
  • CBC_MIXED_INTEGER_PROGRAMMING or CBC
  • GLOP_LINEAR_PROGRAMMING or GLOP
  • BOP_INTEGER_PROGRAMMING or BOP
  • SAT_INTEGER_PROGRAMMING or SAT or CP_SAT
  • SCIP_MIXED_INTEGER_PROGRAMMING or SCIP
  • GUROBI_LINEAR_PROGRAMMING or GUROBI_LP
  • GUROBI_MIXED_INTEGER_PROGRAMMING or GUROBI or GUROBI_MIP
  • CPLEX_LINEAR_PROGRAMMING or CPLEX_LP
  • CPLEX_MIXED_INTEGER_PROGRAMMING or CPLEX or CPLEX_MIP
  • XPRESS_LINEAR_PROGRAMMING or XPRESS_LP
  • XPRESS_MIXED_INTEGER_PROGRAMMING or XPRESS or XPRESS_MIP
  • GLPK_LINEAR_PROGRAMMING or GLPK_LP
  • GLPK_MIXED_INTEGER_PROGRAMMING or GLPK or GLPK_MIP
@staticmethod
def SupportsProblemType(problem_type):
135    @staticmethod
136    def SupportsProblemType(problem_type):
137        r"""
138        Whether the given problem type is supported (this will depend on the
139        targets that you linked).
140        """
141        return _pywraplp.Solver_SupportsProblemType(problem_type)

Whether the given problem type is supported (this will depend on the targets that you linked).

def IsMip(self):
143    def IsMip(self):
144        return _pywraplp.Solver_IsMip(self)
def Clear(self):
146    def Clear(self):
147        r"""
148        Clears the objective (including the optimization direction), all variables
149        and constraints. All the other properties of the MPSolver (like the time
150        limit) are kept untouched.
151        """
152        return _pywraplp.Solver_Clear(self)

Clears the objective (including the optimization direction), all variables and constraints. All the other properties of the MPSolver (like the time limit) are kept untouched.

def NumVariables(self):
154    def NumVariables(self):
155        r"""Returns the number of variables."""
156        return _pywraplp.Solver_NumVariables(self)

Returns the number of variables.

def variables(self):
158    def variables(self):
159        r"""
160        Returns the array of variables handled by the MPSolver. (They are listed in
161        the order in which they were created.)
162        """
163        return _pywraplp.Solver_variables(self)

Returns the array of variables handled by the MPSolver. (They are listed in the order in which they were created.)

def variable(self, index):
165    def variable(self, index):
166        r"""Returns the variable at position index."""
167        return _pywraplp.Solver_variable(self, index)

Returns the variable at position index.

def LookupVariable(self, var_name):
169    def LookupVariable(self, var_name):
170        r"""
171        Looks up a variable by name, and returns nullptr if it does not exist. The
172        first call has a O(n) complexity, as the variable name index is lazily
173        created upon first use. Will crash if variable names are not unique.
174        """
175        return _pywraplp.Solver_LookupVariable(self, var_name)

Looks up a variable by name, and returns nullptr if it does not exist. The first call has a O(n) complexity, as the variable name index is lazily created upon first use. Will crash if variable names are not unique.

def Var(self, lb, ub, integer, name):
177    def Var(self, lb, ub, integer, name):
178        r"""
179        Creates a variable with the given bounds, integrality requirement and
180        name. Bounds can be finite or +/- MPSolver::infinity(). The MPSolver owns
181        the variable (i.e. the returned pointer is borrowed). Variable names are
182        optional. If you give an empty name, name() will auto-generate one for you
183        upon request.
184        """
185        return _pywraplp.Solver_Var(self, lb, ub, integer, name)

Creates a variable with the given bounds, integrality requirement and name. Bounds can be finite or +/- MPSolver::infinity(). The MPSolver owns the variable (i.e. the returned pointer is borrowed). Variable names are optional. If you give an empty name, name() will auto-generate one for you upon request.

def NumVar(self, lb, ub, name):
187    def NumVar(self, lb, ub, name):
188        r"""Creates a continuous variable."""
189        return _pywraplp.Solver_NumVar(self, lb, ub, name)

Creates a continuous variable.

def IntVar(self, lb, ub, name):
191    def IntVar(self, lb, ub, name):
192        r"""Creates an integer variable."""
193        return _pywraplp.Solver_IntVar(self, lb, ub, name)

Creates an integer variable.

def BoolVar(self, name):
195    def BoolVar(self, name):
196        r"""Creates a boolean variable."""
197        return _pywraplp.Solver_BoolVar(self, name)

Creates a boolean variable.

def NumConstraints(self):
199    def NumConstraints(self):
200        r"""Returns the number of constraints."""
201        return _pywraplp.Solver_NumConstraints(self)

Returns the number of constraints.

def constraints(self):
203    def constraints(self):
204        r"""
205        Returns the array of constraints handled by the MPSolver.
206
207        They are listed in the order in which they were created.
208        """
209        return _pywraplp.Solver_constraints(self)

Returns the array of constraints handled by the MPSolver.

They are listed in the order in which they were created.

def constraint(self, index):
211    def constraint(self, index):
212        r"""Returns the constraint at the given index."""
213        return _pywraplp.Solver_constraint(self, index)

Returns the constraint at the given index.

def LookupConstraint(self, constraint_name):
215    def LookupConstraint(self, constraint_name):
216        r"""
217         Looks up a constraint by name, and returns nullptr if it does not exist.
218
219        The first call has a O(n) complexity, as the constraint name index is
220        lazily created upon first use. Will crash if constraint names are not
221        unique.
222        """
223        return _pywraplp.Solver_LookupConstraint(self, constraint_name)

Looks up a constraint by name, and returns nullptr if it does not exist.

The first call has a O(n) complexity, as the constraint name index is lazily created upon first use. Will crash if constraint names are not unique.

def Constraint(self, *args):
225    def Constraint(self, *args):
226        r"""
227        *Overload 1:*
228
229        Creates a linear constraint with given bounds.
230
231        Bounds can be finite or +/- MPSolver::infinity(). The MPSolver class
232        assumes ownership of the constraint.
233
234        :rtype: :py:class:`MPConstraint`
235        :return: a pointer to the newly created constraint.
236
237        |
238
239        *Overload 2:*
240         Creates a constraint with -infinity and +infinity bounds.
241
242        |
243
244        *Overload 3:*
245         Creates a named constraint with given bounds.
246
247        |
248
249        *Overload 4:*
250         Creates a named constraint with -infinity and +infinity bounds.
251        """
252        return _pywraplp.Solver_Constraint(self, *args)

Overload 1:

Creates a linear constraint with given bounds.

Bounds can be finite or +/- MPSolver::infinity(). The MPSolver class assumes ownership of the constraint.

Returns

a pointer to the newly created constraint.

|

Overload 2: Creates a constraint with -infinity and +infinity bounds.

|

Overload 3: Creates a named constraint with given bounds.

|

Overload 4: Creates a named constraint with -infinity and +infinity bounds.

def Objective(self):
254    def Objective(self):
255        r"""Returns the mutable objective object."""
256        return _pywraplp.Solver_Objective(self)

Returns the mutable objective object.

OPTIMAL = 0

optimal.

FEASIBLE = 1

feasible, or stopped by limit.

INFEASIBLE = 2

proven infeasible.

UNBOUNDED = 3

proven unbounded.

ABNORMAL = 4

abnormal, i.e., error of some kind.

MODEL_INVALID = 5

the model is trivially invalid (NaN coefficients, etc).

NOT_SOLVED = 6

not been solved yet.

def Solve(self, *args):
272    def Solve(self, *args):
273        r"""
274        *Overload 1:*
275        Solves the problem using the default parameter values.
276
277        |
278
279        *Overload 2:*
280        Solves the problem using the specified parameter values.
281        """
282        return _pywraplp.Solver_Solve(self, *args)

Overload 1: Solves the problem using the default parameter values.

|

Overload 2: Solves the problem using the specified parameter values.

def Write(self, file_name):
284    def Write(self, file_name):
285        r"""
286        Writes the model using the solver internal write function.  Currently only
287        available for Gurobi.
288        """
289        return _pywraplp.Solver_Write(self, file_name)

Writes the model using the solver internal write function. Currently only available for Gurobi.

def ComputeConstraintActivities(self):
291    def ComputeConstraintActivities(self):
292        r"""
293        Advanced usage: compute the "activities" of all constraints, which are the
294        sums of their linear terms. The activities are returned in the same order
295        as constraints(), which is the order in which constraints were added; but
296        you can also use MPConstraint::index() to get a constraint's index.
297        """
298        return _pywraplp.Solver_ComputeConstraintActivities(self)

Advanced usage: compute the "activities" of all constraints, which are the sums of their linear terms. The activities are returned in the same order as constraints(), which is the order in which constraints were added; but you can also use MPConstraint::index() to get a constraint's index.

def VerifySolution(self, tolerance, log_errors):
300    def VerifySolution(self, tolerance, log_errors):
301        r"""
302        Advanced usage: Verifies the *correctness* of the solution.
303
304        It verifies that all variables must be within their domains, all
305        constraints must be satisfied, and the reported objective value must be
306        accurate.
307
308        Usage:
309        - This can only be called after Solve() was called.
310        - "tolerance" is interpreted as an absolute error threshold.
311        - For the objective value only, if the absolute error is too large,
312          the tolerance is interpreted as a relative error threshold instead.
313        - If "log_errors" is true, every single violation will be logged.
314        - If "tolerance" is negative, it will be set to infinity().
315
316        Most users should just set the --verify_solution flag and not bother using
317        this method directly.
318        """
319        return _pywraplp.Solver_VerifySolution(self, tolerance, log_errors)

Advanced usage: Verifies the correctness of the solution.

It verifies that all variables must be within their domains, all constraints must be satisfied, and the reported objective value must be accurate.

Usage:

  • This can only be called after Solve() was called.
  • "tolerance" is interpreted as an absolute error threshold.
  • For the objective value only, if the absolute error is too large, the tolerance is interpreted as a relative error threshold instead.
  • If "log_errors" is true, every single violation will be logged.
  • If "tolerance" is negative, it will be set to infinity().

Most users should just set the --verify_solution flag and not bother using this method directly.

def InterruptSolve(self):
321    def InterruptSolve(self):
322        r"""
323         Interrupts the Solve() execution to terminate processing if possible.
324
325        If the underlying interface supports interruption; it does that and returns
326        true regardless of whether there's an ongoing Solve() or not. The Solve()
327        call may still linger for a while depending on the conditions.  If
328        interruption is not supported; returns false and does nothing.
329        MPSolver::SolverTypeSupportsInterruption can be used to check if
330        interruption is supported for a given solver type.
331        """
332        return _pywraplp.Solver_InterruptSolve(self)

Interrupts the Solve() execution to terminate processing if possible.

If the underlying interface supports interruption; it does that and returns true regardless of whether there's an ongoing Solve() or not. The Solve() call may still linger for a while depending on the conditions. If interruption is not supported; returns false and does nothing. MPSolver::SolverTypeSupportsInterruption can be used to check if interruption is supported for a given solver type.

def FillSolutionResponseProto(self, response):
334    def FillSolutionResponseProto(self, response):
335        r"""Encodes the current solution in a solution response protocol buffer."""
336        return _pywraplp.Solver_FillSolutionResponseProto(self, response)

Encodes the current solution in a solution response protocol buffer.

@staticmethod
def SolveWithProto(model_request, response, interrupt=None):
338    @staticmethod
339    def SolveWithProto(model_request, response, interrupt=None):
340        r"""
341        Solves the model encoded by a MPModelRequest protocol buffer and fills the
342        solution encoded as a MPSolutionResponse. The solve is stopped prematurely
343        if interrupt is non-null at set to true during (or before) solving.
344        Interruption is only supported if SolverTypeSupportsInterruption() returns
345        true for the requested solver. Passing a non-null interruption with any
346        other solver type immediately returns an MPSOLVER_INCOMPATIBLE_OPTIONS
347        error.
348
349        `interrupt` is non-const because the internal solver may set it to true
350        itself, in some cases.
351
352        Note(user): This attempts to first use `DirectlySolveProto()` (if
353        implemented). Consequently, this most likely does *not* override any of
354        the default parameters of the underlying solver. This behavior *differs*
355        from `MPSolver::Solve()` which by default sets the feasibility tolerance
356        and the gap limit (as of 2020/02/11, to 1e-7 and 0.0001, respectively).
357        """
358        return _pywraplp.Solver_SolveWithProto(model_request, response, interrupt)

Solves the model encoded by a MPModelRequest protocol buffer and fills the solution encoded as a MPSolutionResponse. The solve is stopped prematurely if interrupt is non-null at set to true during (or before) solving. Interruption is only supported if SolverTypeSupportsInterruption() returns true for the requested solver. Passing a non-null interruption with any other solver type immediately returns an MPSOLVER_INCOMPATIBLE_OPTIONS error.

interrupt is non-const because the internal solver may set it to true itself, in some cases.

Note(user): This attempts to first use DirectlySolveProto() (if implemented). Consequently, this most likely does not override any of the default parameters of the underlying solver. This behavior differs from MPSolver::Solve() which by default sets the feasibility tolerance and the gap limit (as of 2020/02/11, to 1e-7 and 0.0001, respectively).

def ExportModelToProto(self, output_model):
360    def ExportModelToProto(self, output_model):
361        r"""Exports model to protocol buffer."""
362        return _pywraplp.Solver_ExportModelToProto(self, output_model)

Exports model to protocol buffer.

def SetSolverSpecificParametersAsString(self, parameters):
364    def SetSolverSpecificParametersAsString(self, parameters):
365        r"""
366        Advanced usage: pass solver specific parameters in text format.
367
368        The format is solver-specific and is the same as the corresponding solver
369        configuration file format. Returns true if the operation was successful.
370        """
371        return _pywraplp.Solver_SetSolverSpecificParametersAsString(self, parameters)

Advanced usage: pass solver specific parameters in text format.

The format is solver-specific and is the same as the corresponding solver configuration file format. Returns true if the operation was successful.

FREE = 0
AT_LOWER_BOUND = 1
AT_UPPER_BOUND = 2
FIXED_VALUE = 3
BASIC = 4
@staticmethod
def infinity():
378    @staticmethod
379    def infinity():
380        r"""
381        Infinity.
382
383        You can use -MPSolver::infinity() for negative infinity.
384        """
385        return _pywraplp.Solver_infinity()

Infinity.

You can use -MPSolver::infinity() for negative infinity.

def EnableOutput(self):
387    def EnableOutput(self):
388        r"""Enables solver logging."""
389        return _pywraplp.Solver_EnableOutput(self)

Enables solver logging.

def SuppressOutput(self):
391    def SuppressOutput(self):
392        r"""Suppresses solver logging."""
393        return _pywraplp.Solver_SuppressOutput(self)

Suppresses solver logging.

def iterations(self):
395    def iterations(self):
396        r"""Returns the number of simplex iterations."""
397        return _pywraplp.Solver_iterations(self)

Returns the number of simplex iterations.

def nodes(self):
399    def nodes(self):
400        r"""
401        Returns the number of branch-and-bound nodes evaluated during the solve.
402
403        Only available for discrete problems.
404        """
405        return _pywraplp.Solver_nodes(self)

Returns the number of branch-and-bound nodes evaluated during the solve.

Only available for discrete problems.

def SolverVersion(self):
407    def SolverVersion(self):
408        r"""Returns a string describing the underlying solver and its version."""
409        return _pywraplp.Solver_SolverVersion(self)

Returns a string describing the underlying solver and its version.

def ComputeExactConditionNumber(self):
411    def ComputeExactConditionNumber(self):
412        r"""
413         Advanced usage: computes the exact condition number of the current scaled
414        basis: L1norm(B) * L1norm(inverse(B)), where B is the scaled basis.
415
416        This method requires that a basis exists: it should be called after Solve.
417        It is only available for continuous problems. It is implemented for GLPK
418        but not CLP because CLP does not provide the API for doing it.
419
420        The condition number measures how well the constraint matrix is conditioned
421        and can be used to predict whether numerical issues will arise during the
422        solve: the model is declared infeasible whereas it is feasible (or
423        vice-versa), the solution obtained is not optimal or violates some
424        constraints, the resolution is slow because of repeated singularities.
425
426        The rule of thumb to interpret the condition number kappa is:
427          - o kappa <= 1e7: virtually no chance of numerical issues
428          - o 1e7 < kappa <= 1e10: small chance of numerical issues
429          - o 1e10 < kappa <= 1e13: medium chance of numerical issues
430          - o kappa > 1e13: high chance of numerical issues
431
432        The computation of the condition number depends on the quality of the LU
433        decomposition, so it is not very accurate when the matrix is ill
434        conditioned.
435        """
436        return _pywraplp.Solver_ComputeExactConditionNumber(self)

Advanced usage: computes the exact condition number of the current scaled basis: L1norm(B) * L1norm(inverse(B)), where B is the scaled basis.

This method requires that a basis exists: it should be called after Solve. It is only available for continuous problems. It is implemented for GLPK but not CLP because CLP does not provide the API for doing it.

The condition number measures how well the constraint matrix is conditioned and can be used to predict whether numerical issues will arise during the solve: the model is declared infeasible whereas it is feasible (or vice-versa), the solution obtained is not optimal or violates some constraints, the resolution is slow because of repeated singularities.

The rule of thumb to interpret the condition number kappa is:
  • o kappa <= 1e7: virtually no chance of numerical issues
  • o 1e7 < kappa <= 1e10: small chance of numerical issues
  • o 1e10 < kappa <= 1e13: medium chance of numerical issues
  • o kappa > 1e13: high chance of numerical issues

The computation of the condition number depends on the quality of the LU decomposition, so it is not very accurate when the matrix is ill conditioned.

def NextSolution(self):
438    def NextSolution(self):
439        r"""
440        Some solvers (MIP only, not LP) can produce multiple solutions to the
441        problem. Returns true when another solution is available, and updates the
442        MPVariable* objects to make the new solution queryable. Call only after
443        calling solve.
444
445        The optimality properties of the additional solutions found, and whether or
446        not the solver computes them ahead of time or when NextSolution() is called
447        is solver specific.
448
449        As of 2020-02-10, only Gurobi and SCIP support NextSolution(), see
450        linear_solver_interfaces_test for an example of how to configure these
451        solvers for multiple solutions. Other solvers return false unconditionally.
452        """
453        return _pywraplp.Solver_NextSolution(self)

Some solvers (MIP only, not LP) can produce multiple solutions to the problem. Returns true when another solution is available, and updates the MPVariable* objects to make the new solution queryable. Call only after calling solve.

The optimality properties of the additional solutions found, and whether or not the solver computes them ahead of time or when NextSolution() is called is solver specific.

As of 2020-02-10, only Gurobi and SCIP support NextSolution(), see linear_solver_interfaces_test for an example of how to configure these solvers for multiple solutions. Other solvers return false unconditionally.

def set_time_limit(self, time_limit_milliseconds):
455    def set_time_limit(self, time_limit_milliseconds):
456        return _pywraplp.Solver_set_time_limit(self, time_limit_milliseconds)
def wall_time(self):
458    def wall_time(self):
459        r"""Deprecated: Use DurationSinceConstruction() instead."""
460        return _pywraplp.Solver_wall_time(self)

Deprecated: Use DurationSinceConstruction() instead.

def LoadModelFromProto(self, input_model):
462    def LoadModelFromProto(self, input_model):
463        return _pywraplp.Solver_LoadModelFromProto(self, input_model)
def LoadModelFromProtoKeepNames(self, input_model):
465    def LoadModelFromProtoKeepNames(self, input_model):
466        return _pywraplp.Solver_LoadModelFromProtoKeepNames(self, input_model)
def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
468    def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
469        return _pywraplp.Solver_LoadModelFromProtoWithUniqueNamesOrDie(self, input_model)
def LoadSolutionFromProto(self, *args):
471    def LoadSolutionFromProto(self, *args):
472        return _pywraplp.Solver_LoadSolutionFromProto(self, *args)
def ExportModelAsLpFormat(self, obfuscate):
474    def ExportModelAsLpFormat(self, obfuscate):
475        return _pywraplp.Solver_ExportModelAsLpFormat(self, obfuscate)
def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
477    def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
478        return _pywraplp.Solver_ExportModelAsMpsFormat(self, fixed_format, obfuscate)
def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
480    def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
481        return _pywraplp.Solver_WriteModelToMpsFile(self, filename, fixed_format, obfuscate)
def SetHint(self, variables, values):
483    def SetHint(self, variables, values):
484        r"""
485        Set a hint for solution.
486
487        If a feasible or almost-feasible solution to the problem is already known,
488        it may be helpful to pass it to the solver so that it can be used. A
489        solver that supports this feature will try to use this information to
490        create its initial feasible solution.
491
492        Note that it may not always be faster to give a hint like this to the
493        solver. There is also no guarantee that the solver will use this hint or
494        try to return a solution "close" to this assignment in case of multiple
495        optimal solutions.
496        """
497        return _pywraplp.Solver_SetHint(self, variables, values)

Set a hint for solution.

If a feasible or almost-feasible solution to the problem is already known, it may be helpful to pass it to the solver so that it can be used. A solver that supports this feature will try to use this information to create its initial feasible solution.

Note that it may not always be faster to give a hint like this to the solver. There is also no guarantee that the solver will use this hint or try to return a solution "close" to this assignment in case of multiple optimal solutions.

def SetNumThreads(self, num_theads):
499    def SetNumThreads(self, num_theads):
500        r"""Sets the number of threads to be used by the solver."""
501        return _pywraplp.Solver_SetNumThreads(self, num_theads)

Sets the number of threads to be used by the solver.

def Add(self, constraint, name=''):
503    def Add(self, constraint, name=''):
504      if isinstance(constraint, bool):
505        if constraint:
506          return self.RowConstraint(0, 0, name)
507        else:
508          return self.RowConstraint(1, 1, name)
509      else:
510        return constraint.Extract(self, name)
def Sum(self, expr_array):
512    def Sum(self, expr_array):
513      result = SumArray(expr_array)
514      return result
def RowConstraint(self, *args):
516    def RowConstraint(self, *args):
517      return self.Constraint(*args)
def Minimize(self, expr):
519    def Minimize(self, expr):
520      objective = self.Objective()
521      objective.Clear()
522      objective.SetMinimization()
523      if isinstance(expr, numbers.Number):
524          objective.SetOffset(expr)
525      else:
526          coeffs = expr.GetCoeffs()
527          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
528          for v, c, in list(coeffs.items()):
529            objective.SetCoefficient(v, float(c))
def Maximize(self, expr):
531    def Maximize(self, expr):
532      objective = self.Objective()
533      objective.Clear()
534      objective.SetMaximization()
535      if isinstance(expr, numbers.Number):
536          objective.SetOffset(expr)
537      else:
538          coeffs = expr.GetCoeffs()
539          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
540          for v, c, in list(coeffs.items()):
541            objective.SetCoefficient(v, float(c))
@staticmethod
def Infinity():
544    @staticmethod
545    def Infinity():
546        return _pywraplp.Solver_Infinity()
def SetTimeLimit(self, x):
548    def SetTimeLimit(self, x):
549        return _pywraplp.Solver_SetTimeLimit(self, x)
def WallTime(self):
551    def WallTime(self):
552        return _pywraplp.Solver_WallTime(self)
def Iterations(self):
554    def Iterations(self):
555        return _pywraplp.Solver_Iterations(self)
class Objective:
562class Objective(object):
563    r"""A class to express a linear objective."""
564
565    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
566
567    def __init__(self, *args, **kwargs):
568        raise AttributeError("No constructor defined")
569    __repr__ = _swig_repr
570
571    def Clear(self):
572        r"""
573         Clears the offset, all variables and coefficients, and the optimization
574        direction.
575        """
576        return _pywraplp.Objective_Clear(self)
577
578    def SetCoefficient(self, var, coeff):
579        r"""
580        Sets the coefficient of the variable in the objective.
581
582        If the variable does not belong to the solver, the function just returns,
583        or crashes in non-opt mode.
584        """
585        return _pywraplp.Objective_SetCoefficient(self, var, coeff)
586
587    def GetCoefficient(self, var):
588        r"""
589         Gets the coefficient of a given variable in the objective
590
591        It returns 0 if the variable does not appear in the objective).
592        """
593        return _pywraplp.Objective_GetCoefficient(self, var)
594
595    def SetOffset(self, value):
596        r"""Sets the constant term in the objective."""
597        return _pywraplp.Objective_SetOffset(self, value)
598
599    def offset(self):
600        r"""Gets the constant term in the objective."""
601        return _pywraplp.Objective_offset(self)
602
603    def SetOptimizationDirection(self, maximize):
604        r"""Sets the optimization direction (maximize: true or minimize: false)."""
605        return _pywraplp.Objective_SetOptimizationDirection(self, maximize)
606
607    def SetMinimization(self):
608        r"""Sets the optimization direction to minimize."""
609        return _pywraplp.Objective_SetMinimization(self)
610
611    def SetMaximization(self):
612        r"""Sets the optimization direction to maximize."""
613        return _pywraplp.Objective_SetMaximization(self)
614
615    def maximization(self):
616        r"""Is the optimization direction set to maximize?"""
617        return _pywraplp.Objective_maximization(self)
618
619    def minimization(self):
620        r"""Is the optimization direction set to minimize?"""
621        return _pywraplp.Objective_minimization(self)
622
623    def Value(self):
624        r"""
625        Returns the objective value of the best solution found so far.
626
627        It is the optimal objective value if the problem has been solved to
628        optimality.
629
630        Note: the objective value may be slightly different than what you could
631        compute yourself using ``MPVariable::solution_value();`` please use the
632        --verify_solution flag to gain confidence about the numerical stability of
633        your solution.
634        """
635        return _pywraplp.Objective_Value(self)
636
637    def BestBound(self):
638        r"""
639        Returns the best objective bound.
640
641        In case of minimization, it is a lower bound on the objective value of the
642        optimal integer solution. Only available for discrete problems.
643        """
644        return _pywraplp.Objective_BestBound(self)
645
646    def Offset(self):
647        return _pywraplp.Objective_Offset(self)
648    __swig_destroy__ = _pywraplp.delete_Objective

A class to express a linear objective.

Objective(*args, **kwargs)
567    def __init__(self, *args, **kwargs):
568        raise AttributeError("No constructor defined")
thisown
565    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

def Clear(self):
571    def Clear(self):
572        r"""
573         Clears the offset, all variables and coefficients, and the optimization
574        direction.
575        """
576        return _pywraplp.Objective_Clear(self)

Clears the offset, all variables and coefficients, and the optimization direction.

def SetCoefficient(self, var, coeff):
578    def SetCoefficient(self, var, coeff):
579        r"""
580        Sets the coefficient of the variable in the objective.
581
582        If the variable does not belong to the solver, the function just returns,
583        or crashes in non-opt mode.
584        """
585        return _pywraplp.Objective_SetCoefficient(self, var, coeff)

Sets the coefficient of the variable in the objective.

If the variable does not belong to the solver, the function just returns, or crashes in non-opt mode.

def GetCoefficient(self, var):
587    def GetCoefficient(self, var):
588        r"""
589         Gets the coefficient of a given variable in the objective
590
591        It returns 0 if the variable does not appear in the objective).
592        """
593        return _pywraplp.Objective_GetCoefficient(self, var)

Gets the coefficient of a given variable in the objective

It returns 0 if the variable does not appear in the objective).

def SetOffset(self, value):
595    def SetOffset(self, value):
596        r"""Sets the constant term in the objective."""
597        return _pywraplp.Objective_SetOffset(self, value)

Sets the constant term in the objective.

def offset(self):
599    def offset(self):
600        r"""Gets the constant term in the objective."""
601        return _pywraplp.Objective_offset(self)

Gets the constant term in the objective.

def SetOptimizationDirection(self, maximize):
603    def SetOptimizationDirection(self, maximize):
604        r"""Sets the optimization direction (maximize: true or minimize: false)."""
605        return _pywraplp.Objective_SetOptimizationDirection(self, maximize)

Sets the optimization direction (maximize: true or minimize: false).

def SetMinimization(self):
607    def SetMinimization(self):
608        r"""Sets the optimization direction to minimize."""
609        return _pywraplp.Objective_SetMinimization(self)

Sets the optimization direction to minimize.

def SetMaximization(self):
611    def SetMaximization(self):
612        r"""Sets the optimization direction to maximize."""
613        return _pywraplp.Objective_SetMaximization(self)

Sets the optimization direction to maximize.

def maximization(self):
615    def maximization(self):
616        r"""Is the optimization direction set to maximize?"""
617        return _pywraplp.Objective_maximization(self)

Is the optimization direction set to maximize?

def minimization(self):
619    def minimization(self):
620        r"""Is the optimization direction set to minimize?"""
621        return _pywraplp.Objective_minimization(self)

Is the optimization direction set to minimize?

def Value(self):
623    def Value(self):
624        r"""
625        Returns the objective value of the best solution found so far.
626
627        It is the optimal objective value if the problem has been solved to
628        optimality.
629
630        Note: the objective value may be slightly different than what you could
631        compute yourself using ``MPVariable::solution_value();`` please use the
632        --verify_solution flag to gain confidence about the numerical stability of
633        your solution.
634        """
635        return _pywraplp.Objective_Value(self)

Returns the objective value of the best solution found so far.

It is the optimal objective value if the problem has been solved to optimality.

Note: the objective value may be slightly different than what you could compute yourself using MPVariable::solution_value(); please use the --verify_solution flag to gain confidence about the numerical stability of your solution.

def BestBound(self):
637    def BestBound(self):
638        r"""
639        Returns the best objective bound.
640
641        In case of minimization, it is a lower bound on the objective value of the
642        optimal integer solution. Only available for discrete problems.
643        """
644        return _pywraplp.Objective_BestBound(self)

Returns the best objective bound.

In case of minimization, it is a lower bound on the objective value of the optimal integer solution. Only available for discrete problems.

def Offset(self):
646    def Offset(self):
647        return _pywraplp.Objective_Offset(self)
class Variable:
652class Variable(object):
653    r"""The class for variables of a Mathematical Programming (MP) model."""
654
655    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
656
657    def __init__(self, *args, **kwargs):
658        raise AttributeError("No constructor defined")
659
660    def name(self):
661        r"""Returns the name of the variable."""
662        return _pywraplp.Variable_name(self)
663
664    def SetInteger(self, integer):
665        r"""Sets the integrality requirement of the variable."""
666        return _pywraplp.Variable_SetInteger(self, integer)
667
668    def integer(self):
669        r"""Returns the integrality requirement of the variable."""
670        return _pywraplp.Variable_integer(self)
671
672    def solution_value(self):
673        r"""
674        Returns the value of the variable in the current solution.
675
676        If the variable is integer, then the value will always be an integer (the
677        underlying solver handles floating-point values only, but this function
678        automatically rounds it to the nearest integer; see: man 3 round).
679        """
680        return _pywraplp.Variable_solution_value(self)
681
682    def index(self):
683        r"""Returns the index of the variable in the MPSolver::variables_."""
684        return _pywraplp.Variable_index(self)
685
686    def lb(self):
687        r"""Returns the lower bound."""
688        return _pywraplp.Variable_lb(self)
689
690    def ub(self):
691        r"""Returns the upper bound."""
692        return _pywraplp.Variable_ub(self)
693
694    def SetBounds(self, lb, ub):
695        r"""Sets both the lower and upper bounds."""
696        return _pywraplp.Variable_SetBounds(self, lb, ub)
697
698    def reduced_cost(self):
699        r"""
700        Advanced usage: returns the reduced cost of the variable in the current
701        solution (only available for continuous problems).
702        """
703        return _pywraplp.Variable_reduced_cost(self)
704
705    def basis_status(self):
706        r"""
707        Advanced usage: returns the basis status of the variable in the current
708        solution (only available for continuous problems).
709
710        See also: MPSolver::BasisStatus.
711        """
712        return _pywraplp.Variable_basis_status(self)
713
714    def branching_priority(self):
715        r"""
716        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
717        a per-variable priority for determining which variable to branch on.
718
719        A value of 0 is treated as default, and is equivalent to not setting the
720        branching priority. The solver looks first to branch on fractional
721        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
722        support setting branching priority; all other solvers will simply ignore
723        this annotation.
724        """
725        return _pywraplp.Variable_branching_priority(self)
726
727    def SetBranchingPriority(self, priority):
728        return _pywraplp.Variable_SetBranchingPriority(self, priority)
729
730    def __str__(self):
731        return _pywraplp.Variable___str__(self)
732
733    def __repr__(self):
734        return _pywraplp.Variable___repr__(self)
735
736    def __getattr__(self, name):
737      return getattr(VariableExpr(self), name)
738
739
740    def SolutionValue(self):
741        return _pywraplp.Variable_SolutionValue(self)
742
743    def Integer(self):
744        return _pywraplp.Variable_Integer(self)
745
746    def Lb(self):
747        return _pywraplp.Variable_Lb(self)
748
749    def Ub(self):
750        return _pywraplp.Variable_Ub(self)
751
752    def SetLb(self, x):
753        return _pywraplp.Variable_SetLb(self, x)
754
755    def SetUb(self, x):
756        return _pywraplp.Variable_SetUb(self, x)
757
758    def ReducedCost(self):
759        return _pywraplp.Variable_ReducedCost(self)
760    __swig_destroy__ = _pywraplp.delete_Variable

The class for variables of a Mathematical Programming (MP) model.

Variable(*args, **kwargs)
657    def __init__(self, *args, **kwargs):
658        raise AttributeError("No constructor defined")
thisown
655    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

def name(self):
660    def name(self):
661        r"""Returns the name of the variable."""
662        return _pywraplp.Variable_name(self)

Returns the name of the variable.

def SetInteger(self, integer):
664    def SetInteger(self, integer):
665        r"""Sets the integrality requirement of the variable."""
666        return _pywraplp.Variable_SetInteger(self, integer)

Sets the integrality requirement of the variable.

def integer(self):
668    def integer(self):
669        r"""Returns the integrality requirement of the variable."""
670        return _pywraplp.Variable_integer(self)

Returns the integrality requirement of the variable.

def solution_value(self):
672    def solution_value(self):
673        r"""
674        Returns the value of the variable in the current solution.
675
676        If the variable is integer, then the value will always be an integer (the
677        underlying solver handles floating-point values only, but this function
678        automatically rounds it to the nearest integer; see: man 3 round).
679        """
680        return _pywraplp.Variable_solution_value(self)

Returns the value of the variable in the current solution.

If the variable is integer, then the value will always be an integer (the underlying solver handles floating-point values only, but this function automatically rounds it to the nearest integer; see: man 3 round).

def index(self):
682    def index(self):
683        r"""Returns the index of the variable in the MPSolver::variables_."""
684        return _pywraplp.Variable_index(self)

Returns the index of the variable in the MPSolver::variables_.

def lb(self):
686    def lb(self):
687        r"""Returns the lower bound."""
688        return _pywraplp.Variable_lb(self)

Returns the lower bound.

def ub(self):
690    def ub(self):
691        r"""Returns the upper bound."""
692        return _pywraplp.Variable_ub(self)

Returns the upper bound.

def SetBounds(self, lb, ub):
694    def SetBounds(self, lb, ub):
695        r"""Sets both the lower and upper bounds."""
696        return _pywraplp.Variable_SetBounds(self, lb, ub)

Sets both the lower and upper bounds.

def reduced_cost(self):
698    def reduced_cost(self):
699        r"""
700        Advanced usage: returns the reduced cost of the variable in the current
701        solution (only available for continuous problems).
702        """
703        return _pywraplp.Variable_reduced_cost(self)

Advanced usage: returns the reduced cost of the variable in the current solution (only available for continuous problems).

def basis_status(self):
705    def basis_status(self):
706        r"""
707        Advanced usage: returns the basis status of the variable in the current
708        solution (only available for continuous problems).
709
710        See also: MPSolver::BasisStatus.
711        """
712        return _pywraplp.Variable_basis_status(self)

Advanced usage: returns the basis status of the variable in the current solution (only available for continuous problems).

See also: MPSolver::BasisStatus.

def branching_priority(self):
714    def branching_priority(self):
715        r"""
716        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
717        a per-variable priority for determining which variable to branch on.
718
719        A value of 0 is treated as default, and is equivalent to not setting the
720        branching priority. The solver looks first to branch on fractional
721        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
722        support setting branching priority; all other solvers will simply ignore
723        this annotation.
724        """
725        return _pywraplp.Variable_branching_priority(self)

Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set a per-variable priority for determining which variable to branch on.

A value of 0 is treated as default, and is equivalent to not setting the branching priority. The solver looks first to branch on fractional variables in higher priority levels. As of 2019-05, only Gurobi and SCIP support setting branching priority; all other solvers will simply ignore this annotation.

def SetBranchingPriority(self, priority):
727    def SetBranchingPriority(self, priority):
728        return _pywraplp.Variable_SetBranchingPriority(self, priority)
def SolutionValue(self):
740    def SolutionValue(self):
741        return _pywraplp.Variable_SolutionValue(self)
def Integer(self):
743    def Integer(self):
744        return _pywraplp.Variable_Integer(self)
def Lb(self):
746    def Lb(self):
747        return _pywraplp.Variable_Lb(self)
def Ub(self):
749    def Ub(self):
750        return _pywraplp.Variable_Ub(self)
def SetLb(self, x):
752    def SetLb(self, x):
753        return _pywraplp.Variable_SetLb(self, x)
def SetUb(self, x):
755    def SetUb(self, x):
756        return _pywraplp.Variable_SetUb(self, x)
def ReducedCost(self):
758    def ReducedCost(self):
759        return _pywraplp.Variable_ReducedCost(self)
class Constraint:
764class Constraint(object):
765    r"""
766    The class for constraints of a Mathematical Programming (MP) model.
767
768    A constraint is represented as a linear equation or inequality.
769    """
770
771    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
772
773    def __init__(self, *args, **kwargs):
774        raise AttributeError("No constructor defined")
775    __repr__ = _swig_repr
776
777    def name(self):
778        r"""Returns the name of the constraint."""
779        return _pywraplp.Constraint_name(self)
780
781    def Clear(self):
782        r"""Clears all variables and coefficients. Does not clear the bounds."""
783        return _pywraplp.Constraint_Clear(self)
784
785    def SetCoefficient(self, var, coeff):
786        r"""
787        Sets the coefficient of the variable on the constraint.
788
789        If the variable does not belong to the solver, the function just returns,
790        or crashes in non-opt mode.
791        """
792        return _pywraplp.Constraint_SetCoefficient(self, var, coeff)
793
794    def GetCoefficient(self, var):
795        r"""
796        Gets the coefficient of a given variable on the constraint (which is 0 if
797        the variable does not appear in the constraint).
798        """
799        return _pywraplp.Constraint_GetCoefficient(self, var)
800
801    def lb(self):
802        r"""Returns the lower bound."""
803        return _pywraplp.Constraint_lb(self)
804
805    def ub(self):
806        r"""Returns the upper bound."""
807        return _pywraplp.Constraint_ub(self)
808
809    def SetBounds(self, lb, ub):
810        r"""Sets both the lower and upper bounds."""
811        return _pywraplp.Constraint_SetBounds(self, lb, ub)
812
813    def set_is_lazy(self, laziness):
814        r"""
815        Advanced usage: sets the constraint "laziness".
816
817        **This is only supported for SCIP and has no effect on other
818        solvers.**
819
820        When **laziness** is true, the constraint is only considered by the Linear
821        Programming solver if its current solution violates the constraint. In this
822        case, the constraint is definitively added to the problem. This may be
823        useful in some MIP problems, and may have a dramatic impact on performance.
824
825        For more info see: http://tinyurl.com/lazy-constraints.
826        """
827        return _pywraplp.Constraint_set_is_lazy(self, laziness)
828
829    def index(self):
830        r"""Returns the index of the constraint in the MPSolver::constraints_."""
831        return _pywraplp.Constraint_index(self)
832
833    def dual_value(self):
834        r"""
835        Advanced usage: returns the dual value of the constraint in the current
836        solution (only available for continuous problems).
837        """
838        return _pywraplp.Constraint_dual_value(self)
839
840    def basis_status(self):
841        r"""
842        Advanced usage: returns the basis status of the constraint.
843
844        It is only available for continuous problems).
845
846        Note that if a constraint "linear_expression in [lb, ub]" is transformed
847        into "linear_expression + slack = 0" with slack in [-ub, -lb], then this
848        status is the same as the status of the slack variable with AT_UPPER_BOUND
849        and AT_LOWER_BOUND swapped.
850
851        See also: MPSolver::BasisStatus.
852        """
853        return _pywraplp.Constraint_basis_status(self)
854
855    def Lb(self):
856        return _pywraplp.Constraint_Lb(self)
857
858    def Ub(self):
859        return _pywraplp.Constraint_Ub(self)
860
861    def SetLb(self, x):
862        return _pywraplp.Constraint_SetLb(self, x)
863
864    def SetUb(self, x):
865        return _pywraplp.Constraint_SetUb(self, x)
866
867    def DualValue(self):
868        return _pywraplp.Constraint_DualValue(self)
869    __swig_destroy__ = _pywraplp.delete_Constraint

The class for constraints of a Mathematical Programming (MP) model.

A constraint is represented as a linear equation or inequality.

Constraint(*args, **kwargs)
773    def __init__(self, *args, **kwargs):
774        raise AttributeError("No constructor defined")
thisown
771    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

def name(self):
777    def name(self):
778        r"""Returns the name of the constraint."""
779        return _pywraplp.Constraint_name(self)

Returns the name of the constraint.

def Clear(self):
781    def Clear(self):
782        r"""Clears all variables and coefficients. Does not clear the bounds."""
783        return _pywraplp.Constraint_Clear(self)

Clears all variables and coefficients. Does not clear the bounds.

def SetCoefficient(self, var, coeff):
785    def SetCoefficient(self, var, coeff):
786        r"""
787        Sets the coefficient of the variable on the constraint.
788
789        If the variable does not belong to the solver, the function just returns,
790        or crashes in non-opt mode.
791        """
792        return _pywraplp.Constraint_SetCoefficient(self, var, coeff)

Sets the coefficient of the variable on the constraint.

If the variable does not belong to the solver, the function just returns, or crashes in non-opt mode.

def GetCoefficient(self, var):
794    def GetCoefficient(self, var):
795        r"""
796        Gets the coefficient of a given variable on the constraint (which is 0 if
797        the variable does not appear in the constraint).
798        """
799        return _pywraplp.Constraint_GetCoefficient(self, var)

Gets the coefficient of a given variable on the constraint (which is 0 if the variable does not appear in the constraint).

def lb(self):
801    def lb(self):
802        r"""Returns the lower bound."""
803        return _pywraplp.Constraint_lb(self)

Returns the lower bound.

def ub(self):
805    def ub(self):
806        r"""Returns the upper bound."""
807        return _pywraplp.Constraint_ub(self)

Returns the upper bound.

def SetBounds(self, lb, ub):
809    def SetBounds(self, lb, ub):
810        r"""Sets both the lower and upper bounds."""
811        return _pywraplp.Constraint_SetBounds(self, lb, ub)

Sets both the lower and upper bounds.

def set_is_lazy(self, laziness):
813    def set_is_lazy(self, laziness):
814        r"""
815        Advanced usage: sets the constraint "laziness".
816
817        **This is only supported for SCIP and has no effect on other
818        solvers.**
819
820        When **laziness** is true, the constraint is only considered by the Linear
821        Programming solver if its current solution violates the constraint. In this
822        case, the constraint is definitively added to the problem. This may be
823        useful in some MIP problems, and may have a dramatic impact on performance.
824
825        For more info see: http://tinyurl.com/lazy-constraints.
826        """
827        return _pywraplp.Constraint_set_is_lazy(self, laziness)

Advanced usage: sets the constraint "laziness".

This is only supported for SCIP and has no effect on other solvers.

When laziness is true, the constraint is only considered by the Linear Programming solver if its current solution violates the constraint. In this case, the constraint is definitively added to the problem. This may be useful in some MIP problems, and may have a dramatic impact on performance.

For more info see: http://tinyurl.com/lazy-constraints.

def index(self):
829    def index(self):
830        r"""Returns the index of the constraint in the MPSolver::constraints_."""
831        return _pywraplp.Constraint_index(self)

Returns the index of the constraint in the MPSolver::constraints_.

def dual_value(self):
833    def dual_value(self):
834        r"""
835        Advanced usage: returns the dual value of the constraint in the current
836        solution (only available for continuous problems).
837        """
838        return _pywraplp.Constraint_dual_value(self)

Advanced usage: returns the dual value of the constraint in the current solution (only available for continuous problems).

def basis_status(self):
840    def basis_status(self):
841        r"""
842        Advanced usage: returns the basis status of the constraint.
843
844        It is only available for continuous problems).
845
846        Note that if a constraint "linear_expression in [lb, ub]" is transformed
847        into "linear_expression + slack = 0" with slack in [-ub, -lb], then this
848        status is the same as the status of the slack variable with AT_UPPER_BOUND
849        and AT_LOWER_BOUND swapped.
850
851        See also: MPSolver::BasisStatus.
852        """
853        return _pywraplp.Constraint_basis_status(self)

Advanced usage: returns the basis status of the constraint.

It is only available for continuous problems).

Note that if a constraint "linear_expression in [lb, ub]" is transformed into "linear_expression + slack = 0" with slack in [-ub, -lb], then this status is the same as the status of the slack variable with AT_UPPER_BOUND and AT_LOWER_BOUND swapped.

See also: MPSolver::BasisStatus.

def Lb(self):
855    def Lb(self):
856        return _pywraplp.Constraint_Lb(self)
def Ub(self):
858    def Ub(self):
859        return _pywraplp.Constraint_Ub(self)
def SetLb(self, x):
861    def SetLb(self, x):
862        return _pywraplp.Constraint_SetLb(self, x)
def SetUb(self, x):
864    def SetUb(self, x):
865        return _pywraplp.Constraint_SetUb(self, x)
def DualValue(self):
867    def DualValue(self):
868        return _pywraplp.Constraint_DualValue(self)
class MPSolverParameters:
873class MPSolverParameters(object):
874    r"""
875    This class stores parameter settings for LP and MIP solvers. Some parameters
876    are marked as advanced: do not change their values unless you know what you
877    are doing!
878
879    For developers: how to add a new parameter:
880    - Add the new Foo parameter in the DoubleParam or IntegerParam enum.
881    - If it is a categorical param, add a FooValues enum.
882    - Decide if the wrapper should define a default value for it: yes
883      if it controls the properties of the solution (example:
884      tolerances) or if it consistently improves performance, no
885      otherwise. If yes, define kDefaultFoo.
886    - Add a foo_value_ member and, if no default value is defined, a
887      foo_is_default_ member.
888    - Add code to handle Foo in Set...Param, Reset...Param,
889      Get...Param, Reset and the constructor.
890    - In class MPSolverInterface, add a virtual method SetFoo, add it
891      to SetCommonParameters or SetMIPParameters, and implement it for
892      each solver. Sometimes, parameters need to be implemented
893      differently, see for example the INCREMENTALITY implementation.
894    - Add a test in linear_solver_test.cc.
895
896    TODO(user): store the parameter values in a protocol buffer
897    instead. We need to figure out how to deal with the subtleties of
898    the default values.
899    """
900
901    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
902    __repr__ = _swig_repr
903    RELATIVE_MIP_GAP = _pywraplp.MPSolverParameters_RELATIVE_MIP_GAP
904    r"""Limit for relative MIP gap."""
905    PRIMAL_TOLERANCE = _pywraplp.MPSolverParameters_PRIMAL_TOLERANCE
906    r"""
907    Advanced usage: tolerance for primal feasibility of basic solutions.
908
909    This does not control the integer feasibility tolerance of integer
910    solutions for MIP or the tolerance used during presolve.
911    """
912    DUAL_TOLERANCE = _pywraplp.MPSolverParameters_DUAL_TOLERANCE
913    r"""Advanced usage: tolerance for dual feasibility of basic solutions."""
914    PRESOLVE = _pywraplp.MPSolverParameters_PRESOLVE
915    r"""Advanced usage: presolve mode."""
916    LP_ALGORITHM = _pywraplp.MPSolverParameters_LP_ALGORITHM
917    r"""Algorithm to solve linear programs."""
918    INCREMENTALITY = _pywraplp.MPSolverParameters_INCREMENTALITY
919    r"""Advanced usage: incrementality from one solve to the next."""
920    SCALING = _pywraplp.MPSolverParameters_SCALING
921    r"""Advanced usage: enable or disable matrix scaling."""
922    PRESOLVE_OFF = _pywraplp.MPSolverParameters_PRESOLVE_OFF
923    r"""Presolve is off."""
924    PRESOLVE_ON = _pywraplp.MPSolverParameters_PRESOLVE_ON
925    r"""Presolve is on."""
926    DUAL = _pywraplp.MPSolverParameters_DUAL
927    r"""Dual simplex."""
928    PRIMAL = _pywraplp.MPSolverParameters_PRIMAL
929    r"""Primal simplex."""
930    BARRIER = _pywraplp.MPSolverParameters_BARRIER
931    r"""Barrier algorithm."""
932    INCREMENTALITY_OFF = _pywraplp.MPSolverParameters_INCREMENTALITY_OFF
933    r"""Start solve from scratch."""
934    INCREMENTALITY_ON = _pywraplp.MPSolverParameters_INCREMENTALITY_ON
935    r"""
936    Reuse results from previous solve as much as the underlying solver
937    allows.
938    """
939    SCALING_OFF = _pywraplp.MPSolverParameters_SCALING_OFF
940    r"""Scaling is off."""
941    SCALING_ON = _pywraplp.MPSolverParameters_SCALING_ON
942    r"""Scaling is on."""
943
944    def __init__(self):
945        r"""The constructor sets all parameters to their default value."""
946        _pywraplp.MPSolverParameters_swiginit(self, _pywraplp.new_MPSolverParameters())
947
948    def SetDoubleParam(self, param, value):
949        r"""Sets a double parameter to a specific value."""
950        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)
951
952    def SetIntegerParam(self, param, value):
953        r"""Sets a integer parameter to a specific value."""
954        return _pywraplp.MPSolverParameters_SetIntegerParam(self, param, value)
955
956    def GetDoubleParam(self, param):
957        r"""Returns the value of a double parameter."""
958        return _pywraplp.MPSolverParameters_GetDoubleParam(self, param)
959
960    def GetIntegerParam(self, param):
961        r"""Returns the value of an integer parameter."""
962        return _pywraplp.MPSolverParameters_GetIntegerParam(self, param)
963    __swig_destroy__ = _pywraplp.delete_MPSolverParameters

This class stores parameter settings for LP and MIP solvers. Some parameters are marked as advanced: do not change their values unless you know what you are doing!

For developers: how to add a new parameter:

  • Add the new Foo parameter in the DoubleParam or IntegerParam enum.
  • If it is a categorical param, add a FooValues enum.
  • Decide if the wrapper should define a default value for it: yes if it controls the properties of the solution (example: tolerances) or if it consistently improves performance, no otherwise. If yes, define kDefaultFoo.
  • Add a foo_value_ member and, if no default value is defined, a foo_is_default_ member.
  • Add code to handle Foo in Set...Param, Reset...Param, Get...Param, Reset and the constructor.
  • In class MPSolverInterface, add a virtual method SetFoo, add it to SetCommonParameters or SetMIPParameters, and implement it for each solver. Sometimes, parameters need to be implemented differently, see for example the INCREMENTALITY implementation.
  • Add a test in linear_solver_test.cc.

TODO(user): store the parameter values in a protocol buffer instead. We need to figure out how to deal with the subtleties of the default values.

MPSolverParameters()
944    def __init__(self):
945        r"""The constructor sets all parameters to their default value."""
946        _pywraplp.MPSolverParameters_swiginit(self, _pywraplp.new_MPSolverParameters())

The constructor sets all parameters to their default value.

thisown
901    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

RELATIVE_MIP_GAP = 0

Limit for relative MIP gap.

PRIMAL_TOLERANCE = 1

Advanced usage: tolerance for primal feasibility of basic solutions.

This does not control the integer feasibility tolerance of integer solutions for MIP or the tolerance used during presolve.

DUAL_TOLERANCE = 2

Advanced usage: tolerance for dual feasibility of basic solutions.

PRESOLVE = 1000

Advanced usage: presolve mode.

LP_ALGORITHM = 1001

Algorithm to solve linear programs.

INCREMENTALITY = 1002

Advanced usage: incrementality from one solve to the next.

SCALING = 1003

Advanced usage: enable or disable matrix scaling.

PRESOLVE_OFF = 0

Presolve is off.

PRESOLVE_ON = 1

Presolve is on.

DUAL = 10

Dual simplex.

PRIMAL = 11

Primal simplex.

BARRIER = 12

Barrier algorithm.

INCREMENTALITY_OFF = 0

Start solve from scratch.

INCREMENTALITY_ON = 1

Reuse results from previous solve as much as the underlying solver allows.

SCALING_OFF = 0

Scaling is off.

SCALING_ON = 1

Scaling is on.

def SetDoubleParam(self, param, value):
948    def SetDoubleParam(self, param, value):
949        r"""Sets a double parameter to a specific value."""
950        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)

Sets a double parameter to a specific value.

def SetIntegerParam(self, param, value):
952    def SetIntegerParam(self, param, value):
953        r"""Sets a integer parameter to a specific value."""
954        return _pywraplp.MPSolverParameters_SetIntegerParam(self, param, value)

Sets a integer parameter to a specific value.

def GetDoubleParam(self, param):
956    def GetDoubleParam(self, param):
957        r"""Returns the value of a double parameter."""
958        return _pywraplp.MPSolverParameters_GetDoubleParam(self, param)

Returns the value of a double parameter.

def GetIntegerParam(self, param):
960    def GetIntegerParam(self, param):
961        r"""Returns the value of an integer parameter."""
962        return _pywraplp.MPSolverParameters_GetIntegerParam(self, param)

Returns the value of an integer parameter.

kDefaultRelativeMipGap = 0.0001
kDefaultPrimalTolerance = 1e-07
kDefaultDualTolerance = 1e-07
kDefaultPresolve = 1
kDefaultIncrementality = 1
cvar = <Swig global variables>
class ModelExportOptions:
974class ModelExportOptions(object):
975    r"""Export options."""
976
977    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
978    __repr__ = _swig_repr
979
980    def __init__(self):
981        _pywraplp.ModelExportOptions_swiginit(self, _pywraplp.new_ModelExportOptions())
982    __swig_destroy__ = _pywraplp.delete_ModelExportOptions

Export options.

thisown
977    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

def ExportModelAsLpFormat(*args):
987def ExportModelAsLpFormat(*args):
988    return _pywraplp.ExportModelAsLpFormat(*args)
def ExportModelAsMpsFormat(*args):
990def ExportModelAsMpsFormat(*args):
991    return _pywraplp.ExportModelAsMpsFormat(*args)
def FindErrorInModelProto(input_model):
993def FindErrorInModelProto(input_model):
994    return _pywraplp.FindErrorInModelProto(input_model)
def setup_variable_operator(opname):
996def setup_variable_operator(opname):
997  setattr(Variable, opname,
998          lambda self, *args: getattr(VariableExpr(self), opname)(*args))