1 // Copyright by Contributors
2 #include <xgboost/objective.h>
3 #include <xgboost/generic_parameters.h>
4 #include "../helpers.h"
5 #include <xgboost/json.h>
6 
7 namespace xgboost {
8 
TEST(Objective,DeclareUnifiedTest (PairwiseRankingGPair))9 TEST(Objective, DeclareUnifiedTest(PairwiseRankingGPair)) {
10   std::vector<std::pair<std::string, std::string>> args;
11   xgboost::GenericParameter lparam = xgboost::CreateEmptyGenericParam(GPUIDX);
12 
13   std::unique_ptr<xgboost::ObjFunction> obj {
14     xgboost::ObjFunction::Create("rank:pairwise", &lparam)
15   };
16   obj->Configure(args);
17   CheckConfigReload(obj, "rank:pairwise");
18 
19   // Test with setting sample weight to second query group
20   CheckRankingObjFunction(obj,
21                           {0, 0.1f, 0, 0.1f},
22                           {0,   1, 0, 1},
23                           {2.0f, 0.0f},
24                           {0, 2, 4},
25                           {1.9f, -1.9f, 0.0f, 0.0f},
26                           {1.995f, 1.995f, 0.0f, 0.0f});
27 
28   CheckRankingObjFunction(obj,
29                           {0, 0.1f, 0, 0.1f},
30                           {0,   1, 0, 1},
31                           {1.0f, 1.0f},
32                           {0, 2, 4},
33                           {0.95f, -0.95f,  0.95f, -0.95f},
34                           {0.9975f, 0.9975f, 0.9975f, 0.9975f});
35 
36   ASSERT_NO_THROW(obj->DefaultEvalMetric());
37 }
38 
TEST(Objective,DeclareUnifiedTest (NDCG_JsonIO))39 TEST(Objective, DeclareUnifiedTest(NDCG_JsonIO)) {
40   xgboost::GenericParameter tparam;
41   tparam.UpdateAllowUnknown(Args{});
42 
43   std::unique_ptr<xgboost::ObjFunction> obj {
44     xgboost::ObjFunction::Create("rank:ndcg", &tparam)
45   };
46 
47   obj->Configure(Args{});
48   Json j_obj {Object()};
49   obj->SaveConfig(&j_obj);
50 
51   ASSERT_EQ(get<String>(j_obj["name"]), "rank:ndcg");;
52 
53   auto const& j_param = j_obj["lambda_rank_param"];
54 
55   ASSERT_EQ(get<String>(j_param["num_pairsample"]), "1");
56   ASSERT_EQ(get<String>(j_param["fix_list_weight"]), "0");
57 }
58 
TEST(Objective,DeclareUnifiedTest (PairwiseRankingGPairSameLabels))59 TEST(Objective, DeclareUnifiedTest(PairwiseRankingGPairSameLabels)) {
60   std::vector<std::pair<std::string, std::string>> args;
61   xgboost::GenericParameter lparam = xgboost::CreateEmptyGenericParam(GPUIDX);
62 
63   std::unique_ptr<ObjFunction> obj {
64     ObjFunction::Create("rank:pairwise", &lparam)
65   };
66   obj->Configure(args);
67   // No computation of gradient/hessian, as there is no diversity in labels
68   CheckRankingObjFunction(obj,
69                           {0, 0.1f, 0, 0.1f},
70                           {1,   1, 1, 1},
71                           {2.0f, 0.0f},
72                           {0, 2, 4},
73                           {0.0f, 0.0f, 0.0f, 0.0f},
74                           {0.0f, 0.0f, 0.0f, 0.0f});
75 
76   ASSERT_NO_THROW(obj->DefaultEvalMetric());
77 }
78 
TEST(Objective,DeclareUnifiedTest (NDCGRankingGPair))79 TEST(Objective, DeclareUnifiedTest(NDCGRankingGPair)) {
80   std::vector<std::pair<std::string, std::string>> args;
81   xgboost::GenericParameter lparam = xgboost::CreateEmptyGenericParam(GPUIDX);
82 
83   std::unique_ptr<xgboost::ObjFunction> obj {
84     xgboost::ObjFunction::Create("rank:ndcg", &lparam)
85   };
86   obj->Configure(args);
87   CheckConfigReload(obj, "rank:ndcg");
88 
89   // Test with setting sample weight to second query group
90   CheckRankingObjFunction(obj,
91                           {0, 0.1f, 0, 0.1f},
92                           {0,   1, 0, 1},
93                           {2.0f, 0.0f},
94                           {0, 2, 4},
95                           {0.7f, -0.7f, 0.0f, 0.0f},
96                           {0.74f, 0.74f, 0.0f, 0.0f});
97 
98   CheckRankingObjFunction(obj,
99                           {0, 0.1f, 0, 0.1f},
100                           {0,   1, 0, 1},
101                           {1.0f, 1.0f},
102                           {0, 2, 4},
103                           {0.35f, -0.35f,  0.35f, -0.35f},
104                           {0.368f, 0.368f, 0.368f, 0.368f});
105   ASSERT_NO_THROW(obj->DefaultEvalMetric());
106 }
107 
TEST(Objective,DeclareUnifiedTest (MAPRankingGPair))108 TEST(Objective, DeclareUnifiedTest(MAPRankingGPair)) {
109   std::vector<std::pair<std::string, std::string>> args;
110   xgboost::GenericParameter lparam = xgboost::CreateEmptyGenericParam(GPUIDX);
111 
112   std::unique_ptr<xgboost::ObjFunction> obj {
113     xgboost::ObjFunction::Create("rank:map", &lparam)
114   };
115   obj->Configure(args);
116   CheckConfigReload(obj, "rank:map");
117 
118   // Test with setting sample weight to second query group
119   CheckRankingObjFunction(obj,
120                           {0, 0.1f, 0, 0.1f},
121                           {0,   1, 0, 1},
122                           {2.0f, 0.0f},
123                           {0, 2, 4},
124                           {0.95f, -0.95f,  0.0f, 0.0f},
125                           {0.9975f, 0.9975f, 0.0f, 0.0f});
126 
127   CheckRankingObjFunction(obj,
128                           {0, 0.1f, 0, 0.1f},
129                           {0,   1, 0, 1},
130                           {1.0f, 1.0f},
131                           {0, 2, 4},
132                           {0.475f, -0.475f,  0.475f, -0.475f},
133                           {0.4988f, 0.4988f, 0.4988f, 0.4988f});
134   ASSERT_NO_THROW(obj->DefaultEvalMetric());
135 }
136 
137 }  // namespace xgboost
138