forked from heavywatal/cxxwtl
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmath.hpp
More file actions
108 lines (91 loc) · 2.66 KB
/
math.hpp
File metadata and controls
108 lines (91 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#pragma once
#ifndef WTL_MATH_HPP_
#define WTL_MATH_HPP_
#include <cmath>
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////
namespace wtl {
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////
// interger powers at compile time
template <class T>
constexpr T pow(T base, unsigned int exponent) noexcept {
return exponent == 0 ? 1 : base * pow(base, --exponent);
}
// factorial at compile time
constexpr unsigned int factorial(unsigned int n) {
return n ? (n * factorial(n - 1u)) : 1u;
}
constexpr unsigned int permut(unsigned int n, unsigned int r) {
return r ? (n * permut(n - 1u, --r)) : 1u;
}
constexpr unsigned int choose(unsigned int n, unsigned int r) {
return permut(n, r) / factorial(r);
}
template <class T>
inline unsigned int multinomial(const T& v) {
unsigned int out = factorial(v.sum());
for (const auto x: v) {
out /= factorial(x);
}
return out;
}
inline unsigned int permut_runtime(unsigned int n, unsigned int r) {
unsigned int answer = n;
while (--r) {
answer *= --n;
}
return answer;
}
inline unsigned int choose_runtime(unsigned int n, unsigned int r) {
unsigned int numerator = n;
unsigned int denominator = r;
while (--r) {
numerator *= --n;
denominator *= r;
}
return numerator /= denominator;
}
// step function: sign, heaviside
template <class T> inline
constexpr int sign(T x) {return (x < 0) ? -1 : (x == 0) ? 0 : 1;}
template <class T> inline
constexpr int heaviside0(T x) {return (x <= 0) ? 0 : 1;}
template <class T> inline
constexpr int heaviside1(T x) {return (x < 0) ? 0 : 1;}
template <class T> inline
constexpr double heaviside1_2(T x) {return (x < 0) ? 0 : (x == 0) ? 0.5 : 1;}
template <class Ret, class Arg>
class Heaviside {
public:
explicit Heaviside(Ret a=0): a_(a) {}
constexpr Ret operator()(Arg x) const {
return (x < 0) ? 0 : (x == 0) ? a_ : 1;
}
private:
const Ret a_;
};
// x(-∞,∞) -> y(0,1)
inline double sigmoid(double x, double gain=1.0) {
return 1.0 / (1.0 + std::exp(-gain * x));
}
// (0, 1)
class Sigmoid {
public:
Sigmoid(double gain): gain_(gain) {}
double operator()(double x) const {
return 1.0 / (1.0 + std::exp(-gain_ * x));
}
private:
const double gain_;
};
// (-1, 1)
class Tanh {
public:
Tanh(double a): a_(a) {}
double operator()(double x) const {return std::tanh(a_ * x);}
private:
const double a_;
};
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////
} // namespace wtl
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////
#endif /* WTL_MATH_HPP_ */