diff --git a/include/xgboost/objective.h b/include/xgboost/objective.h index dcf244987..3e722a18f 100644 --- a/include/xgboost/objective.h +++ b/include/xgboost/objective.h @@ -53,7 +53,7 @@ class ObjFunction : public Configurable { * \brief transform prediction values, this is only called when Prediction is called * \param io_preds prediction values, saves to this vector as well */ - virtual void PredTransform(HostDeviceVector*) {} + virtual void PredTransform(HostDeviceVector*) const {} /*! * \brief transform prediction values, this is only called when Eval is called, diff --git a/plugin/example/custom_obj.cc b/plugin/example/custom_obj.cc index c42e21c8b..a18d8aecc 100644 --- a/plugin/example/custom_obj.cc +++ b/plugin/example/custom_obj.cc @@ -58,7 +58,7 @@ class MyLogistic : public ObjFunction { const char* DefaultEvalMetric() const override { return "logloss"; } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { // transform margin value to probability. std::vector &preds = io_preds->HostVector(); for (auto& pred : preds) { diff --git a/src/objective/aft_obj.cu b/src/objective/aft_obj.cu index fadd449dc..95e4f4c55 100644 --- a/src/objective/aft_obj.cu +++ b/src/objective/aft_obj.cu @@ -102,7 +102,7 @@ class AFTObj : public ObjFunction { } } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { // Trees give us a prediction in log scale, so exponentiate common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { diff --git a/src/objective/hinge.cu b/src/objective/hinge.cu index 8e37aa0db..0c8c2f317 100644 --- a/src/objective/hinge.cu +++ b/src/objective/hinge.cu @@ -68,7 +68,7 @@ class HingeObj : public ObjFunction { out_gpair, &preds, &info.labels_, &info.weights_); } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { _preds[_idx] = _preds[_idx] > 0.0 ? 1.0 : 0.0; diff --git a/src/objective/multiclass_obj.cu b/src/objective/multiclass_obj.cu index 4286b6c40..6ffa6eac2 100644 --- a/src/objective/multiclass_obj.cu +++ b/src/objective/multiclass_obj.cu @@ -121,7 +121,7 @@ class SoftmaxMultiClassObj : public ObjFunction { } } } - void PredTransform(HostDeviceVector* io_preds) override { + void PredTransform(HostDeviceVector* io_preds) const override { this->Transform(io_preds, output_prob_); } void EvalTransform(HostDeviceVector* io_preds) override { @@ -131,10 +131,9 @@ class SoftmaxMultiClassObj : public ObjFunction { return "mlogloss"; } - inline void Transform(HostDeviceVector *io_preds, bool prob) { + inline void Transform(HostDeviceVector *io_preds, bool prob) const { const int nclass = param_.num_class; const auto ndata = static_cast(io_preds->Size() / nclass); - max_preds_.Resize(ndata); auto device = io_preds->DeviceIdx(); if (prob) { @@ -148,23 +147,22 @@ class SoftmaxMultiClassObj : public ObjFunction { .Eval(io_preds); } else { io_preds->SetDevice(device); - max_preds_.SetDevice(device); + HostDeviceVector max_preds; + max_preds.SetDevice(device); + max_preds.Resize(ndata); common::Transform<>::Init( - [=] XGBOOST_DEVICE(size_t _idx, - common::Span _preds, + [=] XGBOOST_DEVICE(size_t _idx, common::Span _preds, common::Span _max_preds) { common::Span point = _preds.subspan(_idx * nclass, nclass); _max_preds[_idx] = - common::FindMaxIndex(point.cbegin(), - point.cend()) - point.cbegin(); + common::FindMaxIndex(point.cbegin(), point.cend()) - + point.cbegin(); }, common::Range{0, ndata}, device, false) - .Eval(io_preds, &max_preds_); - } - if (!prob) { - io_preds->Resize(max_preds_.Size()); - io_preds->Copy(max_preds_); + .Eval(io_preds, &max_preds); + io_preds->Resize(max_preds.Size()); + io_preds->Copy(max_preds); } } @@ -188,7 +186,6 @@ class SoftmaxMultiClassObj : public ObjFunction { // parameter SoftmaxMultiClassParam param_; // Cache for max_preds - HostDeviceVector max_preds_; HostDeviceVector label_correct_; }; diff --git a/src/objective/regression_obj.cu b/src/objective/regression_obj.cu index cb5e0f48e..bb4e7074b 100644 --- a/src/objective/regression_obj.cu +++ b/src/objective/regression_obj.cu @@ -109,7 +109,7 @@ class RegLossObj : public ObjFunction { return Loss::DefaultEvalMetric(); } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { _preds[_idx] = Loss::PredTransform(_preds[_idx]); @@ -233,7 +233,7 @@ class PoissonRegression : public ObjFunction { } } } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { _preds[_idx] = expf(_preds[_idx]); @@ -343,7 +343,7 @@ class CoxRegression : public ObjFunction { last_exp_p = exp_p; } } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { std::vector &preds = io_preds->HostVector(); const long ndata = static_cast(preds.size()); // NOLINT(*) common::ParallelFor(ndata, [&](long j) { // NOLINT(*) @@ -420,7 +420,7 @@ class GammaRegression : public ObjFunction { } } } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { _preds[_idx] = expf(_preds[_idx]); @@ -523,7 +523,7 @@ class TweedieRegression : public ObjFunction { } } } - void PredTransform(HostDeviceVector *io_preds) override { + void PredTransform(HostDeviceVector *io_preds) const override { common::Transform<>::Init( [] XGBOOST_DEVICE(size_t _idx, common::Span _preds) { _preds[_idx] = expf(_preds[_idx]);