ortools.linear_solver.pywraplp

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

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

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

A class to express a linear objective.

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

The membership flag

def Clear(self):
567    def Clear(self):
568        r"""
569         Clears the offset, all variables and coefficients, and the optimization
570        direction.
571        """
572        return _pywraplp.Objective_Clear(self)

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

def SetCoefficient(self, var, coeff):
574    def SetCoefficient(self, var, coeff):
575        r"""
576        Sets the coefficient of the variable in the objective.
577
578        If the variable does not belong to the solver, the function just returns,
579        or crashes in non-opt mode.
580        """
581        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):
583    def GetCoefficient(self, var):
584        r"""
585         Gets the coefficient of a given variable in the objective
586
587        It returns 0 if the variable does not appear in the objective).
588        """
589        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):
591    def SetOffset(self, value):
592        r""" Sets the constant term in the objective."""
593        return _pywraplp.Objective_SetOffset(self, value)

Sets the constant term in the objective.

def offset(self):
595    def offset(self):
596        r""" Gets the constant term in the objective."""
597        return _pywraplp.Objective_offset(self)

Gets the constant term in the objective.

def SetOptimizationDirection(self, maximize):
599    def SetOptimizationDirection(self, maximize):
600        r""" Sets the optimization direction (maximize: true or minimize: false)."""
601        return _pywraplp.Objective_SetOptimizationDirection(self, maximize)

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

def SetMinimization(self):
603    def SetMinimization(self):
604        r""" Sets the optimization direction to minimize."""
605        return _pywraplp.Objective_SetMinimization(self)

Sets the optimization direction to minimize.

def SetMaximization(self):
607    def SetMaximization(self):
608        r""" Sets the optimization direction to maximize."""
609        return _pywraplp.Objective_SetMaximization(self)

Sets the optimization direction to maximize.

def maximization(self):
611    def maximization(self):
612        r""" Is the optimization direction set to maximize?"""
613        return _pywraplp.Objective_maximization(self)

Is the optimization direction set to maximize?

def minimization(self):
615    def minimization(self):
616        r""" Is the optimization direction set to minimize?"""
617        return _pywraplp.Objective_minimization(self)

Is the optimization direction set to minimize?

