ortools.linear_solver.pywraplp

  1# This file was automatically generated by SWIG (https://www.swig.org).
  2# Version 4.3.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 __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        return _pywraplp.Solver_wall_time(self)
459
460    def LoadModelFromProto(self, input_model):
461        return _pywraplp.Solver_LoadModelFromProto(self, input_model)
462
463    def LoadModelFromProtoKeepNames(self, input_model):
464        return _pywraplp.Solver_LoadModelFromProtoKeepNames(self, input_model)
465
466    def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
467        return _pywraplp.Solver_LoadModelFromProtoWithUniqueNamesOrDie(self, input_model)
468
469    def LoadSolutionFromProto(self, *args):
470        return _pywraplp.Solver_LoadSolutionFromProto(self, *args)
471
472    def ExportModelAsLpFormat(self, obfuscate):
473        return _pywraplp.Solver_ExportModelAsLpFormat(self, obfuscate)
474
475    def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
476        return _pywraplp.Solver_ExportModelAsMpsFormat(self, fixed_format, obfuscate)
477
478    def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
479        return _pywraplp.Solver_WriteModelToMpsFile(self, filename, fixed_format, obfuscate)
480
481    def SetHint(self, variables, values):
482        r"""
483        Set a hint for solution.
484
485        If a feasible or almost-feasible solution to the problem is already known,
486        it may be helpful to pass it to the solver so that it can be used. A
487        solver that supports this feature will try to use this information to
488        create its initial feasible solution.
489
490        Note that it may not always be faster to give a hint like this to the
491        solver. There is also no guarantee that the solver will use this hint or
492        try to return a solution "close" to this assignment in case of multiple
493        optimal solutions.
494        """
495        return _pywraplp.Solver_SetHint(self, variables, values)
496
497    def SetNumThreads(self, num_theads):
498        r"""Sets the number of threads to be used by the solver."""
499        return _pywraplp.Solver_SetNumThreads(self, num_theads)
500
501    def Add(self, constraint, name=''):
502      if isinstance(constraint, bool):
503        if constraint:
504          return self.RowConstraint(0, 0, name)
505        else:
506          return self.RowConstraint(1, 1, name)
507      else:
508        return constraint.Extract(self, name)
509
510    def Sum(self, expr_array):
511      result = SumArray(expr_array)
512      return result
513
514    def RowConstraint(self, *args):
515      return self.Constraint(*args)
516
517    def Minimize(self, expr):
518      objective = self.Objective()
519      objective.Clear()
520      objective.SetMinimization()
521      if isinstance(expr, numbers.Number):
522          objective.SetOffset(expr)
523      else:
524          coeffs = expr.GetCoeffs()
525          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
526          for v, c, in list(coeffs.items()):
527            objective.SetCoefficient(v, float(c))
528
529    def Maximize(self, expr):
530      objective = self.Objective()
531      objective.Clear()
532      objective.SetMaximization()
533      if isinstance(expr, numbers.Number):
534          objective.SetOffset(expr)
535      else:
536          coeffs = expr.GetCoeffs()
537          objective.SetOffset(coeffs.pop(OFFSET_KEY, 0.0))
538          for v, c, in list(coeffs.items()):
539            objective.SetCoefficient(v, float(c))
540
541
542    @staticmethod
543    def Infinity():
544        return _pywraplp.Solver_Infinity()
545
546    def SetTimeLimit(self, x):
547        return _pywraplp.Solver_SetTimeLimit(self, x)
548
549    def WallTime(self):
550        return _pywraplp.Solver_WallTime(self)
551
552    def Iterations(self):
553        return _pywraplp.Solver_Iterations(self)
554
555# Register Solver in _pywraplp:
556_pywraplp.Solver_swigregister(Solver)
557
558def __lshift__(*args):
559    return _pywraplp.__lshift__(*args)
560class Objective(object):
561    r"""A class to express a linear objective."""
562
563    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
564
565    def __init__(self, *args, **kwargs):
566        raise AttributeError("No constructor defined")
567    __repr__ = _swig_repr
568
569    def Clear(self):
570        r"""
571         Clears the offset, all variables and coefficients, and the optimization
572        direction.
573        """
574        return _pywraplp.Objective_Clear(self)
575
576    def SetCoefficient(self, var, coeff):
577        r"""
578        Sets the coefficient of the variable in the objective.
579
580        If the variable does not belong to the solver, the function just returns,
581        or crashes in non-opt mode.
582        """
583        return _pywraplp.Objective_SetCoefficient(self, var, coeff)
584
585    def GetCoefficient(self, var):
586        r"""
587         Gets the coefficient of a given variable in the objective
588
589        It returns 0 if the variable does not appear in the objective).
590        """
591        return _pywraplp.Objective_GetCoefficient(self, var)
592
593    def SetOffset(self, value):
594        r"""Sets the constant term in the objective."""
595        return _pywraplp.Objective_SetOffset(self, value)
596
597    def offset(self):
598        r"""Gets the constant term in the objective."""
599        return _pywraplp.Objective_offset(self)
600
601    def SetOptimizationDirection(self, maximize):
602        r"""Sets the optimization direction (maximize: true or minimize: false)."""
603        return _pywraplp.Objective_SetOptimizationDirection(self, maximize)
604
605    def SetMinimization(self):
606        r"""Sets the optimization direction to minimize."""
607        return _pywraplp.Objective_SetMinimization(self)
608
609    def SetMaximization(self):
610        r"""Sets the optimization direction to maximize."""
611        return _pywraplp.Objective_SetMaximization(self)
612
613    def maximization(self):
614        r"""Is the optimization direction set to maximize?"""
615        return _pywraplp.Objective_maximization(self)
616
617    def minimization(self):
618        r"""Is the optimization direction set to minimize?"""
619        return _pywraplp.Objective_minimization(self)
620
621    def Value(self):
622        r"""
623        Returns the objective value of the best solution found so far.
624
625        It is the optimal objective value if the problem has been solved to
626        optimality.
627
628        Note: the objective value may be slightly different than what you could
629        compute yourself using ``MPVariable::solution_value();`` please use the
630        --verify_solution flag to gain confidence about the numerical stability of
631        your solution.
632        """
633        return _pywraplp.Objective_Value(self)
634
635    def BestBound(self):
636        r"""
637        Returns the best objective bound.
638
639        In case of minimization, it is a lower bound on the objective value of the
640        optimal integer solution. Only available for discrete problems.
641        """
642        return _pywraplp.Objective_BestBound(self)
643
644    def Offset(self):
645        return _pywraplp.Objective_Offset(self)
646    __swig_destroy__ = _pywraplp.delete_Objective
647
648# Register Objective in _pywraplp:
649_pywraplp.Objective_swigregister(Objective)
650class Variable(object):
651    r"""The class for variables of a Mathematical Programming (MP) model."""
652
653    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
654
655    def __init__(self, *args, **kwargs):
656        raise AttributeError("No constructor defined")
657
658    def name(self):
659        r"""Returns the name of the variable."""
660        return _pywraplp.Variable_name(self)
661
662    def SetInteger(self, integer):
663        r"""Sets the integrality requirement of the variable."""
664        return _pywraplp.Variable_SetInteger(self, integer)
665
666    def integer(self):
667        r"""Returns the integrality requirement of the variable."""
668        return _pywraplp.Variable_integer(self)
669
670    def solution_value(self):
671        r"""
672        Returns the value of the variable in the current solution.
673
674        If the variable is integer, then the value will always be an integer (the
675        underlying solver handles floating-point values only, but this function
676        automatically rounds it to the nearest integer; see: man 3 round).
677        """
678        return _pywraplp.Variable_solution_value(self)
679
680    def index(self):
681        r"""Returns the index of the variable in the MPSolver::variables_."""
682        return _pywraplp.Variable_index(self)
683
684    def lb(self):
685        r"""Returns the lower bound."""
686        return _pywraplp.Variable_lb(self)
687
688    def ub(self):
689        r"""Returns the upper bound."""
690        return _pywraplp.Variable_ub(self)
691
692    def SetBounds(self, lb, ub):
693        r"""Sets both the lower and upper bounds."""
694        return _pywraplp.Variable_SetBounds(self, lb, ub)
695
696    def reduced_cost(self):
697        r"""
698        Advanced usage: returns the reduced cost of the variable in the current
699        solution (only available for continuous problems).
700        """
701        return _pywraplp.Variable_reduced_cost(self)
702
703    def basis_status(self):
704        r"""
705        Advanced usage: returns the basis status of the variable in the current
706        solution (only available for continuous problems).
707
708        See also: MPSolver::BasisStatus.
709        """
710        return _pywraplp.Variable_basis_status(self)
711
712    def branching_priority(self):
713        r"""
714        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
715        a per-variable priority for determining which variable to branch on.
716
717        A value of 0 is treated as default, and is equivalent to not setting the
718        branching priority. The solver looks first to branch on fractional
719        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
720        support setting branching priority; all other solvers will simply ignore
721        this annotation.
722        """
723        return _pywraplp.Variable_branching_priority(self)
724
725    def SetBranchingPriority(self, priority):
726        return _pywraplp.Variable_SetBranchingPriority(self, priority)
727
728    def __str__(self):
729        return _pywraplp.Variable___str__(self)
730
731    def __repr__(self):
732        return _pywraplp.Variable___repr__(self)
733
734    def __getattr__(self, name):
735      return getattr(VariableExpr(self), name)
736
737
738    def SolutionValue(self):
739        return _pywraplp.Variable_SolutionValue(self)
740
741    def Integer(self):
742        return _pywraplp.Variable_Integer(self)
743
744    def Lb(self):
745        return _pywraplp.Variable_Lb(self)
746
747    def Ub(self):
748        return _pywraplp.Variable_Ub(self)
749
750    def SetLb(self, x):
751        return _pywraplp.Variable_SetLb(self, x)
752
753    def SetUb(self, x):
754        return _pywraplp.Variable_SetUb(self, x)
755
756    def ReducedCost(self):
757        return _pywraplp.Variable_ReducedCost(self)
758    __swig_destroy__ = _pywraplp.delete_Variable
759
760# Register Variable in _pywraplp:
761_pywraplp.Variable_swigregister(Variable)
762class Constraint(object):
763    r"""
764    The class for constraints of a Mathematical Programming (MP) model.
765
766    A constraint is represented as a linear equation or inequality.
767    """
768
769    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
770
771    def __init__(self, *args, **kwargs):
772        raise AttributeError("No constructor defined")
773    __repr__ = _swig_repr
774
775    def name(self):
776        r"""Returns the name of the constraint."""
777        return _pywraplp.Constraint_name(self)
778
779    def Clear(self):
780        r"""Clears all variables and coefficients. Does not clear the bounds."""
781        return _pywraplp.Constraint_Clear(self)
782
783    def SetCoefficient(self, var, coeff):
784        r"""
785        Sets the coefficient of the variable on the constraint.
786
787        If the variable does not belong to the solver, the function just returns,
788        or crashes in non-opt mode.
789        """
790        return _pywraplp.Constraint_SetCoefficient(self, var, coeff)
791
792    def GetCoefficient(self, var):
793        r"""
794        Gets the coefficient of a given variable on the constraint (which is 0 if
795        the variable does not appear in the constraint).
796        """
797        return _pywraplp.Constraint_GetCoefficient(self, var)
798
799    def lb(self):
800        r"""Returns the lower bound."""
801        return _pywraplp.Constraint_lb(self)
802
803    def ub(self):
804        r"""Returns the upper bound."""
805        return _pywraplp.Constraint_ub(self)
806
807    def SetBounds(self, lb, ub):
808        r"""Sets both the lower and upper bounds."""
809        return _pywraplp.Constraint_SetBounds(self, lb, ub)
810
811    def set_is_lazy(self, laziness):
812        r"""
813        Advanced usage: sets the constraint "laziness".
814
815        **This is only supported for SCIP and has no effect on other
816        solvers.**
817
818        When **laziness** is true, the constraint is only considered by the Linear
819        Programming solver if its current solution violates the constraint. In this
820        case, the constraint is definitively added to the problem. This may be
821        useful in some MIP problems, and may have a dramatic impact on performance.
822
823        For more info see: http://tinyurl.com/lazy-constraints.
824        """
825        return _pywraplp.Constraint_set_is_lazy(self, laziness)
826
827    def index(self):
828        r"""Returns the index of the constraint in the MPSolver::constraints_."""
829        return _pywraplp.Constraint_index(self)
830
831    def dual_value(self):
832        r"""
833        Advanced usage: returns the dual value of the constraint in the current
834        solution (only available for continuous problems).
835        """
836        return _pywraplp.Constraint_dual_value(self)
837
838    def basis_status(self):
839        r"""
840        Advanced usage: returns the basis status of the constraint.
841
842        It is only available for continuous problems).
843
844        Note that if a constraint "linear_expression in [lb, ub]" is transformed
845        into "linear_expression + slack = 0" with slack in [-ub, -lb], then this
846        status is the same as the status of the slack variable with AT_UPPER_BOUND
847        and AT_LOWER_BOUND swapped.
848
849        See also: MPSolver::BasisStatus.
850        """
851        return _pywraplp.Constraint_basis_status(self)
852
853    def Lb(self):
854        return _pywraplp.Constraint_Lb(self)
855
856    def Ub(self):
857        return _pywraplp.Constraint_Ub(self)
858
859    def SetLb(self, x):
860        return _pywraplp.Constraint_SetLb(self, x)
861
862    def SetUb(self, x):
863        return _pywraplp.Constraint_SetUb(self, x)
864
865    def DualValue(self):
866        return _pywraplp.Constraint_DualValue(self)
867    __swig_destroy__ = _pywraplp.delete_Constraint
868
869# Register Constraint in _pywraplp:
870_pywraplp.Constraint_swigregister(Constraint)
871class MPSolverParameters(object):
872    r"""
873    This class stores parameter settings for LP and MIP solvers. Some parameters
874    are marked as advanced: do not change their values unless you know what you
875    are doing!
876
877    For developers: how to add a new parameter:
878    - Add the new Foo parameter in the DoubleParam or IntegerParam enum.
879    - If it is a categorical param, add a FooValues enum.
880    - Decide if the wrapper should define a default value for it: yes
881      if it controls the properties of the solution (example:
882      tolerances) or if it consistently improves performance, no
883      otherwise. If yes, define kDefaultFoo.
884    - Add a foo_value_ member and, if no default value is defined, a
885      foo_is_default_ member.
886    - Add code to handle Foo in Set...Param, Reset...Param,
887      Get...Param, Reset and the constructor.
888    - In class MPSolverInterface, add a virtual method SetFoo, add it
889      to SetCommonParameters or SetMIPParameters, and implement it for
890      each solver. Sometimes, parameters need to be implemented
891      differently, see for example the INCREMENTALITY implementation.
892    - Add a test in linear_solver_test.cc.
893
894    TODO(user): store the parameter values in a protocol buffer
895    instead. We need to figure out how to deal with the subtleties of
896    the default values.
897    """
898
899    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
900    __repr__ = _swig_repr
901    RELATIVE_MIP_GAP = _pywraplp.MPSolverParameters_RELATIVE_MIP_GAP
902    r"""Limit for relative MIP gap."""
903    PRIMAL_TOLERANCE = _pywraplp.MPSolverParameters_PRIMAL_TOLERANCE
904    r"""
905    Advanced usage: tolerance for primal feasibility of basic solutions.
906
907    This does not control the integer feasibility tolerance of integer
908    solutions for MIP or the tolerance used during presolve.
909    """
910    DUAL_TOLERANCE = _pywraplp.MPSolverParameters_DUAL_TOLERANCE
911    r"""Advanced usage: tolerance for dual feasibility of basic solutions."""
912    PRESOLVE = _pywraplp.MPSolverParameters_PRESOLVE
913    r"""Advanced usage: presolve mode."""
914    LP_ALGORITHM = _pywraplp.MPSolverParameters_LP_ALGORITHM
915    r"""Algorithm to solve linear programs."""
916    INCREMENTALITY = _pywraplp.MPSolverParameters_INCREMENTALITY
917    r"""Advanced usage: incrementality from one solve to the next."""
918    SCALING = _pywraplp.MPSolverParameters_SCALING
919    r"""Advanced usage: enable or disable matrix scaling."""
920    PRESOLVE_OFF = _pywraplp.MPSolverParameters_PRESOLVE_OFF
921    r"""Presolve is off."""
922    PRESOLVE_ON = _pywraplp.MPSolverParameters_PRESOLVE_ON
923    r"""Presolve is on."""
924    DUAL = _pywraplp.MPSolverParameters_DUAL
925    r"""Dual simplex."""
926    PRIMAL = _pywraplp.MPSolverParameters_PRIMAL
927    r"""Primal simplex."""
928    BARRIER = _pywraplp.MPSolverParameters_BARRIER
929    r"""Barrier algorithm."""
930    INCREMENTALITY_OFF = _pywraplp.MPSolverParameters_INCREMENTALITY_OFF
931    r"""Start solve from scratch."""
932    INCREMENTALITY_ON = _pywraplp.MPSolverParameters_INCREMENTALITY_ON
933    r"""
934    Reuse results from previous solve as much as the underlying solver
935    allows.
936    """
937    SCALING_OFF = _pywraplp.MPSolverParameters_SCALING_OFF
938    r"""Scaling is off."""
939    SCALING_ON = _pywraplp.MPSolverParameters_SCALING_ON
940    r"""Scaling is on."""
941
942    def __init__(self):
943        r"""The constructor sets all parameters to their default value."""
944        _pywraplp.MPSolverParameters_swiginit(self, _pywraplp.new_MPSolverParameters())
945
946    def SetDoubleParam(self, param, value):
947        r"""Sets a double parameter to a specific value."""
948        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)
949
950    def SetIntegerParam(self, param, value):
951        r"""Sets a integer parameter to a specific value."""
952        return _pywraplp.MPSolverParameters_SetIntegerParam(self, param, value)
953
954    def GetDoubleParam(self, param):
955        r"""Returns the value of a double parameter."""
956        return _pywraplp.MPSolverParameters_GetDoubleParam(self, param)
957
958    def GetIntegerParam(self, param):
959        r"""Returns the value of an integer parameter."""
960        return _pywraplp.MPSolverParameters_GetIntegerParam(self, param)
961    __swig_destroy__ = _pywraplp.delete_MPSolverParameters
962
963# Register MPSolverParameters in _pywraplp:
964_pywraplp.MPSolverParameters_swigregister(MPSolverParameters)
965cvar = _pywraplp.cvar
966MPSolverParameters.kDefaultRelativeMipGap = _pywraplp.cvar.MPSolverParameters_kDefaultRelativeMipGap
967MPSolverParameters.kDefaultPrimalTolerance = _pywraplp.cvar.MPSolverParameters_kDefaultPrimalTolerance
968MPSolverParameters.kDefaultDualTolerance = _pywraplp.cvar.MPSolverParameters_kDefaultDualTolerance
969MPSolverParameters.kDefaultPresolve = _pywraplp.cvar.MPSolverParameters_kDefaultPresolve
970MPSolverParameters.kDefaultIncrementality = _pywraplp.cvar.MPSolverParameters_kDefaultIncrementality
971
972class ModelExportOptions(object):
973    r"""Export options."""
974
975    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
976    __repr__ = _swig_repr
977
978    def __init__(self):
979        _pywraplp.ModelExportOptions_swiginit(self, _pywraplp.new_ModelExportOptions())
980    __swig_destroy__ = _pywraplp.delete_ModelExportOptions
981
982# Register ModelExportOptions in _pywraplp:
983_pywraplp.ModelExportOptions_swigregister(ModelExportOptions)
984
985def ExportModelAsLpFormat(*args):
986    return _pywraplp.ExportModelAsLpFormat(*args)
987
988def ExportModelAsMpsFormat(*args):
989    return _pywraplp.ExportModelAsMpsFormat(*args)
990
991def FindErrorInModelProto(input_model):
992    return _pywraplp.FindErrorInModelProto(input_model)
993
994def setup_variable_operator(opname):
995  setattr(Variable, opname,
996          lambda self, *args: getattr(VariableExpr(self), opname)(*args))
997for opname in LinearExpr.OVERRIDDEN_OPERATOR_METHODS:
998  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        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)

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        return _pywraplp.Solver_wall_time(self)
def LoadModelFromProto(self, input_model):
461    def LoadModelFromProto(self, input_model):
462        return _pywraplp.Solver_LoadModelFromProto(self, input_model)
def LoadModelFromProtoKeepNames(self, input_model):
464    def LoadModelFromProtoKeepNames(self, input_model):
465        return _pywraplp.Solver_LoadModelFromProtoKeepNames(self, input_model)
def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
467    def LoadModelFromProtoWithUniqueNamesOrDie(self, input_model):
468        return _pywraplp.Solver_LoadModelFromProtoWithUniqueNamesOrDie(self, input_model)
def LoadSolutionFromProto(self, *args):
470    def LoadSolutionFromProto(self, *args):
471        return _pywraplp.Solver_LoadSolutionFromProto(self, *args)
def ExportModelAsLpFormat(self, obfuscate):
473    def ExportModelAsLpFormat(self, obfuscate):
474        return _pywraplp.Solver_ExportModelAsLpFormat(self, obfuscate)
def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
476    def ExportModelAsMpsFormat(self, fixed_format, obfuscate):
477        return _pywraplp.Solver_ExportModelAsMpsFormat(self, fixed_format, obfuscate)
def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
479    def WriteModelToMpsFile(self, filename, fixed_format, obfuscate):
480        return _pywraplp.Solver_WriteModelToMpsFile(self, filename, fixed_format, obfuscate)
def SetHint(self, variables, values):
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)

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):
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)

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

