Coverage for src/cvx/linalg/__init__.py: 100%
48 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-15 07:08 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-15 07:08 +0000
1"""Linear algebra utilities for risk models.
3This subpackage provides linear algebra utilities commonly used in risk modeling,
4including Cholesky decomposition, Principal Component Analysis, matrix norms,
5linear-system solving, and matrix validation.
7Example:
8 >>> import numpy as np
9 >>> from cvx.linalg import a_norm, cholesky, eigh, inv_a_norm, pca, qr, rand_cov, solve, svd, valid
10 >>> # Cholesky decomposition
11 >>> cov = np.array([[4.0, 2.0], [2.0, 5.0]])
12 >>> R = cholesky(cov)
13 >>> np.allclose(R.T @ R, cov)
14 True
16Functions:
17 a_norm: Compute the matrix norm of a vector
18 check_and_warn_condition: Compute the condition number and warn if ill-conditioned
19 cholesky: Compute upper triangular Cholesky decomposition
20 cholesky_solve: Solve a linear system via Cholesky with LU fallback
21 cond: Return the condition number of a matrix (NaN-aware)
22 cov_to_corr: Convert a covariance matrix to a correlation matrix
23 det: Compute the determinant of a square matrix
24 eigvals: Compute eigenvalues of a general square matrix
25 eigh: Compute eigenvalues and eigenvectors of a symmetric/Hermitian matrix
26 eigvalsh: Compute eigenvalues of a symmetric/Hermitian matrix
27 inv: Invert a matrix with NaN-aware matrix filtering and condition-number guarding
28 inv_a_norm: Compute the inverse matrix norm of a vector
29 is_positive_definite: Test whether a matrix is positive definite
30 lstsq: Solve least-squares problems with NaN-aware row filtering
31 norm: Compute the norm of a vector or matrix, ignoring non-finite entries
32 pca: Compute principal components of return data
33 power_iteration: Estimate the dominant eigenpair of a symmetric matrix
34 qr: Compute reduced QR decomposition of a matrix
35 rand_cov: Generate a random positive semi-definite covariance matrix
36 solve: Solve linear systems with NaN-aware matrix filtering
37 svd: Compute compact singular value decomposition
38 svd_k: Compute the truncated rank-k singular value decomposition
39 valid: Extract valid submatrix from a matrix with NaN values
40 warn_ill_conditioned: Emit an IllConditionedMatrixWarning for a condition number
42Operators:
43 SymmetricOperator: Protocol exposing a symmetric matrix through block products and a free-block solve
44 DenseOperator: SymmetricOperator backed by an explicit dense matrix
45 GramOperator: SymmetricOperator A = M.T @ M represented by its factor M (matrix-free)
46 FactorOperator: Diagonal-plus-low-rank SymmetricOperator with Woodbury free-block solves
47 IncrementalDenseOperator: DenseOperator maintaining the free-block inverse across single-index flips
48 SumOperator: Weighted sum of symmetric operators (forward-only; feed apply_free to a Krylov solver)
50Constrained solves:
51 bordered_solve: Range-space (Schur complement) solve of a bordered KKT system over a SymmetricOperator
52 AffineProjection: Euclidean projection onto the affine set {x : C x = d}, caching the Gram matrix
54Types:
55 Matrix: Type alias for a 2-D NumPy array
56 Vector: Type alias for a 1-D NumPy array
57 SupportsMatvec: Structural protocol for a matrix-free operator (exposes n and matvec)
59Exceptions:
60 DimensionMismatchError: Raised when operand dimensions are incompatible
61 InvalidComponentsError: Raised when the requested number of components is invalid
62 NegativeWarmupError: Raised when an EWM warmup period is negative
63 NonIntegerWarmupError: Raised when an EWM warmup period is not an integer
64 NonSquareMatrixError: Raised when a square matrix is required but not given
65 NotAMatrixError: Raised when an input is not a 2-D matrix
66 SingularMatrixError: Raised when a matrix is singular and cannot be inverted/solved
68Warnings:
69 IllConditionedMatrixWarning: Emitted when a matrix is ill-conditioned
71Constants:
72 DEFAULT_COND_THRESHOLD: Default condition-number threshold for ill-conditioning checks
74"""
76from importlib.metadata import PackageNotFoundError, version
78from .core import DEFAULT_COND_THRESHOLD as DEFAULT_COND_THRESHOLD
79from .core import DimensionMismatchError as DimensionMismatchError
80from .core import IllConditionedMatrixWarning as IllConditionedMatrixWarning
81from .core import InvalidComponentsError as InvalidComponentsError
82from .core import Matrix as Matrix
83from .core import NegativeWarmupError as NegativeWarmupError
84from .core import NonIntegerWarmupError as NonIntegerWarmupError
85from .core import NonSquareMatrixError as NonSquareMatrixError
86from .core import NotAMatrixError as NotAMatrixError
87from .core import SingularMatrixError as SingularMatrixError
88from .core import SupportsMatvec as SupportsMatvec
89from .core import Vector as Vector
90from .core import check_and_warn_condition as check_and_warn_condition
91from .core import cond as cond
92from .core import valid as valid
93from .core import warn_ill_conditioned as warn_ill_conditioned
94from .covariance import cov_to_corr as cov_to_corr
95from .covariance import pca as pca
96from .covariance import rand_cov as rand_cov
97from .decomposition import cholesky as cholesky
98from .decomposition import cholesky_solve as cholesky_solve
99from .decomposition import eigh as eigh
100from .decomposition import eigvals as eigvals
101from .decomposition import eigvalsh as eigvalsh
102from .decomposition import is_positive_definite as is_positive_definite
103from .decomposition import power_iteration as power_iteration
104from .decomposition import qr as qr
105from .decomposition import svd as svd
106from .decomposition import svd_k as svd_k
107from .kkt import AffineProjection as AffineProjection
108from .kkt import bordered_solve as bordered_solve
109from .norm import a_norm as a_norm
110from .norm import inv_a_norm as inv_a_norm
111from .norm import norm as norm
112from .operators import DenseOperator as DenseOperator
113from .operators import FactorOperator as FactorOperator
114from .operators import GramOperator as GramOperator
115from .operators import IncrementalDenseOperator as IncrementalDenseOperator
116from .operators import SumOperator as SumOperator
117from .operators import SymmetricOperator as SymmetricOperator
118from .solve import det as det
119from .solve import inv as inv
120from .solve import lstsq as lstsq
121from .solve import solve as solve
123__all__ = [
124 "DEFAULT_COND_THRESHOLD",
125 "AffineProjection",
126 "DenseOperator",
127 "DimensionMismatchError",
128 "FactorOperator",
129 "GramOperator",
130 "IllConditionedMatrixWarning",
131 "IncrementalDenseOperator",
132 "InvalidComponentsError",
133 "Matrix",
134 "NegativeWarmupError",
135 "NonIntegerWarmupError",
136 "NonSquareMatrixError",
137 "NotAMatrixError",
138 "SingularMatrixError",
139 "SumOperator",
140 "SupportsMatvec",
141 "SymmetricOperator",
142 "Vector",
143 "a_norm",
144 "bordered_solve",
145 "check_and_warn_condition",
146 "cholesky",
147 "cholesky_solve",
148 "cond",
149 "cov_to_corr",
150 "det",
151 "eigh",
152 "eigvals",
153 "eigvalsh",
154 "inv",
155 "inv_a_norm",
156 "is_positive_definite",
157 "lstsq",
158 "norm",
159 "pca",
160 "power_iteration",
161 "qr",
162 "rand_cov",
163 "solve",
164 "svd",
165 "svd_k",
166 "valid",
167 "warn_ill_conditioned",
168]
170try:
171 __version__ = version("cvx-linalg")
172except PackageNotFoundError: # pragma: no cover
173 __version__ = "0.0.0"