def Value(self):
619    def Value(self):
620        r"""
621        Returns the objective value of the best solution found so far.
622
623        It is the optimal objective value if the problem has been solved to
624        optimality.
625
626        Note: the objective value may be slightly different than what you could
627        compute yourself using ``MPVariable::solution_value();`` please use the
628        --verify_solution flag to gain confidence about the numerical stability of
629        your solution.
630        """
631        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):
633    def BestBound(self):
634        r"""
635        Returns the best objective bound.
636
637        In case of minimization, it is a lower bound on the objective value of the
638        optimal integer solution. Only available for discrete problems.
639        """
640        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):
642    def Offset(self):
643        return _pywraplp.Objective_Offset(self)
class Variable:
648class Variable(object):
649    r""" The class for variables of a Mathematical Programming (MP) model."""
650
651    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
652
653    def __init__(self, *args, **kwargs):
654        raise AttributeError("No constructor defined")
655
656    def name(self):
657        r""" Returns the name of the variable."""
658        return _pywraplp.Variable_name(self)
659
660    def SetInteger(self, integer):
661        r""" Sets the integrality requirement of the variable."""
662        return _pywraplp.Variable_SetInteger(self, integer)
663
664    def integer(self):
665        r""" Returns the integrality requirement of the variable."""
666        return _pywraplp.Variable_integer(self)
667
668    def solution_value(self):
669        r"""
670        Returns the value of the variable in the current solution.
671
672        If the variable is integer, then the value will always be an integer (the
673        underlying solver handles floating-point values only, but this function
674        automatically rounds it to the nearest integer; see: man 3 round).
675        """
676        return _pywraplp.Variable_solution_value(self)
677
678    def index(self):
679        r""" Returns the index of the variable in the MPSolver::variables_."""
680        return _pywraplp.Variable_index(self)
681
682    def lb(self):
683        r""" Returns the lower bound."""
684        return _pywraplp.Variable_lb(self)
685
686    def ub(self):
687        r""" Returns the upper bound."""
688        return _pywraplp.Variable_ub(self)
689
690    def SetBounds(self, lb, ub):
691        r""" Sets both the lower and upper bounds."""
692        return _pywraplp.Variable_SetBounds(self, lb, ub)
693
694    def reduced_cost(self):
695        r"""
696        Advanced usage: returns the reduced cost of the variable in the current
697        solution (only available for continuous problems).
698        """
699        return _pywraplp.Variable_reduced_cost(self)
700
701    def basis_status(self):
702        r"""
703        Advanced usage: returns the basis status of the variable in the current
704        solution (only available for continuous problems).
705
706        See also: MPSolver::BasisStatus.
707        """
708        return _pywraplp.Variable_basis_status(self)
709
710    def branching_priority(self):
711        r"""
712        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
713        a per-variable priority for determining which variable to branch on.
714
715        A value of 0 is treated as default, and is equivalent to not setting the
716        branching priority. The solver looks first to branch on fractional
717        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
718        support setting branching priority; all other solvers will simply ignore
719        this annotation.
720        """
721        return _pywraplp.Variable_branching_priority(self)
722
723    def SetBranchingPriority(self, priority):
724        return _pywraplp.Variable_SetBranchingPriority(self, priority)
725
726    def __str__(self):
727        return _pywraplp.Variable___str__(self)
728
729    def __repr__(self):
730        return _pywraplp.Variable___repr__(self)
731
732    def __getattr__(self, name):
733      return getattr(VariableExpr(self), name)
734
735
736    def SolutionValue(self):
737        return _pywraplp.Variable_SolutionValue(self)
738
739    def Integer(self):
740        return _pywraplp.Variable_Integer(self)
741
742    def Lb(self):
743        return _pywraplp.Variable_Lb(self)
744
745    def Ub(self):
746        return _pywraplp.Variable_Ub(self)
747
748    def SetLb(self, x):
749        return _pywraplp.Variable_SetLb(self, x)
750
751    def SetUb(self, x):
752        return _pywraplp.Variable_SetUb(self, x)
753
754    def ReducedCost(self):
755        return _pywraplp.Variable_ReducedCost(self)
756    __swig_destroy__ = _pywraplp.delete_Variable

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

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

The membership flag

def name(self):
656    def name(self):
657        r""" Returns the name of the variable."""
658        return _pywraplp.Variable_name(self)

Returns the name of the variable.

def SetInteger(self, integer):
660    def SetInteger(self, integer):
661        r""" Sets the integrality requirement of the variable."""
662        return _pywraplp.Variable_SetInteger(self, integer)

Sets the integrality requirement of the variable.

def integer(self):
664    def integer(self):
665        r""" Returns the integrality requirement of the variable."""
666        return _pywraplp.Variable_integer(self)

Returns the integrality requirement of the variable.

def solution_value(self):
668    def solution_value(self):
669        r"""
670        Returns the value of the variable in the current solution.
671
672        If the variable is integer, then the value will always be an integer (the
673        underlying solver handles floating-point values only, but this function
674        automatically rounds it to the nearest integer; see: man 3 round).
675        """
676        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):
678    def index(self):
679        r""" Returns the index of the variable in the MPSolver::variables_."""
680        return _pywraplp.Variable_index(self)

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

def lb(self):
682    def lb(self):
683        r""" Returns the lower bound."""
684        return _pywraplp.Variable_lb(self)

Returns the lower bound.

def ub(self):
686    def ub(self):
687        r""" Returns the upper bound."""
688        return _pywraplp.Variable_ub(self)

Returns the upper bound.

def SetBounds(self, lb, ub):
690    def SetBounds(self, lb, ub):
691        r""" Sets both the lower and upper bounds."""
692        return _pywraplp.Variable_SetBounds(self, lb, ub)

Sets both the lower and upper bounds.

