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}