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 | |
23 | using namespace bnorm; |
24 | |
25 | namespace self { |
26 | |
27 | static 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 | |
51 | static 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 | |
89 | void bnorm() { |
90 | RUN(check_flags()); |
91 | RUN(check_desc()); |
92 | } |
93 | |
94 | } // namespace self |
95 | |