如何在 C++ 中使用离散分布作为 class 变量
How to use a discrete distribution as a class variable in C++
所以我有一个由其他人开发的大型程序(几个 .cpp 文件和 .h),我试图在其中一个文件中添加一些功能。我是 C++ 的新手,所以对我来说很难。
我想在初始化“优化器”时使用初始化幂律分布,然后在调用“迭代”时从中采样。我已经设法让它工作,但只在“初始化”内部,我希望它在整个文件中作为 class 变量工作。我想要的一个最小示例如下,考虑到优化器是在“Optimizer.h”中定义的,并不是真正相关的,随机引擎是在“Util.h”中定义的。
头文件如下所示:
#ifndef FASTONEPLUSONE_H_
#define FASTONEPLUSONE_H_
#include "Optimizer.h"
#include "Util.h"
#include <map>
// Inherits and implements the Optimizer interface
class FastOnePlusOne : public Optimizer {
public:
FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
Configuration& _config);
virtual bool iterate() override;
create_optimizer(FastOnePlusOne);
private:
// Power law distribution
std::discrete_distribution<int>power_dist; // THIS IS MADE BY ME
};
#endif /* FASTONEPLUSONE_H_ */
和 cpp 文件:
FastOnePlusOne::FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
Configuration& _config)
: Optimizer(_rand, _evaluator, _config) {
// Power-law distribution
int length = 10;
float B = 1.5;
vector<double> pmf(length);
std::iota(pmf.begin(), pmf.end(), 1);
for(size_t i = 0; i < length; i++) {
pmf[i] = 1.0 / pow(pmf[i], B);
}
pmf.insert(pmf.begin(), 0);
std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[power_dist(rand)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " times\n";
}
}
// Performs an iteration
bool FastOnePlusOne::iterate() {
// Distributions needed at the current alpha
int alpha = power_dist(rand);
std::cout << alpha << " ";
}
}
当 FastOnePlusOne
初始化时,此代码现在在变量 power_dist 中创建幂律分布,并正确打印 10000 个样本的结果,但 alpha
始终被采样为0. 我该如何解决这个问题?
替换此行:
std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());
有了这个:
power_dist = std::discrete_distribution<int>(pmf.begin(),pmf.end());
解释:
在错误的版本中,您正在创建一个名为 power_dist
的新局部变量,它隐藏 class 变量 this->power_dist
,并使用它。原始 this->power_dist
从未在 FastOnePlusOne::FastOnePlusOne()
中使用或正确初始化。在函数 FastOnePlusOne::iterate()
中,您对未初始化的 this->power_dist
.
进行采样
在第二个版本中,您会将一个正确初始化的对象分配给 class 变量 power_dist
,稍后将在同一函数和 iterate()
函数中使用该变量。
所以我有一个由其他人开发的大型程序(几个 .cpp 文件和 .h),我试图在其中一个文件中添加一些功能。我是 C++ 的新手,所以对我来说很难。
我想在初始化“优化器”时使用初始化幂律分布,然后在调用“迭代”时从中采样。我已经设法让它工作,但只在“初始化”内部,我希望它在整个文件中作为 class 变量工作。我想要的一个最小示例如下,考虑到优化器是在“Optimizer.h”中定义的,并不是真正相关的,随机引擎是在“Util.h”中定义的。
头文件如下所示:
#ifndef FASTONEPLUSONE_H_
#define FASTONEPLUSONE_H_
#include "Optimizer.h"
#include "Util.h"
#include <map>
// Inherits and implements the Optimizer interface
class FastOnePlusOne : public Optimizer {
public:
FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
Configuration& _config);
virtual bool iterate() override;
create_optimizer(FastOnePlusOne);
private:
// Power law distribution
std::discrete_distribution<int>power_dist; // THIS IS MADE BY ME
};
#endif /* FASTONEPLUSONE_H_ */
和 cpp 文件:
FastOnePlusOne::FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
Configuration& _config)
: Optimizer(_rand, _evaluator, _config) {
// Power-law distribution
int length = 10;
float B = 1.5;
vector<double> pmf(length);
std::iota(pmf.begin(), pmf.end(), 1);
for(size_t i = 0; i < length; i++) {
pmf[i] = 1.0 / pow(pmf[i], B);
}
pmf.insert(pmf.begin(), 0);
std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[power_dist(rand)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " times\n";
}
}
// Performs an iteration
bool FastOnePlusOne::iterate() {
// Distributions needed at the current alpha
int alpha = power_dist(rand);
std::cout << alpha << " ";
}
}
当 FastOnePlusOne
初始化时,此代码现在在变量 power_dist 中创建幂律分布,并正确打印 10000 个样本的结果,但 alpha
始终被采样为0. 我该如何解决这个问题?
替换此行:
std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());
有了这个:
power_dist = std::discrete_distribution<int>(pmf.begin(),pmf.end());
解释:
在错误的版本中,您正在创建一个名为 power_dist
的新局部变量,它隐藏 class 变量 this->power_dist
,并使用它。原始 this->power_dist
从未在 FastOnePlusOne::FastOnePlusOne()
中使用或正确初始化。在函数 FastOnePlusOne::iterate()
中,您对未初始化的 this->power_dist
.
在第二个版本中,您会将一个正确初始化的对象分配给 class 变量 power_dist
,稍后将在同一函数和 iterate()
函数中使用该变量。