UniforFill with integer values.

This commit is contained in:
Adam Osewski
2022-05-26 15:33:05 +02:00
parent 82d7d9938f
commit 696408d8b2

View File

@@ -1,6 +1,7 @@
#pragma once
#include <algorithm>
#include <cmath>
#include <random>
#include "data_type.hpp"
@@ -8,35 +9,10 @@
namespace ck {
namespace utils {
// template <typename T, class Enable = void>
// struct FillUniform;
// TODO: what's wrong with this specialization???
// err: segmentation fault in mt19937 - infinite loop like.
// template <typename T>
// struct FillUniform<T, typename std::enable_if<std::is_integral<T>::value &&
// !std::is_same<T, bhalf_t>::value>::type>
// {
// int a_{0};
// int b_{5};
// // T a_ = T{0};
// // T b_ = T{5};
// template <typename ForwardIter>
// void operator()(ForwardIter first, ForwardIter last) const
// {
// std::mt19937 gen{11939};
// std::uniform_int_distribution<int> dis(a_, b_);
// std::generate(first, last, [&dis, &gen]() { return ck::type_convert<T>(dis(gen)); });
// }
// };
// struct FillUniform<T, typename std::enable_if<std::is_floating_point<T>::value ||
// std::is_same<T, bhalf_t>::value>::type>
template <typename T>
struct FillUniform
{
float a_{0};
float a_{-5};
float b_{5};
template <typename ForwardIter>
@@ -48,6 +24,22 @@ struct FillUniform
}
};
template <typename T>
struct FillUniformIntegerValue
{
float a_{-5};
float b_{5};
template <typename ForwardIter>
void operator()(ForwardIter first, ForwardIter last) const
{
std::mt19937 gen{11939};
std::uniform_real_distribution<> dis(a_, b_);
std::generate(
first, last, [&dis, &gen]() { return ck::type_convert<T>(std::round(dis(gen))); });
}
};
template <typename T>
struct FillMonotonicSeq
{