Clang-tidy static analysis (#3222)
* Clang-tidy static analysis * Modernise checks * Google coding standard checks * Identifier renaming according to Google style
This commit is contained in:
@@ -62,14 +62,14 @@ inline double CoordinateDeltaBias(double sum_grad, double sum_hess) {
|
||||
* \return The gradient and diagonal Hessian entry for a given feature.
|
||||
*/
|
||||
inline std::pair<double, double> GetGradient(int group_idx, int num_group, int fidx,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat) {
|
||||
double sum_grad = 0.0, sum_hess = 0.0;
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator({static_cast<bst_uint>(fidx)});
|
||||
while (iter->Next()) {
|
||||
const ColBatch &batch = iter->Value();
|
||||
ColBatch::Inst col = batch[0];
|
||||
const bst_omp_uint ndata = static_cast<bst_omp_uint>(col.length);
|
||||
const auto ndata = static_cast<bst_omp_uint>(col.length);
|
||||
for (bst_omp_uint j = 0; j < ndata; ++j) {
|
||||
const bst_float v = col[j].fvalue;
|
||||
auto &p = gpair[col[j].index * num_group + group_idx];
|
||||
@@ -93,14 +93,14 @@ inline std::pair<double, double> GetGradient(int group_idx, int num_group, int f
|
||||
* \return The gradient and diagonal Hessian entry for a given feature.
|
||||
*/
|
||||
inline std::pair<double, double> GetGradientParallel(int group_idx, int num_group, int fidx,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat) {
|
||||
double sum_grad = 0.0, sum_hess = 0.0;
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator({static_cast<bst_uint>(fidx)});
|
||||
while (iter->Next()) {
|
||||
const ColBatch &batch = iter->Value();
|
||||
ColBatch::Inst col = batch[0];
|
||||
const bst_omp_uint ndata = static_cast<bst_omp_uint>(col.length);
|
||||
const auto ndata = static_cast<bst_omp_uint>(col.length);
|
||||
#pragma omp parallel for schedule(static) reduction(+ : sum_grad, sum_hess)
|
||||
for (bst_omp_uint j = 0; j < ndata; ++j) {
|
||||
const bst_float v = col[j].fvalue;
|
||||
@@ -124,11 +124,11 @@ inline std::pair<double, double> GetGradientParallel(int group_idx, int num_grou
|
||||
* \return The gradient and diagonal Hessian entry for the bias.
|
||||
*/
|
||||
inline std::pair<double, double> GetBiasGradientParallel(int group_idx, int num_group,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat) {
|
||||
const RowSet &rowset = p_fmat->buffered_rowset();
|
||||
const RowSet &rowset = p_fmat->BufferedRowset();
|
||||
double sum_grad = 0.0, sum_hess = 0.0;
|
||||
const bst_omp_uint ndata = static_cast<bst_omp_uint>(rowset.size());
|
||||
const auto ndata = static_cast<bst_omp_uint>(rowset.Size());
|
||||
#pragma omp parallel for schedule(static) reduction(+ : sum_grad, sum_hess)
|
||||
for (bst_omp_uint i = 0; i < ndata; ++i) {
|
||||
auto &p = gpair[rowset[i] * num_group + group_idx];
|
||||
@@ -151,7 +151,7 @@ inline std::pair<double, double> GetBiasGradientParallel(int group_idx, int num_
|
||||
* \param p_fmat The input feature matrix.
|
||||
*/
|
||||
inline void UpdateResidualParallel(int fidx, int group_idx, int num_group,
|
||||
float dw, std::vector<bst_gpair> *in_gpair,
|
||||
float dw, std::vector<GradientPair> *in_gpair,
|
||||
DMatrix *p_fmat) {
|
||||
if (dw == 0.0f) return;
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator({static_cast<bst_uint>(fidx)});
|
||||
@@ -159,12 +159,12 @@ inline void UpdateResidualParallel(int fidx, int group_idx, int num_group,
|
||||
const ColBatch &batch = iter->Value();
|
||||
ColBatch::Inst col = batch[0];
|
||||
// update grad value
|
||||
const bst_omp_uint num_row = static_cast<bst_omp_uint>(col.length);
|
||||
const auto num_row = static_cast<bst_omp_uint>(col.length);
|
||||
#pragma omp parallel for schedule(static)
|
||||
for (bst_omp_uint j = 0; j < num_row; ++j) {
|
||||
bst_gpair &p = (*in_gpair)[col[j].index * num_group + group_idx];
|
||||
GradientPair &p = (*in_gpair)[col[j].index * num_group + group_idx];
|
||||
if (p.GetHess() < 0.0f) continue;
|
||||
p += bst_gpair(p.GetHess() * col[j].fvalue * dw, 0);
|
||||
p += GradientPair(p.GetHess() * col[j].fvalue * dw, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -179,16 +179,16 @@ inline void UpdateResidualParallel(int fidx, int group_idx, int num_group,
|
||||
* \param p_fmat The input feature matrix.
|
||||
*/
|
||||
inline void UpdateBiasResidualParallel(int group_idx, int num_group, float dbias,
|
||||
std::vector<bst_gpair> *in_gpair,
|
||||
std::vector<GradientPair> *in_gpair,
|
||||
DMatrix *p_fmat) {
|
||||
if (dbias == 0.0f) return;
|
||||
const RowSet &rowset = p_fmat->buffered_rowset();
|
||||
const bst_omp_uint ndata = static_cast<bst_omp_uint>(p_fmat->info().num_row);
|
||||
const RowSet &rowset = p_fmat->BufferedRowset();
|
||||
const auto ndata = static_cast<bst_omp_uint>(p_fmat->Info().num_row_);
|
||||
#pragma omp parallel for schedule(static)
|
||||
for (bst_omp_uint i = 0; i < ndata; ++i) {
|
||||
bst_gpair &g = (*in_gpair)[rowset[i] * num_group + group_idx];
|
||||
GradientPair &g = (*in_gpair)[rowset[i] * num_group + group_idx];
|
||||
if (g.GetHess() < 0.0f) continue;
|
||||
g += bst_gpair(g.GetHess() * dbias, 0);
|
||||
g += GradientPair(g.GetHess() * dbias, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ class FeatureSelector {
|
||||
/*! \brief factory method */
|
||||
static FeatureSelector *Create(int choice);
|
||||
/*! \brief virtual destructor */
|
||||
virtual ~FeatureSelector() {}
|
||||
virtual ~FeatureSelector() = default;
|
||||
/**
|
||||
* \brief Setting up the selector state prior to looping through features.
|
||||
*
|
||||
@@ -213,7 +213,7 @@ class FeatureSelector {
|
||||
* \param param A parameter with algorithm-dependent use.
|
||||
*/
|
||||
virtual void Setup(const gbm::GBLinearModel &model,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat,
|
||||
float alpha, float lambda, int param) {}
|
||||
/**
|
||||
@@ -232,7 +232,7 @@ class FeatureSelector {
|
||||
virtual int NextFeature(int iteration,
|
||||
const gbm::GBLinearModel &model,
|
||||
int group_idx,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) = 0;
|
||||
};
|
||||
|
||||
@@ -242,7 +242,7 @@ class FeatureSelector {
|
||||
class CyclicFeatureSelector : public FeatureSelector {
|
||||
public:
|
||||
int NextFeature(int iteration, const gbm::GBLinearModel &model,
|
||||
int group_idx, const std::vector<bst_gpair> &gpair,
|
||||
int group_idx, const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) override {
|
||||
return iteration % model.param.num_feature;
|
||||
}
|
||||
@@ -255,23 +255,23 @@ class CyclicFeatureSelector : public FeatureSelector {
|
||||
class ShuffleFeatureSelector : public FeatureSelector {
|
||||
public:
|
||||
void Setup(const gbm::GBLinearModel &model,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda, int param) override {
|
||||
if (feat_index.size() == 0) {
|
||||
feat_index.resize(model.param.num_feature);
|
||||
std::iota(feat_index.begin(), feat_index.end(), 0);
|
||||
if (feat_index_.size() == 0) {
|
||||
feat_index_.resize(model.param.num_feature);
|
||||
std::iota(feat_index_.begin(), feat_index_.end(), 0);
|
||||
}
|
||||
std::shuffle(feat_index.begin(), feat_index.end(), common::GlobalRandom());
|
||||
std::shuffle(feat_index_.begin(), feat_index_.end(), common::GlobalRandom());
|
||||
}
|
||||
|
||||
int NextFeature(int iteration, const gbm::GBLinearModel &model,
|
||||
int group_idx, const std::vector<bst_gpair> &gpair,
|
||||
int group_idx, const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) override {
|
||||
return feat_index[iteration % model.param.num_feature];
|
||||
return feat_index_[iteration % model.param.num_feature];
|
||||
}
|
||||
|
||||
protected:
|
||||
std::vector<bst_uint> feat_index;
|
||||
std::vector<bst_uint> feat_index_;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -281,7 +281,7 @@ class ShuffleFeatureSelector : public FeatureSelector {
|
||||
class RandomFeatureSelector : public FeatureSelector {
|
||||
public:
|
||||
int NextFeature(int iteration, const gbm::GBLinearModel &model,
|
||||
int group_idx, const std::vector<bst_gpair> &gpair,
|
||||
int group_idx, const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) override {
|
||||
return common::GlobalRandom()() % model.param.num_feature;
|
||||
}
|
||||
@@ -299,32 +299,32 @@ class RandomFeatureSelector : public FeatureSelector {
|
||||
class GreedyFeatureSelector : public FeatureSelector {
|
||||
public:
|
||||
void Setup(const gbm::GBLinearModel &model,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda, int param) override {
|
||||
top_k = static_cast<bst_uint>(param);
|
||||
top_k_ = static_cast<bst_uint>(param);
|
||||
const bst_uint ngroup = model.param.num_output_group;
|
||||
if (param <= 0) top_k = std::numeric_limits<bst_uint>::max();
|
||||
if (counter.size() == 0) {
|
||||
counter.resize(ngroup);
|
||||
gpair_sums.resize(model.param.num_feature * ngroup);
|
||||
if (param <= 0) top_k_ = std::numeric_limits<bst_uint>::max();
|
||||
if (counter_.size() == 0) {
|
||||
counter_.resize(ngroup);
|
||||
gpair_sums_.resize(model.param.num_feature * ngroup);
|
||||
}
|
||||
for (bst_uint gid = 0u; gid < ngroup; ++gid) {
|
||||
counter[gid] = 0u;
|
||||
counter_[gid] = 0u;
|
||||
}
|
||||
}
|
||||
|
||||
int NextFeature(int iteration, const gbm::GBLinearModel &model,
|
||||
int group_idx, const std::vector<bst_gpair> &gpair,
|
||||
int group_idx, const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) override {
|
||||
// k-th selected feature for a group
|
||||
auto k = counter[group_idx]++;
|
||||
auto k = counter_[group_idx]++;
|
||||
// stop after either reaching top-K or going through all the features in a group
|
||||
if (k >= top_k || counter[group_idx] == model.param.num_feature) return -1;
|
||||
if (k >= top_k_ || counter_[group_idx] == model.param.num_feature) return -1;
|
||||
|
||||
const int ngroup = model.param.num_output_group;
|
||||
const bst_omp_uint nfeat = model.param.num_feature;
|
||||
// Calculate univariate gradient sums
|
||||
std::fill(gpair_sums.begin(), gpair_sums.end(), std::make_pair(0., 0.));
|
||||
std::fill(gpair_sums_.begin(), gpair_sums_.end(), std::make_pair(0., 0.));
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator();
|
||||
while (iter->Next()) {
|
||||
const ColBatch &batch = iter->Value();
|
||||
@@ -332,7 +332,7 @@ class GreedyFeatureSelector : public FeatureSelector {
|
||||
for (bst_omp_uint i = 0; i < nfeat; ++i) {
|
||||
const ColBatch::Inst col = batch[i];
|
||||
const bst_uint ndata = col.length;
|
||||
auto &sums = gpair_sums[group_idx * nfeat + i];
|
||||
auto &sums = gpair_sums_[group_idx * nfeat + i];
|
||||
for (bst_uint j = 0u; j < ndata; ++j) {
|
||||
const bst_float v = col[j].fvalue;
|
||||
auto &p = gpair[col[j].index * ngroup + group_idx];
|
||||
@@ -346,7 +346,7 @@ class GreedyFeatureSelector : public FeatureSelector {
|
||||
int best_fidx = 0;
|
||||
double best_weight_update = 0.0f;
|
||||
for (bst_omp_uint fidx = 0; fidx < nfeat; ++fidx) {
|
||||
auto &s = gpair_sums[group_idx * nfeat + fidx];
|
||||
auto &s = gpair_sums_[group_idx * nfeat + fidx];
|
||||
float dw = std::abs(static_cast<bst_float>(
|
||||
CoordinateDelta(s.first, s.second, model[fidx][group_idx], alpha, lambda)));
|
||||
if (dw > best_weight_update) {
|
||||
@@ -358,9 +358,9 @@ class GreedyFeatureSelector : public FeatureSelector {
|
||||
}
|
||||
|
||||
protected:
|
||||
bst_uint top_k;
|
||||
std::vector<bst_uint> counter;
|
||||
std::vector<std::pair<double, double>> gpair_sums;
|
||||
bst_uint top_k_;
|
||||
std::vector<bst_uint> counter_;
|
||||
std::vector<std::pair<double, double>> gpair_sums_;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -377,21 +377,21 @@ class GreedyFeatureSelector : public FeatureSelector {
|
||||
class ThriftyFeatureSelector : public FeatureSelector {
|
||||
public:
|
||||
void Setup(const gbm::GBLinearModel &model,
|
||||
const std::vector<bst_gpair> &gpair,
|
||||
const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda, int param) override {
|
||||
top_k = static_cast<bst_uint>(param);
|
||||
if (param <= 0) top_k = std::numeric_limits<bst_uint>::max();
|
||||
top_k_ = static_cast<bst_uint>(param);
|
||||
if (param <= 0) top_k_ = std::numeric_limits<bst_uint>::max();
|
||||
const bst_uint ngroup = model.param.num_output_group;
|
||||
const bst_omp_uint nfeat = model.param.num_feature;
|
||||
|
||||
if (deltaw.size() == 0) {
|
||||
deltaw.resize(nfeat * ngroup);
|
||||
sorted_idx.resize(nfeat * ngroup);
|
||||
counter.resize(ngroup);
|
||||
gpair_sums.resize(nfeat * ngroup);
|
||||
if (deltaw_.size() == 0) {
|
||||
deltaw_.resize(nfeat * ngroup);
|
||||
sorted_idx_.resize(nfeat * ngroup);
|
||||
counter_.resize(ngroup);
|
||||
gpair_sums_.resize(nfeat * ngroup);
|
||||
}
|
||||
// Calculate univariate gradient sums
|
||||
std::fill(gpair_sums.begin(), gpair_sums.end(), std::make_pair(0., 0.));
|
||||
std::fill(gpair_sums_.begin(), gpair_sums_.end(), std::make_pair(0., 0.));
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator();
|
||||
while (iter->Next()) {
|
||||
const ColBatch &batch = iter->Value();
|
||||
@@ -401,7 +401,7 @@ class ThriftyFeatureSelector : public FeatureSelector {
|
||||
const ColBatch::Inst col = batch[i];
|
||||
const bst_uint ndata = col.length;
|
||||
for (bst_uint gid = 0u; gid < ngroup; ++gid) {
|
||||
auto &sums = gpair_sums[gid * nfeat + i];
|
||||
auto &sums = gpair_sums_[gid * nfeat + i];
|
||||
for (bst_uint j = 0u; j < ndata; ++j) {
|
||||
const bst_float v = col[j].fvalue;
|
||||
auto &p = gpair[col[j].index * ngroup + gid];
|
||||
@@ -413,45 +413,45 @@ class ThriftyFeatureSelector : public FeatureSelector {
|
||||
}
|
||||
}
|
||||
// rank by descending weight magnitude within the groups
|
||||
std::fill(deltaw.begin(), deltaw.end(), 0.f);
|
||||
std::iota(sorted_idx.begin(), sorted_idx.end(), 0);
|
||||
bst_float *pdeltaw = &deltaw[0];
|
||||
std::fill(deltaw_.begin(), deltaw_.end(), 0.f);
|
||||
std::iota(sorted_idx_.begin(), sorted_idx_.end(), 0);
|
||||
bst_float *pdeltaw = &deltaw_[0];
|
||||
for (bst_uint gid = 0u; gid < ngroup; ++gid) {
|
||||
// Calculate univariate weight changes
|
||||
for (bst_omp_uint i = 0; i < nfeat; ++i) {
|
||||
auto ii = gid * nfeat + i;
|
||||
auto &s = gpair_sums[ii];
|
||||
deltaw[ii] = static_cast<bst_float>(CoordinateDelta(
|
||||
auto &s = gpair_sums_[ii];
|
||||
deltaw_[ii] = static_cast<bst_float>(CoordinateDelta(
|
||||
s.first, s.second, model[i][gid], alpha, lambda));
|
||||
}
|
||||
// sort in descending order of deltaw abs values
|
||||
auto start = sorted_idx.begin() + gid * nfeat;
|
||||
auto start = sorted_idx_.begin() + gid * nfeat;
|
||||
std::sort(start, start + nfeat,
|
||||
[pdeltaw](size_t i, size_t j) {
|
||||
return std::abs(*(pdeltaw + i)) > std::abs(*(pdeltaw + j));
|
||||
});
|
||||
counter[gid] = 0u;
|
||||
counter_[gid] = 0u;
|
||||
}
|
||||
}
|
||||
|
||||
int NextFeature(int iteration, const gbm::GBLinearModel &model,
|
||||
int group_idx, const std::vector<bst_gpair> &gpair,
|
||||
int group_idx, const std::vector<GradientPair> &gpair,
|
||||
DMatrix *p_fmat, float alpha, float lambda) override {
|
||||
// k-th selected feature for a group
|
||||
auto k = counter[group_idx]++;
|
||||
auto k = counter_[group_idx]++;
|
||||
// stop after either reaching top-N or going through all the features in a group
|
||||
if (k >= top_k || counter[group_idx] == model.param.num_feature) return -1;
|
||||
if (k >= top_k_ || counter_[group_idx] == model.param.num_feature) return -1;
|
||||
// note that sorted_idx stores the "long" indices
|
||||
const size_t grp_offset = group_idx * model.param.num_feature;
|
||||
return static_cast<int>(sorted_idx[grp_offset + k] - grp_offset);
|
||||
return static_cast<int>(sorted_idx_[grp_offset + k] - grp_offset);
|
||||
}
|
||||
|
||||
protected:
|
||||
bst_uint top_k;
|
||||
std::vector<bst_float> deltaw;
|
||||
std::vector<size_t> sorted_idx;
|
||||
std::vector<bst_uint> counter;
|
||||
std::vector<std::pair<double, double>> gpair_sums;
|
||||
bst_uint top_k_;
|
||||
std::vector<bst_float> deltaw_;
|
||||
std::vector<size_t> sorted_idx_;
|
||||
std::vector<bst_uint> counter_;
|
||||
std::vector<std::pair<double, double>> gpair_sums_;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -85,7 +85,7 @@ class CoordinateUpdater : public LinearUpdater {
|
||||
monitor.Init("CoordinateUpdater", param.debug_verbose);
|
||||
}
|
||||
|
||||
void Update(std::vector<bst_gpair> *in_gpair, DMatrix *p_fmat,
|
||||
void Update(std::vector<GradientPair> *in_gpair, DMatrix *p_fmat,
|
||||
gbm::GBLinearModel *model, double sum_instance_weight) override {
|
||||
param.DenormalizePenalties(sum_instance_weight);
|
||||
const int ngroup = model->param.num_output_group;
|
||||
@@ -111,7 +111,7 @@ class CoordinateUpdater : public LinearUpdater {
|
||||
}
|
||||
}
|
||||
|
||||
inline void UpdateFeature(int fidx, int group_idx, std::vector<bst_gpair> *in_gpair,
|
||||
inline void UpdateFeature(int fidx, int group_idx, std::vector<GradientPair> *in_gpair,
|
||||
DMatrix *p_fmat, gbm::GBLinearModel *model) {
|
||||
const int ngroup = model->param.num_output_group;
|
||||
bst_float &w = (*model)[fidx][group_idx];
|
||||
|
||||
@@ -58,59 +58,60 @@ class ShotgunUpdater : public LinearUpdater {
|
||||
public:
|
||||
// set training parameter
|
||||
void Init(const std::vector<std::pair<std::string, std::string> > &args) override {
|
||||
param.InitAllowUnknown(args);
|
||||
selector.reset(FeatureSelector::Create(param.feature_selector));
|
||||
param_.InitAllowUnknown(args);
|
||||
selector_.reset(FeatureSelector::Create(param_.feature_selector));
|
||||
}
|
||||
|
||||
void Update(std::vector<bst_gpair> *in_gpair, DMatrix *p_fmat,
|
||||
void Update(std::vector<GradientPair> *in_gpair, DMatrix *p_fmat,
|
||||
gbm::GBLinearModel *model, double sum_instance_weight) override {
|
||||
param.DenormalizePenalties(sum_instance_weight);
|
||||
std::vector<bst_gpair> &gpair = *in_gpair;
|
||||
param_.DenormalizePenalties(sum_instance_weight);
|
||||
std::vector<GradientPair> &gpair = *in_gpair;
|
||||
const int ngroup = model->param.num_output_group;
|
||||
|
||||
// update bias
|
||||
for (int gid = 0; gid < ngroup; ++gid) {
|
||||
auto grad = GetBiasGradientParallel(gid, ngroup, *in_gpair, p_fmat);
|
||||
auto dbias = static_cast<bst_float>(param.learning_rate *
|
||||
auto dbias = static_cast<bst_float>(param_.learning_rate *
|
||||
CoordinateDeltaBias(grad.first, grad.second));
|
||||
model->bias()[gid] += dbias;
|
||||
UpdateBiasResidualParallel(gid, ngroup, dbias, in_gpair, p_fmat);
|
||||
}
|
||||
|
||||
// lock-free parallel updates of weights
|
||||
selector->Setup(*model, *in_gpair, p_fmat, param.reg_alpha_denorm, param.reg_lambda_denorm, 0);
|
||||
selector_->Setup(*model, *in_gpair, p_fmat, param_.reg_alpha_denorm,
|
||||
param_.reg_lambda_denorm, 0);
|
||||
dmlc::DataIter<ColBatch> *iter = p_fmat->ColIterator();
|
||||
while (iter->Next()) {
|
||||
const ColBatch &batch = iter->Value();
|
||||
const bst_omp_uint nfeat = static_cast<bst_omp_uint>(batch.size);
|
||||
const auto nfeat = static_cast<bst_omp_uint>(batch.size);
|
||||
#pragma omp parallel for schedule(static)
|
||||
for (bst_omp_uint i = 0; i < nfeat; ++i) {
|
||||
int ii = selector->NextFeature(i, *model, 0, *in_gpair, p_fmat,
|
||||
param.reg_alpha_denorm, param.reg_lambda_denorm);
|
||||
int ii = selector_->NextFeature(i, *model, 0, *in_gpair, p_fmat,
|
||||
param_.reg_alpha_denorm, param_.reg_lambda_denorm);
|
||||
if (ii < 0) continue;
|
||||
const bst_uint fid = batch.col_index[ii];
|
||||
ColBatch::Inst col = batch[ii];
|
||||
for (int gid = 0; gid < ngroup; ++gid) {
|
||||
double sum_grad = 0.0, sum_hess = 0.0;
|
||||
for (bst_uint j = 0; j < col.length; ++j) {
|
||||
bst_gpair &p = gpair[col[j].index * ngroup + gid];
|
||||
GradientPair &p = gpair[col[j].index * ngroup + gid];
|
||||
if (p.GetHess() < 0.0f) continue;
|
||||
const bst_float v = col[j].fvalue;
|
||||
sum_grad += p.GetGrad() * v;
|
||||
sum_hess += p.GetHess() * v * v;
|
||||
}
|
||||
bst_float &w = (*model)[fid][gid];
|
||||
bst_float dw = static_cast<bst_float>(
|
||||
param.learning_rate *
|
||||
CoordinateDelta(sum_grad, sum_hess, w, param.reg_alpha_denorm,
|
||||
param.reg_lambda_denorm));
|
||||
auto dw = static_cast<bst_float>(
|
||||
param_.learning_rate *
|
||||
CoordinateDelta(sum_grad, sum_hess, w, param_.reg_alpha_denorm,
|
||||
param_.reg_lambda_denorm));
|
||||
if (dw == 0.f) continue;
|
||||
w += dw;
|
||||
// update grad values
|
||||
for (bst_uint j = 0; j < col.length; ++j) {
|
||||
bst_gpair &p = gpair[col[j].index * ngroup + gid];
|
||||
GradientPair &p = gpair[col[j].index * ngroup + gid];
|
||||
if (p.GetHess() < 0.0f) continue;
|
||||
p += bst_gpair(p.GetHess() * col[j].fvalue * dw, 0);
|
||||
p += GradientPair(p.GetHess() * col[j].fvalue * dw, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -119,9 +120,9 @@ class ShotgunUpdater : public LinearUpdater {
|
||||
|
||||
protected:
|
||||
// training parameters
|
||||
ShotgunTrainParam param;
|
||||
ShotgunTrainParam param_;
|
||||
|
||||
std::unique_ptr<FeatureSelector> selector;
|
||||
std::unique_ptr<FeatureSelector> selector_;
|
||||
};
|
||||
|
||||
DMLC_REGISTER_PARAMETER(ShotgunTrainParam);
|
||||
|
||||
Reference in New Issue
Block a user