tenferro_linalg/result_types/
spectral.rs

1use super::*;
2
3/// Eigendecomposition result: `A * V = V * diag(values)`.
4///
5/// Only valid for square matrices.
6///
7/// # Examples
8///
9/// ```
10/// use tenferro_device::LogicalMemorySpace;
11/// use tenferro_linalg::eigen;
12/// use tenferro_prims::CpuContext;
13/// use tenferro_tensor::{MemoryOrder, Tensor};
14///
15/// let mut ctx = CpuContext::new(1);
16/// let a = Tensor::<f64>::zeros(
17///     &[3, 3],
18///     LogicalMemorySpace::MainMemory,
19///     MemoryOrder::ColumnMajor,
20/// ).unwrap();
21/// let result = eigen(&mut ctx, &a).unwrap();
22/// assert_eq!(result.values.dims(), &[3]);
23/// ```
24#[derive(Debug)]
25pub struct EigenResult<T: Scalar, R: Scalar = T> {
26    /// Eigenvalues.
27    pub values: Tensor<R>,
28    /// Right eigenvectors stored by columns.
29    pub vectors: Tensor<T>,
30}
31
32/// Result of general eigendecomposition (always complex-valued).
33///
34/// # Examples
35///
36/// ```
37/// use tenferro_device::LogicalMemorySpace;
38/// use tenferro_linalg::{eig, EigResult};
39/// use tenferro_prims::CpuContext;
40/// use tenferro_tensor::{MemoryOrder, Tensor};
41///
42/// let mut ctx = CpuContext::new(1);
43/// let a = Tensor::<f64>::zeros(
44///     &[3, 3],
45///     LogicalMemorySpace::MainMemory,
46///     MemoryOrder::ColumnMajor,
47/// ).unwrap();
48/// let result: EigResult<f64> = eig(&mut ctx, &a).unwrap();
49/// assert_eq!(result.vectors.dims(), &[3, 3]);
50/// ```
51#[derive(Debug)]
52pub struct EigResult<R: LinalgScalar<Real = R> + num_traits::Float> {
53    /// Complex eigenvalues.
54    pub values: Tensor<num_complex::Complex<R>>,
55    /// Complex right eigenvectors.
56    pub vectors: Tensor<num_complex::Complex<R>>,
57}
58
59/// Norm kind for [`crate::norm`].
60///
61/// # Examples
62///
63/// ```
64/// use tenferro_linalg::NormKind;
65///
66/// let fro = NormKind::Fro;
67/// let lp = NormKind::Lp(3.0);
68/// assert!(matches!(fro, NormKind::Fro));
69/// assert!(matches!(lp, NormKind::Lp(_)));
70/// ```
71#[derive(Debug, Clone, Copy)]
72pub enum NormKind {
73    /// Frobenius norm or vector L2 norm.
74    Fro,
75    /// Nuclear norm.
76    Nuclear,
77    /// Spectral norm.
78    Spectral,
79    /// L1 norm.
80    L1,
81    /// Infinity norm.
82    Inf,
83    /// General Lp norm.
84    Lp(f64),
85}
86
87/// Vector norm order for [`crate::vector_norm`]-style public surfaces.
88#[derive(Debug, Clone, Copy, PartialEq)]
89pub enum VectorNormOrd {
90    /// General vector p-norm.
91    P(f64),
92    /// Zero-"norm" / count of nonzero entries.
93    Zero,
94    /// Positive infinity norm.
95    PosInf,
96    /// Negative infinity norm.
97    NegInf,
98}
99
100/// Matrix norm order for [`crate::matrix_norm`]-style public surfaces.
101#[derive(Debug, Clone, Copy, PartialEq, Eq)]
102pub enum MatrixNormOrd {
103    /// Frobenius norm.
104    Fro,
105    /// Nuclear norm.
106    Nuc,
107    /// Induced matrix 1-norm.
108    One,
109    /// Minimum column-sum norm.
110    NegOne,
111    /// Spectral norm.
112    Two,
113    /// Smallest singular value norm.
114    NegTwo,
115    /// Infinity norm.
116    PosInf,
117    /// Minimum row-sum norm.
118    NegInf,
119}