1
0
forked from HQU-gxy/CVTH3PE
Files
CVTH3PE/app/solver/_cvxopt_wrap/__init__.py
crosstyan 6034175a10 refactor: Migrate solver module to use CVXOPT wrapper
- Rename `_wrap` to `_cvx_opt_wrap` for consistency
- Update import paths in solver module
- Add type hints to `solution_mat_clusters` method
- Improve type annotations in `solve` method
2025-03-03 17:40:05 +08:00

185 lines
4.5 KiB
Python

"""
See also:
https://github.com/cvxopt/cvxopt/blob/master/src/C/base.c
"""
from typing import (
Any,
BinaryIO,
Generic,
Literal,
Optional,
Protocol,
Sequence,
Tuple,
TypeVar,
Union,
overload,
)
import numpy as np
from cvxopt import matrix as cvxopt_matrix
from cvxopt import sparse as cvxopt_sparse
from cvxopt import spmatrix as cvxopt_spmatrix
from numpy.typing import NDArray
from typing_extensions import Self, TypeAlias
Typecode: TypeAlias = Literal["i", "d", "z"]
# Integer sparse matrices are not implemented.
SparseTypecode: TypeAlias = Literal["d", "z"]
DenseT = TypeVar("DenseT", int, float, complex)
SparseT = TypeVar("SparseT", float, complex)
IndexType = Union[int, slice, Sequence[int], "Matrix[int]"]
class Matrix(Generic[DenseT], Protocol):
"""
cvxopt.matrix interface
"""
@property
def size(self) -> Tuple[int, int]: ...
@property
def typecode(self) -> Typecode: ...
def __mul__(self, other): ...
def __add__(self, other): ...
def __sub__(self, other): ...
def __truediv__(self, other): ...
def __mod__(self, other): ...
def __len__(self) -> int: ...
def transpose(self) -> Self: ...
def ctrans(self) -> Self: ...
def real(self) -> "Matrix[float]": ...
def imag(self) -> "Matrix[float]": ...
def tofile(self, f: BinaryIO) -> None: ...
def fromfile(self, f: BinaryIO) -> None: ...
def __getitem__(
self, index: Union[IndexType, Tuple[IndexType, IndexType]]
) -> Union[DenseT, Self]: ...
def __setitem__(
self,
index: Union[IndexType, Tuple[IndexType, IndexType]],
value: Union[DenseT, "Matrix[Any]"],
) -> None: ...
@overload
def matrix(
data: Any, size: Optional[Tuple[int, int]] = None, tc: Typecode = "d"
) -> Matrix[float]: ...
@overload
def matrix(
data: Any, size: Optional[Tuple[int, int]] = None, tc: Typecode = "i"
) -> Matrix[int]: ...
@overload
def matrix(
data: Any, size: Optional[Tuple[int, int]] = None, tc: Typecode = "z"
) -> Matrix[complex]: ...
def matrix(data: Any, size: Optional[Tuple[int, int]] = None, tc: Typecode = "d"):
if size is None:
return cvxopt_matrix(data, tc=tc)
return cvxopt_matrix(data, size=size, tc=tc)
class SparseMatrix(Generic[SparseT], Protocol):
"""
cvxopt.spmatrix interface
"""
@property
def size(self) -> Tuple[int, int]: ...
@property
def typecode(self) -> Typecode: ...
@property
def V(self) -> "Matrix[SparseT]": ...
@property
def I(self) -> "Matrix[int]": ...
@property
def J(self) -> "Matrix[int]": ...
@property
def CCS(self) -> "Matrix[int]": ...
def __mul__(self, other): ...
def __add__(self, other): ...
def __sub__(self, other): ...
def __truediv__(self, other): ...
def __mod__(self, other): ...
def __len__(self) -> int: ...
def transpose(self) -> Self: ...
def ctrans(self) -> Self: ...
def real(self) -> "Matrix[float]": ...
def imag(self) -> "Matrix[float]": ...
def tofile(self, f: BinaryIO) -> None: ...
def fromfile(self, f: BinaryIO) -> None: ...
def __getitem__(
self, index: Union[IndexType, Tuple[IndexType, IndexType]]
) -> Union[DenseT, Self]: ...
def __setitem__(
self,
index: Union[IndexType, Tuple[IndexType, IndexType]],
value: Union[DenseT, "Matrix[Any]"],
) -> None: ...
@overload
def spmatrix(
x: Union[Sequence[float], float, Matrix[float], NDArray[np.floating[Any]]],
I: Union[Sequence[int], NDArray[np.int_]],
J: Union[Sequence[int], NDArray[np.int_]],
size: Optional[Tuple[int, int]] = None,
tc: SparseTypecode = "d",
) -> SparseMatrix[float]: ...
@overload
def spmatrix(
x: Union[
Sequence[complex], complex, Matrix[complex], NDArray[np.complexfloating[Any]]
],
I: Union[Sequence[int], NDArray[np.int_]],
J: Union[Sequence[int], NDArray[np.int_]],
size: Optional[Tuple[int, int]] = None,
tc: SparseTypecode = "z",
) -> SparseMatrix[complex]: ...
def spmatrix(
x: Any,
I: Any,
J: Any,
size: Optional[Tuple[int, int]] = None,
tc: SparseTypecode = "d",
):
if size is None:
return cvxopt_spmatrix(x, I, J, tc=tc)
return cvxopt_spmatrix(x, I, J, size=size, tc=tc)
@overload
def sparse(x: Any, tc: SparseTypecode = "d") -> SparseMatrix[float]: ...
@overload
def sparse(x: Any, tc: SparseTypecode = "z") -> SparseMatrix[complex]: ...
def sparse(x: Any, tc: SparseTypecode = "d"):
return cvxopt_sparse(x, tc=tc)