# Source code for picos.solvers.solver_smcp

```
# coding: utf-8
# ------------------------------------------------------------------------------
# Copyright (C) 2017 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/>.
# ------------------------------------------------------------------------------
"""Implementation of :class:`SMCPSolver`."""
# ------------------------------------------------------------------------------
# This file is a skeleton implementation for the SMCP solver.
# Currently, the funcional implementation is found in CVXOPTSolver.
# ------------------------------------------------------------------------------
from ..apidoc import api_end, api_start
from ..compat import assert_import_exists
from ..constraints import AffineConstraint, LMIConstraint
from ..expressions import CONTINUOUS_VARTYPES, AffineExpression
from ..modeling.footprint import Specification
from .solver import Solver
from .solver_cvxopt import CVXOPTSolver
_API_START = api_start(globals())
# -------------------------------
[docs]class SMCPSolver(CVXOPTSolver):
"""Interface to the SMCP solver.
Most of the logic is implemented in the
:class:`CVXOPTSolver <picos.solvers.solver_cvxopt.CVXOPTSolver>` base class.
"""
SUPPORTED = Specification.compile(
directions=Specification.ALL,
objectives=[
AffineExpression],
variables=CONTINUOUS_VARTYPES,
constraints=[
AffineConstraint,
# TODO: See below.
# SOCConstraint,
# RSOCConstraint,
LMIConstraint])
[docs] @classmethod
def supports(cls, footprint):
"""Implement :meth:`~.solver.Solver.supports`."""
if not Solver.supports(footprint):
return False
# TODO: SMCP formally supports problems that are not SDPs, but it is
# known to perform poorly for them, sometimes even returning
# incorrect solutions. For now, only support SDPs.
if not ("con", LMIConstraint) in footprint:
return False
return footprint << cls.SUPPORTED
[docs] @classmethod
def default_penalty(cls):
"""Implement :meth:`~.solver.Solver.default_penalty`."""
return 2.0 # Experimental free/open source solver.
[docs] @classmethod
def test_availability(cls):
"""Implement :meth:`~.solver.Solver.test_availability`."""
assert_import_exists("smcp")
[docs] @classmethod
def names(cls):
"""Implement :meth:`~.solver.Solver.names`."""
return "smcp", "SMCP", "Sparse Matrix Cone Program Solver"
@property
def is_smcp(self):
"""Whether to implement SMCP instead of CVXOPT."""
return True
# --------------------------------------
__all__ = api_end(_API_START, globals())
```