summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sumofsquares/canon.py25
1 files changed, 22 insertions, 3 deletions
diff --git a/sumofsquares/canon.py b/sumofsquares/canon.py
index 17ad187..3cde57d 100644
--- a/sumofsquares/canon.py
+++ b/sumofsquares/canon.py
@@ -14,7 +14,7 @@ from polymatrix.statemonad import init_state_monad
from polymatrix.polymatrix.mixins import PolyMatrixMixin
from polymatrix.variable import Variable
-from .abc import Constraint, Result
+from .abc import Problem, Solver, Constraint, Result
from .constraints import NonNegative, PositiveSemiDefinite, ExponentialCone
from .error import AlgebraicError
from .problems import SOSProblem, InternalSOSProblem
@@ -22,7 +22,7 @@ from .variable import OptVariable, from_name as opt_variable_from_name
from .utils import partition
-class Canonicalization:
+class Canonicalization(Problem):
"""
Transform a problem into another problem.
"""
@@ -31,7 +31,6 @@ class Canonicalization:
s = f"Apply canonicalization procedure {self.__class__.__qualname__} to\n"
return s + str(self.problem)
- @abstractmethod
def __call__(self, problem : SOSProblem | None = None) -> SOSProblem:
# TODO: is this a good idea? probably not but I don't want to introduce
# a new type of class for "horizontal" function in the commutative
@@ -48,12 +47,32 @@ class Canonicalization:
without having to apply the state. I.e. it is not stateful in the
problem.
"""
+ raise NotImplementedError
+
+ @property
+ @override
+ def cost(self) -> Expression:
+ # TODO: error message
+ raise AttributeError
+
+ @property
+ @override
+ def constraints(self) -> Expression:
+ # TODO: error message
+ raise AttributeError
+
+ @property
+ @override
+ def solver(self) -> Solver:
+ # TODO: error message
+ raise AttributeError
@property
@abstractmethod
def problem(self) -> SOSProblem:
""" The problem that will be canonicalized """
+ @override
def solve(self, verbose: bool = False, state: ExpressionState | None = None) -> Result:
if state is None:
state = poly.make_state()