cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
scale.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_TENSOR_TRAIN_COMMON_FUNCTIONS_SCALE_H
4#define pRC_TENSOR_TRAIN_COMMON_FUNCTIONS_SCALE_H
5
12
13namespace pRC
14{
15 template<class XA, class XB, class RA = RemoveReference<XA>,
16 class RB = RemoveReference<XB>>
17 requires(TensorTrain::IsTensorish<RA> ||
18 TensorTrain::IsOperatorish<RA>) &&
19 (IsValue<RB> || IsComplex<RB>) &&
20 IsInvocable<Mul, typename RA::Type, RB const &>
21 static inline constexpr auto operator*(XA &&a, XB &&b)
22 {
23 return enumerate(
24 [lambda = pow(abs(b), rcp(unit<RB>(RA::Dimension))),
25 sgn = sign(b)]<Index C>(auto &&a)
26 {
27 if constexpr(C == 0)
28 {
29 return forward<decltype(a)>(a) * sgn * lambda;
30 }
31 else
32 {
33 return forward<decltype(a)>(a) * lambda;
34 }
35 },
36 forward<XA>(a));
37 }
38
39 template<class XA, class XB, class RA = RemoveReference<XA>,
40 class RB = RemoveReference<XB>>
41 requires(IsValue<RA> || IsComplex<RA>) &&
42 (TensorTrain::IsTensorish<RB> || TensorTrain::IsOperatorish<RB>) &&
43 IsInvocable<Mul, RA const &, typename RB::Type>
44 static inline constexpr auto operator*(XA &&a, XB &&b)
45 {
46 return forward<XB>(b) * forward<XA>(a);
47 }
48
49 template<class XA, class XB, class RA = RemoveReference<XA>,
50 class RB = RemoveReference<XB>>
51 requires(TensorTrain::IsTensorish<RA> ||
52 TensorTrain::IsOperatorish<RA>) &&
53 (IsValue<RB> || IsComplex<RB>) &&
54 IsInvocable<Div, typename RA::Type, RB const &>
55 static inline constexpr auto operator/(XA &&a, XB &&b)
56 {
58
59 return forward<XA>(a) * rcp(cast<Value<T>>(forward<XB>(b)));
60 }
61
62 template<class XA, class XB, class RA = RemoveReference<XA>,
63 class RB = RemoveReference<XB>>
64 requires(TensorTrain::IsTensorish<RA> ||
65 TensorTrain::IsOperatorish<RA>) &&
66 IsTensorish<RB> && IsInvocable<Mul, XA, typename RB::Type>
67 static inline constexpr auto operator*(XA &&a, XB &&b)
68 {
69 return forward<XA>(a) * forward<XB>(b)();
70 }
71
72 template<class XA, class XB, class RA = RemoveReference<XA>,
73 class RB = RemoveReference<XB>>
74 requires IsTensorish<RA> &&
75 (TensorTrain::IsTensorish<RB> || TensorTrain::IsOperatorish<RB>) &&
76 IsInvocable<Mul, typename RA::Type, XB>
77 static inline constexpr auto operator*(XA &&a, XB &&b)
78 {
79 return forward<XA>(a)() * forward<XB>(b);
80 }
81
82 template<class XA, class XB, class RA = RemoveReference<XA>,
83 class RB = RemoveReference<XB>>
84 requires(TensorTrain::IsTensorish<RA> ||
85 TensorTrain::IsOperatorish<RA>) &&
86 IsTensorish<RB> && IsInvocable<Div, XA, typename RB::Type>
87 static inline constexpr auto operator/(XA &&a, XB &&b)
88 {
89 return forward<XA>(a) / forward<XB>(b)();
90 }
91}
92#endif // pRC_TENSOR_TRAIN_COMMON_FUNCTIONS_SCALE_H
Definition value.hpp:12
Definition cholesky.hpp:10
static constexpr auto unit()
Definition unit.hpp:13
static constexpr auto cast(T const &a)
Definition cast.hpp:11
static constexpr auto rcp(T const &b)
Definition rcp.hpp:12
Size Index
Definition basics.hpp:32
std::invoke_result_t< F, Args... > ResultOf
Definition basics.hpp:59
static constexpr auto sign(T const &a)
Definition sign.hpp:11
static constexpr auto operator*(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:298
static constexpr auto abs(T const &a)
Definition abs.hpp:11
static constexpr auto pow(X const &x, Y const &y)
Definition pow.hpp:11
typename ValueType< T >::Type Value
Definition value.hpp:72
static constexpr auto enumerate(F &&f, Xs &&...args)
Definition enumerate.hpp:21
static constexpr auto operator/(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:179