diff --git a/src/learner.cc b/src/learner.cc index dcb6c5783..b5151a13a 100644 --- a/src/learner.cc +++ b/src/learner.cc @@ -41,6 +41,7 @@ #include "common/observer.h" #include "common/random.h" #include "common/timer.h" +#include "common/charconv.h" #include "common/version.h" namespace { @@ -99,18 +100,33 @@ struct LearnerModelParamLegacy : public dmlc::Parameter // Skip other legacy fields. Json ToJson() const { Object obj; - obj["base_score"] = std::to_string(base_score); - obj["num_feature"] = std::to_string(num_feature); - obj["num_class"] = std::to_string(num_class); + char floats[NumericLimits::kToCharsSize]; + auto ret = to_chars(floats, floats + NumericLimits::kToCharsSize, base_score); + CHECK(ret.ec == std::errc()); + obj["base_score"] = + std::string{floats, static_cast(std::distance(floats, ret.ptr))}; + + char integers[NumericLimits::kToCharsSize]; + ret = to_chars(integers, integers + NumericLimits::kToCharsSize, + static_cast(num_feature)); + CHECK(ret.ec == std::errc()); + obj["num_feature"] = + std::string{integers, static_cast(std::distance(integers, ret.ptr))}; + ret = to_chars(integers, integers + NumericLimits::kToCharsSize, + static_cast(num_class)); + CHECK(ret.ec == std::errc()); + obj["num_class"] = + std::string{integers, static_cast(std::distance(integers, ret.ptr))}; return Json(std::move(obj)); } void FromJson(Json const& obj) { auto const& j_param = get(obj); std::map m; - m["base_score"] = get(j_param.at("base_score")); m["num_feature"] = get(j_param.at("num_feature")); m["num_class"] = get(j_param.at("num_class")); this->Init(m); + std::string str = get(j_param.at("base_score")); + from_chars(str.c_str(), str.c_str() + str.size(), base_score); } // declare parameters DMLC_DECLARE_PARAMETER(LearnerModelParamLegacy) { diff --git a/tests/cpp/test_serialization.cc b/tests/cpp/test_serialization.cc index 9ab4c5416..23334408f 100644 --- a/tests/cpp/test_serialization.cc +++ b/tests/cpp/test_serialization.cc @@ -177,6 +177,7 @@ TEST_F(SerializationTest, Exact) { TestLearnerSerialization({{"booster", "gbtree"}, {"seed", "0"}, {"nthread", "1"}, + {"base_score", "3.14195265"}, {"max_depth", "2"}, {"enable_experimental_json_serialization", "1"}, {"tree_method", "exact"}}, @@ -185,6 +186,7 @@ TEST_F(SerializationTest, Exact) { TestLearnerSerialization({{"booster", "gbtree"}, {"seed", "0"}, {"nthread", "1"}, + {"base_score", "3.14195265"}, {"max_depth", "2"}, {"num_parallel_tree", "4"}, {"enable_experimental_json_serialization", "1"}, @@ -194,6 +196,7 @@ TEST_F(SerializationTest, Exact) { TestLearnerSerialization({{"booster", "dart"}, {"seed", "0"}, {"nthread", "1"}, + {"base_score", "3.14195265"}, {"max_depth", "2"}, {"enable_experimental_json_serialization", "1"}, {"tree_method", "exact"}},