3#ifndef pRC_ALGORITHMS_JACOBI_ROTATION_H
4#define pRC_ALGORITHMS_JACOBI_ROTATION_H
11 requires IsValue<T> || IsComplex<T>
15 template<IsConvertible<T> R1, IsConvertible<T> R2, IsConvertible<T> R3>
19 r.makeJacobi(
x,
y,
z);
23 template<IsConvertible<T> R1, IsConvertible<T> R2>
45 template<
class X, IsTensorish R = RemoveReference<X>>
59 "JacobiRotation input 2x2 matrix is not self-adjoint.");
65 auto const &
z =
real(a(q, q));
70 template<
class X, IsTensorish R = RemoveReference<X>>
80 template<IsConvertible<T> R>
87 template<IsConvertible<T> R>
95 constexpr decltype(
auto)
c() &&
100 constexpr decltype(
auto)
c()
const &&
105 constexpr auto &
c() &
110 constexpr auto &
c() const &
115 constexpr decltype(
auto)
s() &&
120 constexpr decltype(
auto)
s()
const &&
125 constexpr auto &
s() &
130 constexpr auto &
s() const &
136 template<IsConvertible<T> R1, IsConvertible<T> R2, IsConvertible<T> R3>
137 constexpr auto makeJacobi(R1
const &
x, R2
const &
y, R3
const &
z)
147 auto const beta = (
x -
z) / denominator;
149 auto const t = [&beta, &w]()
153 return rcp(beta + w);
157 return rcp(beta - w);
171 template<IsConvertible<T> R1, IsConvertible<T> R2>
172 constexpr auto makeGivens(R1
const &
x, R2
const &
y)
195 if(
abs(
x) <= NumericLimits<Value<R>>
::min())
202 if constexpr(IsComplex<R>)
209 auto const xS =
x / x1;
211 auto const yS =
y / x1;
217 if(
x.real() <
zero())
221 mS = yS *
conj(xS) * (mC / x2);
225 auto const xS =
x / y1;
227 auto const yS =
y / y1;
230 auto const u = y1 *
sqrt(x2 + y2);
235 if(
x.real() <
zero())
246 auto const t =
y /
x;
253 auto const t =
x /
y;
267 template<
class T, Size M, Size N>
271 template<
class V,
class T, Size M, Size N>
275 template<
class T, Size N>
279 template<
class V,
class T, Size N>
283 template<
class TA,
class TB>
287 return a.
c() == b.
c() && a.
s() == b.
s();
290 template<
class TA,
class TB>
297 template<
class TA,
class TB>
317 template<
class T,
class X, IsTensorish R = RemoveReference<X>>
318 requires(R::Dimension == 2) &&
319 ((IsTensor<R> && !IsReference<X>) || IsAssignable<X>)
320 static inline constexpr decltype(
auto)
327 [&r, &
x, &
y](
auto const i)
329 auto const tX =
x(
i);
330 auto const tY =
y(
i);
331 x(
i) = r.
c() * tX +
conj(r.
s()) * tY;
332 y(
i) = -r.
s() * tX +
conj(r.
c()) * tY;
335 return forward<X>(m);
338 template<
class T,
class X, IsTensorish R = RemoveReference<X>>
339 requires(R::Dimension == 2) &&
340 ((IsTensor<R> && !IsReference<X>) || IsAssignable<X>)
341 static inline constexpr decltype(
auto)
348 [&r, &
x, &
y](
auto const i)
350 auto const tX =
x(
i);
351 auto const tY =
y(
i);
352 x(
i) = r.
c() * tX - r.
s() * tY;
356 return forward<X>(m);
359 template<
class T,
class X, IsTensorish R = RemoveReference<X>>
360 requires(R::Dimension == 1) &&
361 ((IsTensor<R> && !IsReference<X>) || IsAssignable<X>)
362 static inline constexpr decltype(
auto)
365 auto const tX = v(
p);
366 auto const tY = v(q);
368 v(
p) = r.
c() * tX +
conj(r.
s()) * tY;
369 v(q) = -r.
s() * tX +
conj(r.
c()) * tY;
371 return forward<X>(v);
374 template<
class T,
class X, IsTensorish R = RemoveReference<X>>
375 requires(R::Dimension == 1) &&
376 ((IsTensor<R> && !IsReference<X>) || IsAssignable<X>)
377 static inline constexpr decltype(
auto)
380 auto const tX = v(
p);
381 auto const tY = v(q);
383 v(
p) = r.
c() * tX - r.
s() * tY;
386 return forward<X>(v);
Definition jacobi_rotation.hpp:13
constexpr JacobiRotation()=default
constexpr JacobiRotation & operator=(JacobiRotation const &) &=default
constexpr JacobiRotation(JacobiRotation< R > const &other)
Definition jacobi_rotation.hpp:81
static constexpr auto MakeJacobi(R1 const &x, R2 const &y, R3 const &z)
Definition jacobi_rotation.hpp:16
constexpr JacobiRotation & operator=(JacobiRotation &&) &=default
static constexpr auto MakeGivens(R1 const &x, R2 const &y)
Definition jacobi_rotation.hpp:24
constexpr auto & c() &
Definition jacobi_rotation.hpp:105
constexpr decltype(auto) c() &&
Definition jacobi_rotation.hpp:95
~JacobiRotation()=default
constexpr JacobiRotation(JacobiRotation &&)=default
constexpr JacobiRotation(X &&a, Index const p, Index const q)
Definition jacobi_rotation.hpp:72
constexpr decltype(auto) s() &&
Definition jacobi_rotation.hpp:115
constexpr decltype(auto) s() const &&
Definition jacobi_rotation.hpp:120
constexpr auto & operator=(JacobiRotation< R > const &rhs) &
Definition jacobi_rotation.hpp:88
constexpr JacobiRotation(JacobiRotation const &)=default
constexpr JacobiRotation(X &&a, Index const p, Index const q)
Definition jacobi_rotation.hpp:47
constexpr JacobiRotation(T const &c, T const &s)
Definition jacobi_rotation.hpp:39
constexpr auto & s() const &
Definition jacobi_rotation.hpp:130
constexpr auto & c() const &
Definition jacobi_rotation.hpp:110
constexpr decltype(auto) c() const &&
Definition jacobi_rotation.hpp:100
constexpr auto & s() &
Definition jacobi_rotation.hpp:125
Definition sequence.hpp:29
Definition declarations.hpp:20
Definition concepts.hpp:43
int i
Definition gmock-matchers-comparisons_test.cc:603
Uncopyable z
Definition gmock-matchers-containers_test.cc:378
const double y
Definition gmock-matchers-containers_test.cc:377
int x
Definition gmock-matchers-containers_test.cc:376
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 unit()
Definition unit.hpp:13
static constexpr auto sqrt(T const &a)
Definition sqrt.hpp:11
static constexpr auto rcp(T const &b)
Definition rcp.hpp:12
Size Index
Definition basics.hpp:32
static constexpr auto sign(T const &a)
Definition sign.hpp:11
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 operator*(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:298
static constexpr auto conj(T const &a)
Definition conj.hpp:11
std::common_type_t< Ts... > Common
Definition basics.hpp:53
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 chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
static constexpr auto operator!=(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:291
constexpr auto cDebugLevel
Definition config.hpp:48
static constexpr auto range(F &&f, Xs &&...args)
Definition range.hpp:18
static constexpr auto operator==(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:284
static constexpr decltype(auto) real(X &&a)
Definition real.hpp:12
RemoveConstReference< ResultOf< Eval, ResultOf< Real, T > > > NonComplex
Definition complex.hpp:201
static constexpr auto identity()
Definition identity.hpp:13
static constexpr auto zero()
Definition zero.hpp:12
static constexpr auto mean(Xs &&...args)
Definition mean.hpp:16
static constexpr auto norm(T const &a)
Definition norm.hpp:12
static constexpr auto isSelfAdjoint(X &&a, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_self_adjoint.hpp:14