Commit 1cacaef9 authored by Guolin Ke's avatar Guolin Ke
Browse files

use int64_t for num_class * num_data

parent f449a45b
...@@ -94,7 +94,7 @@ public: ...@@ -94,7 +94,7 @@ public:
* \param out_len length of returned score * \param out_len length of returned score
* \return training score * \return training score
*/ */
virtual const score_t* GetTrainingScore(data_size_t* out_len) = 0; virtual const score_t* GetTrainingScore(int64_t* out_len) = 0;
/*! /*!
* \brief Get prediction result at data_idx data * \brief Get prediction result at data_idx data
...@@ -102,7 +102,7 @@ public: ...@@ -102,7 +102,7 @@ public:
* \param result used to store prediction result, should allocate memory before call this function * \param result used to store prediction result, should allocate memory before call this function
* \param out_len lenght of returned score * \param out_len lenght of returned score
*/ */
virtual void GetPredictAt(int data_idx, score_t* result, data_size_t* out_len) = 0; virtual void GetPredictAt(int data_idx, score_t* result, int64_t* out_len) = 0;
/*! /*!
* \brief Prediction for one record, not sigmoid transform * \brief Prediction for one record, not sigmoid transform
......
...@@ -63,13 +63,13 @@ public: ...@@ -63,13 +63,13 @@ public:
* \param out_len length of returned score * \param out_len length of returned score
* \return training score * \return training score
*/ */
const score_t* GetTrainingScore(data_size_t* out_len) override { const score_t* GetTrainingScore(int64_t* out_len) override {
if (!is_update_score_cur_iter_) { if (!is_update_score_cur_iter_) {
// only drop one time in one iteration // only drop one time in one iteration
DroppingTrees(); DroppingTrees();
is_update_score_cur_iter_ = true; is_update_score_cur_iter_ = true;
} }
*out_len = train_score_updater_->num_data() * num_class_; *out_len = static_cast<int64_t>(train_score_updater_->num_data()) * num_class_;
return train_score_updater_->score(); return train_score_updater_->score();
} }
......
...@@ -83,8 +83,9 @@ void GBDT::ResetTrainingData(const BoostingConfig* config, const Dataset* train_ ...@@ -83,8 +83,9 @@ void GBDT::ResetTrainingData(const BoostingConfig* config, const Dataset* train_
num_data_ = train_data->num_data(); num_data_ = train_data->num_data();
// create buffer for gradients and hessians // create buffer for gradients and hessians
if (object_function_ != nullptr) { if (object_function_ != nullptr) {
gradients_.resize(num_data_ * num_class_); size_t total_size = static_cast<size_t>(num_data_) * num_class_;
hessians_.resize(num_data_ * num_class_); gradients_.resize(total_size);
hessians_.resize(total_size);
} }
// get max feature index // get max feature index
max_feature_idx_ = train_data->num_total_features() - 1; max_feature_idx_ = train_data->num_total_features() - 1;
...@@ -372,12 +373,12 @@ std::vector<double> GBDT::GetEvalAt(int data_idx) const { ...@@ -372,12 +373,12 @@ std::vector<double> GBDT::GetEvalAt(int data_idx) const {
} }
/*! \brief Get training scores result */ /*! \brief Get training scores result */
const score_t* GBDT::GetTrainingScore(data_size_t* out_len) { const score_t* GBDT::GetTrainingScore(int64_t* out_len) {
*out_len = train_score_updater_->num_data() * num_class_; *out_len = static_cast<int64_t>(train_score_updater_->num_data()) * num_class_;
return train_score_updater_->score(); return train_score_updater_->score();
} }
void GBDT::GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len) { void GBDT::GetPredictAt(int data_idx, score_t* out_result, int64_t* out_len) {
CHECK(data_idx >= 0 && data_idx <= static_cast<int>(valid_metrics_.size())); CHECK(data_idx >= 0 && data_idx <= static_cast<int>(valid_metrics_.size()));
const score_t* raw_scores = nullptr; const score_t* raw_scores = nullptr;
...@@ -389,7 +390,7 @@ void GBDT::GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len) ...@@ -389,7 +390,7 @@ void GBDT::GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len)
auto used_idx = data_idx - 1; auto used_idx = data_idx - 1;
raw_scores = valid_score_updater_[used_idx]->score(); raw_scores = valid_score_updater_[used_idx]->score();
num_data = valid_score_updater_[used_idx]->num_data(); num_data = valid_score_updater_[used_idx]->num_data();
*out_len = num_data * num_class_; *out_len = static_cast<int64_t>(num_data) * num_class_;
} }
if (num_class_ > 1) { if (num_class_ > 1) {
#pragma omp parallel for schedule(static) #pragma omp parallel for schedule(static)
...@@ -422,7 +423,7 @@ void GBDT::Boosting() { ...@@ -422,7 +423,7 @@ void GBDT::Boosting() {
Log::Fatal("No object function provided"); Log::Fatal("No object function provided");
} }
// objective function will calculate gradients and hessians // objective function will calculate gradients and hessians
int num_score = 0; int64_t num_score = 0;
object_function_-> object_function_->
GetGradients(GetTrainingScore(&num_score), gradients_.data(), hessians_.data()); GetGradients(GetTrainingScore(&num_score), gradients_.data(), hessians_.data());
} }
......
...@@ -105,7 +105,7 @@ public: ...@@ -105,7 +105,7 @@ public:
* \param out_len length of returned score * \param out_len length of returned score
* \return training score * \return training score
*/ */
virtual const score_t* GetTrainingScore(data_size_t* out_len) override; virtual const score_t* GetTrainingScore(int64_t* out_len) override;
/*! /*!
* \brief Get prediction result at data_idx data * \brief Get prediction result at data_idx data
...@@ -113,7 +113,7 @@ public: ...@@ -113,7 +113,7 @@ public:
* \param result used to store prediction result, should allocate memory before call this function * \param result used to store prediction result, should allocate memory before call this function
* \param out_len lenght of returned score * \param out_len lenght of returned score
*/ */
void GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len) override; void GetPredictAt(int data_idx, score_t* out_result, int64_t* out_len) override;
/*! /*!
* \brief Prediction for one record without sigmoid transformation * \brief Prediction for one record without sigmoid transformation
......
...@@ -20,13 +20,14 @@ public: ...@@ -20,13 +20,14 @@ public:
*/ */
ScoreUpdater(const Dataset* data, int num_class) : data_(data) { ScoreUpdater(const Dataset* data, int num_class) : data_(data) {
num_data_ = data->num_data(); num_data_ = data->num_data();
score_ = std::vector<score_t>(num_data_ * num_class); size_t total_size = static_cast<size_t>(num_data_) * num_class;
score_.resize(total_size);
// default start score is zero // default start score is zero
std::fill(score_.begin(), score_.end(), 0.0f); std::fill(score_.begin(), score_.end(), 0.0f);
const float* init_score = data->metadata().init_score(); const float* init_score = data->metadata().init_score();
// if exists initial score, will start from it // if exists initial score, will start from it
if (init_score != nullptr) { if (init_score != nullptr) {
for (data_size_t i = 0; i < num_data_ * num_class; ++i) { for (size_t i = 0; i < total_size; ++i) {
score_[i] = init_score[i]; score_[i] = init_score[i];
} }
} }
......
...@@ -169,7 +169,7 @@ public: ...@@ -169,7 +169,7 @@ public:
predictor_.reset(new Predictor(boosting_.get(), is_raw_score, is_predict_leaf)); predictor_.reset(new Predictor(boosting_.get(), is_raw_score, is_predict_leaf));
} }
void GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len) { void GetPredictAt(int data_idx, score_t* out_result, int64_t* out_len) {
boosting_->GetPredictAt(data_idx, out_result, out_len); boosting_->GetPredictAt(data_idx, out_result, out_len);
} }
...@@ -681,9 +681,7 @@ DllExport int LGBM_BoosterGetPredict(BoosterHandle handle, ...@@ -681,9 +681,7 @@ DllExport int LGBM_BoosterGetPredict(BoosterHandle handle,
float* out_result) { float* out_result) {
API_BEGIN(); API_BEGIN();
Booster* ref_booster = reinterpret_cast<Booster*>(handle); Booster* ref_booster = reinterpret_cast<Booster*>(handle);
int len = 0; ref_booster->GetPredictAt(data_idx, out_result, out_len);
ref_booster->GetPredictAt(data_idx, out_result, &len);
*out_len = static_cast<int64_t>(len);
API_END(); API_END();
} }
......
...@@ -56,7 +56,8 @@ public: ...@@ -56,7 +56,8 @@ public:
for (data_size_t i = 0; i < num_data_; ++i) { for (data_size_t i = 0; i < num_data_; ++i) {
std::vector<double> rec(num_class_); std::vector<double> rec(num_class_);
for (int k = 0; k < num_class_; ++k) { for (int k = 0; k < num_class_; ++k) {
rec[k] = static_cast<double>(score[k * num_data_ + i]); size_t idx = static_cast<size_t>(num_data_) * k + i;
rec[k] = static_cast<double>(score[idx]);
} }
// add loss // add loss
sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], rec); sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], rec);
...@@ -66,7 +67,8 @@ public: ...@@ -66,7 +67,8 @@ public:
for (data_size_t i = 0; i < num_data_; ++i) { for (data_size_t i = 0; i < num_data_; ++i) {
std::vector<double> rec(num_class_); std::vector<double> rec(num_class_);
for (int k = 0; k < num_class_; ++k) { for (int k = 0; k < num_class_; ++k) {
rec[k] = static_cast<double>(score[k * num_data_ + i]); size_t idx = static_cast<size_t>(num_data_) * k + i;
rec[k] = static_cast<double>(score[idx]);
} }
// add loss // add loss
sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], rec) * weights_[i]; sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], rec) * weights_[i];
......
...@@ -38,17 +38,19 @@ public: ...@@ -38,17 +38,19 @@ public:
for (data_size_t i = 0; i < num_data_; ++i) { for (data_size_t i = 0; i < num_data_; ++i) {
std::vector<double> rec(num_class_); std::vector<double> rec(num_class_);
for (int k = 0; k < num_class_; ++k){ for (int k = 0; k < num_class_; ++k){
rec[k] = static_cast<double>(score[k * num_data_ + i]); size_t idx = static_cast<size_t>(num_data_) * k + i;
rec[k] = static_cast<double>(score[idx]);
} }
Common::Softmax(&rec); Common::Softmax(&rec);
for (int k = 0; k < num_class_; ++k) { for (int k = 0; k < num_class_; ++k) {
score_t p = static_cast<score_t>(rec[k]); score_t p = static_cast<score_t>(rec[k]);
size_t idx = static_cast<size_t>(num_data_) * k + i;
if (label_int_[i] == k) { if (label_int_[i] == k) {
gradients[k * num_data_ + i] = p - 1.0f; gradients[idx] = p - 1.0f;
} else { } else {
gradients[k * num_data_ + i] = p; gradients[idx] = p;
} }
hessians[k * num_data_ + i] = 2.0f * p * (1.0f - p); hessians[idx] = 2.0f * p * (1.0f - p);
} }
} }
} else { } else {
...@@ -56,17 +58,19 @@ public: ...@@ -56,17 +58,19 @@ public:
for (data_size_t i = 0; i < num_data_; ++i) { for (data_size_t i = 0; i < num_data_; ++i) {
std::vector<double> rec(num_class_); std::vector<double> rec(num_class_);
for (int k = 0; k < num_class_; ++k){ for (int k = 0; k < num_class_; ++k){
rec[k] = static_cast<double>(score[k * num_data_ + i]); size_t idx = static_cast<size_t>(num_data_) * k + i;
rec[k] = static_cast<double>(score[idx]);
} }
Common::Softmax(&rec); Common::Softmax(&rec);
for (int k = 0; k < num_class_; ++k) { for (int k = 0; k < num_class_; ++k) {
score_t p = static_cast<score_t>(rec[k]); score_t p = static_cast<score_t>(rec[k]);
size_t idx = static_cast<size_t>(num_data_) * k + i;
if (label_int_[i] == k) { if (label_int_[i] == k) {
gradients[k * num_data_ + i] = (p - 1.0f) * weights_[i]; gradients[idx] = (p - 1.0f) * weights_[i];
} else { } else {
gradients[k * num_data_ + i] = p * weights_[i]; gradients[idx] = p * weights_[i];
} }
hessians[k * num_data_ + i] = 2.0f * p * (1.0f - p) * weights_[i]; hessians[idx] = 2.0f * p * (1.0f - p) * weights_[i];
} }
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment