3#ifndef pRC_ALGORITHMS_SVD_H
4#define pRC_ALGORITHMS_SVD_H
13 template<
class X, IsTensorish R = RemoveReference<X>>
14 requires IsFloat<Value<R>> && (R::Dimension == 2)
15 static inline constexpr auto svd(X &&input)
17 using T =
typename R::Type;
18 constexpr auto M = R::size(0);
19 constexpr auto N = R::size(1);
20 constexpr auto D =
min(M, N);
30 auto &u = get<0>(result);
31 auto &s = get<1>(result);
32 auto &v = get<2>(result);
41 else if constexpr(M > N)
43 tie(u, a) =
qr(input / scale);
46 else if constexpr(M < N)
55 auto const updateMaxDiagEntry =
56 [](
auto const &a,
Index const p,
Index const q,
auto const &old)
61 auto const threshold = [](
auto const &diag)
68 Bool finished =
false;
75 for(
Index q = 0; q <
p; ++q)
78 threshold(maxDiagEntry))
94 auto const z =
abs(a(
p, q)) / a(
p, q);
109 auto const z =
abs(a(
p, q)) / a(
p, q);
117 auto const z =
abs(a(q, q)) / a(q, q);
123 updateMaxDiagEntry(a,
p, q, maxDiagEntry);
126 threshold(maxDiagEntry))
134 m(1, 0) =
real(a(q,
p));
135 m(0, 1) =
real(a(
p, q));
136 m(1, 1) =
real(a(q, q));
138 auto const t = m(0, 0) + m(1, 1);
139 auto const d = m(1, 0) - m(0, 1);
145 auto const jLeft = rot *
transpose(jRight);
153 updateMaxDiagEntry(a,
p, q, maxDiagEntry);
160 [&a, &u, &s](
auto const i)
191 if(s(iMax) ==
zero())
221 "SVD decomposition failed: Found negative singular "
229 template<Size C,
class X, IsTensorish R = RemoveReference<X>,
230 IsFloat V = Value<R>, IsFloat VT = V>
231 requires(R::Dimension == 2) && (C <
reduce<Min>(
typename R::Sizes()))
232 static inline constexpr auto svd(X &&input,
235 auto const [fU, fS, fV] =
svd(forward<X>(input));
237 constexpr auto M =
decltype(fU)::size(0);
238 constexpr auto D =
decltype(fS)::size();
239 constexpr auto N =
decltype(fV)::size(0);
247 auto &u = get<0>(result);
248 auto &s = get<1>(result);
249 auto &v = get<2>(result);
251 if(sError >
square(tolerance) * sNorm)
263 for(
Index k = C; k != 0;)
280 template<Size C,
class X, IsTensorish R = RemoveReference<X>,
281 IsFloat V = Value<R>, IsFloat VT = V>
282 requires(R::Dimension == 2) && (C ==
reduce<Min>(
typename R::Sizes()))
283 static inline constexpr auto svd(X &&input,
286 auto result =
svd(forward<X>(input));
287 auto &u = get<0>(result);
288 auto &s = get<1>(result);
289 auto &v = get<2>(result);
294 for(
Index k = C; k != 0;)
pRC::Size const D
Definition CalculatePThetaTests.cpp:9
Definition jacobi_rotation.hpp:13
static constexpr auto MakeGivens(R1 const &x, R2 const &y)
Definition jacobi_rotation.hpp:24
Definition complex.hpp:197
int i
Definition gmock-matchers-comparisons_test.cc:603
Uncopyable z
Definition gmock-matchers-containers_test.cc:378
const char * p
Definition gmock-matchers-containers_test.cc:379
static void error(Xs &&...args)
Definition log.hpp:14
Definition cholesky.hpp:10
static constexpr auto svd(X &&input)
Definition svd.hpp:15
static constexpr auto sqrt(T const &a)
Definition sqrt.hpp:11
Size Index
Definition basics.hpp:32
std::tuple< Ts... > Tuple
Definition basics.hpp:23
static constexpr decltype(auto) apply(JacobiRotation< T > const &r, X &&m, Index const p, Index const q)
Definition jacobi_rotation.hpp:321
JacobiRotation(Tensor< T, M, N > const &a, Index const p, Index const q) -> JacobiRotation< T >
static constexpr auto qr(X &&input)
Definition qr.hpp:13
static constexpr auto fromDiagonal(X &&a)
Definition from_diagonal.hpp:17
static constexpr auto slice(X &&a, Os const ... offsets)
Definition slice.hpp:17
static constexpr auto conj(T const &a)
Definition conj.hpp:11
static constexpr auto transpose(JacobiRotation< T > const &a)
Definition jacobi_rotation.hpp:306
static constexpr auto abs(T const &a)
Definition abs.hpp:11
typename ValueType< T >::Type Value
Definition value.hpp:72
static constexpr auto adjoint(JacobiRotation< T > const &a)
Definition jacobi_rotation.hpp:312
static constexpr decltype(auto) min(X &&a)
Definition min.hpp:13
static constexpr auto reduce(Sequence< T, I1, I2, Is... > const)
Definition sequence.hpp:458
static constexpr auto swap(XA &&a, XB &&b)
Definition swap.hpp:20
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
static constexpr auto extractDiagonal(X &&a)
Definition extract_diagonal.hpp:16
static constexpr auto isApprox(XE &&expected, XA &&approx, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_approx.hpp:14
constexpr auto cDebugLevel
Definition config.hpp:48
static constexpr auto range(F &&f, Xs &&...args)
Definition range.hpp:18
static constexpr decltype(auto) real(X &&a)
Definition real.hpp:12
static constexpr auto isUnitary(X &&a, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_unitary.hpp:14
static constexpr auto square(T const &a)
Definition square.hpp:11
static constexpr decltype(auto) imag(X &&a)
Definition imag.hpp:12
static constexpr auto identity()
Definition identity.hpp:13
static constexpr auto zero()
Definition zero.hpp:12
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12
static constexpr auto norm(T const &a)
Definition norm.hpp:12
static constexpr decltype(auto) max(X &&a)
Definition max.hpp:13
Definition gtest_pred_impl_unittest.cc:54