GNU Radio's BLOCKSTREAM Package
utils.h
Go to the documentation of this file.
1 #ifndef MATH_UTILS_H
2 #define MATH_UTILS_H
3 
4 #include <algorithm>
5 #include <sstream>
6 #include <vector>
7 #include <cstdint>
8 #include <limits>
9 
10 #include "Tools/Exception/exception.hpp"
11 
12 namespace aff3ct
13 {
14 namespace tools
15 {
16 template <typename R> inline R div2(R val) { return val * (R)0.500; }
17 template <> inline int32_t div2(int32_t val) { return val >> 1; }
18 template <> inline int16_t div2(int16_t val) { return val >> 1; }
19 template <> inline int8_t div2(int8_t val) { return val >> 1; }
20 
21 template <typename R> inline R div4(R val) { return val * (R)0.250; }
22 template <> inline int32_t div4(int32_t val) { return val >> 2; }
23 template <> inline int16_t div4(int16_t val) { return val >> 2; }
24 template <> inline int8_t div4(int8_t val) { return val >> 2; }
25 
26 template <typename R> inline R div8(R val) { return val * (R)0.125; }
27 template <> inline int32_t div8(int32_t val) { return val >> 3; }
28 template <> inline int16_t div8(int16_t val) { return val >> 3; }
29 template <> inline int8_t div8(int8_t val) { return val >> 3; }
30 
31 // init value depending on the domain
32 template <typename R>
33 constexpr R init_LR () { return (R)1; }
34 
35 template <typename R>
36 constexpr R init_LLR() { return (R)0; }
37 
38 // saturate values in function of the domain
39 template <typename R>
40 constexpr R sat_val() { return std::numeric_limits<R>::infinity(); }
41 
42 template <> constexpr double sat_val<double >() { return std::numeric_limits<double>::infinity(); }
43 template <> constexpr float sat_val<float >() { return std::numeric_limits<float >::infinity(); }
44 template <> constexpr int32_t sat_val<int32_t>() { return 1073741823; }
45 template <> constexpr int16_t sat_val<int16_t>() { return 16382; }
46 template <> constexpr int8_t sat_val<int8_t >() { return 63; }
47 
48 template <typename R>
49 constexpr std::pair<R, R> sat_vals() { return std::make_pair(-sat_val<R>(), sat_val<R>()); }
50 
51 // return the initial value for a bit
52 template <typename B>
53 constexpr B bit_init() { return (B)(((B)1) << (sizeof(B) * 8 -1)); }
54 
55 // make a saturation on a the value "val"
56 template <typename T>
57 inline T saturate(const T val, const T min, const T max) { return std::min(std::max(val, min), max); }
58 
59 // make a saturation on a full vector
60 template <typename T, class A = std::allocator<T>>
61 inline void saturate(std::vector<T,A> &array, const T min, const T max)
62 {
63  const auto loop_size = (int)array.size();
64  for (auto i = 0; i < loop_size; i++)
65  array[i] = saturate<T>(array[i], min, max);
66 }
67 
68 template <typename B, typename R>
69 B sgn(R val) { return (B)((R(0) < val) - (val < R(0))); }
70 
71 
72 template <typename T>
73 constexpr bool is_power_of_2(T x)
74 {
75  return (x > 0) && !(x & (x - 1));
76 }
77 
78 template <typename R, typename function_type>
79 inline R integral(function_type func, const R min, const R max, const int number_steps)
80 {
81  if (max < min)
82  {
83  std::stringstream message;
84  message << "'max' has to be equal or greater than 'min' ('max' = " << max << ", 'min' = " << min << ").";
85  throw invalid_argument(__FILE__, __LINE__, __func__, message.str());
86  }
87 
88  if (number_steps <= 0)
89  {
90  std::stringstream message;
91  message << "'number_steps' has to be greater than 0 ('number_steps' = " << number_steps << ").";
92  throw invalid_argument(__FILE__, __LINE__, __func__, message.str());
93  }
94 
95  R step = (max - min) / number_steps; // width of rectangle
96  R area = (R)0;
97 
98  for (auto i = 0; i < number_steps; i++)
99  area += func(min + ((R)i + (R)0.5) * step) * step;
100 
101  return area;
102 }
103 }
104 }
105 
106 #endif /* MATH_UTILS_H */
B sgn(R val)
Definition: utils.h:69
constexpr float sat_val< float >()
Definition: utils.h:43
reg min(const reg, const reg)
Definition: mipp.h:643
constexpr int32_t sat_val< int32_t >()
Definition: utils.h:44
R div4(R val)
Definition: utils.h:21
R div2(R val)
Definition: utils.h:16
constexpr int16_t sat_val< int16_t >()
Definition: utils.h:45
T saturate(const T val, const T min, const T max)
Definition: utils.h:57
constexpr int8_t sat_val< int8_t >()
Definition: utils.h:46
constexpr R init_LR()
Definition: utils.h:33
reg max(const reg, const reg)
Definition: mipp.h:644
R_32 R
Definition: types.h:51
R integral(function_type func, const R min, const R max, const int number_steps)
Definition: utils.h:79
__forceinline R max(const R &a, const R &b)
R div8(R val)
Definition: utils.h:26
B_32 B
Definition: types.h:50
constexpr B bit_init()
Definition: utils.h:53
constexpr R sat_val()
Definition: utils.h:40
constexpr std::pair< R, R > sat_vals()
Definition: utils.h:49
constexpr bool is_power_of_2(T x)
Definition: utils.h:73
constexpr double sat_val< double >()
Definition: utils.h:42
constexpr R init_LLR()
Definition: utils.h:36