Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
scalar.h
Go to the documentation of this file.
1#ifndef SCALAR_H
2#define SCALAR_H
3
4#include <cmath>
5#include "Utils.h"
6#include "Logger.h"
7
8template <class T>
9std::enable_if_t<not std::numeric_limits<T>::is_integer, bool> fpeq(T, T, std::size_t n=10);
10
11class scalar_t : public complex_t {
12public:
13 constexpr scalar_t(double re = 0.0, double im = 0.0) : complex_t(re, im) {};
15
16 scalar_t(const scalar_t& k);
17 scalar_t& operator=(const scalar_t& k);
18 scalar_t(scalar_t&& k) = default;
19 scalar_t& operator=(scalar_t&& k) = default;
20
21 operator double() const;
22
23 scalar_t operator-() const;
24
25 template<typename T>
26 requires std::convertible_to<T, std::complex<double>>
27 scalar_t& operator+=(const T& rhs);
28
29 friend scalar_t operator+(scalar_t lhs, const scalar_t& rhs);
30
31 template<typename T>
32 requires std::convertible_to<T, std::complex<double>>
33 friend scalar_t operator+(scalar_t lhs, const T& rhs);
34
35 template<typename T>
36 requires std::convertible_to<T, std::complex<double>>
37 friend scalar_t operator+(T lhs, const scalar_t& rhs);
38
39 template<typename T>
40 requires std::convertible_to<T, std::complex<double>>
41 scalar_t& operator-=(const T& rhs);
42
43 friend scalar_t operator-(scalar_t lhs, const scalar_t& rhs);
44
45 template<typename T>
46 requires std::convertible_to<T, std::complex<double>>
47 friend scalar_t operator-(scalar_t lhs, const T& rhs);
48
49 template<typename T>
50 requires std::convertible_to<T, std::complex<double>>
51 friend scalar_t operator-(T lhs, const scalar_t& rhs);
52
53 template<typename T>
54 requires std::convertible_to<T, std::complex<double>>
55 scalar_t& operator*=(const T& rhs);
56
57 friend scalar_t operator+(scalar_t lhs, const scalar_t& rhs);
58
59 friend scalar_t operator+(double lhs, const scalar_t& rhs);
60
61 friend scalar_t operator-(scalar_t lhs, const scalar_t& rhs);
62
63 friend scalar_t operator-(double lhs, const scalar_t& rhs);
64
65 friend scalar_t operator/(scalar_t lhs, const scalar_t& rhs);
66
67 friend scalar_t operator/(double lhs, const scalar_t& rhs);
68
69 friend scalar_t operator*(scalar_t lhs, const scalar_t& rhs);
70
71 friend scalar_t operator*(double lhs, const scalar_t& rhs);
72
73 friend scalar_t operator*(const scalar_t& lhs, double rhs);
74
75 template<typename T>
76 requires std::convertible_to<T, std::complex<double>>
77 friend scalar_t operator*(scalar_t lhs, const T& rhs);
78
79 template<typename T>
80 requires std::convertible_to<T, std::complex<double>>
81 friend scalar_t operator*(T lhs, const scalar_t& rhs);
82
83 template<typename T>
84 requires std::convertible_to<T, std::complex<double>>
85 scalar_t& operator/=(const T& rhs);
86
87 friend scalar_t operator/(scalar_t lhs, const scalar_t& rhs);
88
89 template<typename T>
90 requires std::convertible_to<T, std::complex<double>>
91 friend scalar_t operator/(scalar_t lhs, const T& rhs);
92
93 template<typename T>
94 requires std::convertible_to<T, std::complex<double>>
95 friend scalar_t operator/(T lhs, const scalar_t& rhs);
96
97};
98
99#define DEFINE_MATH_FUNCTION(func) \
100inline scalar_t func(const scalar_t& x) { \
101 return scalar_t(std::func(static_cast<complex_t>(x))); \
102}
103
119
120// TODO : warnings
121// Define overload for pow(scalar_t, scalar_t)
122scalar_t pow(const scalar_t& base, const scalar_t& exp);
123
124// Define overload for pow(scalar_t, double)
125scalar_t pow(const scalar_t& base, double exp);
126
127template <typename T>
128requires std::is_integral_v<T>
129scalar_t pow(const scalar_t& base, T exp);
130
131double real(const scalar_t& z);
132double imag(const scalar_t& z);
133
134// Ensure ADL works by defining functions in the same namespace
135using std::sqrt;
136using std::pow;
137using std::sin;
138using std::cos;
139using std::tan;
140using std::asin;
141using std::acos;
142using std::atan;
143using std::exp;
144using std::log;
145using std::sinh;
146using std::cosh;
147using std::tanh;
148using std::abs;
149using std::arg;
150using std::norm;
151using std::real;
152using std::imag;
153
154#include "scalar.tpp"
155
156#endif // SCALAR_H
std::complex< double > complex_t
Convenience alias for std::complex<double>.
Definition Utils.h:35
friend scalar_t operator+(scalar_t lhs, const T &rhs)
scalar_t(scalar_t &&k)=default
friend scalar_t operator/(T lhs, const scalar_t &rhs)
scalar_t operator-() const
Definition scalar.cpp:19
scalar_t & operator+=(const T &rhs)
friend scalar_t operator*(scalar_t lhs, const T &rhs)
friend scalar_t operator-(T lhs, const scalar_t &rhs)
scalar_t & operator/=(const T &rhs)
friend scalar_t operator*(T lhs, const scalar_t &rhs)
scalar_t & operator=(const scalar_t &k)
Definition scalar.cpp:7
scalar_t & operator-=(const T &rhs)
friend scalar_t operator/(scalar_t lhs, const T &rhs)
friend scalar_t operator-(scalar_t lhs, const T &rhs)
friend scalar_t operator+(scalar_t lhs, const scalar_t &rhs)
Definition scalar.cpp:31
scalar_t & operator*=(const T &rhs)
friend scalar_t operator/(scalar_t lhs, const scalar_t &rhs)
Definition scalar.cpp:62
constexpr scalar_t(double re=0.0, double im=0.0)
Definition scalar.h:13
friend scalar_t operator+(T lhs, const scalar_t &rhs)
friend scalar_t operator*(scalar_t lhs, const scalar_t &rhs)
Definition scalar.cpp:49
scalar_t & operator=(scalar_t &&k)=default
double imag(const scalar_t &z)
Definition scalar.cpp:87
scalar_t pow(const scalar_t &base, const scalar_t &exp)
Definition scalar.cpp:75
double real(const scalar_t &z)
Definition scalar.cpp:83
#define DEFINE_MATH_FUNCTION(func)
Definition scalar.h:99
std::enable_if_t< not std::numeric_limits< T >::is_integer, bool > fpeq(T, T, std::size_t n=10)
Compares two floating point numbers with a given precision.
double T(double x)
Wilson coefficient T(x).