2 * Copyright (C) 2023 Samsung Electronics Co., Ltd. All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
15 * @file unittest_tizen_capi_lr_scheduler.cpp
17 * @brief Unit test utility for learning rate scheduler.
18 * @see https://github.com/nnstreamer/nntrainer
19 * @author Hyeonseok Lee <hs89.lee@samsung.com>
22 #include <gtest/gtest.h>
24 #include <nntrainer.h>
25 #include <nntrainer_internal.h>
26 #include <nntrainer_test_util.h>
29 * @brief Learning rate scheduler Create / Destruct Test (positive test)
31 TEST(nntrainer_capi_lr_scheduler, create_destruct_01_p) {
32 ml_train_lr_scheduler_h handle;
35 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
36 EXPECT_EQ(status, ML_ERROR_NONE);
37 status = ml_train_lr_scheduler_destroy(handle);
38 EXPECT_EQ(status, ML_ERROR_NONE);
42 * @brief Learning rate scheduler Create / Destruct Test (positive test)
44 TEST(nntrainer_capi_lr_scheduler, create_destruct_02_p) {
45 ml_train_lr_scheduler_h handle;
47 status = ml_train_lr_scheduler_create(&handle,
48 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
49 EXPECT_EQ(status, ML_ERROR_NONE);
50 status = ml_train_lr_scheduler_destroy(handle);
51 EXPECT_EQ(status, ML_ERROR_NONE);
55 * @brief Learning rate scheduler Create / Destruct Test (positive test)
57 TEST(nntrainer_capi_lr_scheduler, create_destruct_03_p) {
58 ml_train_lr_scheduler_h handle;
61 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_STEP);
62 EXPECT_EQ(status, ML_ERROR_NONE);
63 status = ml_train_lr_scheduler_destroy(handle);
64 EXPECT_EQ(status, ML_ERROR_NONE);
68 * @brief Learning rate scheduler Create / Destruct Test (negative test)
70 TEST(nntrainer_capi_lr_scheduler, create_destruct_04_n) {
71 ml_train_lr_scheduler_h handle = NULL;
73 status = ml_train_lr_scheduler_destroy(&handle);
74 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
78 * @brief Learning rate scheduler Create / Destruct Test (negative test)
80 TEST(nntrainer_capi_lr_scheduler, create_destruct_05_n) {
81 ml_train_lr_scheduler_h handle;
84 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_UNKNOWN);
85 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
89 * @brief Learning rate scheduler Create / Destruct Test (negative test)
91 TEST(nntrainer_capi_lr_scheduler, create_destruct_06_n) {
92 ml_train_optimizer_h opt_handle;
93 ml_train_lr_scheduler_h lr_sched_handle;
95 status = ml_train_optimizer_create(&opt_handle, ML_TRAIN_OPTIMIZER_TYPE_SGD);
96 EXPECT_EQ(status, ML_ERROR_NONE);
98 status = ml_train_lr_scheduler_create(&lr_sched_handle,
99 ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
100 EXPECT_EQ(status, ML_ERROR_NONE);
102 status = ml_train_optimizer_set_lr_scheduler(opt_handle, lr_sched_handle);
103 EXPECT_EQ(status, ML_ERROR_NONE);
105 status = ml_train_lr_scheduler_destroy(lr_sched_handle);
106 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
108 status = ml_train_optimizer_destroy(opt_handle);
109 EXPECT_EQ(status, ML_ERROR_NONE);
113 * @brief Learning rate scheduler Create / Destruct Test (negative test)
115 TEST(nntrainer_capi_lr_scheduler, create_destruct_07_n) {
116 int status = ML_ERROR_NONE;
118 ml_train_model_h model;
119 ml_train_optimizer_h optimizer;
120 ml_train_lr_scheduler_h lr_scheduler;
122 status = ml_train_model_construct(&model);
123 EXPECT_EQ(status, ML_ERROR_NONE);
125 status = ml_train_optimizer_create(&optimizer, ML_TRAIN_OPTIMIZER_TYPE_ADAM);
126 EXPECT_EQ(status, ML_ERROR_NONE);
128 status = ml_train_optimizer_set_property(optimizer, "beta1=0.002",
129 "beta2=0.001", "epsilon=1e-7", NULL);
130 EXPECT_EQ(status, ML_ERROR_NONE);
132 status = ml_train_lr_scheduler_create(&lr_scheduler,
133 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
134 EXPECT_EQ(status, ML_ERROR_NONE);
136 status = ml_train_lr_scheduler_set_property(
137 lr_scheduler, "learning_rate=0.0001", "decay_rate=0.96", "decay_steps=1000",
139 EXPECT_EQ(status, ML_ERROR_NONE);
141 status = ml_train_model_set_optimizer(model, optimizer);
142 EXPECT_EQ(status, ML_ERROR_NONE);
144 status = ml_train_optimizer_set_lr_scheduler(optimizer, lr_scheduler);
145 EXPECT_EQ(status, ML_ERROR_NONE);
147 status = ml_train_lr_scheduler_destroy(lr_scheduler);
148 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
150 status = ml_train_model_destroy(model);
151 EXPECT_EQ(status, ML_ERROR_NONE);
155 * @brief Learning rate scheduler set Property Test (positive test)
157 TEST(nntrainer_capi_lr_scheduler, setProperty_01_p) {
158 ml_train_lr_scheduler_h handle;
161 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
162 EXPECT_EQ(status, ML_ERROR_NONE);
164 ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001", NULL);
165 EXPECT_EQ(status, ML_ERROR_NONE);
166 status = ml_train_lr_scheduler_destroy(handle);
167 EXPECT_EQ(status, ML_ERROR_NONE);
171 * @brief Learning rate scheduler set Property Test (positive test)
173 TEST(nntrainer_capi_lr_scheduler, setProperty_02_p) {
174 ml_train_lr_scheduler_h handle;
176 status = ml_train_lr_scheduler_create(&handle,
177 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
178 EXPECT_EQ(status, ML_ERROR_NONE);
179 status = ml_train_lr_scheduler_set_property(
180 handle, "learning_rate=0.001", "decay_rate=0.9", "decay_steps=2", NULL);
181 EXPECT_EQ(status, ML_ERROR_NONE);
182 status = ml_train_lr_scheduler_destroy(handle);
183 EXPECT_EQ(status, ML_ERROR_NONE);
187 * @brief Learning rate scheduler set Property Test (positive test)
189 TEST(nntrainer_capi_lr_scheduler, setProperty_03_p) {
190 ml_train_lr_scheduler_h handle;
193 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_STEP);
194 EXPECT_EQ(status, ML_ERROR_NONE);
195 status = ml_train_lr_scheduler_set_property(
196 handle, "learning_rate=0.01, 0.001", "iteration=100", NULL);
197 EXPECT_EQ(status, ML_ERROR_NONE);
198 status = ml_train_lr_scheduler_destroy(handle);
199 EXPECT_EQ(status, ML_ERROR_NONE);
203 * @brief Learning rate scheduler set Property Test (negative test)
205 TEST(nntrainer_capi_lr_scheduler, setProperty_04_n) {
206 ml_train_lr_scheduler_h handle;
209 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
210 EXPECT_EQ(status, ML_ERROR_NONE);
211 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
212 "iteration=10", NULL);
213 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
214 status = ml_train_lr_scheduler_destroy(handle);
215 EXPECT_EQ(status, ML_ERROR_NONE);
219 * @brief Learning rate scheduler set Property Test (negative test)
221 TEST(nntrainer_capi_lr_scheduler, setProperty_05_n) {
222 ml_train_lr_scheduler_h handle;
225 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
226 EXPECT_EQ(status, ML_ERROR_NONE);
227 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
228 "decay_rate=0.9", NULL);
229 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
230 status = ml_train_lr_scheduler_destroy(handle);
231 EXPECT_EQ(status, ML_ERROR_NONE);
235 * @brief Learning rate scheduler set Property Test (negative test)
237 TEST(nntrainer_capi_lr_scheduler, setProperty_06_n) {
238 ml_train_lr_scheduler_h handle;
241 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_CONSTANT);
242 EXPECT_EQ(status, ML_ERROR_NONE);
243 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
244 "decay_steps=2", NULL);
245 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
246 status = ml_train_lr_scheduler_destroy(handle);
247 EXPECT_EQ(status, ML_ERROR_NONE);
251 * @brief Learning rate scheduler set Property Test (negative test)
253 TEST(nntrainer_capi_lr_scheduler, setProperty_07_n) {
254 ml_train_lr_scheduler_h handle;
256 status = ml_train_lr_scheduler_create(&handle,
257 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
258 EXPECT_EQ(status, ML_ERROR_NONE);
259 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
260 "iteration=100", NULL);
261 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
262 status = ml_train_lr_scheduler_destroy(handle);
263 EXPECT_EQ(status, ML_ERROR_NONE);
267 * @brief Learning rate scheduler set Property Test (negative test)
269 TEST(nntrainer_capi_lr_scheduler, setProperty_08_n) {
270 ml_train_lr_scheduler_h handle;
273 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_STEP);
274 EXPECT_EQ(status, ML_ERROR_NONE);
275 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
276 "decay_rate=0.9", NULL);
277 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
278 status = ml_train_lr_scheduler_destroy(handle);
279 EXPECT_EQ(status, ML_ERROR_NONE);
283 * @brief Learning rate scheduler set Property Test (negative test)
285 TEST(nntrainer_capi_lr_scheduler, setProperty_09_n) {
286 ml_train_lr_scheduler_h handle;
289 ml_train_lr_scheduler_create(&handle, ML_TRAIN_LR_SCHEDULER_TYPE_STEP);
290 EXPECT_EQ(status, ML_ERROR_NONE);
291 status = ml_train_lr_scheduler_set_property(handle, "learning_rate=0.001",
292 "decay_steps=2", NULL);
293 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
294 status = ml_train_lr_scheduler_destroy(handle);
295 EXPECT_EQ(status, ML_ERROR_NONE);
299 * @brief Learning rate scheduler set Property Test (positive test)
301 TEST(nntrainer_capi_lr_scheduler, setProperty_with_single_param_01_p) {
302 ml_train_lr_scheduler_h handle;
304 status = ml_train_lr_scheduler_create(&handle,
305 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
306 EXPECT_EQ(status, ML_ERROR_NONE);
307 status = ml_train_lr_scheduler_set_property_with_single_param(
308 handle, "learning_rate=0.001 | decay_rate=0.9 | decay_steps=2");
309 EXPECT_EQ(status, ML_ERROR_NONE);
310 status = ml_train_lr_scheduler_destroy(handle);
311 EXPECT_EQ(status, ML_ERROR_NONE);
315 * @brief Learning rate scheduler set Property Test (negative test)
317 TEST(nntrainer_capi_lr_scheduler, setProperty_with_single_param_02_n) {
318 ml_train_lr_scheduler_h handle;
320 status = ml_train_lr_scheduler_create(&handle,
321 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
322 EXPECT_EQ(status, ML_ERROR_NONE);
323 status = ml_train_lr_scheduler_set_property_with_single_param(
324 handle, "learning_rate=0.001, decay_rate=0.9, decay_steps=2");
325 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
326 status = ml_train_lr_scheduler_destroy(handle);
327 EXPECT_EQ(status, ML_ERROR_NONE);
331 * @brief Learning rate scheduler set Property Test (negative test)
333 TEST(nntrainer_capi_lr_scheduler, setProperty_with_single_param_03_n) {
334 ml_train_lr_scheduler_h handle;
336 status = ml_train_lr_scheduler_create(&handle,
337 ML_TRAIN_LR_SCHEDULER_TYPE_EXPONENTIAL);
338 EXPECT_EQ(status, ML_ERROR_NONE);
339 status = ml_train_lr_scheduler_set_property_with_single_param(
340 handle, "learning_rate=0.001 ! decay_rate=0.9 ! decay_steps=2");
341 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
342 status = ml_train_lr_scheduler_destroy(handle);
343 EXPECT_EQ(status, ML_ERROR_NONE);
349 int main(int argc, char **argv) {
353 testing::InitGoogleTest(&argc, argv);
355 std::cerr << "Error duing IniGoogleTest" << std::endl;
359 /** ignore tizen feature check while running the testcases */
360 set_feature_state(ML_FEATURE, SUPPORTED);
361 set_feature_state(ML_FEATURE_INFERENCE, SUPPORTED);
362 set_feature_state(ML_FEATURE_TRAINING, SUPPORTED);
365 result = RUN_ALL_TESTS();
367 std::cerr << "Error duing RUN_ALL_TSETS()" << std::endl;
370 /** reset tizen feature check state */
371 set_feature_state(ML_FEATURE, NOT_CHECKED_YET);
372 set_feature_state(ML_FEATURE_INFERENCE, NOT_CHECKED_YET);
373 set_feature_state(ML_FEATURE_TRAINING, NOT_CHECKED_YET);