|
|
@ -18,6 +18,7 @@ limitations under the License. */
|
|
|
|
#include <queue>
|
|
|
|
#include <queue>
|
|
|
|
#include <utility>
|
|
|
|
#include <utility>
|
|
|
|
#include <vector>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "paddle/fluid/framework/generator.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
namespace paddle {
|
|
|
|
namespace operators {
|
|
|
|
namespace operators {
|
|
|
@ -31,7 +32,12 @@ UniformSampler::UniformSampler(int64_t range, unsigned int seed)
|
|
|
|
dist_ = std::make_shared<std::uniform_int_distribution<>>(0, range);
|
|
|
|
dist_ = std::make_shared<std::uniform_int_distribution<>>(0, range);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int64_t UniformSampler::Sample() const { return (*dist_)(*random_engine_); }
|
|
|
|
int64_t UniformSampler::Sample() const {
|
|
|
|
|
|
|
|
return framework::Generator::GetInstance()->is_init_py
|
|
|
|
|
|
|
|
? (*dist_)(framework::Generator::GetInstance()->GetCPUEngine())
|
|
|
|
|
|
|
|
: (*dist_)(*random_engine_);
|
|
|
|
|
|
|
|
// return (*dist_)(*random_engine_);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float UniformSampler::Probability(int64_t value) const { return inv_range_; }
|
|
|
|
float UniformSampler::Probability(int64_t value) const { return inv_range_; }
|
|
|
|
|
|
|
|
|
|
|
@ -46,8 +52,11 @@ int64_t LogUniformSampler::Sample() const {
|
|
|
|
// inverse_transform_sampling method
|
|
|
|
// inverse_transform_sampling method
|
|
|
|
// More details:
|
|
|
|
// More details:
|
|
|
|
// https://wanghaoshuang.github.io/2017/11/Log-uniform-distribution-sampler/
|
|
|
|
// https://wanghaoshuang.github.io/2017/11/Log-uniform-distribution-sampler/
|
|
|
|
const int64_t value =
|
|
|
|
auto cur_random =
|
|
|
|
static_cast<int64_t>(exp((*dist_)(*random_engine_) * log_range_)) - 1;
|
|
|
|
framework::Generator::GetInstance()->is_init_py
|
|
|
|
|
|
|
|
? (*dist_)(framework::Generator::GetInstance()->GetCPUEngine())
|
|
|
|
|
|
|
|
: (*dist_)(*random_engine_);
|
|
|
|
|
|
|
|
const int64_t value = static_cast<int64_t>(exp(cur_random * log_range_)) - 1;
|
|
|
|
// Mathematically, value should be <= range_, but might not be due to some
|
|
|
|
// Mathematically, value should be <= range_, but might not be due to some
|
|
|
|
// floating point roundoff, so we mod by range_.
|
|
|
|
// floating point roundoff, so we mod by range_.
|
|
|
|
return value % range_;
|
|
|
|
return value % range_;
|
|
|
@ -75,8 +84,14 @@ CustomSampler::CustomSampler(int64_t range, const float *probabilities,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int64_t CustomSampler::Sample() const {
|
|
|
|
int64_t CustomSampler::Sample() const {
|
|
|
|
auto index = (*int_dist_)(*random_engine_);
|
|
|
|
auto index =
|
|
|
|
auto p = (*real_dist_)(*random_engine_);
|
|
|
|
framework::Generator::GetInstance()->is_init_py
|
|
|
|
|
|
|
|
? (*int_dist_)(framework::Generator::GetInstance()->GetCPUEngine())
|
|
|
|
|
|
|
|
: (*int_dist_)(*random_engine_);
|
|
|
|
|
|
|
|
auto p =
|
|
|
|
|
|
|
|
framework::Generator::GetInstance()->is_init_py
|
|
|
|
|
|
|
|
? (*real_dist_)(framework::Generator::GetInstance()->GetCPUEngine())
|
|
|
|
|
|
|
|
: (*real_dist_)(*random_engine_);
|
|
|
|
if (p > alias_probs_[index]) {
|
|
|
|
if (p > alias_probs_[index]) {
|
|
|
|
int alias = alias_[index];
|
|
|
|
int alias = alias_[index];
|
|
|
|
|
|
|
|
|
|
|
|