|
|
|
@ -41,39 +41,42 @@ public:
|
|
|
|
|
TEST(MultinomialSampler, gen) {
|
|
|
|
|
int numGrids = 1024 * 1024;
|
|
|
|
|
int size = 1024 * 4;
|
|
|
|
|
|
|
|
|
|
default_random_engine reng;
|
|
|
|
|
uniform_int_distribution<int> rand(1, numGrids / size * 1.8);
|
|
|
|
|
vector<real> prob;
|
|
|
|
|
int sum = 0;
|
|
|
|
|
for (int i = 0; i < size; ++i) {
|
|
|
|
|
prob.push_back(rand(reng));
|
|
|
|
|
sum += prob.back();
|
|
|
|
|
}
|
|
|
|
|
CHECK_LE(sum, numGrids);
|
|
|
|
|
prob.back() += numGrids - sum;
|
|
|
|
|
|
|
|
|
|
vector<int> counts(size);
|
|
|
|
|
MultinomialSamplerTester sampler(&prob[0], size);
|
|
|
|
|
counts.assign(size, 0);
|
|
|
|
|
{
|
|
|
|
|
double s = (double)size / (double)numGrids;
|
|
|
|
|
REGISTER_TIMER("MultinomialSampler");
|
|
|
|
|
for (double i = 0; i < numGrids; ++i) {
|
|
|
|
|
int ret = sampler.testGen([i, s]() { return s * i; });
|
|
|
|
|
if (ret < 0 || ret >= size) {
|
|
|
|
|
EXPECT_GE(ret, 0);
|
|
|
|
|
EXPECT_LT(ret, size);
|
|
|
|
|
break;
|
|
|
|
|
for (size_t iter=0; iter < 256; ++iter) {
|
|
|
|
|
uniform_int_distribution<int> rand(1, numGrids / size * 1.8);
|
|
|
|
|
vector<real> prob;
|
|
|
|
|
int sum = 0;
|
|
|
|
|
for (int i = 0; i < size; ++i) {
|
|
|
|
|
prob.push_back(rand(reng));
|
|
|
|
|
sum += prob.back();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CHECK_LE(sum, numGrids);
|
|
|
|
|
prob.back() += numGrids - sum;
|
|
|
|
|
|
|
|
|
|
vector<int> counts(size);
|
|
|
|
|
MultinomialSamplerTester sampler(&prob[0], size);
|
|
|
|
|
counts.assign(size, 0);
|
|
|
|
|
{
|
|
|
|
|
double s = (double)size / (double)numGrids;
|
|
|
|
|
REGISTER_TIMER("MultinomialSampler");
|
|
|
|
|
for (double i = 0; i < numGrids; ++i) {
|
|
|
|
|
int ret = sampler.testGen([i, s]() { return s * i; });
|
|
|
|
|
if (ret < 0 || ret >= size) {
|
|
|
|
|
EXPECT_GE(ret, 0);
|
|
|
|
|
EXPECT_LT(ret, size);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
++counts[ret];
|
|
|
|
|
}
|
|
|
|
|
++counts[ret];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < size; ++i) {
|
|
|
|
|
if (prob[i] != counts[i]) {
|
|
|
|
|
EXPECT_EQ(prob[i], counts[i]);
|
|
|
|
|
LOG(INFO) << "i=" << i;
|
|
|
|
|
break;
|
|
|
|
|
for (int i = 0; i < size; ++i) {
|
|
|
|
|
if (prob[i] != counts[i]) {
|
|
|
|
|
EXPECT_EQ(prob[i], counts[i]);
|
|
|
|
|
LOG(INFO) << iter;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -135,6 +138,7 @@ void benchmarkRandom() {
|
|
|
|
|
LOG(INFO) << "sum1=" << sum1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
|
initMain(argc, argv);
|
|
|
|
|
testing::InitGoogleTest(&argc, argv);
|
|
|
|
|