def Add(self, constraint, name=''):
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)
def Sum(self, expr_array):
511    def Sum(self, expr_array):
512      result = SumArray(expr_array)
513      return result
def RowConstraint(self, *args):
515    def RowConstraint(self, *args):
516      return self.Constraint(*args)
def Minimize(self, expr):
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))
def Maximize(self, expr):
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))
@staticmethod
def Infinity():
543    @staticmethod
544    def Infinity():
545        return _pywraplp.Solver_Infinity()
def SetTimeLimit(self, x):
547    def SetTimeLimit(self, x):
548        return _pywraplp.Solver_SetTimeLimit(self, x)
def WallTime(self):
550    def WallTime(self):
551        return _pywraplp.Solver_WallTime(self)
def Iterations(self):
553    def Iterations(self):
554        return _pywraplp.Solver_Iterations(self)
class Objective:
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

A class to express a linear objective.

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

The membership flag

def Clear(self):
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)

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

def SetCoefficient(self, var, coeff):
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)

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):
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)

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):
594    def SetOffset(self, value):
595        r"""Sets the constant term in the objective."""
596        return _pywraplp.Objective_SetOffset(self, value)

Sets the constant term in the objective.

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

Gets the constant term in the objective.

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

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

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

Sets the optimization direction to minimize.

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