def reduced_cost(self):
694    def reduced_cost(self):
695        r"""
696        Advanced usage: returns the reduced cost of the variable in the current
697        solution (only available for continuous problems).
698        """
699        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):
701    def basis_status(self):
702        r"""
703        Advanced usage: returns the basis status of the variable in the current
704        solution (only available for continuous problems).
705
706        See also: MPSolver::BasisStatus.
707        """
708        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):
710    def branching_priority(self):
711        r"""
712        Advanced usage: Certain MIP solvers (e.g. Gurobi or SCIP) allow you to set
713        a per-variable priority for determining which variable to branch on.
714
715        A value of 0 is treated as default, and is equivalent to not setting the
716        branching priority. The solver looks first to branch on fractional
717        variables in higher priority levels. As of 2019-05, only Gurobi and SCIP
718        support setting branching priority; all other solvers will simply ignore
719        this annotation.
720        """
721        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):
723    def SetBranchingPriority(self, priority):
724        return _pywraplp.Variable_SetBranchingPriority(self, priority)
def SolutionValue(self):
736    def SolutionValue(self):
737        return _pywraplp.Variable_SolutionValue(self)
def Integer(self):
739    def Integer(self):
740        return _pywraplp.Variable_Integer(self)
def Lb(self):
742    def Lb(self):
743        return _pywraplp.Variable_Lb(self)
def Ub(self):
745    def Ub(self):
746        return _pywraplp.Variable_Ub(self)
def SetLb(self, x):
748    def SetLb(self, x):
749        return _pywraplp.Variable_SetLb(self, x)
def SetUb(self, x):
751    def SetUb(self, x):
752        return _pywraplp.Variable_SetUb(self, x)
def ReducedCost(self):
754    def ReducedCost(self):
755        return _pywraplp.Variable_ReducedCost(self)
class Constraint:
760class Constraint(object):
761    r"""
762    The class for constraints of a Mathematical Programming (MP) model.
763
764    A constraint is represented as a linear equation or inequality.
765    """
766
767    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
768
769    def __init__(self, *args, **kwargs):
770        raise AttributeError("No constructor defined")
771    __repr__ = _swig_repr
772
773    def name(self):
774        r""" Returns the name of the constraint."""
775        return _pywraplp.Constraint_name(self)
776
777    def Clear(self):
778        r""" Clears all variables and coefficients. Does not clear the bounds."""
779        return _pywraplp.Constraint_Clear(self)
780
781    def SetCoefficient(self, var, coeff):
782        r"""
783        Sets the coefficient of the variable on the constraint.
784
785        If the variable does not belong to the solver, the function just returns,
786        or crashes in non-opt mode.
787        """
788        return _pywraplp.Constraint_SetCoefficient(self, var, coeff)
789
790    def GetCoefficient(self, var):
791        r"""
792        Gets the coefficient of a given variable on the constraint (which is 0 if
793        the variable does not appear in the constraint).
794        """
795        return _pywraplp.Constraint_GetCoefficient(self, var)
796
797    def lb(self):
798        r""" Returns the lower bound."""
799        return _pywraplp.Constraint_lb(self)
800
801    def ub(self):
802        r""" Returns the upper bound."""
803        return _pywraplp.Constraint_ub(self)
804
805    def SetBounds(self, lb, ub):
806        r""" Sets both the lower and upper bounds."""
807        return _pywraplp.Constraint_SetBounds(self, lb, ub)
808
809    def set_is_lazy(self, laziness):
810        r"""
811        Advanced usage: sets the constraint "laziness".
812
813        **This is only supported for SCIP and has no effect on other
814        solvers.**
815
816        When **laziness** is true, the constraint is only considered by the Linear
817        Programming solver if its current solution violates the constraint. In this
818        case, the constraint is definitively added to the problem. This may be
819        useful in some MIP problems, and may have a dramatic impact on performance.
820
821        For more info see: http://tinyurl.com/lazy-constraints.
822        """
823        return _pywraplp.Constraint_set_is_lazy(self, laziness)
824
825    def index(self):
826        r""" Returns the index of the constraint in the MPSolver::constraints_."""
827        return _pywraplp.Constraint_index(self)
828
829    def dual_value(self):
830        r"""
831        Advanced usage: returns the dual value of the constraint in the current
832        solution (only available for continuous problems).
833        """
834        return _pywraplp.Constraint_dual_value(self)
835
836    def basis_status(self):
837        r"""
838        Advanced usage: returns the basis status of the constraint.
839
840        It is only available for continuous problems).
841
842        Note that if a constraint "linear_expression in [lb, ub]" is transformed
843        into "linear_expression + slack = 0" with slack in [-ub, -lb], then this
844        status is the same as the status of the slack variable with AT_UPPER_BOUND
845        and AT_LOWER_BOUND swapped.
846
847        See also: MPSolver::BasisStatus.
848        """
849        return _pywraplp.Constraint_basis_status(self)
850
851    def Lb(self):
852        return _pywraplp.Constraint_Lb(self)
853
854    def Ub(self):
855        return _pywraplp.Constraint_Ub(self)
856
857    def SetLb(self, x):
858        return _pywraplp.Constraint_SetLb(self, x)
859
860    def SetUb(self, x):
861        return _pywraplp.Constraint_SetUb(self, x)
862
863    def DualValue(self):
864        return _pywraplp.Constraint_DualValue(self)
865    __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)
769    def __init__(self, *args, **kwargs):
770        raise AttributeError("No constructor defined")
thisown
767    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

