diff options
-rw-r--r-- | sumofsquares/abc.py | 17 | ||||
-rw-r--r-- | sumofsquares/constraints.py | 18 |
2 files changed, 34 insertions, 1 deletions
diff --git a/sumofsquares/abc.py b/sumofsquares/abc.py index 482ba7f..95eacad 100644 --- a/sumofsquares/abc.py +++ b/sumofsquares/abc.py @@ -42,10 +42,27 @@ class Constraint(ABC): def expression(self) -> Expression: """ Expression under the constraint. """ + def __str__(self): + return f"{self.__class__.__qualname__}({str(self.expression)})" + class Problem(ABC): """ Optimization Problem. """ + # --- dunder methods --- + + def __str__(self): + vs = ", ".join(map(str, self.variables)) + n = len(self.constraints) + s = f"SumOfSquares Problem ({self.__class__.__qualname__}):\n\n " \ + f"find {vs}\n minimize {self.cost}\n " \ + f"subject to ({n} constraint{'s' if n > 1 else ''})\n" + + for c in self.constraints: + s += f"\t* {str(c)}\n" + + return s + # --- Properties --- @property diff --git a/sumofsquares/constraints.py b/sumofsquares/constraints.py index 3634e61..41f2b14 100644 --- a/sumofsquares/constraints.py +++ b/sumofsquares/constraints.py @@ -1,11 +1,15 @@ +from dataclasses import dataclass from dataclassabc import dataclassabc +from typing_extensions import override +from typing import NamedTuple from polymatrix.expression.expression import Expression from .abc import Set, Constraint -class ArchimedeanSet(Set, tuple[Expression]): +@dataclass(frozen=True) +class ArchimedeanSet(Set): r""" A set that is described by the intersection of the positive loci of a finite number of polynomials (under some conditions). Roughly speaking this @@ -26,6 +30,10 @@ class ArchimedeanSet(Set, tuple[Expression]): Archimedean! It is assumed that the given :math:`g_i` make :math:`\mathbf{K}` Archimedean. """ + polynomials: tuple[Expression] + + def __str__(self): + return f"{self.__class__.__qualname__}({', '.join(map(str, self.polynomials))})" @dataclassabc(frozen=True) @@ -48,3 +56,11 @@ class NonNegative(Constraint): """ expression: Expression domain: ArchimedeanSet | None = None + + @override + def __str__(self): + s = f"{self.__class__.__qualname__} {str(self.expression)}" + if self.domain: + s += f"\n\t\t over {self.domain}" + return s + |