Sets the optimization direction to maximize.

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

Is the optimization direction set to maximize?

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

Is the optimization direction set to minimize?

def Value(self):
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)

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):
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)

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):
645    def Offset(self):
646        return _pywraplp.Objective_Offset(self)
class Variable:
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

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

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

The membership flag

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

Returns the name of the variable.

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

Sets the integrality requirement of the variable.

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

Returns the integrality requirement of the variable.

def solution_value(self):
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)

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):
681    def index(self):
682        r"""Returns the index of the variable in the MPSolver::variables_."""
683        return _pywraplp.Variable_index(self)

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

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

Returns the lower bound.

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

Returns the upper bound.

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

Sets both the lower and upper bounds.

def reduced_cost(self):
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)

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

def basis_status(self):
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)

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):
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)

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):
726    def SetBranchingPriority(self, priority):
727        return _pywraplp.Variable_SetBranchingPriority(self, priority)
def SolutionValue(self):
739    def SolutionValue(self):
740        return _pywraplp.Variable_SolutionValue(self)
def Integer(self):
742    def Integer(self):
743        return _pywraplp.Variable_Integer(self)
def Lb(self):
745    def Lb(self):
746        return _pywraplp.Variable_Lb(self)
def Ub(self):
748    def Ub(self):
749        return _pywraplp.Variable_Ub(self)
def SetLb(self, x):
751    def SetLb(self, x):
752        return _pywraplp.Variable_SetLb(self, x)
def SetUb(self, x):
754    def SetUb(self, x):
755        return _pywraplp.Variable_SetUb(self, x)
def ReducedCost(self):
757    def ReducedCost(self):
758        return _pywraplp.Variable_ReducedCost(self)
class Constraint:
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

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

