1 /*!
2  * Copyright 2018-2019 XGBoost contributors
3  */
4 #include <xgboost/objective.h>
5 #include <xgboost/generic_parameters.h>
6 #include "../../src/common/common.h"
7 #include "../helpers.h"
8 
9 namespace xgboost {
10 
TEST(Objective,DeclareUnifiedTest (SoftmaxMultiClassObjGPair))11 TEST(Objective, DeclareUnifiedTest(SoftmaxMultiClassObjGPair)) {
12   GenericParameter lparam = CreateEmptyGenericParam(GPUIDX);
13   std::vector<std::pair<std::string, std::string>> args {{"num_class", "3"}};
14   std::unique_ptr<ObjFunction> obj {
15     ObjFunction::Create("multi:softmax", &lparam)
16   };
17 
18   obj->Configure(args);
19   CheckConfigReload(obj, "multi:softmax");
20 
21   CheckObjFunction(obj,
22 		   {1.0f, 0.0f, 2.0f, 2.0f, 0.0f, 1.0f}, // preds
23 		   {1.0f, 0.0f},	       // labels
24 		   {1.0f, 1.0f},	       // weights
25 		   {0.24f, -0.91f, 0.66f, -0.33f, 0.09f, 0.24f}, // grad
26 		   {0.36f, 0.16f, 0.44f, 0.45f, 0.16f, 0.37f});	 // hess
27 
28   CheckObjFunction(obj,
29 		   {1.0f, 0.0f, 2.0f, 2.0f, 0.0f, 1.0f}, // preds
30 		   {1.0f, 0.0f},	       // labels
31                    {},                         // weights
32 		   {0.24f, -0.91f, 0.66f, -0.33f, 0.09f, 0.24f}, // grad
33 		   {0.36f, 0.16f, 0.44f, 0.45f, 0.16f, 0.37f});	 // hess
34 
35   ASSERT_NO_THROW(obj->DefaultEvalMetric());
36 }
37 
TEST(Objective,DeclareUnifiedTest (SoftmaxMultiClassBasic))38 TEST(Objective, DeclareUnifiedTest(SoftmaxMultiClassBasic)) {
39   auto lparam = CreateEmptyGenericParam(GPUIDX);
40   std::vector<std::pair<std::string, std::string>> args{
41     std::pair<std::string, std::string>("num_class", "3")};
42 
43   std::unique_ptr<ObjFunction> obj { ObjFunction::Create("multi:softmax", &lparam) };
44   obj->Configure(args);
45   CheckConfigReload(obj, "multi:softmax");
46 
47   HostDeviceVector<bst_float>  io_preds = {2.0f, 0.0f, 1.0f,
48                                            1.0f, 0.0f, 2.0f};
49   std::vector<bst_float> out_preds = {0.0f, 2.0f};
50   obj->PredTransform(&io_preds);
51 
52   auto& preds = io_preds.HostVector();
53 
54   for (int i = 0; i < static_cast<int>(io_preds.Size()); ++i) {
55     EXPECT_NEAR(preds[i], out_preds[i], 0.01f);
56   }
57 }
58 
TEST(Objective,DeclareUnifiedTest (SoftprobMultiClassBasic))59 TEST(Objective, DeclareUnifiedTest(SoftprobMultiClassBasic)) {
60   GenericParameter lparam = CreateEmptyGenericParam(GPUIDX);
61   std::vector<std::pair<std::string, std::string>> args {
62     std::pair<std::string, std::string>("num_class", "3")};
63 
64   std::unique_ptr<ObjFunction> obj {
65     ObjFunction::Create("multi:softprob", &lparam)
66   };
67   obj->Configure(args);
68   CheckConfigReload(obj, "multi:softprob");
69 
70   HostDeviceVector<bst_float>  io_preds = {2.0f, 0.0f, 1.0f};
71   std::vector<bst_float> out_preds = {0.66524096f, 0.09003057f, 0.24472847f};
72 
73   obj->PredTransform(&io_preds);
74   auto& preds = io_preds.HostVector();
75 
76   for (int i = 0; i < static_cast<int>(io_preds.Size()); ++i) {
77     EXPECT_NEAR(preds[i], out_preds[i], 0.01f);
78   }
79 }
80 }  // namespace xgboost
81