tenferro_linalg/result_types/
cotangents.rs

1use super::*;
2
3/// Cotangent (adjoint) for SVD outputs.
4///
5/// # Examples
6///
7/// ```
8/// use tenferro_linalg::SvdCotangent;
9///
10/// let cotangent = SvdCotangent::<f64> {
11///     u: None,
12///     s: None,
13///     vt: None,
14/// };
15/// assert!(cotangent.s.is_none());
16/// ```
17#[derive(Debug)]
18pub struct SvdCotangent<T: Scalar, R: Scalar = T> {
19    /// Cotangent for `u`.
20    pub u: Option<Tensor<T>>,
21    /// Cotangent for `s`.
22    pub s: Option<Tensor<R>>,
23    /// Cotangent for `vt`.
24    pub vt: Option<Tensor<T>>,
25}
26
27/// Cotangent (adjoint) for QR outputs.
28///
29/// # Examples
30///
31/// ```
32/// use tenferro_linalg::QrCotangent;
33///
34/// let cotangent = QrCotangent::<f64> { q: None, r: None };
35/// assert!(cotangent.q.is_none());
36/// ```
37#[derive(Debug)]
38pub struct QrCotangent<T: Scalar> {
39    /// Cotangent for `q`.
40    pub q: Option<Tensor<T>>,
41    /// Cotangent for `r`.
42    pub r: Option<Tensor<T>>,
43}
44
45/// Cotangent (adjoint) for LU outputs.
46///
47/// # Examples
48///
49/// ```
50/// use tenferro_linalg::LuCotangent;
51///
52/// let cotangent = LuCotangent::<f64> { l: None, u: None };
53/// assert!(cotangent.l.is_none());
54/// ```
55#[derive(Debug)]
56pub struct LuCotangent<T: Scalar> {
57    /// Cotangent for `l`.
58    pub l: Option<Tensor<T>>,
59    /// Cotangent for `u`.
60    pub u: Option<Tensor<T>>,
61}
62
63/// Cotangent (adjoint) for eigendecomposition outputs.
64///
65/// # Examples
66///
67/// ```
68/// use tenferro_linalg::EigenCotangent;
69///
70/// let cotangent = EigenCotangent::<f64> {
71///     values: None,
72///     vectors: None,
73/// };
74/// assert!(cotangent.values.is_none());
75/// ```
76#[derive(Debug)]
77pub struct EigenCotangent<T: Scalar, R: Scalar = T> {
78    /// Cotangent for eigenvalues.
79    pub values: Option<Tensor<R>>,
80    /// Cotangent for eigenvectors.
81    pub vectors: Option<Tensor<T>>,
82}
83
84/// Cotangent (adjoint) for general eigendecomposition outputs.
85///
86/// # Examples
87///
88/// ```
89/// use tenferro_linalg::EigCotangent;
90///
91/// let cotangent = EigCotangent::<f64> {
92///     values: None,
93///     vectors: None,
94/// };
95/// assert!(cotangent.vectors.is_none());
96/// ```
97#[derive(Debug)]
98pub struct EigCotangent<R: LinalgScalar<Real = R> + num_traits::Float> {
99    /// Cotangent for eigenvalues.
100    pub values: Option<Tensor<num_complex::Complex<R>>>,
101    /// Cotangent for eigenvectors.
102    pub vectors: Option<Tensor<num_complex::Complex<R>>>,
103}
104
105/// Cotangent (adjoint) for slogdet outputs.
106///
107/// # Examples
108///
109/// ```
110/// use tenferro_linalg::SlogdetCotangent;
111///
112/// let cotangent = SlogdetCotangent::<f64> {
113///     sign: None,
114///     logabsdet: None,
115/// };
116/// assert!(cotangent.sign.is_none());
117/// ```
118#[derive(Debug)]
119pub struct SlogdetCotangent<T: Scalar, R: Scalar = T> {
120    /// Cotangent for `sign`.
121    pub sign: Option<Tensor<T>>,
122    /// Cotangent for `logabsdet`.
123    pub logabsdet: Option<Tensor<R>>,
124}