21 #define M_PI 3.14159265358979323846264338327950288
31 inline bool IsNaN(
const float x);
32 inline bool IsNaN(
const double x);
35 inline bool IsInf(
const float x);
36 inline bool IsInf(
const double x);
40 inline T
Clip(
const T& value,
const T& low,
const T& high);
43 inline float DegToRad(
const float deg);
44 inline double DegToRad(
const double deg);
47 inline float RadToDeg(
const float rad);
48 inline double RadToDeg(
const double rad);
52 double Median(
const std::vector<T>& elems);
56 double Mean(
const std::vector<T>& elems);
60 double Variance(
const std::vector<T>& elems);
64 double StdDev(
const std::vector<T>& elems);
68 bool AnyLessThan(std::vector<T> elems, T threshold);
78 template <
class Iterator>
83 T
Sigmoid(
const T
x,
const T alpha = 1);
98 size_t NChooseK(
const size_t n,
const size_t k);
102 template <
typename T1,
typename T2>
106 template <
typename T>
107 T
Percentile(
const std::vector<T>& elems,
const double p);
115 template <
class Iterator>
120 if ((first1 == last1) || (first2 == last2)) {
126 while (--m1 != first1 && *m1 >= *m2) {
128 bool result = (m1 == first1) && *first1 >= *m2;
130 while (first2 != m2 && *m1 >= *first2) {
134 std::iter_swap(first1, first2);
138 if ((first1 != last1) && (first2 != last2)) {
141 while ((m1 != first1) && (m2 != last2)) {
142 std::iter_swap(--m1, m2);
145 std::reverse(first1, m1);
146 std::reverse(first1, last1);
147 std::reverse(m2, last2);
148 std::reverse(first2, last2);
155 template <
typename T>
157 return (T(0) < val) - (val < T(0));
166 template <
typename T>
167 T
Clip(
const T& value,
const T& low,
const T& high) {
168 return std::max(low, std::min(value, high));
172 return deg * 0.0174532925199432954743716805978692718781530857086181640625f;
176 return deg * 0.0174532925199432954743716805978692718781530857086181640625;
181 return rad * 57.29577951308232286464772187173366546630859375f;
185 return rad * 57.29577951308232286464772187173366546630859375;
188 template <
typename T>
189 double Median(
const std::vector<T>& elems) {
190 CHECK(!elems.empty());
192 const size_t mid_idx = elems.size() / 2;
194 std::vector<T> ordered_elems = elems;
195 std::nth_element(ordered_elems.begin(), ordered_elems.begin() + mid_idx,
196 ordered_elems.end());
198 if (elems.size() % 2 == 0) {
199 const T mid_element1 = ordered_elems[mid_idx];
200 const T mid_element2 = *std::max_element(
201 ordered_elems.begin(), ordered_elems.begin() + mid_idx);
202 return (mid_element1 + mid_element2) / 2.0;
204 return ordered_elems[mid_idx];
208 template <
typename T>
210 CHECK(!elems.empty());
214 const int idx =
static_cast<int>(std::round(p / 100 * (elems.size() - 1)));
215 const size_t percentile_idx =
216 std::max(0, std::min(
static_cast<int>(elems.size() - 1), idx));
218 std::vector<T> ordered_elems = elems;
219 std::nth_element(ordered_elems.begin(),
220 ordered_elems.begin() + percentile_idx,
221 ordered_elems.end());
223 return ordered_elems.at(percentile_idx);
226 template <
typename T>
227 double Mean(
const std::vector<T>& elems) {
228 CHECK(!elems.empty());
230 for (
const auto el : elems) {
231 sum +=
static_cast<double>(el);
233 return sum / elems.size();
236 template <
typename T>
238 const double mean =
Mean(elems);
240 for (
const auto el : elems) {
241 const double diff = el - mean;
244 return var / (elems.size() - 1);
247 template <
typename T>
248 double StdDev(
const std::vector<T>& elems) {
252 template <
typename T>
254 for (
const auto& el : elems) {
255 if (el < threshold) {
262 template <
typename T>
264 for (
const auto& el : elems) {
265 if (el > threshold) {
272 template <
class Iterator>
277 template <
typename T>
279 return T(1) / (T(1) + exp(-
x * alpha));
282 template <
typename T>
284 const T t0 =
Sigmoid(-x0, alpha);
285 const T t1 =
Sigmoid(x0, alpha);
286 x = (
Sigmoid(2 * x0 *
x - x0, alpha) - t0) / (t1 - t0);
290 template <
typename T1,
typename T2>
293 static_cast<T1
>(std::numeric_limits<T2>::max()),
294 std::max(
static_cast<T1
>(std::numeric_limits<T2>::min()), value));
bool NextCombination(Iterator first1, Iterator last1, Iterator first2, Iterator last2)
bool AnyGreaterThan(std::vector< T > elems, T threshold)
float RadToDeg(const float rad)
double StdDev(const std::vector< T > &elems)
bool AnyLessThan(std::vector< T > elems, T threshold)
T Sigmoid(const T x, const T alpha=1)
double Variance(const std::vector< T > &elems)
bool NextCombination(Iterator first, Iterator middle, Iterator last)
int SignOfNumber(const T val)
double Median(const std::vector< T > &elems)
T ScaleSigmoid(T x, const T alpha=1, const T x0=10)
size_t NChooseK(const size_t n, const size_t k)
double Mean(const std::vector< T > &elems)
bool IsNaN(const float x)
float DegToRad(const float deg)
T Clip(const T &value, const T &low, const T &high)
T2 TruncateCast(const T1 value)
T Percentile(const std::vector< T > &elems, const double p)
bool IsInf(const float x)
constexpr Rgbaf middle(0.50f, 0.50f, 0.50f, 1.00f)