Source code for picos.solvers

# ------------------------------------------------------------------------------
# Copyright (C) 2017-2018 Maximilian Stahlberg
#
# This file is part of PICOS.
#
# PICOS is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# PICOS is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see <http://www.gnu.org/licenses/>.
# ------------------------------------------------------------------------------

"""Optimization solver interfaces.

This package contains the interfaces to the optimization solvers that PICOS uses
as its backend. You do not need to instanciate any of the solver classes
directly; if you want to select a particular solver, it is most convenient to
name it to :meth:`~.problem.Problem.solve` via the ``solver`` keyword argument.
"""

from ..apidoc import api_end, api_start
from ..legacy import throw_deprecation_warning


_API_START = api_start(globals())
# -------------------------------

# Import the solver base class and exceptions.
from .solver import (Solver, SolverError, ProblemUpdateError,  # noqa
    OptionError, UnsupportedOptionError,
    ConflictingOptionsError, DependentOptionError, OptionValueError)

# Import all solvers.
from .solver_cplex  import CPLEXSolver  # noqa
from .solver_cvxopt import CVXOPTSolver  # noqa
from .solver_ecos   import ECOSSolver  # noqa
from .solver_glpk   import GLPKSolver  # noqa
from .solver_gurobi import GurobiSolver  # noqa
from .solver_mosek  import MOSEKSolver  # noqa
from .solver_mskfsn import MOSEKFusionSolver  # noqa
from .solver_osqp   import OSQPSolver  # noqa
from .solver_scip   import SCIPSolver  # noqa
from .solver_smcp   import SMCPSolver  # noqa


# Map solver names to their implementation classes.
_solvers = {solver.names()[0]: solver for solver in (
    CPLEXSolver,
    CVXOPTSolver,
    ECOSSolver,
    GLPKSolver,
    GurobiSolver,
    MOSEKSolver,
    MOSEKFusionSolver,
    OSQPSolver,
    SCIPSolver,
    SMCPSolver
)}

# Make sure all solvers inherit from their abstract base class.
assert all(issubclass(solver, Solver) for solver in _solvers.values())


[docs]def get_solver(name): """Return the implementation class of the solver with the given name.""" return _solvers[name]
[docs]def get_solver_name(solver): """Return the registry name of a solver instance.""" for name, solverClass in _solvers.items(): if isinstance(solver, solverClass): return name raise LookupError("The given object's type is not regisered as a solver.")
[docs]def all_solvers(): """Return a dictionary mapping solver names to implementation classes.""" return _solvers.copy()
[docs]def available_solvers(problem=None): """Return a sorted list of names of available solvers. :param problem: DEPRECATED """ if problem is not None: throw_deprecation_warning( "Arguments 'problem' to picos.available_solvers is deprecated.") return sorted( name for name, solver in _solvers.items() if solver.available())
# -------------------------------------- __all__ = api_end(_API_START, globals())