| 465 | |
| 466 | |
| 467 | bool GBDT::TrainOneIter_new(const score_t* gradients, const score_t* hessians,const score_t* gradients2, const score_t* hessians2) { |
| 468 | std::vector<double> init_scores(num_tree_per_iteration_, 0.0); |
| 469 | |
| 470 | // bagging logic |
| 471 | Bagging(iter_); |
| 472 | |
| 473 | bool should_continue = false; |
| 474 | for (int cur_tree_id = 0; cur_tree_id < num_tree_per_iteration_; ++cur_tree_id) { |
| 475 | const size_t offset = static_cast<size_t>(cur_tree_id) * num_data_; |
| 476 | for (int cur_tree_id2 = 0; cur_tree_id2 < config_->num_labels; ++cur_tree_id2) { |
| 477 | const size_t offset2 = static_cast<size_t>(cur_tree_id2) * num_data_; |
| 478 | std::unique_ptr<Tree> new_tree(new Tree(2)); |
| 479 | |
| 480 | if (class_need_train_[cur_tree_id] && train_data_->num_features() > 0) { |
| 481 | auto grad = gradients + offset; |
| 482 | auto hess = hessians + offset; |
| 483 | auto grad2 = gradients2 + offset2; |
| 484 | auto hess2 = hessians2 + offset2; |
| 485 | if (is_use_subset_ && bag_data_cnt_ < num_data_) { |
| 486 | |
| 487 | for (int i = 0; i < bag_data_cnt_; ++i) { |
| 488 | gradients_[offset + i] = grad[bag_data_indices_[i]]; |
| 489 | hessians_[offset + i] = hess[bag_data_indices_[i]]; |
| 490 | } |
| 491 | grad = gradients_.data() + offset; |
| 492 | hess = hessians_.data() + offset; |
| 493 | } |
| 494 | new_tree.reset(tree_learner_->Train(grad, hess, is_constant_hessian_, forced_splits_json_)); |
| 495 | // new_tree.reset(tree_learner_->Train_serial2(grad, hess,grad, hess, is_constant_hessian_, forced_splits_json_)); |
| 496 | tree_learner_->Train_serial2(new_tree.get(), grad2, hess2); |
| 497 | } |
| 498 | |
| 499 | |
| 500 | if (new_tree->num_leaves() > 1) { |
| 501 | should_continue = true; |
| 502 | auto score_ptr = train_score_updater_->score() + offset2; |
| 503 | auto residual_getter = [score_ptr](const label_t* label, int i) {return static_cast<double>(label[i]) - score_ptr[i]; }; |
| 504 | // tree_learner_->RenewTreeOutput(new_tree.get(), objective_function_, residual_getter, |
| 505 | // num_data_, bag_data_indices_.data(), bag_data_cnt_); |
| 506 | // shrinkage by learning rate |
| 507 | new_tree->Shrinkage(shrinkage_rate_); |
| 508 | // update score |
| 509 | UpdateScore(new_tree.get(), cur_tree_id2); |
| 510 | if (std::fabs(init_scores[cur_tree_id]) > kEpsilon) { |
| 511 | Log::Warning("please set grad and hess both."); |
| 512 | new_tree->AddBias(init_scores[cur_tree_id]); |
| 513 | } |
| 514 | } else { |
| 515 | // only add default score one-time |
| 516 | if (models_.size() < static_cast<size_t>(num_tree_per_iteration_)) { |
| 517 | double output = 0.0; |
| 518 | if (!class_need_train_[cur_tree_id2]) { |
| 519 | if (objective_function_ != nullptr) { |
| 520 | output = objective_function_->BoostFromScore(cur_tree_id2); |
| 521 | } |
| 522 | } else { |
| 523 | output = init_scores[cur_tree_id]; |
| 524 | } |
nothing calls this directly
no test coverage detected