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)
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.
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.
80 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag
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
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).
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.
154 def NumVariables(self): 155 r""" Returns the number of variables.""" 156 return _pywraplp.Solver_NumVariables(self)
Returns the number of variables.
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.)
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.
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.
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.
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.
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.
195 def BoolVar(self, name): 196 r""" Creates a boolean variable.""" 197 return _pywraplp.Solver_BoolVar(self, name)
Creates a boolean variable.
199 def NumConstraints(self): 200 r""" Returns the number of constraints.""" 201 return _pywraplp.Solver_NumConstraints(self)
Returns the number of constraints.
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.
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.
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.
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.
254 def Objective(self): 255 r""" Returns the mutable objective object.""" 256 return _pywraplp.Solver_Objective(self)
Returns the mutable objective object.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
387 def EnableOutput(self): 388 r""" Enables solver logging.""" 389 return _pywraplp.Solver_EnableOutput(self)
Enables solver logging.
391 def SuppressOutput(self): 392 r""" Suppresses solver logging.""" 393 return _pywraplp.Solver_SuppressOutput(self)
Suppresses solver logging.
395 def iterations(self): 396 r""" Returns the number of simplex iterations.""" 397 return _pywraplp.Solver_iterations(self)
Returns the number of simplex iterations.
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.
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.
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.
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.
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.
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.
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))
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))
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.
561 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag
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.
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.
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).
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.
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.
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).
603 def SetMinimization(self): 604 r""" Sets the optimization direction to minimize.""" 605 return _pywraplp.Objective_SetMinimization(self)
Sets the optimization direction to minimize.
607 def SetMaximization(self): 608 r""" Sets the optimization direction to maximize.""" 609 return _pywraplp.Objective_SetMaximization(self)
Sets the optimization direction to maximize.
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?
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?
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.
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.
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.
651 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag
656 def name(self): 657 r""" Returns the name of the variable.""" 658 return _pywraplp.Variable_name(self)
Returns the name of the variable.
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.
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.
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).
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_.
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.
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).
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.
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.
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.
767 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag
773 def name(self): 774 r""" Returns the name of the constraint.""" 775 return _pywraplp.Constraint_name(self)
Returns the name of the constraint.
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.
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.
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).
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.
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.
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_.
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).
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.
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.
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.
897 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag
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.
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.
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.
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.
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.
973 thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
The membership flag