The membership flag

def name(self):
773    def name(self):
774        r""" Returns the name of the constraint."""
775        return _pywraplp.Constraint_name(self)

Returns the name of the constraint.

def Clear(self):
777    def Clear(self):
778        r""" Clears all variables and coefficients. Does not clear the bounds."""
779        return _pywraplp.Constraint_Clear(self)

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

def SetCoefficient(self, var, coeff):
781    def SetCoefficient(self, var, coeff):
782        r"""
783        Sets the coefficient of the variable on the constraint.
784
785        If the variable does not belong to the solver, the function just returns,
786        or crashes in non-opt mode.
787        """
788        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):
790    def GetCoefficient(self, var):
791        r"""
792        Gets the coefficient of a given variable on the constraint (which is 0 if
793        the variable does not appear in the constraint).
794        """
795        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):
797    def lb(self):
798        r""" Returns the lower bound."""
799        return _pywraplp.Constraint_lb(self)

Returns the lower bound.

def ub(self):
801    def ub(self):
802        r""" Returns the upper bound."""
803        return _pywraplp.Constraint_ub(self)

Returns the upper bound.

def SetBounds(self, lb, ub):
805    def SetBounds(self, lb, ub):
806        r""" Sets both the lower and upper bounds."""
807        return _pywraplp.Constraint_SetBounds(self, lb, ub)

Sets both the lower and upper bounds.

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

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

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

The constructor sets all parameters to their default value.

thisown
897    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):
944    def SetDoubleParam(self, param, value):
945        r""" Sets a double parameter to a specific value."""
946        return _pywraplp.MPSolverParameters_SetDoubleParam(self, param, value)

Sets a double parameter to a specific value.

def SetIntegerParam(self, param, value):
948    def SetIntegerParam(self, param, value):
949        r""" Sets a integer parameter to a specific value."""
950        return _pywraplp.MPSolverParameters_SetIntegerParam(self, param, value)

Sets a integer parameter to a specific value.

def GetDoubleParam(self, param):
952    def GetDoubleParam(self, param):
953        r""" Returns the value of a double parameter."""
954        return _pywraplp.MPSolverParameters_GetDoubleParam(self, param)

Returns the value of a double parameter.

def GetIntegerParam(self, param):
956    def GetIntegerParam(self, param):
957        r""" Returns the value of an integer parameter."""
958        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:
970class ModelExportOptions(object):
971    r""" Export options."""
972
973    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
974    __repr__ = _swig_repr
975
976    def __init__(self):
977        _pywraplp.ModelExportOptions_swiginit(self, _pywraplp.new_ModelExportOptions())
978    __swig_destroy__ = _pywraplp.delete_ModelExportOptions

Export options.

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

The membership flag

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