A constraint is represented as a linear equation or inequality.

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

The membership flag

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

Returns the name of the constraint.

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

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

def SetCoefficient(self, var, coeff):
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)

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):
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)

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):
800    def lb(self):
801        r"""Returns the lower bound."""
802        return _pywraplp.Constraint_lb(self)

Returns the lower bound.

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

Returns the upper bound.

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

Sets both the lower and upper bounds.

def set_is_lazy(self, laziness):
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)

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):
828    def index(self):
829        r"""Returns the index of the constraint in the MPSolver::constraints_."""
830        return _pywraplp.Constraint_index(self)

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

def dual_value(self):
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)

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

def basis_status(self):
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)

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):
854    def Lb(self):
855        return _pywraplp.Constraint_Lb(self)
def Ub(self):
857    def Ub(self):
858        return _pywraplp.Constraint_Ub(self)
def SetLb(self, x):
860    def SetLb(self, x):
861        return _pywraplp.Constraint_SetLb(self, x)
def SetUb(self, x):
863    def SetUb(self, x):
864        return _pywraplp.Constraint_SetUb(self, x)
def DualValue(self):
866    def DualValue(self):
867        return _pywraplp.Constraint_DualValue(self)
class MPSolverParameters:
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

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()
943    def __init__(self):
944        r"""The constructor sets all parameters to their default value."""
945        _pywraplp.MPSolverParameters_swiginit(self, _pywraplp.new_MPSolverParameters())

The constructor sets all parameters to their default value.

thisown
900    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):
947    def SetDoubleParam(self, param, value):
948        r"""Sets a double parameter to a specific value."""
949        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)

Sets a double parameter to a specific value.

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

Sets a integer parameter to a specific value.

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

Returns the value of a double parameter.

def GetIntegerParam(self, param):
959    def GetIntegerParam(self, param):
960        r"""Returns the value of an integer parameter."""
961        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:
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

Export options.

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

The membership flag

def ExportModelAsLpFormat(*args):
986def ExportModelAsLpFormat(*args):
987    return _pywraplp.ExportModelAsLpFormat(*args)
def ExportModelAsMpsFormat(*args):
989def ExportModelAsMpsFormat(*args):
990    return _pywraplp.ExportModelAsMpsFormat(*args)
def FindErrorInModelProto(input_model):
992def FindErrorInModelProto(input_model):
993    return _pywraplp.FindErrorInModelProto(input_model)
def setup_variable_operator(opname):
995def setup_variable_operator(opname):
996  setattr(Variable, opname,
997          lambda self, *args: getattr(VariableExpr(self), opname)(*args))