1#ifndef TATOOINE_TENSOR_OPERATIONS_SINGULAR_VALUES_H
2#define TATOOINE_TENSOR_OPERATIONS_SINGULAR_VALUES_H
6template <
typename Tensor,
typename T,
size_t M,
size_t N>
9 return lapack::gesvd(A, lapack::job::A, lapack::job::A);
12template <
typename Tensor,
typename T,
size_t M,
size_t N>
16 return lapack::gesvd(A, lapack::job::S, lapack::job::S);
19template <
typename Tensor,
typename T,
size_t M,
size_t N>
24template <
typename Tensor,
typename T,
size_t M,
size_t N>
28 return lapack::gesvd(A, lapack::job::A, lapack::job::N);
31template <
typename Tensor,
typename T,
size_t M,
size_t N>
35 return lapack::gesvd(A, lapack::job::S, lapack::job::N);
38template <
typename Tensor,
typename T,
size_t M,
size_t N>
43template <
typename Tensor,
typename T,
size_t M,
size_t N>
47 return lapack::gesvd(A, lapack::job::N, lapack::job::A);
50template <
typename Tensor,
typename T,
size_t M,
size_t N>
54 return lapack::gesvd(A, lapack::job::N, lapack::job::S);
57template <
typename Tensor,
typename T,
size_t M,
size_t N>
62template <
typename Tensor,
typename T>
64 auto const a = A(0, 0);
65 auto const b = A(0, 1);
66 auto const c = A(1, 0);
67 auto const d = A(1, 1);
69 auto const aa = a * a;
70 auto const bb = b * b;
71 auto const cc = c * c;
72 auto const dd = d * d;
73 auto const s1 = aa + bb + cc + dd;
74 auto const s2 = std::sqrt((aa + bb - cc - dd) * (aa + bb - cc - dd) +
75 4 * (a * c + b * d) * (a * c + b * d));
76 auto const sigma1 = std::sqrt((s1 + s2) / 2);
77 auto const sigma2 = std::sqrt((s1 - s2) / 2);
81template <
typename T,
size_t M,
size_t N>
83 if constexpr (M == 2 && N == 2) {
86 return gesvd(A, lapack::job::N, lapack::job::N);
90template <
typename Tensor,
typename T,
size_t M,
size_t N>
92 if constexpr (M == 2 && N == 2) {
96 return lapack::gesvd(A, lapack::job::N, lapack::job::N);
static constexpr full_t full
Definition: tags.h:81
Definition: algorithm.h:6
constexpr auto singular_values(tensor< T, M, N > &&A)
Definition: singular_values.h:82
constexpr auto singular_values22(base_tensor< Tensor, T, 2, 2 > const &A)
Definition: singular_values.h:63
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
constexpr auto min(A &&a, B &&b)
Definition: math.h:15
auto svd_right(base_tensor< Tensor, T, M, N > const &A_base, tag::full_t[> tag<])
Definition: singular_values.h:44
auto svd(base_tensor< Tensor, T, M, N > const &A_base, tag::full_t[> tag<])
Definition: singular_values.h:7
auto svd_left(base_tensor< Tensor, T, M, N > const &A_base, tag::full_t[> tag<])
Definition: singular_values.h:25
Definition: base_tensor.h:23