1/*******************************************************************************
2* Copyright 2017-2022 Intel Corporation
3*
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*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*******************************************************************************/
16
17#include <stdlib.h>
18#include <string.h>
19
20#include "bnorm/bnorm.hpp"
21#include "self/self.hpp"
22
23using namespace bnorm;
24
25namespace self {
26
27static int check_flags() {
28 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(NONE), "");
29 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(GLOB_STATS), "G");
30 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(USE_SCALE), "C");
31 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(USE_SHIFT), "H");
32 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(USE_SCALE | USE_SHIFT), "CH");
33 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(FUSE_NORM_RELU), "R");
34 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(GLOB_STATS | FUSE_NORM_RELU), "GR");
35 SELF_CHECK_CASE_CPP_STR_EQ(flags2str(FUSE_NORM_ADD_RELU), "A");
36 SELF_CHECK_CASE_CPP_STR_EQ(
37 flags2str(GLOB_STATS | FUSE_NORM_ADD_RELU), "GA");
38
39 SELF_CHECK_EQ(str2flags(""), NONE);
40 SELF_CHECK_EQ(str2flags("G"), GLOB_STATS);
41 SELF_CHECK_EQ(str2flags("C"), USE_SCALE);
42 SELF_CHECK_EQ(str2flags("H"), USE_SHIFT);
43 SELF_CHECK_EQ(str2flags("CH"), USE_SCALE | USE_SHIFT);
44 SELF_CHECK_EQ(str2flags("R"), FUSE_NORM_RELU);
45 SELF_CHECK_EQ(str2flags("GR"), GLOB_STATS | FUSE_NORM_RELU);
46 SELF_CHECK_EQ(str2flags("A"), FUSE_NORM_ADD_RELU);
47 SELF_CHECK_EQ(str2flags("GA"), GLOB_STATS | FUSE_NORM_ADD_RELU);
48 return OK;
49}
50
51static int check_desc() {
52 desc_t d {0};
53 d.ndims = 4;
54 d.mb = 3;
55 d.ic = 4;
56 d.ih = 5;
57 d.iw = 6;
58 d.eps = 7.;
59 d.name = "test";
60
61 SELF_CHECK_PRINT_EQ(d, "mb3ic4ih5iw6eps7ntest");
62
63 d.ndims = 4;
64 d.mb = 2;
65 d.iw = d.ih;
66 d.eps = 1.f / 16;
67 SELF_CHECK_PRINT_EQ(d, "ic4ih5ntest");
68
69 canonical = true;
70 SELF_CHECK_PRINT_EQ(d, "mb2ic4ih5iw5eps0.0625ntest");
71
72#define SELF_CHECK_D(_mb, _ic, _ih, _iw, _eps, _name) \
73 SELF_CHECK_EQ(d.mb, _mb); \
74 SELF_CHECK_EQ(d.ic, _ic); \
75 SELF_CHECK_EQ(d.ih, _ih); \
76 SELF_CHECK_EQ(d.iw, _iw); \
77 SELF_CHECK_EQ(d.eps, _eps); \
78 if (d.name != (_name)) return FAIL;
79 SELF_CHECK_EQ(str2desc(&d, "mb1ic2ih3iw4eps5ntest2"), OK);
80 SELF_CHECK_D(1, 2, 3, 4, 5.f, "test2");
81 SELF_CHECK_EQ(str2desc(&d, "ic8ih9ntest3"), OK);
82 SELF_CHECK_D(2, 8, 9, 9, 1.f / 16, "test3");
83 SELF_CHECK_EQ(str2desc(&d, "ic8iw9ntest3"), OK);
84 SELF_CHECK_D(2, 8, 1, 9, 1.f / 16, "test3");
85#undef SELF_CHECK_D
86 return OK;
87}
88
89void bnorm() {
90 RUN(check_flags());
91 RUN(check_desc());
92}
93
94} // namespace self
95