xref: /aosp_15_r20/external/libaom/test/cnn_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2019, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker 
12*77c1e3ccSAndroid Build Coastguard Worker #include <assert.h>
13*77c1e3ccSAndroid Build Coastguard Worker #include <math.h>
14*77c1e3ccSAndroid Build Coastguard Worker #include <stdio.h>
15*77c1e3ccSAndroid Build Coastguard Worker 
16*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*77c1e3ccSAndroid Build Coastguard Worker 
18*77c1e3ccSAndroid Build Coastguard Worker #include "config/av1_rtcd.h"
19*77c1e3ccSAndroid Build Coastguard Worker 
20*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/aom_timer.h"
21*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/cnn.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/partition_cnn_weights.h"
23*77c1e3ccSAndroid Build Coastguard Worker #include "test/acm_random.h"
24*77c1e3ccSAndroid Build Coastguard Worker #include "test/function_equivalence_test.h"
25*77c1e3ccSAndroid Build Coastguard Worker #include "test/util.h"
26*77c1e3ccSAndroid Build Coastguard Worker 
27*77c1e3ccSAndroid Build Coastguard Worker #define SQR(x) ((x) * (x))
28*77c1e3ccSAndroid Build Coastguard Worker 
29*77c1e3ccSAndroid Build Coastguard Worker // Best possible pixelwise guaranteed precision given each float has at most
30*77c1e3ccSAndroid Build Coastguard Worker // 3 specified decimals.
31*77c1e3ccSAndroid Build Coastguard Worker #define PIXELWISE_FLOAT_TOL 1E-2
32*77c1e3ccSAndroid Build Coastguard Worker 
33*77c1e3ccSAndroid Build Coastguard Worker #define MSE_FLOAT_TOL 1E-6
34*77c1e3ccSAndroid Build Coastguard Worker #define MSE_INT_TOL 0
35*77c1e3ccSAndroid Build Coastguard Worker 
36*77c1e3ccSAndroid Build Coastguard Worker // CNN convolve pixelwise error threshold for functional equivalence.
37*77c1e3ccSAndroid Build Coastguard Worker #define CNN_CONVOLVE_PIXELWISE_FLOAT_TOL 1E-3f
38*77c1e3ccSAndroid Build Coastguard Worker 
39*77c1e3ccSAndroid Build Coastguard Worker namespace {
40*77c1e3ccSAndroid Build Coastguard Worker 
41*77c1e3ccSAndroid Build Coastguard Worker class CNNTest : public ::testing::Test {
42*77c1e3ccSAndroid Build Coastguard Worker  protected:
RunCNNTest(int image_width,int image_height,const float * input,const float * expected,const CNN_CONFIG * cnn_config,int in_stride,CNN_THREAD_DATA * thread_data,double tolerance)43*77c1e3ccSAndroid Build Coastguard Worker   static void RunCNNTest(int image_width, int image_height, const float *input,
44*77c1e3ccSAndroid Build Coastguard Worker                          const float *expected, const CNN_CONFIG *cnn_config,
45*77c1e3ccSAndroid Build Coastguard Worker                          int in_stride, CNN_THREAD_DATA *thread_data,
46*77c1e3ccSAndroid Build Coastguard Worker                          double tolerance) {
47*77c1e3ccSAndroid Build Coastguard Worker     int out_width, out_height, out_channels;
48*77c1e3ccSAndroid Build Coastguard Worker     av1_find_cnn_output_size(image_width, image_height, cnn_config, &out_width,
49*77c1e3ccSAndroid Build Coastguard Worker                              &out_height, &out_channels);
50*77c1e3ccSAndroid Build Coastguard Worker 
51*77c1e3ccSAndroid Build Coastguard Worker     const int out_size = out_width * out_height;
52*77c1e3ccSAndroid Build Coastguard Worker     const int out_stride = out_width;
53*77c1e3ccSAndroid Build Coastguard Worker 
54*77c1e3ccSAndroid Build Coastguard Worker     float *output_ =
55*77c1e3ccSAndroid Build Coastguard Worker         (float *)aom_malloc(sizeof(*output_) * out_size * out_channels);
56*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(output_, nullptr);
57*77c1e3ccSAndroid Build Coastguard Worker     float *output[CNN_MAX_CHANNELS] = { nullptr };
58*77c1e3ccSAndroid Build Coastguard Worker     for (int channel = 0; channel < out_channels; ++channel) {
59*77c1e3ccSAndroid Build Coastguard Worker       output[channel] = output_ + (channel * out_size);
60*77c1e3ccSAndroid Build Coastguard Worker     }
61*77c1e3ccSAndroid Build Coastguard Worker     const int num_outputs = 1;
62*77c1e3ccSAndroid Build Coastguard Worker     const int output_chs[1] = { out_channels };
63*77c1e3ccSAndroid Build Coastguard Worker     const int output_strides[1] = { out_stride };
64*77c1e3ccSAndroid Build Coastguard Worker     CNN_MULTI_OUT output_struct = { num_outputs, output_chs, output_strides,
65*77c1e3ccSAndroid Build Coastguard Worker                                     output };
66*77c1e3ccSAndroid Build Coastguard Worker 
67*77c1e3ccSAndroid Build Coastguard Worker     RunMultiOutCNNTest(&input, image_width, image_height, in_stride, cnn_config,
68*77c1e3ccSAndroid Build Coastguard Worker                        thread_data, &output_struct, &expected, tolerance);
69*77c1e3ccSAndroid Build Coastguard Worker 
70*77c1e3ccSAndroid Build Coastguard Worker     aom_free(output_);
71*77c1e3ccSAndroid Build Coastguard Worker   }
72*77c1e3ccSAndroid Build Coastguard Worker 
RunMultiOutCNNTest(const float ** input,int image_width,int image_height,int in_stride,const CNN_CONFIG * cnn_config,CNN_THREAD_DATA * thread_data,CNN_MULTI_OUT * output,const float ** expected,double tolerance)73*77c1e3ccSAndroid Build Coastguard Worker   static void RunMultiOutCNNTest(const float **input, int image_width,
74*77c1e3ccSAndroid Build Coastguard Worker                                  int image_height, int in_stride,
75*77c1e3ccSAndroid Build Coastguard Worker                                  const CNN_CONFIG *cnn_config,
76*77c1e3ccSAndroid Build Coastguard Worker                                  CNN_THREAD_DATA *thread_data,
77*77c1e3ccSAndroid Build Coastguard Worker                                  CNN_MULTI_OUT *output, const float **expected,
78*77c1e3ccSAndroid Build Coastguard Worker                                  double tolerance) {
79*77c1e3ccSAndroid Build Coastguard Worker     const int num_outputs = output->num_outputs;
80*77c1e3ccSAndroid Build Coastguard Worker     const int *output_chs = output->output_channels;
81*77c1e3ccSAndroid Build Coastguard Worker 
82*77c1e3ccSAndroid Build Coastguard Worker     int *out_widths = (int *)aom_calloc(num_outputs, sizeof(*out_widths));
83*77c1e3ccSAndroid Build Coastguard Worker     int *out_heights = (int *)aom_calloc(num_outputs, sizeof(*out_heights));
84*77c1e3ccSAndroid Build Coastguard Worker     int *not_used = (int *)aom_calloc(num_outputs, sizeof(*not_used));
85*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(out_widths, nullptr);
86*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(out_heights, nullptr);
87*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(not_used, nullptr);
88*77c1e3ccSAndroid Build Coastguard Worker 
89*77c1e3ccSAndroid Build Coastguard Worker     av1_find_cnn_output_size(image_width, image_height, cnn_config, out_widths,
90*77c1e3ccSAndroid Build Coastguard Worker                              out_heights, not_used);
91*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_TRUE(av1_cnn_predict(input, image_width, image_height, in_stride,
92*77c1e3ccSAndroid Build Coastguard Worker                                 cnn_config, thread_data, output));
93*77c1e3ccSAndroid Build Coastguard Worker 
94*77c1e3ccSAndroid Build Coastguard Worker     int channel_offset = 0;
95*77c1e3ccSAndroid Build Coastguard Worker     for (int output_idx = 0; output_idx < num_outputs; output_idx++) {
96*77c1e3ccSAndroid Build Coastguard Worker       const float *expected_out = expected[output_idx];
97*77c1e3ccSAndroid Build Coastguard Worker       const int curr_output_chs = output_chs[output_idx];
98*77c1e3ccSAndroid Build Coastguard Worker       const int out_size = out_widths[output_idx] * out_heights[output_idx];
99*77c1e3ccSAndroid Build Coastguard Worker 
100*77c1e3ccSAndroid Build Coastguard Worker       double mse = 0;
101*77c1e3ccSAndroid Build Coastguard Worker       int expected_ite = 0;
102*77c1e3ccSAndroid Build Coastguard Worker       for (int channel = 0; channel < curr_output_chs; ++channel) {
103*77c1e3ccSAndroid Build Coastguard Worker         const float *buf_out = output->output_buffer[channel_offset];
104*77c1e3ccSAndroid Build Coastguard Worker 
105*77c1e3ccSAndroid Build Coastguard Worker         for (int i = 0; i < out_size; ++i) {
106*77c1e3ccSAndroid Build Coastguard Worker           EXPECT_NEAR(expected_out[expected_ite], buf_out[i],
107*77c1e3ccSAndroid Build Coastguard Worker                       PIXELWISE_FLOAT_TOL)
108*77c1e3ccSAndroid Build Coastguard Worker               << " output " << output_idx << " channel " << channel << " pixel "
109*77c1e3ccSAndroid Build Coastguard Worker               << expected_ite % out_size << ": " << expected_out[expected_ite]
110*77c1e3ccSAndroid Build Coastguard Worker               << "/" << buf_out[i] << std::endl;
111*77c1e3ccSAndroid Build Coastguard Worker           mse += SQR(expected_out[expected_ite] - buf_out[i]);
112*77c1e3ccSAndroid Build Coastguard Worker           expected_ite++;
113*77c1e3ccSAndroid Build Coastguard Worker         }
114*77c1e3ccSAndroid Build Coastguard Worker 
115*77c1e3ccSAndroid Build Coastguard Worker         channel_offset++;
116*77c1e3ccSAndroid Build Coastguard Worker       }
117*77c1e3ccSAndroid Build Coastguard Worker       mse /= (out_size * curr_output_chs);
118*77c1e3ccSAndroid Build Coastguard Worker       EXPECT_LE(mse, tolerance) << " output " << output_idx << std::endl;
119*77c1e3ccSAndroid Build Coastguard Worker     }
120*77c1e3ccSAndroid Build Coastguard Worker 
121*77c1e3ccSAndroid Build Coastguard Worker     aom_free(out_widths);
122*77c1e3ccSAndroid Build Coastguard Worker     aom_free(out_heights);
123*77c1e3ccSAndroid Build Coastguard Worker     aom_free(not_used);
124*77c1e3ccSAndroid Build Coastguard Worker   }
125*77c1e3ccSAndroid Build Coastguard Worker 
AssignLayerWeightsBiases(CNN_CONFIG * cnn_config,float * weights,float * bias)126*77c1e3ccSAndroid Build Coastguard Worker   static void AssignLayerWeightsBiases(CNN_CONFIG *cnn_config, float *weights,
127*77c1e3ccSAndroid Build Coastguard Worker                                        float *bias) {
128*77c1e3ccSAndroid Build Coastguard Worker     size_t weight_offset = 0;
129*77c1e3ccSAndroid Build Coastguard Worker     size_t bias_offset = 0;
130*77c1e3ccSAndroid Build Coastguard Worker     for (int layer = 0; layer < cnn_config->num_layers; ++layer) {
131*77c1e3ccSAndroid Build Coastguard Worker       CNN_LAYER_CONFIG *layer_config = &cnn_config->layer_config[layer];
132*77c1e3ccSAndroid Build Coastguard Worker       layer_config->weights = weights + weight_offset;
133*77c1e3ccSAndroid Build Coastguard Worker       layer_config->bias = bias + bias_offset;
134*77c1e3ccSAndroid Build Coastguard Worker       weight_offset += layer_config->filter_width *
135*77c1e3ccSAndroid Build Coastguard Worker                        layer_config->filter_height * layer_config->in_channels *
136*77c1e3ccSAndroid Build Coastguard Worker                        layer_config->out_channels;
137*77c1e3ccSAndroid Build Coastguard Worker       bias_offset += layer_config->out_channels;
138*77c1e3ccSAndroid Build Coastguard Worker 
139*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NE(layer_config->weights, nullptr);
140*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NE(layer_config->bias, nullptr);
141*77c1e3ccSAndroid Build Coastguard Worker     }
142*77c1e3ccSAndroid Build Coastguard Worker   }
143*77c1e3ccSAndroid Build Coastguard Worker };
144*77c1e3ccSAndroid Build Coastguard Worker 
145*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
146*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestMultilayerConvolution)147*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestMultilayerConvolution) {
148*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 16;
149*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 16;
150*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 5;
151*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 4;
152*77c1e3ccSAndroid Build Coastguard Worker 
153*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
154*77c1e3ccSAndroid Build Coastguard Worker     -3, 1,  -3, 2,  -2, -2, 2,  -2, 1,  -2, -3, 1,  2,  2,  2,  -2, 0,  1,  -1,
155*77c1e3ccSAndroid Build Coastguard Worker     -3, -1, -1, 1,  0,  -3, 1,  0,  -1, 1,  0,  0,  -3, -3, -3, 0,  2,  1,  -1,
156*77c1e3ccSAndroid Build Coastguard Worker     2,  0,  1,  -3, -1, 2,  2,  1,  -2, 0,  -1, 0,  -2, -2, -1, 1,  0,  0,  0,
157*77c1e3ccSAndroid Build Coastguard Worker     -2, -2, -2, 1,  1,  -2, 1,  1,  -2, -2, 1,  -2, -1, -2, -3, 2,  -3, -1, 1,
158*77c1e3ccSAndroid Build Coastguard Worker     0,  -2, -2, -2, 1,  -2, -2, -1, -1, 2,  2,  2,  -1, 1,  -3, -3, 0,  2,  0,
159*77c1e3ccSAndroid Build Coastguard Worker     2,  1,  -3, -3, 1,  2,  2,  1,  -2, -3, 0,  -3, 0,  -3, -2, 0,  1,  1,  0,
160*77c1e3ccSAndroid Build Coastguard Worker     -3, 2,  -1, 2,  1,  0,  1,  -2, 1,  -1, -1, 2,  0,  -2, -3, 1,  1,  -2, -1,
161*77c1e3ccSAndroid Build Coastguard Worker     -3, -3, -1, 0,  -3, -2, 0,  0,  1,  0,  -3, -2, -1, 1,  0,  2,  1,  0,  -3,
162*77c1e3ccSAndroid Build Coastguard Worker     -2, -3, -3, -1, 0,  -2, 2,  -1, -3, 0,  -1, -1, 2,  0,  -3, -2, -1, 0,  0,
163*77c1e3ccSAndroid Build Coastguard Worker     1,  -2, 1,  2,  1,  2,  2,  -3, 2,  -1, 0,  0,  -1, 0,  2,  2,  -1, 2,  -2,
164*77c1e3ccSAndroid Build Coastguard Worker     1,  1,  -3, -3, 1,  -1, -1, -2, 2,  -2, -2, 2,  -1, -3, 2,  -3, 1,  -1, -1,
165*77c1e3ccSAndroid Build Coastguard Worker     -3, 1,  -1, 1,  0,  -3, -3, 1,  -3, -3, 0,  2,  2,  -2, -1, 2,  0,  2,  1,
166*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, 0,  0,  -1, -1, 1,  0,  2,  0,  -3, 2,  1,  0,  1,  -3, 2,  -3, -3,
167*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, -3, 2,  0,  2,  -2, 1,  -1,
168*77c1e3ccSAndroid Build Coastguard Worker   };
169*77c1e3ccSAndroid Build Coastguard Worker 
170*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
171*77c1e3ccSAndroid Build Coastguard Worker     -2, 2,  -2, 2,  -1, -3, 2,  2,  0,  0,  -3, -1, -2, -3, 1,  -1, 0,  0,  0,
172*77c1e3ccSAndroid Build Coastguard Worker     2,  -2, 2,  -2, -3, 1,  1,  1,  -3, -1, 0,  1,  2,  -2, 0,  -1, -3, -1, -2,
173*77c1e3ccSAndroid Build Coastguard Worker     2,  -3, -3, 1,  -2, -3, 0,  2,  1,  -3, -3, -1, -3, -2, -1, -3, -1, -3, -2,
174*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, -1, -2, -2, -3, 2,  0,  -3, 0,  -3, -3, 1,  -3, -1, 0,  -1, 1,  1,
175*77c1e3ccSAndroid Build Coastguard Worker     -1, 1,  -2, 0,  2,  0,  -3, 1,  -1, -1, 2,  0,  1,  -3, -3, 1,  2,  -3, -3,
176*77c1e3ccSAndroid Build Coastguard Worker     1,  -3, 2,  0,  -3, 1,  2,  2,  -2, -1, -2, 1,  1,  0,  -2, -2, 1,  2,  -1,
177*77c1e3ccSAndroid Build Coastguard Worker     -3, 1,  -2, 2,  -3, -2, -3, 2,  1,  0,  -2, 0,  1,  -3, 2,  -2, -2, 0,  2,
178*77c1e3ccSAndroid Build Coastguard Worker     -3, 2,  0,  0,  1,  -2, 1,  1,  -2, -1, -2, 1,  -2, 0,  -2, -2, 0,  -1, -1,
179*77c1e3ccSAndroid Build Coastguard Worker     -3, -3, -3, 1,  -3, -2, 2,  -1, 2,  0,  2,  -2, 2,  -2, 1,  -3, -3, -1, 0,
180*77c1e3ccSAndroid Build Coastguard Worker     2,  2,  1,  -1, -3, -1, -3, 2,  1,  -2, 0,  -3, -1, -3, -1, 2,  1,  0,  2,
181*77c1e3ccSAndroid Build Coastguard Worker     -1, 1,  0,  1,  2,  -1, -2, 2,  1,  -3, -1, -3, 0,  1,  -2, 0,  -2, -3, 0,
182*77c1e3ccSAndroid Build Coastguard Worker     -2, 2,  2,  0,  0,  2,  -3, 2,  -3, -2, 1,  2,  -3, -3, -1, -3, 0,  -3, -3,
183*77c1e3ccSAndroid Build Coastguard Worker     -2, -2, -2, 0,  0,  1,  0,  0,  -1, 0,  0,  -3, 0,  -3, -1, -2, 1,  -2, -1,
184*77c1e3ccSAndroid Build Coastguard Worker     2,  -2, 0,  0,  1,  0,  -2, -1, 0,  -3, 1,  0,  -1, -3, 1,  -1, 1,  -1, -3,
185*77c1e3ccSAndroid Build Coastguard Worker     1,  0,  1,  1,  -1, 2,  2,  0,  0,  1,  -3, 2,  -2, -2, -3, -2, -1, -2, 2,
186*77c1e3ccSAndroid Build Coastguard Worker     0,  2,  -2, -3, -1, -3, 2,  2,  -1, 2,  2,  -1, 0,  -3, 1,
187*77c1e3ccSAndroid Build Coastguard Worker   };
188*77c1e3ccSAndroid Build Coastguard Worker 
189*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
190*77c1e3ccSAndroid Build Coastguard Worker     1, -1, 0, 1, 1, 1, -2,
191*77c1e3ccSAndroid Build Coastguard Worker   };
192*77c1e3ccSAndroid Build Coastguard Worker 
193*77c1e3ccSAndroid Build Coastguard Worker   float expected_same[] = {
194*77c1e3ccSAndroid Build Coastguard Worker     -1125, 2926,  6406,  631,   -1244, 97,    -1454, 2526,  1065,  3292,  3464,
195*77c1e3ccSAndroid Build Coastguard Worker     2553,  -330,  532,   1038,  1182,  -402,  3758,  3392,  9854,  4365,  1408,
196*77c1e3ccSAndroid Build Coastguard Worker     4736,  3134,  3838,  2409,  3221,  4350,  6750,  4045,  815,   1188,  2959,
197*77c1e3ccSAndroid Build Coastguard Worker     9802,  9590,  4572,  5740,  4253,  1701,  7974,  7012,  6854,  7093,  3907,
198*77c1e3ccSAndroid Build Coastguard Worker     4539,  3886,  4267,  3505,  465,   7824,  9219,  10026, 7968,  957,   2295,
199*77c1e3ccSAndroid Build Coastguard Worker     5594,  10811, 9641,  5950,  10043, 8783,  3132,  1421,  1110,  4108,  13929,
200*77c1e3ccSAndroid Build Coastguard Worker     10660, -84,   -61,   3932,  -180,  6811,  13393, 15147, 15640, 9337,  6961,
201*77c1e3ccSAndroid Build Coastguard Worker     3808,  1604,  1398,  1047,  6739,  10144, 6517,  4698,  2678,  7389,  2595,
202*77c1e3ccSAndroid Build Coastguard Worker     5248,  12075, 11272, 13951, 8820,  1090,  2199,  2206,  2788,  12116, 6683,
203*77c1e3ccSAndroid Build Coastguard Worker     2612,  -291,  3183,  9414,  12316, 14524, 12333, 13208, 7832,  4664,  4657,
204*77c1e3ccSAndroid Build Coastguard Worker     3534,  1298,  -666,  4250,  7707,  9103,  5760,  688,   9571,  15782, 14203,
205*77c1e3ccSAndroid Build Coastguard Worker     14878, 17339, 14684, 8690,  5671,  875,   1429,  1531,  6173,  2984,  5558,
206*77c1e3ccSAndroid Build Coastguard Worker     2996,  7928,  6733,  16117, 15262, 12757, 7980,  3923,  4795,  5973,  2051,
207*77c1e3ccSAndroid Build Coastguard Worker     455,   -1922, 1816,  5906,  3321,  10908, 10910, 7377,  12204, 12809, 11195,
208*77c1e3ccSAndroid Build Coastguard Worker     7451,  6666,  74,    -1645, -35,   -391,  3813,  7324,  892,   1656,  6095,
209*77c1e3ccSAndroid Build Coastguard Worker     12193, 14648, 12156, 14663, 10251, 10325, 7821,  3925,  323,   697,   442,
210*77c1e3ccSAndroid Build Coastguard Worker     1324,  4669,  7002,  5485,  5171,  5086,  10582, 11053, 9709,  11353, 8543,
211*77c1e3ccSAndroid Build Coastguard Worker     5256,  2873,  235,   -628,  1496,  1878,  -867,  3420,  6865,  5937,  10182,
212*77c1e3ccSAndroid Build Coastguard Worker     13277, 10069, 10789, 5998,  624,   -2082, 4417,  1258,  -1080, -819,  -1430,
213*77c1e3ccSAndroid Build Coastguard Worker     1033,  5220,  6335,  8471,  8980,  11908, 14430, 12584, 8404,  1576,  -803,
214*77c1e3ccSAndroid Build Coastguard Worker     985,   1481,  1367,  -193,  873,   3684,  2288,  6676,  9477,  11155, 9602,
215*77c1e3ccSAndroid Build Coastguard Worker     9707,  10507, 4739,  3174,  -575,  -178,  3002,  1710,  423,   -477,  554,
216*77c1e3ccSAndroid Build Coastguard Worker     3088,  2029,  5113,  5000,  3771,  6090,  5365,  1185,  2855,  399,   -312,
217*77c1e3ccSAndroid Build Coastguard Worker     -1577, 176,   955,
218*77c1e3ccSAndroid Build Coastguard Worker   };
219*77c1e3ccSAndroid Build Coastguard Worker 
220*77c1e3ccSAndroid Build Coastguard Worker   float expected_replicate[] = {
221*77c1e3ccSAndroid Build Coastguard Worker     13768, 13528, 12999, 6906,  4618,  4043,  2611,  9955,  6685,  4776,  2753,
222*77c1e3ccSAndroid Build Coastguard Worker     1036,  3063,  4544,  5183,  7349,  12451, 12501, 9131,  12753, 8908,  4058,
223*77c1e3ccSAndroid Build Coastguard Worker     6299,  7542,  7115,  3307,  3360,  3543,  9754,  7808,  5991,  9019,  14320,
224*77c1e3ccSAndroid Build Coastguard Worker     14919, 12492, 6871,  7373,  3336,  2085,  10604, 9377,  6882,  5009,  3103,
225*77c1e3ccSAndroid Build Coastguard Worker     6220,  6278,  7588,  10196, 11045, 11563, 11842, 11911, 8279,  2030,  1858,
226*77c1e3ccSAndroid Build Coastguard Worker     6368,  12123, 9909,  6347,  10345, 9365,  4038,  1673,  3051,  16492, 16649,
227*77c1e3ccSAndroid Build Coastguard Worker     12276, 408,   -301,  4122,  -654,  7864,  14038, 15279, 15315, 9744,  8243,
228*77c1e3ccSAndroid Build Coastguard Worker     5298,  746,   380,   9824,  9124,  10895, 6640,  4712,  2669,  6980,  2759,
229*77c1e3ccSAndroid Build Coastguard Worker     5385,  12345, 11336, 13129, 8600,  2370,  3682,  5219,  12407, 13123, 6784,
230*77c1e3ccSAndroid Build Coastguard Worker     2612,  -291,  3183,  9414,  12316, 14524, 12333, 13397, 7543,  3916,  4153,
231*77c1e3ccSAndroid Build Coastguard Worker     4477,  4314,  7983,  8418,  9163,  9103,  5760,  688,   9571,  15782, 14203,
232*77c1e3ccSAndroid Build Coastguard Worker     14878, 17718, 14570, 7940,  6642,  5094,  7133,  9964,  10219, 3224,  5558,
233*77c1e3ccSAndroid Build Coastguard Worker     2996,  7928,  6733,  16117, 15262, 12757, 7958,  4401,  5187,  5476,  5529,
234*77c1e3ccSAndroid Build Coastguard Worker     6055,  2206,  3909,  6015,  3321,  10908, 10910, 7377,  12204, 12809, 11195,
235*77c1e3ccSAndroid Build Coastguard Worker     6967,  6840,  481,   -1600, 274,   1,     10373, 8514,  1123,  2117,  6758,
236*77c1e3ccSAndroid Build Coastguard Worker     12736, 16223, 13585, 15988, 11771, 10600, 7918,  4156,  2840,  3111,  3287,
237*77c1e3ccSAndroid Build Coastguard Worker     6359,  7652,  8813,  6530,  6967,  7789,  13671, 13990, 13247, 13241, 9836,
238*77c1e3ccSAndroid Build Coastguard Worker     5251,  3024,  2313,  1834,  4187,  2637,  -1312, 2139,  7378,  7665,  11933,
239*77c1e3ccSAndroid Build Coastguard Worker     15591, 15314, 15678, 9531,  2820,  -1516, 3400,  1314,  22,    363,   -2896,
240*77c1e3ccSAndroid Build Coastguard Worker     -898,  5906,  7308,  10650, 12975, 16978, 20370, 18817, 12381, 4118,  -861,
241*77c1e3ccSAndroid Build Coastguard Worker     -137,  236,   1802,  1632,  -350,  2334,  3400,  8680,  14064, 18216, 18675,
242*77c1e3ccSAndroid Build Coastguard Worker     21765, 22871, 11491, 4937,  -1555, -11,   1669,  2392,  3265,  -5254, -217,
243*77c1e3ccSAndroid Build Coastguard Worker     5001,  8063,  13444, 18884, 19706, 22794, 21064, 9545,  6689,  -7,    289,
244*77c1e3ccSAndroid Build Coastguard Worker     -2021, 504,   2347,
245*77c1e3ccSAndroid Build Coastguard Worker   };
246*77c1e3ccSAndroid Build Coastguard Worker 
247*77c1e3ccSAndroid Build Coastguard Worker   float expected_valid[] = {
248*77c1e3ccSAndroid Build Coastguard Worker     2612,  -291,  3183,  9414,  12316, 14524, 12333, 9103,  5760,  688,
249*77c1e3ccSAndroid Build Coastguard Worker     9571,  15782, 14203, 14878, 5558,  2996,  7928,  6733,  16117, 15262,
250*77c1e3ccSAndroid Build Coastguard Worker     12757, 3321,  10908, 10910, 7377,  12204, 12809, 11195,
251*77c1e3ccSAndroid Build Coastguard Worker   };
252*77c1e3ccSAndroid Build Coastguard Worker 
253*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 3,
254*77c1e3ccSAndroid Build Coastguard Worker                             0,
255*77c1e3ccSAndroid Build Coastguard Worker                             0,
256*77c1e3ccSAndroid Build Coastguard Worker                             0,
257*77c1e3ccSAndroid Build Coastguard Worker                             0,
258*77c1e3ccSAndroid Build Coastguard Worker                             {
259*77c1e3ccSAndroid Build Coastguard Worker                                 {
260*77c1e3ccSAndroid Build Coastguard Worker                                     1,
261*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
262*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
263*77c1e3ccSAndroid Build Coastguard Worker                                     3,
264*77c1e3ccSAndroid Build Coastguard Worker                                     1,
265*77c1e3ccSAndroid Build Coastguard Worker                                     1,
266*77c1e3ccSAndroid Build Coastguard Worker                                     0,
267*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
268*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
269*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
270*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
271*77c1e3ccSAndroid Build Coastguard Worker                                     0,
272*77c1e3ccSAndroid Build Coastguard Worker                                     0,
273*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
274*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
275*77c1e3ccSAndroid Build Coastguard Worker                                     {},
276*77c1e3ccSAndroid Build Coastguard Worker                                     {},
277*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
278*77c1e3ccSAndroid Build Coastguard Worker                                 },
279*77c1e3ccSAndroid Build Coastguard Worker                                 {
280*77c1e3ccSAndroid Build Coastguard Worker                                     3,
281*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
282*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
283*77c1e3ccSAndroid Build Coastguard Worker                                     3,
284*77c1e3ccSAndroid Build Coastguard Worker                                     1,
285*77c1e3ccSAndroid Build Coastguard Worker                                     1,
286*77c1e3ccSAndroid Build Coastguard Worker                                     0,
287*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
288*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
289*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
290*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
291*77c1e3ccSAndroid Build Coastguard Worker                                     0,
292*77c1e3ccSAndroid Build Coastguard Worker                                     0,
293*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
294*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
295*77c1e3ccSAndroid Build Coastguard Worker                                     {},
296*77c1e3ccSAndroid Build Coastguard Worker                                     {},
297*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
298*77c1e3ccSAndroid Build Coastguard Worker                                 },
299*77c1e3ccSAndroid Build Coastguard Worker                                 {
300*77c1e3ccSAndroid Build Coastguard Worker                                     3,
301*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
302*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
303*77c1e3ccSAndroid Build Coastguard Worker                                     1,
304*77c1e3ccSAndroid Build Coastguard Worker                                     1,
305*77c1e3ccSAndroid Build Coastguard Worker                                     1,
306*77c1e3ccSAndroid Build Coastguard Worker                                     0,
307*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
308*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
309*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
310*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
311*77c1e3ccSAndroid Build Coastguard Worker                                     0,
312*77c1e3ccSAndroid Build Coastguard Worker                                     0,
313*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
314*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
315*77c1e3ccSAndroid Build Coastguard Worker                                     {},
316*77c1e3ccSAndroid Build Coastguard Worker                                     {},
317*77c1e3ccSAndroid Build Coastguard Worker                                     0,
318*77c1e3ccSAndroid Build Coastguard Worker                                 },
319*77c1e3ccSAndroid Build Coastguard Worker                             } };
320*77c1e3ccSAndroid Build Coastguard Worker 
321*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
322*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
323*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
324*77c1e3ccSAndroid Build Coastguard Worker 
325*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
326*77c1e3ccSAndroid Build Coastguard Worker 
327*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_same, &cnn_config,
328*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
329*77c1e3ccSAndroid Build Coastguard Worker 
330*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < cnn_config.num_layers; ++i) {
331*77c1e3ccSAndroid Build Coastguard Worker     cnn_config.layer_config[i].pad = PADDING_SAME_REPLICATE;
332*77c1e3ccSAndroid Build Coastguard Worker   }
333*77c1e3ccSAndroid Build Coastguard Worker 
334*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_replicate, &cnn_config,
335*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
336*77c1e3ccSAndroid Build Coastguard Worker 
337*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < cnn_config.num_layers; ++i) {
338*77c1e3ccSAndroid Build Coastguard Worker     cnn_config.layer_config[i].pad = PADDING_VALID;
339*77c1e3ccSAndroid Build Coastguard Worker   }
340*77c1e3ccSAndroid Build Coastguard Worker 
341*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_valid, &cnn_config,
342*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
343*77c1e3ccSAndroid Build Coastguard Worker }
344*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestRELUSingleLayer)345*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestRELUSingleLayer) {
346*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 8;
347*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 8;
348*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 5;
349*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 4;
350*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
351*77c1e3ccSAndroid Build Coastguard Worker     0, -2, -3, 1,  -1, 2,  -2, 1,  -3, -1, 0,  1,  -2, -3, -2, -2,
352*77c1e3ccSAndroid Build Coastguard Worker     1, -3, 2,  -3, -1, -1, 2,  0,  -2, -3, 0,  -2, -3, 1,  -1, -1,
353*77c1e3ccSAndroid Build Coastguard Worker     2, -2, 0,  -2, -3, -3, 1,  1,  -1, 1,  0,  1,  -3, 0,  2,  2,
354*77c1e3ccSAndroid Build Coastguard Worker     0, -3, 1,  -3, 2,  -2, 1,  -1, -1, -2, -3, -2, -1, -3, -2, -1,
355*77c1e3ccSAndroid Build Coastguard Worker   };
356*77c1e3ccSAndroid Build Coastguard Worker   float expected_same[] = {
357*77c1e3ccSAndroid Build Coastguard Worker     9,  0,  1,  1,  0,  3,  0,  19, 0,  12, 10, 0,  0,  0,  5, 0,
358*77c1e3ccSAndroid Build Coastguard Worker     0,  18, 21, 7,  19, 4,  3,  0,  0,  9,  16, 0,  11, 16, 0, 11,
359*77c1e3ccSAndroid Build Coastguard Worker     12, 2,  0,  11, 0,  16, 6,  0,  8,  22, 13, 10, 12, 0,  0, 0,
360*77c1e3ccSAndroid Build Coastguard Worker     0,  1,  2,  12, 29, 6,  10, 0,  13, 0,  0,  5,  8,  10, 0, 0,
361*77c1e3ccSAndroid Build Coastguard Worker   };
362*77c1e3ccSAndroid Build Coastguard Worker   float expected_replicate[] = {
363*77c1e3ccSAndroid Build Coastguard Worker     18, 17, 12, 2,  0,  0,  5,  11, 0,  17, 22, 6,  0,  0,  17, 0,
364*77c1e3ccSAndroid Build Coastguard Worker     0,  18, 21, 7,  19, 4,  3,  5,  3,  9,  16, 0,  11, 16, 0,  3,
365*77c1e3ccSAndroid Build Coastguard Worker     3,  2,  0,  11, 0,  16, 6,  0,  17, 22, 13, 10, 12, 0,  0,  0,
366*77c1e3ccSAndroid Build Coastguard Worker     0,  4,  1,  10, 30, 7,  10, 0,  23, 8,  0,  13, 15, 19, 8,  10,
367*77c1e3ccSAndroid Build Coastguard Worker   };
368*77c1e3ccSAndroid Build Coastguard Worker   float expected_valid[] = {
369*77c1e3ccSAndroid Build Coastguard Worker     18, 21, 7, 19, 4, 9, 16, 0, 11, 16, 2, 0, 11, 0, 16, 22, 13, 10, 12, 0,
370*77c1e3ccSAndroid Build Coastguard Worker   };
371*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
372*77c1e3ccSAndroid Build Coastguard Worker     -2, -3, 1, 2, 2, -2, -3, 0, -3, 2, 2, -3, -3, -2, 0, 1, 2, 0, -1, -1,
373*77c1e3ccSAndroid Build Coastguard Worker   };
374*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = { -3 };
375*77c1e3ccSAndroid Build Coastguard Worker 
376*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
377*77c1e3ccSAndroid Build Coastguard Worker                             0,
378*77c1e3ccSAndroid Build Coastguard Worker                             0,
379*77c1e3ccSAndroid Build Coastguard Worker                             0,
380*77c1e3ccSAndroid Build Coastguard Worker                             0,
381*77c1e3ccSAndroid Build Coastguard Worker                             { {
382*77c1e3ccSAndroid Build Coastguard Worker                                 1,
383*77c1e3ccSAndroid Build Coastguard Worker                                 filter_width,
384*77c1e3ccSAndroid Build Coastguard Worker                                 filter_height,
385*77c1e3ccSAndroid Build Coastguard Worker                                 1,
386*77c1e3ccSAndroid Build Coastguard Worker                                 1,
387*77c1e3ccSAndroid Build Coastguard Worker                                 1,
388*77c1e3ccSAndroid Build Coastguard Worker                                 0,
389*77c1e3ccSAndroid Build Coastguard Worker                                 weights,
390*77c1e3ccSAndroid Build Coastguard Worker                                 bias,
391*77c1e3ccSAndroid Build Coastguard Worker                                 PADDING_SAME_ZERO,
392*77c1e3ccSAndroid Build Coastguard Worker                                 RELU,
393*77c1e3ccSAndroid Build Coastguard Worker                                 0,
394*77c1e3ccSAndroid Build Coastguard Worker                                 0,
395*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NO_COPY,
396*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NOC,
397*77c1e3ccSAndroid Build Coastguard Worker                                 {},
398*77c1e3ccSAndroid Build Coastguard Worker                                 {},
399*77c1e3ccSAndroid Build Coastguard Worker                                 0,
400*77c1e3ccSAndroid Build Coastguard Worker                             } } };
401*77c1e3ccSAndroid Build Coastguard Worker 
402*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
403*77c1e3ccSAndroid Build Coastguard Worker 
404*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_same, &cnn_config,
405*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
406*77c1e3ccSAndroid Build Coastguard Worker 
407*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_SAME_REPLICATE;
408*77c1e3ccSAndroid Build Coastguard Worker 
409*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_replicate, &cnn_config,
410*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
411*77c1e3ccSAndroid Build Coastguard Worker 
412*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
413*77c1e3ccSAndroid Build Coastguard Worker 
414*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_valid, &cnn_config,
415*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
416*77c1e3ccSAndroid Build Coastguard Worker }
417*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestVaryingStridesVaryingDimImages)418*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestVaryingStridesVaryingDimImages) {
419*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
420*77c1e3ccSAndroid Build Coastguard Worker     1,  -5, -3, -4, -1, 1,  2,  -3, 2,  2,  -1, 1,  -5, 1,  1,
421*77c1e3ccSAndroid Build Coastguard Worker     -3, -5, 3,  1,  4,  -2, -5, -2, -3, -5, 0,  -1, -5, 2,  -2,
422*77c1e3ccSAndroid Build Coastguard Worker     -2, 1,  -2, -4, 1,  3,  -2, 2,  0,  -3, 2,  -3, -2, -3,
423*77c1e3ccSAndroid Build Coastguard Worker   };
424*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = { 2 };
425*77c1e3ccSAndroid Build Coastguard Worker 
426*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
427*77c1e3ccSAndroid Build Coastguard Worker                             0,
428*77c1e3ccSAndroid Build Coastguard Worker                             0,
429*77c1e3ccSAndroid Build Coastguard Worker                             0,
430*77c1e3ccSAndroid Build Coastguard Worker                             0,
431*77c1e3ccSAndroid Build Coastguard Worker                             {
432*77c1e3ccSAndroid Build Coastguard Worker                                 {
433*77c1e3ccSAndroid Build Coastguard Worker                                     1,
434*77c1e3ccSAndroid Build Coastguard Worker                                     4,
435*77c1e3ccSAndroid Build Coastguard Worker                                     11,
436*77c1e3ccSAndroid Build Coastguard Worker                                     1,
437*77c1e3ccSAndroid Build Coastguard Worker                                     7,
438*77c1e3ccSAndroid Build Coastguard Worker                                     6,
439*77c1e3ccSAndroid Build Coastguard Worker                                     0,
440*77c1e3ccSAndroid Build Coastguard Worker                                     weights,
441*77c1e3ccSAndroid Build Coastguard Worker                                     bias,
442*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
443*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
444*77c1e3ccSAndroid Build Coastguard Worker                                     0,
445*77c1e3ccSAndroid Build Coastguard Worker                                     0,
446*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
447*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
448*77c1e3ccSAndroid Build Coastguard Worker                                     {},
449*77c1e3ccSAndroid Build Coastguard Worker                                     {},
450*77c1e3ccSAndroid Build Coastguard Worker                                     0,
451*77c1e3ccSAndroid Build Coastguard Worker                                 },
452*77c1e3ccSAndroid Build Coastguard Worker                             } };
453*77c1e3ccSAndroid Build Coastguard Worker 
454*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 24;
455*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 17;
456*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
457*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, 4,  4,  -5, 4,  3,  -5, -1, -3, 4,  -4, 2,  -3, 3,  -5, 2,  -1, -5,
458*77c1e3ccSAndroid Build Coastguard Worker     1,  -1, 3,  1,  -3, -3, 4,  0,  2,  -3, -5, -5, -4, 0,  -5, -2, -3, -1, -2,
459*77c1e3ccSAndroid Build Coastguard Worker     2,  -5, 4,  4,  0,  -4, -3, 1,  -3, -5, -4, -4, 1,  -2, -3, 3,  -3, -3, -1,
460*77c1e3ccSAndroid Build Coastguard Worker     -5, -5, -2, 3,  1,  -1, -5, -5, 1,  -4, -2, -1, -2, -4, -4, 2,  -2, 2,  1,
461*77c1e3ccSAndroid Build Coastguard Worker     -2, -4, -1, 1,  -2, -5, 3,  -2, -1, -1, -5, -3, 1,  -2, -2, -3, -1, -2, -4,
462*77c1e3ccSAndroid Build Coastguard Worker     -2, 1,  -4, -1, 4,  3,  -4, 0,  4,  2,  2,  4,  -3, -5, 2,  2,  1,  -1, -4,
463*77c1e3ccSAndroid Build Coastguard Worker     -2, 1,  3,  2,  0,  4,  -1, -3, 2,  1,  -4, 2,  2,  -4, -2, 0,  -2, -1, 4,
464*77c1e3ccSAndroid Build Coastguard Worker     4,  2,  3,  -4, 2,  -4, -5, 4,  -1, -3, -1, 0,  -4, 1,  3,  -1, -3, -5, 3,
465*77c1e3ccSAndroid Build Coastguard Worker     -2, -4, 1,  2,  -2, -3, -3, -5, 1,  -3, -1, 0,  -1, 3,  -4, -1, -5, -5, 1,
466*77c1e3ccSAndroid Build Coastguard Worker     0,  0,  -2, -2, 2,  -2, 0,  0,  2,  0,  -3, 0,  -1, -4, -4, -1, 3,  -4, -4,
467*77c1e3ccSAndroid Build Coastguard Worker     -1, 0,  -5, -3, -2, 4,  -3, -4, -4, 0,  -5, 1,  -2, -3, -3, -4, 4,  3,  4,
468*77c1e3ccSAndroid Build Coastguard Worker     3,  3,  -1, 3,  1,  -3, -2, 3,  3,  0,  2,  -4, -3, 2,  2,  0,  -2, 4,  -2,
469*77c1e3ccSAndroid Build Coastguard Worker     2,  -2, -1, -4, -2, 2,  -4, 3,  -1, 4,  1,  1,  4,  -1, -4, -4, 1,  1,  -2,
470*77c1e3ccSAndroid Build Coastguard Worker     4,  -1, 3,  2,  -3, 4,  3,  1,  4,  0,  -4, 2,  0,  2,  4,  -2, -2, 4,  2,
471*77c1e3ccSAndroid Build Coastguard Worker     -1, -2, 1,  -3, 2,  3,  -5, -3, 4,  4,  2,  -5, -4, -5, -2, -4, 2,  0,  2,
472*77c1e3ccSAndroid Build Coastguard Worker     -5, 4,  -4, -2, -5, 2,  1,  0,  4,  1,  -2, -3, -4, -3, -4, 3,  3,  2,  0,
473*77c1e3ccSAndroid Build Coastguard Worker     -3, 1,  -5, 4,  0,  4,  -1, 3,  -5, -5, -2, -1, -1, 4,  3,  3,  4,  3,  -4,
474*77c1e3ccSAndroid Build Coastguard Worker     4,  -3, -3, -1, -4, -1, -4, -1, -2, 4,  -2, -4, 4,  4,  -3, -4, -1, 1,  2,
475*77c1e3ccSAndroid Build Coastguard Worker     -1, -2, -2, 3,  2,  2,  -3, 0,  -1, 0,  3,  2,  -5, 0,  -4, 0,  0,  2,  -4,
476*77c1e3ccSAndroid Build Coastguard Worker     -1, -1, 0,  -2, 0,  1,  0,  0,  4,  -5, -1, -5, 2,  -1, 0,  2,  -1, 1,  3,
477*77c1e3ccSAndroid Build Coastguard Worker     -3, -5, -2, -3, 4,  -2, -2, -1, -3, -4, -1, -2, -4, 1,  4,  -3, -2, -1, 3,
478*77c1e3ccSAndroid Build Coastguard Worker     -3, -2, 3,  2,  1,  -4, -3, -5, 1,
479*77c1e3ccSAndroid Build Coastguard Worker   };
480*77c1e3ccSAndroid Build Coastguard Worker   float expected_1[] = {
481*77c1e3ccSAndroid Build Coastguard Worker     41, -26, 5, 76, 13, 83, -21, 53, -54, -14, 21, 121,
482*77c1e3ccSAndroid Build Coastguard Worker   };
483*77c1e3ccSAndroid Build Coastguard Worker 
484*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
485*77c1e3ccSAndroid Build Coastguard Worker 
486*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_1, &cnn_config,
487*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
488*77c1e3ccSAndroid Build Coastguard Worker 
489*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 6;
490*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 7;
491*77c1e3ccSAndroid Build Coastguard Worker 
492*77c1e3ccSAndroid Build Coastguard Worker   float expected_2[] = {
493*77c1e3ccSAndroid Build Coastguard Worker     21, -50, 41, 20, 72, 127, -21, 103, 62, -37, 83, -3,
494*77c1e3ccSAndroid Build Coastguard Worker   };
495*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_2, &cnn_config,
496*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
497*77c1e3ccSAndroid Build Coastguard Worker 
498*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 3;
499*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 10;
500*77c1e3ccSAndroid Build Coastguard Worker 
501*77c1e3ccSAndroid Build Coastguard Worker   float expected_3[] = {
502*77c1e3ccSAndroid Build Coastguard Worker     -26, -21, -35, 69, 49,  4,  -51, -43, -56,
503*77c1e3ccSAndroid Build Coastguard Worker     -41, 15,  -44, 40, -62, 63, 38,  27,  47,
504*77c1e3ccSAndroid Build Coastguard Worker   };
505*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_3, &cnn_config,
506*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
507*77c1e3ccSAndroid Build Coastguard Worker 
508*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 10;
509*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 3;
510*77c1e3ccSAndroid Build Coastguard Worker 
511*77c1e3ccSAndroid Build Coastguard Worker   float expected_4[] = {
512*77c1e3ccSAndroid Build Coastguard Worker     21, 49, 28, 87, 50, 40, 102, 81, 58, 85, 51, 66, 36, 19, -37, -45,
513*77c1e3ccSAndroid Build Coastguard Worker   };
514*77c1e3ccSAndroid Build Coastguard Worker 
515*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_4, &cnn_config,
516*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
517*77c1e3ccSAndroid Build Coastguard Worker }
518*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestMaxPool)519*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestMaxPool) {
520*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 8;
521*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 8;
522*77c1e3ccSAndroid Build Coastguard Worker   int stride = 3;
523*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
524*77c1e3ccSAndroid Build Coastguard Worker     1,  -4, -4, 8, 0, 7, -5, -2, 8, 2, 2, 8,  5,  -1, -1, 9,
525*77c1e3ccSAndroid Build Coastguard Worker     -3, 0,  -2, 0, 6, 3, -4, 8,  7, 8, 7, -1, 4,  -1, 0,  2,
526*77c1e3ccSAndroid Build Coastguard Worker     -5, -2, 8,  5, 5, 4, 2,  7,  4, 6, 2, 8,  8,  -4, -3, -4,
527*77c1e3ccSAndroid Build Coastguard Worker     -3, -1, 2,  3, 3, 6, -5, 8,  9, 5, 0, -2, -1, 6,  5,  7,
528*77c1e3ccSAndroid Build Coastguard Worker   };
529*77c1e3ccSAndroid Build Coastguard Worker 
530*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
531*77c1e3ccSAndroid Build Coastguard Worker     49, 58, 70, 68, 68, 70, 48, 57, 88,
532*77c1e3ccSAndroid Build Coastguard Worker   };
533*77c1e3ccSAndroid Build Coastguard Worker 
534*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
535*77c1e3ccSAndroid Build Coastguard Worker     3, 1, 3, 4, -1, 5, -2, 1, -4,
536*77c1e3ccSAndroid Build Coastguard Worker   };
537*77c1e3ccSAndroid Build Coastguard Worker 
538*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
539*77c1e3ccSAndroid Build Coastguard Worker     -3,
540*77c1e3ccSAndroid Build Coastguard Worker   };
541*77c1e3ccSAndroid Build Coastguard Worker 
542*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
543*77c1e3ccSAndroid Build Coastguard Worker                             0,
544*77c1e3ccSAndroid Build Coastguard Worker                             0,
545*77c1e3ccSAndroid Build Coastguard Worker                             0,
546*77c1e3ccSAndroid Build Coastguard Worker                             0,
547*77c1e3ccSAndroid Build Coastguard Worker                             { {
548*77c1e3ccSAndroid Build Coastguard Worker                                 1,
549*77c1e3ccSAndroid Build Coastguard Worker                                 3,
550*77c1e3ccSAndroid Build Coastguard Worker                                 3,
551*77c1e3ccSAndroid Build Coastguard Worker                                 1,
552*77c1e3ccSAndroid Build Coastguard Worker                                 stride,
553*77c1e3ccSAndroid Build Coastguard Worker                                 stride,
554*77c1e3ccSAndroid Build Coastguard Worker                                 1,
555*77c1e3ccSAndroid Build Coastguard Worker                                 weights,
556*77c1e3ccSAndroid Build Coastguard Worker                                 bias,
557*77c1e3ccSAndroid Build Coastguard Worker                                 PADDING_SAME_ZERO,
558*77c1e3ccSAndroid Build Coastguard Worker                                 NONE,
559*77c1e3ccSAndroid Build Coastguard Worker                                 0,
560*77c1e3ccSAndroid Build Coastguard Worker                                 0,
561*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NO_COPY,
562*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NOC,
563*77c1e3ccSAndroid Build Coastguard Worker                                 {},
564*77c1e3ccSAndroid Build Coastguard Worker                                 {},
565*77c1e3ccSAndroid Build Coastguard Worker                                 0,
566*77c1e3ccSAndroid Build Coastguard Worker                             } } };
567*77c1e3ccSAndroid Build Coastguard Worker 
568*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
569*77c1e3ccSAndroid Build Coastguard Worker 
570*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
571*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
572*77c1e3ccSAndroid Build Coastguard Worker }
573*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestDeconvolveNonActivationSingleLayerSingleKernel)574*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestDeconvolveNonActivationSingleLayerSingleKernel) {
575*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 4;
576*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 7;
577*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
578*77c1e3ccSAndroid Build Coastguard Worker     9,  6,   181, 9,  218, 30, 80,  108, 68,  216, 70, 128, 179, 228,
579*77c1e3ccSAndroid Build Coastguard Worker     33, 212, 34,  14, 48,  27, 230, 23,  202, 113, 80, 56,  122, 112,
580*77c1e3ccSAndroid Build Coastguard Worker   };
581*77c1e3ccSAndroid Build Coastguard Worker 
582*77c1e3ccSAndroid Build Coastguard Worker   float expected_1_same[] = {
583*77c1e3ccSAndroid Build Coastguard Worker     15,   -30,  36,   -525,  377, -193, 558, 531,  6,   -24,  -15,  124,
584*77c1e3ccSAndroid Build Coastguard Worker     166,  -561, -356, -754,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
585*77c1e3ccSAndroid Build Coastguard Worker     433,  -311, 711,  381,   247, -317, 453, 129,  215, -627, -409, -885,
586*77c1e3ccSAndroid Build Coastguard Worker     17,   -255, -55,  -647,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
587*77c1e3ccSAndroid Build Coastguard Worker     133,  -719, 633,  -225,  785, 191,  463, 79,   65,  9,    77,   -853,
588*77c1e3ccSAndroid Build Coastguard Worker     -365, -949, -15,  -667,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
589*77c1e3ccSAndroid Build Coastguard Worker     355,  -866, 990,  207,   747, 12,   520, -116, 176, -312, -133, -1370,
590*77c1e3ccSAndroid Build Coastguard Worker     -426, -802, 143,  -771,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
591*77c1e3ccSAndroid Build Coastguard Worker     65,   -79,  127,  -59,   135, -90,  195, 114,  31,  -91,  -57,  -133,
592*77c1e3ccSAndroid Build Coastguard Worker     17,   -176, -72,  -276,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
593*77c1e3ccSAndroid Build Coastguard Worker     457,  -302, 733,  58,    470, -475, 829, 490,  227, -670, -440, -790,
594*77c1e3ccSAndroid Build Coastguard Worker     153,  -588, -294, -1150, -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
595*77c1e3ccSAndroid Build Coastguard Worker     157,  -251, 349,  -185,  409, -293, 587, 251,  77,  -187, -107, -369,
596*77c1e3ccSAndroid Build Coastguard Worker     7,    -481, -135, -827,  -3,  -3,   -3,  -3,   -3,  -3,   -3,   -3,
597*77c1e3ccSAndroid Build Coastguard Worker   };
598*77c1e3ccSAndroid Build Coastguard Worker   float expected_1_valid[] = {
599*77c1e3ccSAndroid Build Coastguard Worker     -30,  15,   -30,  36,   -525,  377,  -193,  558,  531,  24,   24,   6,
600*77c1e3ccSAndroid Build Coastguard Worker     6,    -24,  -15,  124,  166,   -561, -356,  -754, -21,  -39,  -3,   -3,
601*77c1e3ccSAndroid Build Coastguard Worker     -3,   -3,   -3,   -3,   -3,    -3,   -3,    -3,   -3,   -657, 433,  -311,
602*77c1e3ccSAndroid Build Coastguard Worker     711,  381,  247,  -317, 453,   129,  321,   321,  215,  215,  -627, -409,
603*77c1e3ccSAndroid Build Coastguard Worker     -885, 17,   -255, -55,  -647,  -219, -435,  -3,   -3,   -3,   -3,   -3,
604*77c1e3ccSAndroid Build Coastguard Worker     -3,   -3,   -3,   -3,   -3,    -3,   -207,  133,  -719, 633,  -225, 785,
605*77c1e3ccSAndroid Build Coastguard Worker     191,  463,  79,   381,  381,   65,   65,    9,    77,   -853, -365, -949,
606*77c1e3ccSAndroid Build Coastguard Worker     -15,  -667, -259, -515, -3,    -3,   -3,    -3,   -3,   -3,   -3,   -3,
607*77c1e3ccSAndroid Build Coastguard Worker     -3,   -3,   -3,   -540, 355,   -866, 990,   207,  747,  12,   520,  -116,
608*77c1e3ccSAndroid Build Coastguard Worker     633,  633,  176,  176,  -312,  -133, -1370, -426, -802, 143,  -771, -427,
609*77c1e3ccSAndroid Build Coastguard Worker     -851, -3,   -3,   -3,   -3,    -3,   -3,    -3,   -3,   -3,   -3,   -3,
610*77c1e3ccSAndroid Build Coastguard Worker     -105, 65,   -79,  127,  -59,   135,  -90,   195,  114,  78,   78,   31,
611*77c1e3ccSAndroid Build Coastguard Worker     31,   -91,  -57,  -133, 17,    -176, -72,   -276, -57,  -111, -3,   -3,
612*77c1e3ccSAndroid Build Coastguard Worker     -3,   -3,   -3,   -3,   -3,    -3,   -3,    -3,   -3,   -693, 457,  -302,
613*77c1e3ccSAndroid Build Coastguard Worker     733,  58,   470,  -475, 829,   490,  336,   336,  227,  227,  -670, -440,
614*77c1e3ccSAndroid Build Coastguard Worker     -790, 153,  -588, -294, -1150, -229, -455,  -3,   -3,   -3,   -3,   -3,
615*77c1e3ccSAndroid Build Coastguard Worker     -3,   -3,   -3,   -3,   -3,    -3,   -243,  157,  -251, 349,  -185, 409,
616*77c1e3ccSAndroid Build Coastguard Worker     -293, 587,  251,  333,  333,   77,   77,    -187, -107, -369, 7,    -481,
617*77c1e3ccSAndroid Build Coastguard Worker     -135, -827, -227, -451,
618*77c1e3ccSAndroid Build Coastguard Worker   };
619*77c1e3ccSAndroid Build Coastguard Worker   float weights_1[] = { -3, 2, -1, 3, 3, 1, 1, -3, -2, -4 };
620*77c1e3ccSAndroid Build Coastguard Worker   float bias_1[] = { -3 };
621*77c1e3ccSAndroid Build Coastguard Worker 
622*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
623*77c1e3ccSAndroid Build Coastguard Worker                             0,
624*77c1e3ccSAndroid Build Coastguard Worker                             0,
625*77c1e3ccSAndroid Build Coastguard Worker                             0,
626*77c1e3ccSAndroid Build Coastguard Worker                             0,
627*77c1e3ccSAndroid Build Coastguard Worker                             { {
628*77c1e3ccSAndroid Build Coastguard Worker                                 1,
629*77c1e3ccSAndroid Build Coastguard Worker                                 5,
630*77c1e3ccSAndroid Build Coastguard Worker                                 2,
631*77c1e3ccSAndroid Build Coastguard Worker                                 1,
632*77c1e3ccSAndroid Build Coastguard Worker                                 2,
633*77c1e3ccSAndroid Build Coastguard Worker                                 3,
634*77c1e3ccSAndroid Build Coastguard Worker                                 0,
635*77c1e3ccSAndroid Build Coastguard Worker                                 weights_1,
636*77c1e3ccSAndroid Build Coastguard Worker                                 bias_1,
637*77c1e3ccSAndroid Build Coastguard Worker                                 PADDING_SAME_ZERO,
638*77c1e3ccSAndroid Build Coastguard Worker                                 NONE,
639*77c1e3ccSAndroid Build Coastguard Worker                                 1,
640*77c1e3ccSAndroid Build Coastguard Worker                                 0,
641*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NO_COPY,
642*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NOC,
643*77c1e3ccSAndroid Build Coastguard Worker                                 {},
644*77c1e3ccSAndroid Build Coastguard Worker                                 {},
645*77c1e3ccSAndroid Build Coastguard Worker                                 0,
646*77c1e3ccSAndroid Build Coastguard Worker                             } } };
647*77c1e3ccSAndroid Build Coastguard Worker 
648*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
649*77c1e3ccSAndroid Build Coastguard Worker 
650*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_1_same, &cnn_config,
651*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
652*77c1e3ccSAndroid Build Coastguard Worker 
653*77c1e3ccSAndroid Build Coastguard Worker   // Change padding to valid
654*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
655*77c1e3ccSAndroid Build Coastguard Worker 
656*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_1_valid, &cnn_config,
657*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
658*77c1e3ccSAndroid Build Coastguard Worker 
659*77c1e3ccSAndroid Build Coastguard Worker   float expected_12_same[] = {
660*77c1e3ccSAndroid Build Coastguard Worker     15,  -12,  6,    36,   -9,   -528, 377,  -184, 513,  558,  -12,  24,
661*77c1e3ccSAndroid Build Coastguard Worker     6,   -30,  -15,  -33,  -21,  166,  154,  -546, -356, -718, -30,  -21,
662*77c1e3ccSAndroid Build Coastguard Worker     433, -221, 561,  711,  -33,  -153, 247,  -83,  -87,  453,  -111, 321,
663*77c1e3ccSAndroid Build Coastguard Worker     215, -657, -409, -845, -93,  17,   -43,  -243, -55,  -215, -327, -219,
664*77c1e3ccSAndroid Build Coastguard Worker     133, -71,  -447, 633,  -219, 435,  785,  -73,  -177, 463,  -131, 381,
665*77c1e3ccSAndroid Build Coastguard Worker     65,  -207, 77,   -59,  -651, -365, -797, -213, -15,  -155, -387, -259,
666*77c1e3ccSAndroid Build Coastguard Worker     355, -182, -150, 990,  -231, 582,  747,  -36,  -540, 520,  -215, 633,
667*77c1e3ccSAndroid Build Coastguard Worker     176, -540, -133, -491, -687, -426, -882, -102, 143,  77,   -639, -427,
668*77c1e3ccSAndroid Build Coastguard Worker     65,  -37,  57,   127,  -17,  -105, 135,  -51,  60,   195,  -30,  78,
669*77c1e3ccSAndroid Build Coastguard Worker     31,  -105, -57,  -125, -45,  17,   -11,  -147, -72,  -168, -84,  -57,
670*77c1e3ccSAndroid Build Coastguard Worker     457, -233, 618,  733,  -26,  -540, 470,  -205, 264,  829,  -116, 336,
671*77c1e3ccSAndroid Build Coastguard Worker     227, -693, -440, -900, -72,  153,  107,  -609, -294, -698, -342, -229,
672*77c1e3ccSAndroid Build Coastguard Worker     157, -83,  69,   349,  -59,  -201, 409,  -125, 27,   587,  -115, 333,
673*77c1e3ccSAndroid Build Coastguard Worker     77,  -243, -107, -267, -171, 7,    -105, -369, -135, -379, -339, -227,
674*77c1e3ccSAndroid Build Coastguard Worker   };
675*77c1e3ccSAndroid Build Coastguard Worker   float expected_12_valid[] = {
676*77c1e3ccSAndroid Build Coastguard Worker     -30,  15,   -12,  6,    36,   -9,   -528, 377,  -184, 513,  558,  -12,
677*77c1e3ccSAndroid Build Coastguard Worker     24,   24,   6,    6,    -30,  -15,  -33,  -21,  166,  154,  -546, -356,
678*77c1e3ccSAndroid Build Coastguard Worker     -718, -30,  -21,  -39,  -657, 433,  -221, 561,  711,  -33,  -153, 247,
679*77c1e3ccSAndroid Build Coastguard Worker     -83,  -87,  453,  -111, 321,  321,  215,  215,  -657, -409, -845, -93,
680*77c1e3ccSAndroid Build Coastguard Worker     17,   -43,  -243, -55,  -215, -327, -219, -435, -207, 133,  -71,  -447,
681*77c1e3ccSAndroid Build Coastguard Worker     633,  -219, 435,  785,  -73,  -177, 463,  -131, 381,  381,  65,   65,
682*77c1e3ccSAndroid Build Coastguard Worker     -207, 77,   -59,  -651, -365, -797, -213, -15,  -155, -387, -259, -515,
683*77c1e3ccSAndroid Build Coastguard Worker     -540, 355,  -182, -150, 990,  -231, 582,  747,  -36,  -540, 520,  -215,
684*77c1e3ccSAndroid Build Coastguard Worker     633,  633,  176,  176,  -540, -133, -491, -687, -426, -882, -102, 143,
685*77c1e3ccSAndroid Build Coastguard Worker     77,   -639, -427, -851, -105, 65,   -37,  57,   127,  -17,  -105, 135,
686*77c1e3ccSAndroid Build Coastguard Worker     -51,  60,   195,  -30,  78,   78,   31,   31,   -105, -57,  -125, -45,
687*77c1e3ccSAndroid Build Coastguard Worker     17,   -11,  -147, -72,  -168, -84,  -57,  -111, -693, 457,  -233, 618,
688*77c1e3ccSAndroid Build Coastguard Worker     733,  -26,  -540, 470,  -205, 264,  829,  -116, 336,  336,  227,  227,
689*77c1e3ccSAndroid Build Coastguard Worker     -693, -440, -900, -72,  153,  107,  -609, -294, -698, -342, -229, -455,
690*77c1e3ccSAndroid Build Coastguard Worker     -243, 157,  -83,  69,   349,  -59,  -201, 409,  -125, 27,   587,  -115,
691*77c1e3ccSAndroid Build Coastguard Worker     333,  333,  77,   77,   -243, -107, -267, -171, 7,    -105, -369, -135,
692*77c1e3ccSAndroid Build Coastguard Worker     -379, -339, -227, -451,
693*77c1e3ccSAndroid Build Coastguard Worker   };
694*77c1e3ccSAndroid Build Coastguard Worker 
695*77c1e3ccSAndroid Build Coastguard Worker   // Change skip_width, skip_height to {2, 3}
696*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 3;
697*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 2;
698*77c1e3ccSAndroid Build Coastguard Worker   // Set padding to same
699*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_SAME_ZERO;
700*77c1e3ccSAndroid Build Coastguard Worker 
701*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_12_same, &cnn_config,
702*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
703*77c1e3ccSAndroid Build Coastguard Worker 
704*77c1e3ccSAndroid Build Coastguard Worker   // Change padding to valid
705*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
706*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_12_valid, &cnn_config,
707*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
708*77c1e3ccSAndroid Build Coastguard Worker 
709*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].filter_width = 4;
710*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].filter_height = 3;
711*77c1e3ccSAndroid Build Coastguard Worker   float weights_2[] = { -1, -3, -1, -3, 0, 2, -2, 4, 3, 0, 1, 4 };
712*77c1e3ccSAndroid Build Coastguard Worker   float bias_2[] = { -4 };
713*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].weights = weights_2;
714*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].bias = bias_2;
715*77c1e3ccSAndroid Build Coastguard Worker 
716*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 5;
717*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 2;
718*77c1e3ccSAndroid Build Coastguard Worker   float expected_2_same[] = {
719*77c1e3ccSAndroid Build Coastguard Worker     -13,  -31,  -13,  -31,  -4,   -10,  -22,  -10,  -22,  -4,   -185, -547,
720*77c1e3ccSAndroid Build Coastguard Worker     -185, -547, -4,   -13,  -31,  -13,  -31,  -4,   -4,   14,   -22,  32,
721*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   8,    -16,  20,   -4,   -4,   358,  -366, 720,  -4,   -4,
722*77c1e3ccSAndroid Build Coastguard Worker     14,   -22,  32,   -4,   -195, -658, -213, -622, -4,   -16,  -94,  -28,
723*77c1e3ccSAndroid Build Coastguard Worker     -70,  -4,   459,  -244, 97,   480,  -4,   -85,  -328, -103, -292, -4,
724*77c1e3ccSAndroid Build Coastguard Worker     -4,   432,  -440, 868,  -4,   -4,   56,   -64,  116,  -4,   -4,   156,
725*77c1e3ccSAndroid Build Coastguard Worker     -164, 316,  -4,   -4,   212,  -220, 428,  -4,   582,  -208, 146,  664,
726*77c1e3ccSAndroid Build Coastguard Worker     -4,   -130, -652, -190, -532, -4,   166,  -214, 6,    106,  -4,   192,
727*77c1e3ccSAndroid Build Coastguard Worker     -388, -24,  44,   -4,   -4,   132,  -140, 268,  -4,   -4,   428,  -436,
728*77c1e3ccSAndroid Build Coastguard Worker     860,  -4,   -4,   136,  -144, 276,  -4,   -4,   252,  -260, 508,  -4,
729*77c1e3ccSAndroid Build Coastguard Worker     21,   -541, -115, -269, -4,   416,  -688, -16,  176,  -4,   173,  -103,
730*77c1e3ccSAndroid Build Coastguard Worker     33,   177,  -4,   168,  -640, -88,  -128, -4,   -4,   354,  -362, 712,
731*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   452,  -460, 908,  -4,   -4,   62,   -70,  128,  -4,   -4,
732*77c1e3ccSAndroid Build Coastguard Worker     420,  -428, 844,  -4,   499,  -106, 141,  610,  -4,   666,  -46,  210,
733*77c1e3ccSAndroid Build Coastguard Worker     866,  -4,   47,   -148, -19,  -16,  -4,   605,  -85,  181,  763,  -4,
734*77c1e3ccSAndroid Build Coastguard Worker     -4,   64,   -72,  132,  -4,   -4,   24,   -32,  52,   -4,   -4,   92,
735*77c1e3ccSAndroid Build Coastguard Worker     -100, 188,  -4,   -4,   50,   -58,  104,  -4,   -132, -694, -200, -558,
736*77c1e3ccSAndroid Build Coastguard Worker     -4,   15,   -73,  -13,  -17,  -4,   -62,  -610, -158, -418, -4,   -36,
737*77c1e3ccSAndroid Build Coastguard Worker     -343, -90,  -235, -4,   -4,   456,  -464, 916,  -4,   -4,   42,   -50,
738*77c1e3ccSAndroid Build Coastguard Worker     88,   -4,   -4,   400,  -408, 804,  -4,   -4,   222,  -230, 448,  -4,
739*77c1e3ccSAndroid Build Coastguard Worker     606,  -244, 146,  676,  -4,   9,    -172, -37,  -80,  -4,   480,  -370,
740*77c1e3ccSAndroid Build Coastguard Worker     76,   438,  -4,   223,  -340, -3,   112,  -4,   -4,   156,  -164, 316,
741*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   108,  -116, 220,  -4,   -4,   240,  -248, 484,  -4,   -4,
742*77c1e3ccSAndroid Build Coastguard Worker     220,  -228, 444,  -4,
743*77c1e3ccSAndroid Build Coastguard Worker   };
744*77c1e3ccSAndroid Build Coastguard Worker   float expected_2_valid[] = {
745*77c1e3ccSAndroid Build Coastguard Worker     -13,  -31,  -13,  -31,  -4,   -10,  -22,  -10,  -22,  -4,   -185, -547,
746*77c1e3ccSAndroid Build Coastguard Worker     -185, -547, -4,   -13,  -31,  -13,  -31,  -4,   14,   -22,  32,   -4,
747*77c1e3ccSAndroid Build Coastguard Worker     -4,   8,    -16,  20,   -4,   -4,   358,  -366, 720,  -4,   -4,   14,
748*77c1e3ccSAndroid Build Coastguard Worker     -22,  32,   -195, -658, -213, -622, -4,   -16,  -94,  -28,  -70,  -4,
749*77c1e3ccSAndroid Build Coastguard Worker     459,  -244, 97,   480,  -4,   -85,  -328, -103, -292, -4,   432,  -440,
750*77c1e3ccSAndroid Build Coastguard Worker     868,  -4,   -4,   56,   -64,  116,  -4,   -4,   156,  -164, 316,  -4,
751*77c1e3ccSAndroid Build Coastguard Worker     -4,   212,  -220, 428,  582,  -208, 146,  664,  -4,   -130, -652, -190,
752*77c1e3ccSAndroid Build Coastguard Worker     -532, -4,   166,  -214, 6,    106,  -4,   192,  -388, -24,  44,   -4,
753*77c1e3ccSAndroid Build Coastguard Worker     132,  -140, 268,  -4,   -4,   428,  -436, 860,  -4,   -4,   136,  -144,
754*77c1e3ccSAndroid Build Coastguard Worker     276,  -4,   -4,   252,  -260, 508,  21,   -541, -115, -269, -4,   416,
755*77c1e3ccSAndroid Build Coastguard Worker     -688, -16,  176,  -4,   173,  -103, 33,   177,  -4,   168,  -640, -88,
756*77c1e3ccSAndroid Build Coastguard Worker     -128, -4,   354,  -362, 712,  -4,   -4,   452,  -460, 908,  -4,   -4,
757*77c1e3ccSAndroid Build Coastguard Worker     62,   -70,  128,  -4,   -4,   420,  -428, 844,  499,  -106, 141,  610,
758*77c1e3ccSAndroid Build Coastguard Worker     -4,   666,  -46,  210,  866,  -4,   47,   -148, -19,  -16,  -4,   605,
759*77c1e3ccSAndroid Build Coastguard Worker     -85,  181,  763,  -4,   64,   -72,  132,  -4,   -4,   24,   -32,  52,
760*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   92,   -100, 188,  -4,   -4,   50,   -58,  104,  -132, -694,
761*77c1e3ccSAndroid Build Coastguard Worker     -200, -558, -4,   15,   -73,  -13,  -17,  -4,   -62,  -610, -158, -418,
762*77c1e3ccSAndroid Build Coastguard Worker     -4,   -36,  -343, -90,  -235, -4,   456,  -464, 916,  -4,   -4,   42,
763*77c1e3ccSAndroid Build Coastguard Worker     -50,  88,   -4,   -4,   400,  -408, 804,  -4,   -4,   222,  -230, 448,
764*77c1e3ccSAndroid Build Coastguard Worker     606,  -244, 146,  676,  -4,   9,    -172, -37,  -80,  -4,   480,  -370,
765*77c1e3ccSAndroid Build Coastguard Worker     76,   438,  -4,   223,  -340, -3,   112,  -4,   156,  -164, 316,  -4,
766*77c1e3ccSAndroid Build Coastguard Worker     -4,   108,  -116, 220,  -4,   -4,   240,  -248, 484,  -4,   -4,   220,
767*77c1e3ccSAndroid Build Coastguard Worker     -228, 444,  236,  -4,   76,   316,  -4,   164,  -4,   52,   220,  -4,
768*77c1e3ccSAndroid Build Coastguard Worker     362,  -4,   118,  484,  -4,   332,  -4,   108,  444,
769*77c1e3ccSAndroid Build Coastguard Worker   };
770*77c1e3ccSAndroid Build Coastguard Worker   // Set padding to same
771*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_SAME_ZERO;
772*77c1e3ccSAndroid Build Coastguard Worker 
773*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_2_same, &cnn_config,
774*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
775*77c1e3ccSAndroid Build Coastguard Worker 
776*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
777*77c1e3ccSAndroid Build Coastguard Worker 
778*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_2_valid, &cnn_config,
779*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
780*77c1e3ccSAndroid Build Coastguard Worker 
781*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 2;
782*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 5;
783*77c1e3ccSAndroid Build Coastguard Worker   float expected_21_same[] = {
784*77c1e3ccSAndroid Build Coastguard Worker     -31,  -19,  -49,   -191, -565, -194, -574, -13,  14,   -22,  44,   -16,
785*77c1e3ccSAndroid Build Coastguard Worker     382,  -366, 738,   -22,  -4,   23,   32,   545,  20,   204,  720,  5,
786*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
787*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -658, -252, -748, -114, -334, -192, -568, -112,
788*77c1e3ccSAndroid Build Coastguard Worker     432,  -440, 928,   -64,  276,  -164, 532,  -220, -4,   304,  868,  266,
789*77c1e3ccSAndroid Build Coastguard Worker     116,  400,  316,   104,  -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
790*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -208, -288, -856, -290,
791*77c1e3ccSAndroid Build Coastguard Worker     -862, -202, -598,  -132, 132,  -140, 700,  -436, 1000, -144, 532,  -260,
792*77c1e3ccSAndroid Build Coastguard Worker     -4,   712,  268,   422,  860,  450,  276,  124,  -4,   -4,   -4,   -4,
793*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
794*77c1e3ccSAndroid Build Coastguard Worker     -541, -411, -1225, -265, -787, -249, -739, -216, 354,  -362, 1168, -460,
795*77c1e3ccSAndroid Build Coastguard Worker     974,  -70,  552,   -428, -4,   859,  712,  323,  908,  665,  128,  208,
796*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
797*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -106, -52,  -148, -66,  -190, -79,  -229, -31,
798*77c1e3ccSAndroid Build Coastguard Worker     64,   -72,  160,   -32,  148,  -100, 242,  -58,  -4,   72,   132,  154,
799*77c1e3ccSAndroid Build Coastguard Worker     52,   125,  188,   23,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
800*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -694, -257, -763, -229,
801*77c1e3ccSAndroid Build Coastguard Worker     -679, -319, -949,  -117, 456,  -464, 962,  -50,  492,  -408, 1030, -230,
802*77c1e3ccSAndroid Build Coastguard Worker     -4,   295,  916,   625,  88,   537,  804,  109,  -4,   -4,   -4,   -4,
803*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
804*77c1e3ccSAndroid Build Coastguard Worker     -244, -140, -412,  -182, -538, -238, -706, -116, 156,  -164, 428,  -116,
805*77c1e3ccSAndroid Build Coastguard Worker     464,  -248, 708,   -228, -4,   244,  316,  418,  220,  454,  484,  108,
806*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,
807*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,    -4,
808*77c1e3ccSAndroid Build Coastguard Worker   };
809*77c1e3ccSAndroid Build Coastguard Worker   float expected_21_valid[] = {
810*77c1e3ccSAndroid Build Coastguard Worker     -13,  -31,  -19,  -49,  -191, -565, -194, -574, -13,  -31,   -4,   14,
811*77c1e3ccSAndroid Build Coastguard Worker     -22,  44,   -16,  382,  -366, 738,  -22,  32,   23,   -4,    23,   32,
812*77c1e3ccSAndroid Build Coastguard Worker     545,  20,   204,  720,  5,    32,   -4,   -4,   -4,   -4,    -4,   -4,
813*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
814*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -222, -658, -252, -748, -114, -334, -192, -568,  -112, -328,
815*77c1e3ccSAndroid Build Coastguard Worker     -4,   432,  -440, 928,  -64,  276,  -164, 532,  -220, 428,   650,  -4,
816*77c1e3ccSAndroid Build Coastguard Worker     304,  868,  266,  116,  400,  316,  104,  428,  -4,   -4,    -4,   -4,
817*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
818*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -72,  -208, -288, -856, -290, -862,  -202, -598,
819*77c1e3ccSAndroid Build Coastguard Worker     -132, -388, -4,   132,  -140, 700,  -436, 1000, -144, 532,   -260, 508,
820*77c1e3ccSAndroid Build Coastguard Worker     200,  -4,   712,  268,  422,  860,  450,  276,  124,  508,   -4,   -4,
821*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
822*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -183, -541, -411, -1225, -265, -787,
823*77c1e3ccSAndroid Build Coastguard Worker     -249, -739, -216, -640, -4,   354,  -362, 1168, -460, 974,   -70,  552,
824*77c1e3ccSAndroid Build Coastguard Worker     -428, 844,  533,  -4,   859,  712,  323,  908,  665,  128,   208,  844,
825*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
826*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -38,  -106,  -52,  -148,
827*77c1e3ccSAndroid Build Coastguard Worker     -66,  -190, -79,  -229, -31,  -85,  -4,   64,   -72,  160,   -32,  148,
828*77c1e3ccSAndroid Build Coastguard Worker     -100, 242,  -58,  104,  98,   -4,   72,   132,  154,  52,    125,  188,
829*77c1e3ccSAndroid Build Coastguard Worker     23,   104,  -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
830*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -234, -694,
831*77c1e3ccSAndroid Build Coastguard Worker     -257, -763, -229, -679, -319, -949, -117, -343, -4,   456,   -464, 962,
832*77c1e3ccSAndroid Build Coastguard Worker     -50,  492,  -408, 1030, -230, 448,  686,  -4,   295,  916,   625,  88,
833*77c1e3ccSAndroid Build Coastguard Worker     537,  804,  109,  448,  -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
834*77c1e3ccSAndroid Build Coastguard Worker     -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,   -4,    -4,   -4,
835*77c1e3ccSAndroid Build Coastguard Worker     -84,  -244, -140, -412, -182, -538, -238, -706, -116, -340,  -4,   156,
836*77c1e3ccSAndroid Build Coastguard Worker     -164, 428,  -116, 464,  -248, 708,  -228, 444,  236,  -4,    244,  316,
837*77c1e3ccSAndroid Build Coastguard Worker     418,  220,  454,  484,  108,  444,
838*77c1e3ccSAndroid Build Coastguard Worker   };
839*77c1e3ccSAndroid Build Coastguard Worker 
840*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_SAME_ZERO;
841*77c1e3ccSAndroid Build Coastguard Worker 
842*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_21_same, &cnn_config,
843*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
844*77c1e3ccSAndroid Build Coastguard Worker 
845*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
846*77c1e3ccSAndroid Build Coastguard Worker 
847*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_21_valid, &cnn_config,
848*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
849*77c1e3ccSAndroid Build Coastguard Worker }
850*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestLargeKernelsAndStrides)851*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestLargeKernelsAndStrides) {
852*77c1e3ccSAndroid Build Coastguard Worker   float input_10x11[] = {
853*77c1e3ccSAndroid Build Coastguard Worker     4,  4,  2,  4,  2,  -5, -2, 3, -1, 0,  0,  1,  2,  0,  -5, -2, -5, 1,  -3,
854*77c1e3ccSAndroid Build Coastguard Worker     -1, 4,  -3, 2,  -2, 1,  0,  1, -3, -3, -4, -2, -2, 1,  -4, -1, 4,  1,  -4,
855*77c1e3ccSAndroid Build Coastguard Worker     -4, -4, 3,  2,  -5, 3,  -5, 1, 2,  -4, 1,  -1, 3,  4,  -2, 3,  -3, 3,  0,
856*77c1e3ccSAndroid Build Coastguard Worker     2,  -4, -5, -5, -2, -1, -2, 1, 1,  1,  -2, 4,  -5, 4,  -1, -1, 2,  3,  -4,
857*77c1e3ccSAndroid Build Coastguard Worker     2,  2,  3,  0,  0,  1,  0,  3, 2,  3,  1,  -2, 3,  -4, 3,  2,  4,  -2, 0,
858*77c1e3ccSAndroid Build Coastguard Worker     4,  -4, 1,  -3, -3, -3, -5, 1, -3, -5, 0,  4,  -1, -3, 2,
859*77c1e3ccSAndroid Build Coastguard Worker   };
860*77c1e3ccSAndroid Build Coastguard Worker 
861*77c1e3ccSAndroid Build Coastguard Worker   float weights_10x11[] = {
862*77c1e3ccSAndroid Build Coastguard Worker     -3, 4,  -4, -3, -5, 1,  -2, 3,  1,  -4, -4, 0,  -1, 0,  3,  1,  -3, -2, 0,
863*77c1e3ccSAndroid Build Coastguard Worker     -1, 1,  3,  -4, -4, -3, -3, -2, 4,  3,  -5, 4,  2,  -3, 4,  -2, -1, 2,  -1,
864*77c1e3ccSAndroid Build Coastguard Worker     -5, 0,  -3, 0,  3,  -5, -5, 3,  -4, -1, -5, 3,  4,  0,  4,  -5, 2,  -1, 2,
865*77c1e3ccSAndroid Build Coastguard Worker     -1, -1, -1, -5, 0,  -4, 3,  -1, 1,  1,  -1, 3,  2,  -5, -4, 0,  -4, 4,  -5,
866*77c1e3ccSAndroid Build Coastguard Worker     -3, 4,  -5, 2,  -5, -4, -4, -1, 3,  3,  0,  2,  -4, 1,  -2, 1,  1,  0,  3,
867*77c1e3ccSAndroid Build Coastguard Worker     -2, 0,  1,  2,  4,  -3, -1, -5, -5, 2,  -4, 1,  1,  2,  -4, -2, -2, 2,  1,
868*77c1e3ccSAndroid Build Coastguard Worker     3,  4,  -5, 1,  -1, -3, -3, -1, -2, -5, 1,  -1, 0,  1,  4,  4,  0,  0,  4,
869*77c1e3ccSAndroid Build Coastguard Worker     -3, -1, -5, -3, 0,  1,  1,  1,  -5, 3,  4,  3,  -5, 3,  -2, -2, 0,  -4, 0,
870*77c1e3ccSAndroid Build Coastguard Worker     0,  -2, 1,  -4, -1, 0,  -5, -2, -2, -5, -3, -3, 1,  1,  -3, 2,  4,  2,  4,
871*77c1e3ccSAndroid Build Coastguard Worker     -4, -3, 3,  1,  1,  3,  -4, 4,  -2, -3, -3, -3, -3, -4, -2, 3,  -5, 2,  4,
872*77c1e3ccSAndroid Build Coastguard Worker     -1, -4, -4, 4,  -2, -1, 3,  -3, -4, -4, -2, 4,  1,  0,  2,  -1, 4,  -3, 1,
873*77c1e3ccSAndroid Build Coastguard Worker     4,  -3, 4,  4,  0,  -4, 3,  -2, -3, 2,  3,  -1, -3, 2,  1,  4,  -2, -3, 1,
874*77c1e3ccSAndroid Build Coastguard Worker     4,  -2, 2,  -2, -5, -2, 1,  4,  -1, -4, 4,  -5, 2,  -5, -4, -1, -2, 3,  1,
875*77c1e3ccSAndroid Build Coastguard Worker     2,  1,  -5, 1,  -5, -4, -1, -2, 2,  -2, -4, -3, -2, -2, 4,  -1, 2,  2,  -4,
876*77c1e3ccSAndroid Build Coastguard Worker     2,  -2, 4,  -4, -2, -2, 1,  -1, 1,  1,  1,  -4, -5, -2, 3,  -4, -1, 3,  -2,
877*77c1e3ccSAndroid Build Coastguard Worker     3,  2,  -5, -4, 0,  3,  -2, -4, -5, 3,  -2, -4, 2,  -2, 1,  -4, 0,  2,  -5,
878*77c1e3ccSAndroid Build Coastguard Worker     1,  -4, -1, -1, 4,  -5, -4, 0,  -5, -4, -3, -5, -4, 0,  2,  0,  -4, 2,  -2,
879*77c1e3ccSAndroid Build Coastguard Worker     1,  1,  -3, 2,  0,  -4, 0,  -4, 1,  0,  -5, -1, -1, -1, -5, 4,  2,  2,  -4,
880*77c1e3ccSAndroid Build Coastguard Worker     3,  -2, -2, 2,  -3, -2, -1, 2,  -4, -5, 2,  -2, -4, -5, -5, -1, 2,  -1, 0,
881*77c1e3ccSAndroid Build Coastguard Worker     -5, -2, -2, -5, 0,  1,  -1, -5, 0,  3,  2,  3,  0,  -3, -2, 0,  -5, -1, -2,
882*77c1e3ccSAndroid Build Coastguard Worker     2,  -4, -1, 2,  2,  -5, 2,  -4, 0,  3,  -3, 1,  0,  0,  1,  -5, -3, 1,  -1,
883*77c1e3ccSAndroid Build Coastguard Worker     0,  -4, -3, 2,  -4, -4, 4,  -1, 0,  1,  2,  -4, -5, 4,  -2, 1,  -4, -4, -3,
884*77c1e3ccSAndroid Build Coastguard Worker     -1, -1, 1,  -1, -4, -1, -4, -3, 2,  -1, -2, -4, 1,  1,  0,  -2, 0,  -4, 3,
885*77c1e3ccSAndroid Build Coastguard Worker     -3, 0,  -4, -1, -4, 2,  -1, -2, -5, -1, -2, -3, 3,  -1, 0,  -3, 0,  1,  -5,
886*77c1e3ccSAndroid Build Coastguard Worker     1,  -5, 0,  1,
887*77c1e3ccSAndroid Build Coastguard Worker   };
888*77c1e3ccSAndroid Build Coastguard Worker 
889*77c1e3ccSAndroid Build Coastguard Worker   float bias_10x11[] = { 3 };
890*77c1e3ccSAndroid Build Coastguard Worker 
891*77c1e3ccSAndroid Build Coastguard Worker   float expected_10x11[] = {
892*77c1e3ccSAndroid Build Coastguard Worker     118,
893*77c1e3ccSAndroid Build Coastguard Worker   };
894*77c1e3ccSAndroid Build Coastguard Worker 
895*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
896*77c1e3ccSAndroid Build Coastguard Worker                             0,
897*77c1e3ccSAndroid Build Coastguard Worker                             0,
898*77c1e3ccSAndroid Build Coastguard Worker                             0,
899*77c1e3ccSAndroid Build Coastguard Worker                             0,
900*77c1e3ccSAndroid Build Coastguard Worker                             { {
901*77c1e3ccSAndroid Build Coastguard Worker                                 1,
902*77c1e3ccSAndroid Build Coastguard Worker                                 23,
903*77c1e3ccSAndroid Build Coastguard Worker                                 20,
904*77c1e3ccSAndroid Build Coastguard Worker                                 1,
905*77c1e3ccSAndroid Build Coastguard Worker                                 15,
906*77c1e3ccSAndroid Build Coastguard Worker                                 20,
907*77c1e3ccSAndroid Build Coastguard Worker                                 0,
908*77c1e3ccSAndroid Build Coastguard Worker                                 weights_10x11,
909*77c1e3ccSAndroid Build Coastguard Worker                                 bias_10x11,
910*77c1e3ccSAndroid Build Coastguard Worker                                 PADDING_SAME_ZERO,
911*77c1e3ccSAndroid Build Coastguard Worker                                 NONE,
912*77c1e3ccSAndroid Build Coastguard Worker                                 0,
913*77c1e3ccSAndroid Build Coastguard Worker                                 0,
914*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NO_COPY,
915*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NOC,
916*77c1e3ccSAndroid Build Coastguard Worker                                 {},
917*77c1e3ccSAndroid Build Coastguard Worker                                 {},
918*77c1e3ccSAndroid Build Coastguard Worker                                 0,
919*77c1e3ccSAndroid Build Coastguard Worker                             } } };
920*77c1e3ccSAndroid Build Coastguard Worker 
921*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 10;
922*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 11;
923*77c1e3ccSAndroid Build Coastguard Worker 
924*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
925*77c1e3ccSAndroid Build Coastguard Worker 
926*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input_10x11, expected_10x11,
927*77c1e3ccSAndroid Build Coastguard Worker              &cnn_config, image_width, &thread_data, MSE_INT_TOL);
928*77c1e3ccSAndroid Build Coastguard Worker 
929*77c1e3ccSAndroid Build Coastguard Worker   float input_11x10[] = {
930*77c1e3ccSAndroid Build Coastguard Worker     -2, -2, 3,  -5, -1, -3, 1,  3,  2,  1,  1,  -5, 4,  1,  3,  -5, 3,  -3, -5,
931*77c1e3ccSAndroid Build Coastguard Worker     0,  -1, -3, -3, 1,  1,  -5, -1, -5, -5, -3, 0,  1,  -3, -1, -3, -3, 0,  3,
932*77c1e3ccSAndroid Build Coastguard Worker     4,  -4, -1, 3,  -3, -1, -3, 1,  -3, -2, -1, -4, -3, 2,  -4, 1,  -4, -1, -3,
933*77c1e3ccSAndroid Build Coastguard Worker     -5, -1, 2,  3,  0,  2,  2,  -5, 4,  1,  2,  -1, -4, 4,  -4, -4, 0,  -1, 1,
934*77c1e3ccSAndroid Build Coastguard Worker     -1, 1,  -3, -3, -2, 1,  2,  4,  4,  4,  -3, -3, 0,  1,  0,  1,  4,  1,  3,
935*77c1e3ccSAndroid Build Coastguard Worker     4,  -3, -2, -4, 4,  2,  0,  3,  4,  -1, 2,  -2, 1,  -3, -2,
936*77c1e3ccSAndroid Build Coastguard Worker   };
937*77c1e3ccSAndroid Build Coastguard Worker 
938*77c1e3ccSAndroid Build Coastguard Worker   float weights_11x10[] = {
939*77c1e3ccSAndroid Build Coastguard Worker     4,  -1, 1,  -1, 2,  4,  3,  3,  -4, 3,  -5, 1,  -1, -1, -2, -2, 0,  2,  -3,
940*77c1e3ccSAndroid Build Coastguard Worker     -2, 3,  -5, -1, 0,  -1, -2, -2, -1, 2,  4,  3,  1,  0,  0,  -3, 3,  -4, -1,
941*77c1e3ccSAndroid Build Coastguard Worker     -5, 4,  -2, -2, 1,  2,  -1, -3, 1,  2,  -5, 1,  -3, 3,  3,  0,  -4, -4, -5,
942*77c1e3ccSAndroid Build Coastguard Worker     -3, -4, -4, 4,  -2, 4,  4,  -2, 2,  -5, -1, -2, -5, -1, 4,  -3, 3,  -2, 0,
943*77c1e3ccSAndroid Build Coastguard Worker     -4, -3, 0,  -1, -2, 4,  2,  0,  -2, -5, -4, 1,  4,  -4, -2, 2,  -2, 1,  1,
944*77c1e3ccSAndroid Build Coastguard Worker     -4, 1,  -4, -4, -2, 4,  2,  -1, -5, -5, 1,  -3, -3, 3,  -3, -5, -3, 4,  -1,
945*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, 0,  -4, 3,  -1, 0,  -2, 0,  -5, -2, -5, 2,  0,  -5, 2,  3,  -2, 2,
946*77c1e3ccSAndroid Build Coastguard Worker     4,  -1, 1,  -3, 2,  3,  2,  0,  -5, -4, -5, 2,  1,  1,  -1, -2, 3,  4,  2,
947*77c1e3ccSAndroid Build Coastguard Worker     -2, 4,  -2, 3,  1,  -4, -3, -1, 4,  4,  -3, -5, -2, 2,  0,  3,  -2, 3,  -1,
948*77c1e3ccSAndroid Build Coastguard Worker     -4, 0,  -2, 0,  3,  4,  -2, -3, -2, 0,  3,  4,  2,  -4, 0,  1,  2,  2,  -1,
949*77c1e3ccSAndroid Build Coastguard Worker     -1, 4,  1,  4,  -2, -1, -1, -5, 1,  -3, 3,  3,  -1, -4, 3,  -5, 0,  0,  -1,
950*77c1e3ccSAndroid Build Coastguard Worker     -4, -1, -2, 4,  -2, 3,  3,  -3, 1,  -1, 2,  -1, 4,  4,  -2, -2, 4,  -2, 0,
951*77c1e3ccSAndroid Build Coastguard Worker     3,  -3, -5, -1, -2, 4,  -4, 2,  -4, 0,  -2, 3,  -3, 2,  2,  -2, -5, -1, 4,
952*77c1e3ccSAndroid Build Coastguard Worker     3,  -2, -1, 3,  3,  -1, 3,  0,  -3, 0,  4,  2,  0,  -1, 4,  1,  1,  2,  1,
953*77c1e3ccSAndroid Build Coastguard Worker     3,  1,  1,  1,  -3, -5, -4, 4,  -4, 2,  0,  0,  -4, 1,  4,  -5, 4,  4,  0,
954*77c1e3ccSAndroid Build Coastguard Worker     1,  0,  -2, -4, -4, -3, 0,  1,  -5, 4,  0,  -3, -2, -4, 2,  4,  1,  -5, 1,
955*77c1e3ccSAndroid Build Coastguard Worker     -4, 1,  0,  -3, -3, 0,  2,  -5, 4,  3,  -2, -5, 3,  1,  -1, 0,  3,  -2, -2,
956*77c1e3ccSAndroid Build Coastguard Worker     3,  -2, -5, 4,  1,  -2, 2,  -1, 0,  4,  0,  -5, 3,  -2, 1,  2,  1,  -5, -3,
957*77c1e3ccSAndroid Build Coastguard Worker     -2, -5, 4,  -4, 0,  3,  2,  -1, -4, -1, 2,  1,  -2, 3,  -1, -4, 2,  0,  -3,
958*77c1e3ccSAndroid Build Coastguard Worker     1,  -1, 2,  -5, -4, -1, -5, 1,  4,  3,  4,  2,  -3, 1,  -5, -1, 3,  0,  -1,
959*77c1e3ccSAndroid Build Coastguard Worker     -4, 3,  4,  -5, 4,  4,  -3, 2,  -3, -1, -3, -5, -3, 2,  -3, -2, 1,  1,  0,
960*77c1e3ccSAndroid Build Coastguard Worker     -5, 3,  2,  1,  -5, 1,  1,  1,  3,  4,  -4, -1, -2, 0,  -5, -3, -5, -2, -4,
961*77c1e3ccSAndroid Build Coastguard Worker     3,  3,  3,  4,  0,  -4, -1, -5, 0,  -3, 1,  4,  4,  -4, 4,  -5, -5, -1, -2,
962*77c1e3ccSAndroid Build Coastguard Worker     -5, 3,  -4, 4,  3,  0,  -3, 2,  -2, 0,  0,  4,  4,  0,  -2, 1,  -1, -3, 2,
963*77c1e3ccSAndroid Build Coastguard Worker     -1, 1,  -3, -5,
964*77c1e3ccSAndroid Build Coastguard Worker   };
965*77c1e3ccSAndroid Build Coastguard Worker 
966*77c1e3ccSAndroid Build Coastguard Worker   float bias_11x10[] = {
967*77c1e3ccSAndroid Build Coastguard Worker     -5,
968*77c1e3ccSAndroid Build Coastguard Worker   };
969*77c1e3ccSAndroid Build Coastguard Worker 
970*77c1e3ccSAndroid Build Coastguard Worker   float expected_11x10[] = {
971*77c1e3ccSAndroid Build Coastguard Worker     36,  -84,  95,   45,  18,   46,   77,  -54, -99,  -149, 66,  49,  161, 11,
972*77c1e3ccSAndroid Build Coastguard Worker     39,  61,   -66,  61,  4,    -3,   34,  -44, -23,  31,   64,  29,  47,  72,
973*77c1e3ccSAndroid Build Coastguard Worker     -27, -27,  121,  -3,  100,  1,    30,  -78, -12,  -89,  -59, 8,   -16, 112,
974*77c1e3ccSAndroid Build Coastguard Worker     91,  -102, -26,  -4,  30,   54,   4,   -84, -24,  -58,  27,  -53, -33, 5,
975*77c1e3ccSAndroid Build Coastguard Worker     53,  -26,  63,   50,  -103, -130, -23, 6,   -104, -207, 73,  23,  77,  132,
976*77c1e3ccSAndroid Build Coastguard Worker     38,  32,   -130, -44, -60,  7,    27,  176, 45,   -32,  -2,  99,  -97, 63,
977*77c1e3ccSAndroid Build Coastguard Worker     69,  126,  47,   63,  136,  -57,  5,   16,  -40,  -157, 8,   38,  -44, -10,
978*77c1e3ccSAndroid Build Coastguard Worker     91,  7,    122,  140, 30,   -105, 4,   -1,  113,  64,   180, 141,
979*77c1e3ccSAndroid Build Coastguard Worker   };
980*77c1e3ccSAndroid Build Coastguard Worker 
981*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].weights = weights_11x10;
982*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].bias = bias_11x10;
983*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].filter_width = 20;
984*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].filter_height = 23;
985*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_width = 1;
986*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].skip_height = 1;
987*77c1e3ccSAndroid Build Coastguard Worker   image_height = 11;
988*77c1e3ccSAndroid Build Coastguard Worker   image_width = 10;
989*77c1e3ccSAndroid Build Coastguard Worker 
990*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input_11x10, expected_11x10,
991*77c1e3ccSAndroid Build Coastguard Worker              &cnn_config, image_width, &thread_data, MSE_INT_TOL);
992*77c1e3ccSAndroid Build Coastguard Worker }
993*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestSoftsignSingleLayer)994*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestSoftsignSingleLayer) {
995*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 8;
996*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 8;
997*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 5;
998*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 4;
999*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1000*77c1e3ccSAndroid Build Coastguard Worker     -0.5220f, 0.8410f,  -0.8990f, -0.0090f, 0.6710f,  -0.9470f, -0.8240f,
1001*77c1e3ccSAndroid Build Coastguard Worker     -0.0870f, 0.5380f,  0.4750f,  0.570f,   -0.3760f, -0.6960f, -0.5940f,
1002*77c1e3ccSAndroid Build Coastguard Worker     -0.3830f, 0.080f,   -0.0980f, -0.4940f, -0.4030f, 0.9460f,  -0.6020f,
1003*77c1e3ccSAndroid Build Coastguard Worker     0.4220f,  0.6190f,  0.6640f,  -0.9210f, -0.1470f, -0.2480f, -0.1120f,
1004*77c1e3ccSAndroid Build Coastguard Worker     -0.580f,  -0.0650f, 0.3330f,  0.9860f,  -0.7430f, 0.7610f,  0.4840f,
1005*77c1e3ccSAndroid Build Coastguard Worker     0.1030f,  0.9570f,  0.6120f,  -0.5240f, -0.1220f, -0.5850f, -0.270f,
1006*77c1e3ccSAndroid Build Coastguard Worker     0.7840f,  -0.9790f, 0.7290f,  -0.30f,   -0.6460f, 0.0780f,  0.4750f,
1007*77c1e3ccSAndroid Build Coastguard Worker     -0.0510f, 0.4550f,  0.3850f,  -0.7230f, 0.4460f,  -0.6260f, -0.810f,
1008*77c1e3ccSAndroid Build Coastguard Worker     0.8720f,  -0.2120f, -0.580f,  -0.9510f, -0.8430f, -0.1340f, -0.0850f,
1009*77c1e3ccSAndroid Build Coastguard Worker     0.9190f,
1010*77c1e3ccSAndroid Build Coastguard Worker   };
1011*77c1e3ccSAndroid Build Coastguard Worker   float expected_same[] = {
1012*77c1e3ccSAndroid Build Coastguard Worker     0.430f,   0.660f,  0.5510f,  -0.610f,  0.450f,  -0.1610f, 0.0520f,  0.3240f,
1013*77c1e3ccSAndroid Build Coastguard Worker     0.6820f,  0.3820f, 0.6360f,  0.7480f,  0.3080f, 0.090f,   0.3910f,  0.1730f,
1014*77c1e3ccSAndroid Build Coastguard Worker     0.340f,   0.6660f, -0.4990f, 0.4280f,  0.1540f, 0.120f,   0.4670f,  0.6150f,
1015*77c1e3ccSAndroid Build Coastguard Worker     -0.3880f, 0.7590f, 0.4190f,  0.7350f,  0.5310f, -0.5160f, -0.1760f, 0.6790f,
1016*77c1e3ccSAndroid Build Coastguard Worker     -0.6780f, 0.5470f, 0.5750f,  -0.6420f, 0.7210f, -0.4620f, 0.5430f,  0.770f,
1017*77c1e3ccSAndroid Build Coastguard Worker     -0.1990f, 0.3950f, 0.7860f,  -0.4380f, 0.7540f, 0.2640f,  -0.6430f, 0.4510f,
1018*77c1e3ccSAndroid Build Coastguard Worker     -0.1260f, 0.1590f, -0.2110f, -0.0560f, 0.6570f, 0.680f,   0.5870f,  0.4720f,
1019*77c1e3ccSAndroid Build Coastguard Worker     0.4040f,  0.3630f, 0.670f,   0.2360f,  0.410f,  0.6980f,  -0.5350f, 0.3940f,
1020*77c1e3ccSAndroid Build Coastguard Worker   };
1021*77c1e3ccSAndroid Build Coastguard Worker   float expected_replicate[] = {
1022*77c1e3ccSAndroid Build Coastguard Worker     0.540f,   0.7230f,  -0.3530f, -0.2130f, 0.7440f,  -0.4470f, -0.6260f,
1023*77c1e3ccSAndroid Build Coastguard Worker     -0.2050f, 0.7230f,  0.4630f,  0.5920f,  0.7440f,  0.6080f,  0.3130f,
1024*77c1e3ccSAndroid Build Coastguard Worker     -0.5670f, -0.4720f, 0.5480f,  0.6660f,  -0.4990f, 0.4280f,  0.1540f,
1025*77c1e3ccSAndroid Build Coastguard Worker     0.120f,   0.3390f,  0.6090f,  0.4160f,  0.7590f,  0.4190f,  0.7350f,
1026*77c1e3ccSAndroid Build Coastguard Worker     0.5310f,  -0.5160f, -0.490f,  0.4450f,  -0.610f,  0.5470f,  0.5750f,
1027*77c1e3ccSAndroid Build Coastguard Worker     -0.6420f, 0.7210f,  -0.4620f, 0.3150f,  0.7370f,  -0.5820f, 0.3950f,
1028*77c1e3ccSAndroid Build Coastguard Worker     0.7860f,  -0.4380f, 0.7540f,  0.2640f,  -0.7430f, -0.5340f, -0.6270f,
1029*77c1e3ccSAndroid Build Coastguard Worker     0.4430f,  0.4730f,  0.4570f,  0.7450f,  0.630f,   0.2620f,  0.3140f,
1030*77c1e3ccSAndroid Build Coastguard Worker     -0.1840f, 0.1810f,  0.7210f,  0.2760f,  0.6430f,  0.6720f,  -0.4390f,
1031*77c1e3ccSAndroid Build Coastguard Worker     0.2040f,
1032*77c1e3ccSAndroid Build Coastguard Worker   };
1033*77c1e3ccSAndroid Build Coastguard Worker   float expected_valid[] = {
1034*77c1e3ccSAndroid Build Coastguard Worker     0.6660f,  -0.4990f, 0.4280f,  0.1540f,  0.120f,  0.7590f,  0.4190f,
1035*77c1e3ccSAndroid Build Coastguard Worker     0.7350f,  0.5310f,  -0.5160f, 0.5470f,  0.5750f, -0.6420f, 0.7210f,
1036*77c1e3ccSAndroid Build Coastguard Worker     -0.4620f, 0.3950f,  0.7860f,  -0.4380f, 0.7540f, 0.2640f,
1037*77c1e3ccSAndroid Build Coastguard Worker   };
1038*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
1039*77c1e3ccSAndroid Build Coastguard Worker     0.6210f,  0.3710f,  -0.2770f, -0.7230f, -0.2450f, 0.6770f,  0.3080f,
1040*77c1e3ccSAndroid Build Coastguard Worker     -0.9880f, -0.080f,  0.7190f,  -0.6760f, -0.0170f, -0.8970f, 0.8260f,
1041*77c1e3ccSAndroid Build Coastguard Worker     0.7390f,  -0.4550f, -0.4260f, -0.6330f, 0.0880f,  -0.9390f,
1042*77c1e3ccSAndroid Build Coastguard Worker   };
1043*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
1044*77c1e3ccSAndroid Build Coastguard Worker     0.750f,
1045*77c1e3ccSAndroid Build Coastguard Worker   };
1046*77c1e3ccSAndroid Build Coastguard Worker 
1047*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 1,
1048*77c1e3ccSAndroid Build Coastguard Worker                             0,
1049*77c1e3ccSAndroid Build Coastguard Worker                             0,
1050*77c1e3ccSAndroid Build Coastguard Worker                             0,
1051*77c1e3ccSAndroid Build Coastguard Worker                             0,
1052*77c1e3ccSAndroid Build Coastguard Worker                             { {
1053*77c1e3ccSAndroid Build Coastguard Worker                                 1,
1054*77c1e3ccSAndroid Build Coastguard Worker                                 filter_width,
1055*77c1e3ccSAndroid Build Coastguard Worker                                 filter_height,
1056*77c1e3ccSAndroid Build Coastguard Worker                                 1,
1057*77c1e3ccSAndroid Build Coastguard Worker                                 1,
1058*77c1e3ccSAndroid Build Coastguard Worker                                 1,
1059*77c1e3ccSAndroid Build Coastguard Worker                                 0,
1060*77c1e3ccSAndroid Build Coastguard Worker                                 weights,
1061*77c1e3ccSAndroid Build Coastguard Worker                                 bias,
1062*77c1e3ccSAndroid Build Coastguard Worker                                 PADDING_SAME_ZERO,
1063*77c1e3ccSAndroid Build Coastguard Worker                                 SOFTSIGN,
1064*77c1e3ccSAndroid Build Coastguard Worker                                 0,
1065*77c1e3ccSAndroid Build Coastguard Worker                                 0,
1066*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NO_COPY,
1067*77c1e3ccSAndroid Build Coastguard Worker                                 BRANCH_NOC,
1068*77c1e3ccSAndroid Build Coastguard Worker                                 {},
1069*77c1e3ccSAndroid Build Coastguard Worker                                 {},
1070*77c1e3ccSAndroid Build Coastguard Worker                                 0,
1071*77c1e3ccSAndroid Build Coastguard Worker                             } } };
1072*77c1e3ccSAndroid Build Coastguard Worker 
1073*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1074*77c1e3ccSAndroid Build Coastguard Worker 
1075*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_same, &cnn_config,
1076*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
1077*77c1e3ccSAndroid Build Coastguard Worker 
1078*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_SAME_REPLICATE;
1079*77c1e3ccSAndroid Build Coastguard Worker 
1080*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_replicate, &cnn_config,
1081*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
1082*77c1e3ccSAndroid Build Coastguard Worker 
1083*77c1e3ccSAndroid Build Coastguard Worker   cnn_config.layer_config[0].pad = PADDING_VALID;
1084*77c1e3ccSAndroid Build Coastguard Worker 
1085*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected_valid, &cnn_config,
1086*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
1087*77c1e3ccSAndroid Build Coastguard Worker }
1088*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestBranchTensorAdd)1089*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestBranchTensorAdd) {
1090*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 2;
1091*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 3;
1092*77c1e3ccSAndroid Build Coastguard Worker 
1093*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 4;
1094*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 4;
1095*77c1e3ccSAndroid Build Coastguard Worker 
1096*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1097*77c1e3ccSAndroid Build Coastguard Worker     -3, -2, -2, 0, -1, 3, 2, -2, 1, 3, 4, 0, 2, -5, -4, 0,
1098*77c1e3ccSAndroid Build Coastguard Worker   };
1099*77c1e3ccSAndroid Build Coastguard Worker 
1100*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
1101*77c1e3ccSAndroid Build Coastguard Worker     -3, -1, 4,  -1, -3, 3,  3,  0,  2,  0,  3,  2,  4,  4, 4,  -5, 1, -4,
1102*77c1e3ccSAndroid Build Coastguard Worker     2,  -4, 1,  -3, 0,  4,  -5, 4,  0,  -4, -3, -1, 0,  0, -2, 0,  0, 2,
1103*77c1e3ccSAndroid Build Coastguard Worker     -5, -1, 1,  -3, 3,  4,  3,  0,  1,  -1, 1,  1,  2,  4, -2, -5, 2, -2,
1104*77c1e3ccSAndroid Build Coastguard Worker     3,  -2, 4,  -1, 0,  2,  3,  2,  -2, -1, -3, 1,  3,  4, -1, -3, 0, -4,
1105*77c1e3ccSAndroid Build Coastguard Worker     4,  2,  -3, -3, -1, 0,  1,  0,  3,  3,  -3, 0,  3,  2, -5, -3, 4, -5,
1106*77c1e3ccSAndroid Build Coastguard Worker     3,  -1, -1, -3, 0,  1,  -1, -4, 2,  4,  -1, 4,  -1, 1, 3,  4,  4, 4,
1107*77c1e3ccSAndroid Build Coastguard Worker     0,  -1, -3, -3, -3, -3, 2,  -3, -2, 2,  3,  -3,
1108*77c1e3ccSAndroid Build Coastguard Worker   };
1109*77c1e3ccSAndroid Build Coastguard Worker 
1110*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
1111*77c1e3ccSAndroid Build Coastguard Worker     3, 4, -1, -1, 2, 1, -2, 1, 4, 1, 3,
1112*77c1e3ccSAndroid Build Coastguard Worker   };
1113*77c1e3ccSAndroid Build Coastguard Worker 
1114*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
1115*77c1e3ccSAndroid Build Coastguard Worker     -11502, -4101, -3424, 668,   -17950, -5470, -5504, 626,
1116*77c1e3ccSAndroid Build Coastguard Worker     4835,   446,   1779,  -3483, 3679,   -4214, 4578,  -105,
1117*77c1e3ccSAndroid Build Coastguard Worker   };
1118*77c1e3ccSAndroid Build Coastguard Worker 
1119*77c1e3ccSAndroid Build Coastguard Worker   int channels = 2;
1120*77c1e3ccSAndroid Build Coastguard Worker 
1121*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 6,
1122*77c1e3ccSAndroid Build Coastguard Worker                             0,
1123*77c1e3ccSAndroid Build Coastguard Worker                             0,
1124*77c1e3ccSAndroid Build Coastguard Worker                             0,
1125*77c1e3ccSAndroid Build Coastguard Worker                             0,
1126*77c1e3ccSAndroid Build Coastguard Worker                             { {
1127*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1128*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1129*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1130*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1131*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1132*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1133*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1134*77c1e3ccSAndroid Build Coastguard Worker                                   weights,
1135*77c1e3ccSAndroid Build Coastguard Worker                                   bias,
1136*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1137*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1138*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1139*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1140*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1141*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1142*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1143*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1144*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1145*77c1e3ccSAndroid Build Coastguard Worker                               },
1146*77c1e3ccSAndroid Build Coastguard Worker                               {
1147*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1148*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1149*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1150*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1151*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1152*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1153*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1154*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1155*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1156*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1157*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1158*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1159*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1160*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_INPUT,
1161*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1162*77c1e3ccSAndroid Build Coastguard Worker                                   {
1163*77c1e3ccSAndroid Build Coastguard Worker                                       0x02,
1164*77c1e3ccSAndroid Build Coastguard Worker                                       0,
1165*77c1e3ccSAndroid Build Coastguard Worker                                       0x00,
1166*77c1e3ccSAndroid Build Coastguard Worker                                   },
1167*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1168*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1169*77c1e3ccSAndroid Build Coastguard Worker                               },
1170*77c1e3ccSAndroid Build Coastguard Worker                               {
1171*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1172*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1173*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1174*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1175*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1176*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1177*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1178*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1179*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1180*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1181*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1182*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1183*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1184*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1185*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1186*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1187*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1188*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1189*77c1e3ccSAndroid Build Coastguard Worker                               },
1190*77c1e3ccSAndroid Build Coastguard Worker                               {
1191*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1192*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1193*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1194*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1195*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1196*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1197*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1198*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1199*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1200*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1201*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1202*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1203*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1204*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1205*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1206*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1207*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1208*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1209*77c1e3ccSAndroid Build Coastguard Worker                               },
1210*77c1e3ccSAndroid Build Coastguard Worker                               {
1211*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1212*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1213*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1214*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1215*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1216*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1217*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1218*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1219*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1220*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1221*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1222*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1223*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1224*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1225*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_ADD,
1226*77c1e3ccSAndroid Build Coastguard Worker                                   {
1227*77c1e3ccSAndroid Build Coastguard Worker                                       0x00,
1228*77c1e3ccSAndroid Build Coastguard Worker                                       0,
1229*77c1e3ccSAndroid Build Coastguard Worker                                       0x02,
1230*77c1e3ccSAndroid Build Coastguard Worker                                   },
1231*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1232*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1233*77c1e3ccSAndroid Build Coastguard Worker                               },
1234*77c1e3ccSAndroid Build Coastguard Worker                               {
1235*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1236*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1237*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1238*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1239*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1240*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1241*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1242*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1243*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1244*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1245*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1246*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1247*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1248*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1249*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1250*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1251*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1252*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1253*77c1e3ccSAndroid Build Coastguard Worker                               } } };
1254*77c1e3ccSAndroid Build Coastguard Worker 
1255*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
1256*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
1257*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
1258*77c1e3ccSAndroid Build Coastguard Worker 
1259*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1260*77c1e3ccSAndroid Build Coastguard Worker 
1261*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
1262*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
1263*77c1e3ccSAndroid Build Coastguard Worker }
1264*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestBranchTensorConcatenation)1265*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestBranchTensorConcatenation) {
1266*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 2;
1267*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 3;
1268*77c1e3ccSAndroid Build Coastguard Worker 
1269*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 4;
1270*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 4;
1271*77c1e3ccSAndroid Build Coastguard Worker 
1272*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1273*77c1e3ccSAndroid Build Coastguard Worker     -3, -2, -2, 0, -1, 3, 2, -2, 1, 3, 4, 0, 2, -5, -4, 0,
1274*77c1e3ccSAndroid Build Coastguard Worker   };
1275*77c1e3ccSAndroid Build Coastguard Worker 
1276*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
1277*77c1e3ccSAndroid Build Coastguard Worker     3,  0,  2,  0,  2,  3,  1,  -3, 1,  -5, -3, 0,  -4, 4,  0,  -5, 0,  -5, -1,
1278*77c1e3ccSAndroid Build Coastguard Worker     -2, -5, 0,  -3, 2,  -4, 2,  0,  2,  -1, 0,  -4, 3,  0,  0,  -1, -5, 2,  -1,
1279*77c1e3ccSAndroid Build Coastguard Worker     4,  -4, -2, -3, -3, 3,  4,  -2, -1, -4, -1, 4,  4,  -1, 4,  3,  -4, 2,  -2,
1280*77c1e3ccSAndroid Build Coastguard Worker     -4, -3, -2, 3,  -3, -5, -1, 3,  -2, 4,  1,  -4, -3, -5, -5, -3, 4,  -2, -2,
1281*77c1e3ccSAndroid Build Coastguard Worker     -1, -5, -5, 0,  -1, -2, -3, 3,  -4, -5, 2,  -3, 1,  0,  -5, 2,  2,  -2, 0,
1282*77c1e3ccSAndroid Build Coastguard Worker     2,  2,  -2, 4,  2,  2,  0,  1,  -5, -3, 0,  2,  -2, 1,  2,  -5, 2,  3,  3,
1283*77c1e3ccSAndroid Build Coastguard Worker     -1, 3,  0,  -3, 3,  -4, -4, 3,  3,  -4, -2, 2,  -2, 2,  -2, -1, 3,  0,
1284*77c1e3ccSAndroid Build Coastguard Worker   };
1285*77c1e3ccSAndroid Build Coastguard Worker 
1286*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
1287*77c1e3ccSAndroid Build Coastguard Worker     -3, -5, 4, -4, -3, -2, 0, 3, -4, 4, -3,
1288*77c1e3ccSAndroid Build Coastguard Worker   };
1289*77c1e3ccSAndroid Build Coastguard Worker 
1290*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
1291*77c1e3ccSAndroid Build Coastguard Worker     -33533, -32087, -6741,  -2124, 39979, 41453, 14034, 689,
1292*77c1e3ccSAndroid Build Coastguard Worker     -22611, -42203, -14882, -239,  15781, 15963, 9524,  837,
1293*77c1e3ccSAndroid Build Coastguard Worker   };
1294*77c1e3ccSAndroid Build Coastguard Worker 
1295*77c1e3ccSAndroid Build Coastguard Worker   int channels = 2;
1296*77c1e3ccSAndroid Build Coastguard Worker 
1297*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 6,
1298*77c1e3ccSAndroid Build Coastguard Worker                             0,
1299*77c1e3ccSAndroid Build Coastguard Worker                             0,
1300*77c1e3ccSAndroid Build Coastguard Worker                             0,
1301*77c1e3ccSAndroid Build Coastguard Worker                             0,
1302*77c1e3ccSAndroid Build Coastguard Worker                             { {
1303*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1304*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1305*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1306*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1307*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1308*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1309*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1310*77c1e3ccSAndroid Build Coastguard Worker                                   weights,
1311*77c1e3ccSAndroid Build Coastguard Worker                                   bias,
1312*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1313*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1314*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1315*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1316*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1317*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1318*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1319*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1320*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1321*77c1e3ccSAndroid Build Coastguard Worker                               },
1322*77c1e3ccSAndroid Build Coastguard Worker                               {
1323*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1324*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1325*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1326*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1327*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1328*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1329*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1330*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1331*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1332*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1333*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1334*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1335*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1336*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_INPUT,
1337*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1338*77c1e3ccSAndroid Build Coastguard Worker                                   {
1339*77c1e3ccSAndroid Build Coastguard Worker                                       0x02,
1340*77c1e3ccSAndroid Build Coastguard Worker                                       0,
1341*77c1e3ccSAndroid Build Coastguard Worker                                       0x00,
1342*77c1e3ccSAndroid Build Coastguard Worker                                   },
1343*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1344*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1345*77c1e3ccSAndroid Build Coastguard Worker                               },
1346*77c1e3ccSAndroid Build Coastguard Worker                               {
1347*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1348*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1349*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1350*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1351*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1352*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1353*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1354*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1355*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1356*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1357*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1358*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1359*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1360*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1361*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1362*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1363*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1364*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1365*77c1e3ccSAndroid Build Coastguard Worker                               },
1366*77c1e3ccSAndroid Build Coastguard Worker                               {
1367*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1368*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1369*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1370*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1371*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1372*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1373*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1374*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1375*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1376*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1377*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1378*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1379*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1380*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1381*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1382*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1383*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1384*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1385*77c1e3ccSAndroid Build Coastguard Worker                               },
1386*77c1e3ccSAndroid Build Coastguard Worker                               {
1387*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1388*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1389*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1390*77c1e3ccSAndroid Build Coastguard Worker                                   channels,
1391*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1392*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1393*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1394*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1395*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1396*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1397*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1398*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1399*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1400*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1401*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_CAT,
1402*77c1e3ccSAndroid Build Coastguard Worker                                   {
1403*77c1e3ccSAndroid Build Coastguard Worker                                       0x00,
1404*77c1e3ccSAndroid Build Coastguard Worker                                       0,
1405*77c1e3ccSAndroid Build Coastguard Worker                                       0x02,
1406*77c1e3ccSAndroid Build Coastguard Worker                                   },
1407*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1408*77c1e3ccSAndroid Build Coastguard Worker                                   -1,
1409*77c1e3ccSAndroid Build Coastguard Worker                               },
1410*77c1e3ccSAndroid Build Coastguard Worker                               {
1411*77c1e3ccSAndroid Build Coastguard Worker                                   channels + channels,
1412*77c1e3ccSAndroid Build Coastguard Worker                                   filter_width,
1413*77c1e3ccSAndroid Build Coastguard Worker                                   filter_height,
1414*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1415*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1416*77c1e3ccSAndroid Build Coastguard Worker                                   1,
1417*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1418*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1419*77c1e3ccSAndroid Build Coastguard Worker                                   nullptr,
1420*77c1e3ccSAndroid Build Coastguard Worker                                   PADDING_SAME_ZERO,
1421*77c1e3ccSAndroid Build Coastguard Worker                                   NONE,
1422*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1423*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1424*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NO_COPY,
1425*77c1e3ccSAndroid Build Coastguard Worker                                   BRANCH_NOC,
1426*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1427*77c1e3ccSAndroid Build Coastguard Worker                                   {},
1428*77c1e3ccSAndroid Build Coastguard Worker                                   0,
1429*77c1e3ccSAndroid Build Coastguard Worker                               } } };
1430*77c1e3ccSAndroid Build Coastguard Worker 
1431*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
1432*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
1433*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
1434*77c1e3ccSAndroid Build Coastguard Worker 
1435*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1436*77c1e3ccSAndroid Build Coastguard Worker 
1437*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
1438*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
1439*77c1e3ccSAndroid Build Coastguard Worker }
1440*77c1e3ccSAndroid Build Coastguard Worker 
1441*77c1e3ccSAndroid Build Coastguard Worker // TODO(logangw): Add test to test all combinations of branch_copy_type.
1442*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestBranchCombinations)1443*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestBranchCombinations) {
1444*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 2;
1445*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 3;
1446*77c1e3ccSAndroid Build Coastguard Worker 
1447*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 4;
1448*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 4;
1449*77c1e3ccSAndroid Build Coastguard Worker 
1450*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1451*77c1e3ccSAndroid Build Coastguard Worker     3, 2, -5, -4, 4, -2, -4, -3, 4, 2, -3, 2, -3, 1, -5, -1,
1452*77c1e3ccSAndroid Build Coastguard Worker   };
1453*77c1e3ccSAndroid Build Coastguard Worker 
1454*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
1455*77c1e3ccSAndroid Build Coastguard Worker     2,  3,  0,  4,  4,  3,  1,  0,  1,  -5, 4,  -3, 3,  0,  4,  -1, -1, -5,
1456*77c1e3ccSAndroid Build Coastguard Worker     2,  1,  -3, -5, 3,  -1, -3, -2, 0,  -2, 3,  0,  -2, -4, -2, -2, 2,  -5,
1457*77c1e3ccSAndroid Build Coastguard Worker     4,  -5, 0,  1,  -5, -4, -3, -4, 2,  -2, 1,  0,  3,  -2, -4, 3,  4,  -4,
1458*77c1e3ccSAndroid Build Coastguard Worker     -1, -1, -3, -2, -2, -1, 2,  0,  2,  -1, 2,  -4, -4, -1, 2,  0,  3,  -2,
1459*77c1e3ccSAndroid Build Coastguard Worker     -2, 3,  -3, 4,  -2, 4,  3,  4,  1,  0,  -2, -3, -5, 1,  -3, 2,  0,  -2,
1460*77c1e3ccSAndroid Build Coastguard Worker     -2, -1, -1, -5, -2, -3, -1, 3,  3,  4,  4,  0,  2,  1,  3,  -3, 2,  -5,
1461*77c1e3ccSAndroid Build Coastguard Worker     -5, 1,  -5, -1, 3,  3,  2,  -4, -1, 3,  -4, -2, -5, -2, 1,  3,  2,  2,
1462*77c1e3ccSAndroid Build Coastguard Worker     -5, -2, -3, -1, -2, -4, -1, -2, 2,  1,  -4, -4, 2,  0,  2,  0,  2,  -3,
1463*77c1e3ccSAndroid Build Coastguard Worker     -2, -4, 4,  0,  1,  -3, -5, 4,  -1, 2,  3,  -5, -1, 0,  4,  -1, -1, 3,
1464*77c1e3ccSAndroid Build Coastguard Worker     -1, -3, 3,  1,  4,  3,  4,  3,  -4, -5, -1, 3,  3,  -4, 3,  1,  3,  -5,
1465*77c1e3ccSAndroid Build Coastguard Worker     3,  4,  -5, 4,  2,  -1, -5, 2,  1,  0,  4,  0,  -3, 2,  0,  2,  -2, 1,
1466*77c1e3ccSAndroid Build Coastguard Worker     -1, -2, -1, -5, 4,  3,  3,  -2, 2,  4,  -5, -5, -3, -2, 4,  0,  -4, 1,
1467*77c1e3ccSAndroid Build Coastguard Worker   };
1468*77c1e3ccSAndroid Build Coastguard Worker 
1469*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
1470*77c1e3ccSAndroid Build Coastguard Worker     -1, 4, 0, 2, 2, -2, 0, -4, -5, -1, 1, -2, 3, 0, 4, -2, 1, 0, 0,
1471*77c1e3ccSAndroid Build Coastguard Worker   };
1472*77c1e3ccSAndroid Build Coastguard Worker 
1473*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
1474*77c1e3ccSAndroid Build Coastguard Worker     149496, 15553,  -24193, -20956, 134094, 86432,  -68283, -6366,
1475*77c1e3ccSAndroid Build Coastguard Worker     -53031, 133739, 67407,  -13539, -53205, -58635, -20033, 1979,
1476*77c1e3ccSAndroid Build Coastguard Worker   };
1477*77c1e3ccSAndroid Build Coastguard Worker 
1478*77c1e3ccSAndroid Build Coastguard Worker   int channels = 2;
1479*77c1e3ccSAndroid Build Coastguard Worker 
1480*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 10,
1481*77c1e3ccSAndroid Build Coastguard Worker                             0,
1482*77c1e3ccSAndroid Build Coastguard Worker                             0,
1483*77c1e3ccSAndroid Build Coastguard Worker                             0,
1484*77c1e3ccSAndroid Build Coastguard Worker                             0,
1485*77c1e3ccSAndroid Build Coastguard Worker                             {
1486*77c1e3ccSAndroid Build Coastguard Worker                                 {
1487*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1488*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1489*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1490*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1491*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1492*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1493*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1494*77c1e3ccSAndroid Build Coastguard Worker                                     weights,
1495*77c1e3ccSAndroid Build Coastguard Worker                                     bias,
1496*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1497*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1498*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1499*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1500*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1501*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1502*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1503*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1504*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1505*77c1e3ccSAndroid Build Coastguard Worker                                 },
1506*77c1e3ccSAndroid Build Coastguard Worker                                 {
1507*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1508*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1509*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1510*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1511*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1512*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1513*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1514*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1515*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1516*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1517*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1518*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1519*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1520*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_INPUT,
1521*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1522*77c1e3ccSAndroid Build Coastguard Worker                                     {
1523*77c1e3ccSAndroid Build Coastguard Worker                                         0x06,
1524*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1525*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1526*77c1e3ccSAndroid Build Coastguard Worker                                     },
1527*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1528*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1529*77c1e3ccSAndroid Build Coastguard Worker                                 },
1530*77c1e3ccSAndroid Build Coastguard Worker                                 {
1531*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1532*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1533*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1534*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1535*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1536*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1537*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1538*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1539*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1540*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1541*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1542*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1543*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1544*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_OUTPUT,
1545*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1546*77c1e3ccSAndroid Build Coastguard Worker                                     {
1547*77c1e3ccSAndroid Build Coastguard Worker                                         0x08,
1548*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1549*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1550*77c1e3ccSAndroid Build Coastguard Worker                                     },
1551*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1552*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1553*77c1e3ccSAndroid Build Coastguard Worker                                 },
1554*77c1e3ccSAndroid Build Coastguard Worker                                 {
1555*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1556*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1557*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1558*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1559*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1560*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1561*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1562*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1563*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1564*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1565*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1566*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1567*77c1e3ccSAndroid Build Coastguard Worker                                     3,
1568*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1569*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1570*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1571*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1572*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1573*77c1e3ccSAndroid Build Coastguard Worker                                 },
1574*77c1e3ccSAndroid Build Coastguard Worker                                 {
1575*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1576*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1577*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1578*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1579*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1580*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1581*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1582*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1583*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1584*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1585*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1586*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1587*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1588*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1589*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_ADD,
1590*77c1e3ccSAndroid Build Coastguard Worker                                     {
1591*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1592*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1593*77c1e3ccSAndroid Build Coastguard Worker                                         0x08,
1594*77c1e3ccSAndroid Build Coastguard Worker                                     },
1595*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1596*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1597*77c1e3ccSAndroid Build Coastguard Worker                                 },
1598*77c1e3ccSAndroid Build Coastguard Worker                                 {
1599*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1600*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1601*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1602*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1603*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1604*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1605*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1606*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1607*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1608*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1609*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1610*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1611*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1612*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1613*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1614*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1615*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1616*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1617*77c1e3ccSAndroid Build Coastguard Worker                                 },
1618*77c1e3ccSAndroid Build Coastguard Worker                                 {
1619*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1620*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1621*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1622*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1623*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1624*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1625*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1626*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1627*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1628*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1629*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1630*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1631*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1632*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1633*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1634*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1635*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1636*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1637*77c1e3ccSAndroid Build Coastguard Worker                                 },
1638*77c1e3ccSAndroid Build Coastguard Worker                                 {
1639*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1640*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1641*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1642*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1643*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1644*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1645*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1646*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1647*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1648*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1649*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1650*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1651*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1652*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1653*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_ADD,
1654*77c1e3ccSAndroid Build Coastguard Worker                                     {
1655*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1656*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1657*77c1e3ccSAndroid Build Coastguard Worker                                         0x0C,
1658*77c1e3ccSAndroid Build Coastguard Worker                                     },
1659*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1660*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1661*77c1e3ccSAndroid Build Coastguard Worker                                 },
1662*77c1e3ccSAndroid Build Coastguard Worker                                 {
1663*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1664*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1665*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1666*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1667*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1668*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1669*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1670*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1671*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1672*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1673*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1674*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1675*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1676*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1677*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_ADD,
1678*77c1e3ccSAndroid Build Coastguard Worker                                     {
1679*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1680*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1681*77c1e3ccSAndroid Build Coastguard Worker                                         0x02,
1682*77c1e3ccSAndroid Build Coastguard Worker                                     },
1683*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1684*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1685*77c1e3ccSAndroid Build Coastguard Worker                                 },
1686*77c1e3ccSAndroid Build Coastguard Worker                                 {
1687*77c1e3ccSAndroid Build Coastguard Worker                                     channels,
1688*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1689*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1690*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1691*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1692*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1693*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1694*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1695*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1696*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1697*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1698*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1699*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1700*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1701*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1702*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1703*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1704*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1705*77c1e3ccSAndroid Build Coastguard Worker                                 },
1706*77c1e3ccSAndroid Build Coastguard Worker                             } };
1707*77c1e3ccSAndroid Build Coastguard Worker 
1708*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
1709*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
1710*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
1711*77c1e3ccSAndroid Build Coastguard Worker 
1712*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1713*77c1e3ccSAndroid Build Coastguard Worker 
1714*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
1715*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
1716*77c1e3ccSAndroid Build Coastguard Worker }
1717*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestSplittingTensors)1718*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestSplittingTensors) {
1719*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 2;
1720*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 3;
1721*77c1e3ccSAndroid Build Coastguard Worker 
1722*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 4;
1723*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 4;
1724*77c1e3ccSAndroid Build Coastguard Worker 
1725*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1726*77c1e3ccSAndroid Build Coastguard Worker     -1, -1, 2, 1, 3, 2, 4, -3, -4, -2, 2, -3, 1, -3, 4, -2,
1727*77c1e3ccSAndroid Build Coastguard Worker   };
1728*77c1e3ccSAndroid Build Coastguard Worker 
1729*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
1730*77c1e3ccSAndroid Build Coastguard Worker     -4, 1,  0,  2,  3,  4,  4,  -4, -5, -3, 2,  2,  -4, -3, 3,  2,
1731*77c1e3ccSAndroid Build Coastguard Worker     4,  -4, -3, -4, -4, 1,  -3, -5, -3, 4,  2,  -2, 2,  -1, -4, -1,
1732*77c1e3ccSAndroid Build Coastguard Worker     -2, -3, 1,  1,  0,  -5, -1, 3,  3,  -5, -3, 0,  -3, 1,  -3, -1,
1733*77c1e3ccSAndroid Build Coastguard Worker     1,  -3, -2, -2, 4,  -2, 0,  1,  2,  2,  -4, 2,  4,  0,  -5, -2,
1734*77c1e3ccSAndroid Build Coastguard Worker     4,  4,  -5, 1,  0,  2,  -2, -5, -5, -3, -5, -5, 4,  -3, 0,  0,
1735*77c1e3ccSAndroid Build Coastguard Worker     -4, -4, 0,  -5, -4, 0,  0,  -3, -5, -3, -1, 2,  -1, 4,  -1, 2,
1736*77c1e3ccSAndroid Build Coastguard Worker   };
1737*77c1e3ccSAndroid Build Coastguard Worker 
1738*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
1739*77c1e3ccSAndroid Build Coastguard Worker     -4, -2, -3, -3, 3, 1, -2,
1740*77c1e3ccSAndroid Build Coastguard Worker   };
1741*77c1e3ccSAndroid Build Coastguard Worker 
1742*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
1743*77c1e3ccSAndroid Build Coastguard Worker     530,  -762,  1469, 777,  849,   -771, -1698, 600,
1744*77c1e3ccSAndroid Build Coastguard Worker     -658, -1821, 98,   -668, -1798, 30,   887,   -971,
1745*77c1e3ccSAndroid Build Coastguard Worker   };
1746*77c1e3ccSAndroid Build Coastguard Worker 
1747*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 3,
1748*77c1e3ccSAndroid Build Coastguard Worker                             0,
1749*77c1e3ccSAndroid Build Coastguard Worker                             0,
1750*77c1e3ccSAndroid Build Coastguard Worker                             0,
1751*77c1e3ccSAndroid Build Coastguard Worker                             0,
1752*77c1e3ccSAndroid Build Coastguard Worker                             {
1753*77c1e3ccSAndroid Build Coastguard Worker                                 {
1754*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1755*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1756*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1757*77c1e3ccSAndroid Build Coastguard Worker                                     4,
1758*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1759*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1760*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1761*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1762*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1763*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1764*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1765*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1766*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1767*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_OUTPUT,
1768*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1769*77c1e3ccSAndroid Build Coastguard Worker                                     {
1770*77c1e3ccSAndroid Build Coastguard Worker                                         0x02,
1771*77c1e3ccSAndroid Build Coastguard Worker                                         2,
1772*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1773*77c1e3ccSAndroid Build Coastguard Worker                                     },
1774*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1775*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1776*77c1e3ccSAndroid Build Coastguard Worker                                 },
1777*77c1e3ccSAndroid Build Coastguard Worker                                 {
1778*77c1e3ccSAndroid Build Coastguard Worker                                     4,
1779*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1780*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1781*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1782*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1783*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1784*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1785*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1786*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1787*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1788*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1789*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1790*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1791*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1792*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_CAT,
1793*77c1e3ccSAndroid Build Coastguard Worker                                     {
1794*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1795*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1796*77c1e3ccSAndroid Build Coastguard Worker                                         0x02,
1797*77c1e3ccSAndroid Build Coastguard Worker                                     },
1798*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1799*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1800*77c1e3ccSAndroid Build Coastguard Worker                                 },
1801*77c1e3ccSAndroid Build Coastguard Worker                                 {
1802*77c1e3ccSAndroid Build Coastguard Worker                                     4,
1803*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1804*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1805*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1806*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1807*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1808*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1809*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1810*77c1e3ccSAndroid Build Coastguard Worker                                     nullptr,
1811*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1812*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1813*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1814*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1815*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1816*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1817*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1818*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1819*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1820*77c1e3ccSAndroid Build Coastguard Worker                                 },
1821*77c1e3ccSAndroid Build Coastguard Worker                             } };
1822*77c1e3ccSAndroid Build Coastguard Worker 
1823*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
1824*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
1825*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
1826*77c1e3ccSAndroid Build Coastguard Worker 
1827*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1828*77c1e3ccSAndroid Build Coastguard Worker 
1829*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
1830*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_INT_TOL);
1831*77c1e3ccSAndroid Build Coastguard Worker }
1832*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestOutputChannelsCount)1833*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestOutputChannelsCount) {
1834*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 1;
1835*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 1;
1836*77c1e3ccSAndroid Build Coastguard Worker 
1837*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 2;
1838*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 2;
1839*77c1e3ccSAndroid Build Coastguard Worker 
1840*77c1e3ccSAndroid Build Coastguard Worker   float input[] = { 0, 0, 0, 0 };
1841*77c1e3ccSAndroid Build Coastguard Worker 
1842*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
1843*77c1e3ccSAndroid Build Coastguard Worker 
1844*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = { 0, 0, 0, 0, 0, 0 };
1845*77c1e3ccSAndroid Build Coastguard Worker 
1846*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
1847*77c1e3ccSAndroid Build Coastguard Worker     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1848*77c1e3ccSAndroid Build Coastguard Worker     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1849*77c1e3ccSAndroid Build Coastguard Worker   };
1850*77c1e3ccSAndroid Build Coastguard Worker 
1851*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = { 3,
1852*77c1e3ccSAndroid Build Coastguard Worker                             0,
1853*77c1e3ccSAndroid Build Coastguard Worker                             0,
1854*77c1e3ccSAndroid Build Coastguard Worker                             0,
1855*77c1e3ccSAndroid Build Coastguard Worker                             0,
1856*77c1e3ccSAndroid Build Coastguard Worker                             {
1857*77c1e3ccSAndroid Build Coastguard Worker                                 {
1858*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1859*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1860*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1861*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1862*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1863*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1864*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1865*77c1e3ccSAndroid Build Coastguard Worker                                     weights,
1866*77c1e3ccSAndroid Build Coastguard Worker                                     bias,
1867*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1868*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1869*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1870*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1871*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_INPUT,
1872*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NOC,
1873*77c1e3ccSAndroid Build Coastguard Worker                                     {
1874*77c1e3ccSAndroid Build Coastguard Worker                                         0x06,
1875*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1876*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1877*77c1e3ccSAndroid Build Coastguard Worker                                     },
1878*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1879*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1880*77c1e3ccSAndroid Build Coastguard Worker                                 },
1881*77c1e3ccSAndroid Build Coastguard Worker                                 {
1882*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1883*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1884*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1885*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1886*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1887*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1888*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1889*77c1e3ccSAndroid Build Coastguard Worker                                     weights,
1890*77c1e3ccSAndroid Build Coastguard Worker                                     bias,
1891*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1892*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1893*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1894*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1895*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1896*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_CAT,
1897*77c1e3ccSAndroid Build Coastguard Worker                                     {
1898*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1899*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1900*77c1e3ccSAndroid Build Coastguard Worker                                         0x03,
1901*77c1e3ccSAndroid Build Coastguard Worker                                     },
1902*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1903*77c1e3ccSAndroid Build Coastguard Worker                                     -1,
1904*77c1e3ccSAndroid Build Coastguard Worker                                 },
1905*77c1e3ccSAndroid Build Coastguard Worker                                 {
1906*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1907*77c1e3ccSAndroid Build Coastguard Worker                                     filter_width,
1908*77c1e3ccSAndroid Build Coastguard Worker                                     filter_height,
1909*77c1e3ccSAndroid Build Coastguard Worker                                     2,
1910*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1911*77c1e3ccSAndroid Build Coastguard Worker                                     1,
1912*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1913*77c1e3ccSAndroid Build Coastguard Worker                                     weights,
1914*77c1e3ccSAndroid Build Coastguard Worker                                     bias,
1915*77c1e3ccSAndroid Build Coastguard Worker                                     PADDING_SAME_ZERO,
1916*77c1e3ccSAndroid Build Coastguard Worker                                     NONE,
1917*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1918*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1919*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_NO_COPY,
1920*77c1e3ccSAndroid Build Coastguard Worker                                     BRANCH_CAT,
1921*77c1e3ccSAndroid Build Coastguard Worker                                     {
1922*77c1e3ccSAndroid Build Coastguard Worker                                         0x00,
1923*77c1e3ccSAndroid Build Coastguard Worker                                         0,
1924*77c1e3ccSAndroid Build Coastguard Worker                                         0x04,
1925*77c1e3ccSAndroid Build Coastguard Worker                                     },
1926*77c1e3ccSAndroid Build Coastguard Worker                                     {},
1927*77c1e3ccSAndroid Build Coastguard Worker                                     0,
1928*77c1e3ccSAndroid Build Coastguard Worker                                 },
1929*77c1e3ccSAndroid Build Coastguard Worker                             } };
1930*77c1e3ccSAndroid Build Coastguard Worker 
1931*77c1e3ccSAndroid Build Coastguard Worker   // Weights and biases need to be specified separately because
1932*77c1e3ccSAndroid Build Coastguard Worker   // of the offset.
1933*77c1e3ccSAndroid Build Coastguard Worker   AssignLayerWeightsBiases(&cnn_config, weights, bias);
1934*77c1e3ccSAndroid Build Coastguard Worker 
1935*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
1936*77c1e3ccSAndroid Build Coastguard Worker 
1937*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
1938*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
1939*77c1e3ccSAndroid Build Coastguard Worker }
1940*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestBatchNorm)1941*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestBatchNorm) {
1942*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 28;
1943*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 28;
1944*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 7;
1945*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 7;
1946*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
1947*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1948*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1949*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1950*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1951*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1952*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1953*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1954*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1955*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1956*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1957*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1958*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1959*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1960*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1961*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1962*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1963*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1964*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1965*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1966*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1967*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1968*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1969*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1970*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1971*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1972*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0117647f,  0.0705882f,  0.0705882f,  0.0705882f,
1973*77c1e3ccSAndroid Build Coastguard Worker     0.494118f,  0.533333f,  0.686275f,   0.101961f,   0.65098f,    1.0f,
1974*77c1e3ccSAndroid Build Coastguard Worker     0.968627f,  0.498039f,  0.0f,        0.0f,        0.0f,        0.0f,
1975*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1976*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.117647f,   0.141176f,   0.368627f,   0.603922f,
1977*77c1e3ccSAndroid Build Coastguard Worker     0.666667f,  0.992157f,  0.992157f,   0.992157f,   0.992157f,   0.992157f,
1978*77c1e3ccSAndroid Build Coastguard Worker     0.882353f,  0.67451f,   0.992157f,   0.94902f,    0.764706f,   0.25098f,
1979*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1980*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.192157f,
1981*77c1e3ccSAndroid Build Coastguard Worker     0.933333f,  0.992157f,  0.992157f,   0.992157f,   0.992157f,   0.992157f,
1982*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.992157f,  0.992157f,   0.984314f,   0.364706f,   0.321569f,
1983*77c1e3ccSAndroid Build Coastguard Worker     0.321569f,  0.219608f,  0.152941f,   0.0f,        0.0f,        0.0f,
1984*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1985*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0705882f,  0.858824f,   0.992157f,
1986*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.992157f,  0.992157f,   0.992157f,   0.776471f,   0.713725f,
1987*77c1e3ccSAndroid Build Coastguard Worker     0.968627f,  0.945098f,  0.0f,        0.0f,        0.0f,        0.0f,
1988*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1989*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1990*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.313725f,   0.611765f,   0.419608f,   0.992157f,
1991*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.803922f,  0.0431373f,  0.0f,        0.168627f,   0.603922f,
1992*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1993*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1994*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1995*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.054902f,  0.00392157f, 0.603922f,   0.992157f,   0.352941f,
1996*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1997*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1998*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
1999*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2000*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.545098f,  0.992157f,   0.745098f,   0.00784314f, 0.0f,
2001*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2002*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2003*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2004*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0431373f,
2005*77c1e3ccSAndroid Build Coastguard Worker     0.745098f,  0.992157f,  0.27451f,    0.0f,        0.0f,        0.0f,
2006*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2007*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2008*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2009*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.137255f,   0.945098f,
2010*77c1e3ccSAndroid Build Coastguard Worker     0.882353f,  0.627451f,  0.423529f,   0.00392157f, 0.0f,        0.0f,
2011*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2012*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2013*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2014*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.317647f,   0.941176f,   0.992157f,
2015*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.466667f,  0.0980392f,  0.0f,        0.0f,        0.0f,
2016*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2017*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2018*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2019*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.176471f,   0.729412f,   0.992157f,   0.992157f,
2020*77c1e3ccSAndroid Build Coastguard Worker     0.588235f,  0.105882f,  0.0f,        0.0f,        0.0f,        0.0f,
2021*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2022*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2023*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2024*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0627451f, 0.364706f,   0.988235f,   0.992157f,   0.733333f,
2025*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2026*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2027*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2028*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2029*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.976471f,  0.992157f,   0.976471f,   0.25098f,    0.0f,
2030*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2031*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2032*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2033*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.180392f,   0.509804f,   0.717647f,   0.992157f,
2034*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.811765f,  0.00784314f, 0.0f,        0.0f,        0.0f,
2035*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2036*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2037*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.152941f,   0.580392f,
2038*77c1e3ccSAndroid Build Coastguard Worker     0.898039f,  0.992157f,  0.992157f,   0.992157f,   0.980392f,   0.713725f,
2039*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2040*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2041*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2042*77c1e3ccSAndroid Build Coastguard Worker     0.0941176f, 0.447059f,  0.866667f,   0.992157f,   0.992157f,   0.992157f,
2043*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.788235f,  0.305882f,   0.0f,        0.0f,        0.0f,
2044*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2045*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2046*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0901961f,  0.258824f,   0.835294f,   0.992157f,
2047*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.992157f,  0.992157f,   0.776471f,   0.317647f,   0.00784314f,
2048*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2049*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2050*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0705882f,  0.670588f,
2051*77c1e3ccSAndroid Build Coastguard Worker     0.858824f,  0.992157f,  0.992157f,   0.992157f,   0.992157f,   0.764706f,
2052*77c1e3ccSAndroid Build Coastguard Worker     0.313725f,  0.0352941f, 0.0f,        0.0f,        0.0f,        0.0f,
2053*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2054*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2055*77c1e3ccSAndroid Build Coastguard Worker     0.215686f,  0.67451f,   0.886275f,   0.992157f,   0.992157f,   0.992157f,
2056*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.956863f,  0.521569f,   0.0431373f,  0.0f,        0.0f,
2057*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2058*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2059*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.533333f,   0.992157f,
2060*77c1e3ccSAndroid Build Coastguard Worker     0.992157f,  0.992157f,  0.831373f,   0.529412f,   0.517647f,   0.0627451f,
2061*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2062*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2063*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2064*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2065*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2066*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2067*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2068*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2069*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2070*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2071*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2072*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2073*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2074*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2075*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2076*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f,        0.0f,        0.0f,
2077*77c1e3ccSAndroid Build Coastguard Worker     0.0f,       0.0f,       0.0f,        0.0f
2078*77c1e3ccSAndroid Build Coastguard Worker   };
2079*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
2080*77c1e3ccSAndroid Build Coastguard Worker     -0.836424f, -0.857365f, -1.62739f,  -1.62739f,  -0.836424f, 5.40742f,
2081*77c1e3ccSAndroid Build Coastguard Worker     0.920853f,  -0.692567f, -0.836424f, -0.534405f, -1.62739f,  -0.836424f,
2082*77c1e3ccSAndroid Build Coastguard Worker     1.32602f,   1.36312f,   0.112766f,  -0.836424f, -0.192962f, 1.56975f,
2083*77c1e3ccSAndroid Build Coastguard Worker     2.45777f,   0.944414f,  -0.192962f, -1.5519f,   -1.5519f,   -0.554006f,
2084*77c1e3ccSAndroid Build Coastguard Worker     -0.192962f, 1.4231f,    -1.5519f,   -0.192962f, 1.3661f,    -1.5519f,
2085*77c1e3ccSAndroid Build Coastguard Worker     -1.5519f,   -0.192962f, -0.843708f, -0.359025f, -0.843708f, -0.843708f,
2086*77c1e3ccSAndroid Build Coastguard Worker     -0.843708f, 4.53065f,   0.0429584f, -0.796804f, -0.843708f, 0.3473f,
2087*77c1e3ccSAndroid Build Coastguard Worker     -0.843708f, -0.843708f, -0.114439f, 3.14817f,   0.0811934f, -0.843708f
2088*77c1e3ccSAndroid Build Coastguard Worker   };
2089*77c1e3ccSAndroid Build Coastguard Worker   float kernel[] = {
2090*77c1e3ccSAndroid Build Coastguard Worker     0.119643f,    -0.237864f,   0.0462892f,   0.0502297f,   -0.0134528f,
2091*77c1e3ccSAndroid Build Coastguard Worker     0.146347f,    0.153133f,    0.0513307f,   0.0752369f,   0.0135557f,
2092*77c1e3ccSAndroid Build Coastguard Worker     -0.111434f,   0.0941854f,   0.0788362f,   0.0299412f,   0.111762f,
2093*77c1e3ccSAndroid Build Coastguard Worker     0.144066f,    0.00431504f,  -0.0177954f,  0.0738092f,   -0.0344215f,
2094*77c1e3ccSAndroid Build Coastguard Worker     0.0832582f,   0.053989f,    -0.112691f,   0.0962145f,   0.0186525f,
2095*77c1e3ccSAndroid Build Coastguard Worker     -0.00660205f, -0.111962f,   -0.126801f,   -0.231625f,   0.17309f,
2096*77c1e3ccSAndroid Build Coastguard Worker     0.0748875f,   -0.179569f,   -0.00513812f, -0.156579f,   -0.147322f,
2097*77c1e3ccSAndroid Build Coastguard Worker     0.184168f,    0.189308f,    -0.200359f,   -0.0156733f,  0.140649f,
2098*77c1e3ccSAndroid Build Coastguard Worker     0.0858496f,   -0.0263217f,  -0.0740749f,  -0.112563f,   0.107528f,
2099*77c1e3ccSAndroid Build Coastguard Worker     0.0609729f,   -0.221625f,   0.0769944f,   -0.00900815f, -0.00136441f,
2100*77c1e3ccSAndroid Build Coastguard Worker     -0.0236521f,  -0.0418025f,  -0.00286299f, 0.12241f,     0.0964093f,
2101*77c1e3ccSAndroid Build Coastguard Worker     -0.0150897f,  0.0532171f,   0.0625916f,   0.116939f,    0.118024f,
2102*77c1e3ccSAndroid Build Coastguard Worker     0.161918f,    -0.00909767f, 0.100897f,    -0.054563f,   -0.175179f,
2103*77c1e3ccSAndroid Build Coastguard Worker     -0.0687892f,  0.00734235f,  0.109833f,    -0.113776f,   0.0595405f,
2104*77c1e3ccSAndroid Build Coastguard Worker     -0.170255f,   0.0124815f,   -0.0363301f,  -0.0127038f,  0.0445554f,
2105*77c1e3ccSAndroid Build Coastguard Worker     -0.0729894f,  0.107428f,    -0.0341417f,  0.132619f,    0.00984557f,
2106*77c1e3ccSAndroid Build Coastguard Worker     -0.00443654f, 0.202929f,    0.0945134f,   0.0148725f,   0.00998574f,
2107*77c1e3ccSAndroid Build Coastguard Worker     -0.0226449f,  0.0478197f,   -0.0793442f,  0.0707599f,   -0.084225f,
2108*77c1e3ccSAndroid Build Coastguard Worker     0.0865795f,   0.071104f,    -0.047894f,   0.0838322f,   0.0635493f,
2109*77c1e3ccSAndroid Build Coastguard Worker     -0.00370265f, -0.157247f,   -0.0289622f,  -0.0590963f,  0.13207f,
2110*77c1e3ccSAndroid Build Coastguard Worker     0.00468011f,  -0.0345372f,  0.217939f,    0.18861f,     -0.0290393f,
2111*77c1e3ccSAndroid Build Coastguard Worker     -0.0440664f,  0.0126197f,   -0.129132f,   -0.124943f,   0.0968156f,
2112*77c1e3ccSAndroid Build Coastguard Worker     -0.0853643f,  -0.182305f,   0.00461618f,  -0.147095f,   -0.230282f,
2113*77c1e3ccSAndroid Build Coastguard Worker     0.00856019f,  0.0278893f,   -0.0300229f,  0.0417871f,   0.0804717f,
2114*77c1e3ccSAndroid Build Coastguard Worker     -0.0768571f,  -0.0397085f,  -0.0601096f,  0.100901f,    -0.0184926f,
2115*77c1e3ccSAndroid Build Coastguard Worker     0.0350673f,   0.0971094f,   -0.0171837f,  -0.289644f,   -0.0899041f,
2116*77c1e3ccSAndroid Build Coastguard Worker     0.08998f,     -0.160319f,   -0.0195103f,  0.0392167f,   -0.137864f,
2117*77c1e3ccSAndroid Build Coastguard Worker     -0.0136294f,  0.0330886f,   -0.0409244f,  -0.092533f,   -0.0427934f,
2118*77c1e3ccSAndroid Build Coastguard Worker     -0.191144f,   -0.0969461f,  0.112035f,    0.138611f,    0.128717f,
2119*77c1e3ccSAndroid Build Coastguard Worker     0.191184f,    0.197462f
2120*77c1e3ccSAndroid Build Coastguard Worker   };
2121*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = { 0.186703f, 0.204358f, -0.0230452f };
2122*77c1e3ccSAndroid Build Coastguard Worker 
2123*77c1e3ccSAndroid Build Coastguard Worker   float bn_gamma[] = { 1.32173f, 1.26171f, 1.21966f };
2124*77c1e3ccSAndroid Build Coastguard Worker   float bn_beta[] = { -0.232595f, -0.222652f, -0.232209f };
2125*77c1e3ccSAndroid Build Coastguard Worker   float bn_mean[] = { 0.329233f, 0.199894f, 0.12389f };
2126*77c1e3ccSAndroid Build Coastguard Worker   float bn_std[] = { 0.311986f, 0.189737f, 0.247104f };
2127*77c1e3ccSAndroid Build Coastguard Worker 
2128*77c1e3ccSAndroid Build Coastguard Worker   CNN_BATCHNORM_PARAMS bn_params = {
2129*77c1e3ccSAndroid Build Coastguard Worker     bn_gamma,
2130*77c1e3ccSAndroid Build Coastguard Worker     bn_beta,
2131*77c1e3ccSAndroid Build Coastguard Worker     bn_mean,
2132*77c1e3ccSAndroid Build Coastguard Worker     bn_std,
2133*77c1e3ccSAndroid Build Coastguard Worker   };
2134*77c1e3ccSAndroid Build Coastguard Worker 
2135*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = {
2136*77c1e3ccSAndroid Build Coastguard Worker     1,
2137*77c1e3ccSAndroid Build Coastguard Worker     0,
2138*77c1e3ccSAndroid Build Coastguard Worker     0,
2139*77c1e3ccSAndroid Build Coastguard Worker     0,
2140*77c1e3ccSAndroid Build Coastguard Worker     0,
2141*77c1e3ccSAndroid Build Coastguard Worker     {
2142*77c1e3ccSAndroid Build Coastguard Worker         {
2143*77c1e3ccSAndroid Build Coastguard Worker             1,
2144*77c1e3ccSAndroid Build Coastguard Worker             filter_width,
2145*77c1e3ccSAndroid Build Coastguard Worker             filter_height,
2146*77c1e3ccSAndroid Build Coastguard Worker             3,
2147*77c1e3ccSAndroid Build Coastguard Worker             7,
2148*77c1e3ccSAndroid Build Coastguard Worker             7,
2149*77c1e3ccSAndroid Build Coastguard Worker             0,
2150*77c1e3ccSAndroid Build Coastguard Worker             kernel,
2151*77c1e3ccSAndroid Build Coastguard Worker             bias,
2152*77c1e3ccSAndroid Build Coastguard Worker             PADDING_VALID,
2153*77c1e3ccSAndroid Build Coastguard Worker             RELU,
2154*77c1e3ccSAndroid Build Coastguard Worker             0,
2155*77c1e3ccSAndroid Build Coastguard Worker             0,
2156*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NO_COPY,
2157*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NOC,
2158*77c1e3ccSAndroid Build Coastguard Worker             {},
2159*77c1e3ccSAndroid Build Coastguard Worker             bn_params,
2160*77c1e3ccSAndroid Build Coastguard Worker             0,
2161*77c1e3ccSAndroid Build Coastguard Worker         },
2162*77c1e3ccSAndroid Build Coastguard Worker     },
2163*77c1e3ccSAndroid Build Coastguard Worker   };
2164*77c1e3ccSAndroid Build Coastguard Worker 
2165*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
2166*77c1e3ccSAndroid Build Coastguard Worker 
2167*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
2168*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
2169*77c1e3ccSAndroid Build Coastguard Worker }
2170*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestMultithreading)2171*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestMultithreading) {
2172*77c1e3ccSAndroid Build Coastguard Worker   int image_height = 2;
2173*77c1e3ccSAndroid Build Coastguard Worker   int image_width = 2;
2174*77c1e3ccSAndroid Build Coastguard Worker   int filter_height = 3;
2175*77c1e3ccSAndroid Build Coastguard Worker   int filter_width = 3;
2176*77c1e3ccSAndroid Build Coastguard Worker 
2177*77c1e3ccSAndroid Build Coastguard Worker   float input[] = {
2178*77c1e3ccSAndroid Build Coastguard Worker     -2,
2179*77c1e3ccSAndroid Build Coastguard Worker     4,
2180*77c1e3ccSAndroid Build Coastguard Worker     1,
2181*77c1e3ccSAndroid Build Coastguard Worker     0,
2182*77c1e3ccSAndroid Build Coastguard Worker   };
2183*77c1e3ccSAndroid Build Coastguard Worker 
2184*77c1e3ccSAndroid Build Coastguard Worker   float weights[] = {
2185*77c1e3ccSAndroid Build Coastguard Worker     -4, 2, -2, 0,  -4, 4, -3, -3, -3, -1, 1,  0,  -5, -3, 0, -5, 0, 0,
2186*77c1e3ccSAndroid Build Coastguard Worker     -1, 0, 2,  -5, 0,  1, 4,  2,  1,  0,  -2, -1, -5, -3, 2, -2, 1, -5,
2187*77c1e3ccSAndroid Build Coastguard Worker   };
2188*77c1e3ccSAndroid Build Coastguard Worker 
2189*77c1e3ccSAndroid Build Coastguard Worker   float bias[] = {
2190*77c1e3ccSAndroid Build Coastguard Worker     -4,
2191*77c1e3ccSAndroid Build Coastguard Worker     -3,
2192*77c1e3ccSAndroid Build Coastguard Worker     -2,
2193*77c1e3ccSAndroid Build Coastguard Worker     3,
2194*77c1e3ccSAndroid Build Coastguard Worker   };
2195*77c1e3ccSAndroid Build Coastguard Worker 
2196*77c1e3ccSAndroid Build Coastguard Worker   float expected[] = {
2197*77c1e3ccSAndroid Build Coastguard Worker     2, 10, -8, -17, -24, 5, -15, 6, -5, -5, 7, -10, 4, 13, 9, -14,
2198*77c1e3ccSAndroid Build Coastguard Worker   };
2199*77c1e3ccSAndroid Build Coastguard Worker 
2200*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = {
2201*77c1e3ccSAndroid Build Coastguard Worker     1,
2202*77c1e3ccSAndroid Build Coastguard Worker     0,
2203*77c1e3ccSAndroid Build Coastguard Worker     0,
2204*77c1e3ccSAndroid Build Coastguard Worker     0,
2205*77c1e3ccSAndroid Build Coastguard Worker     0,
2206*77c1e3ccSAndroid Build Coastguard Worker     {
2207*77c1e3ccSAndroid Build Coastguard Worker         {
2208*77c1e3ccSAndroid Build Coastguard Worker             1,
2209*77c1e3ccSAndroid Build Coastguard Worker             filter_width,
2210*77c1e3ccSAndroid Build Coastguard Worker             filter_height,
2211*77c1e3ccSAndroid Build Coastguard Worker             4,
2212*77c1e3ccSAndroid Build Coastguard Worker             1,
2213*77c1e3ccSAndroid Build Coastguard Worker             1,
2214*77c1e3ccSAndroid Build Coastguard Worker             0,
2215*77c1e3ccSAndroid Build Coastguard Worker             weights,
2216*77c1e3ccSAndroid Build Coastguard Worker             bias,
2217*77c1e3ccSAndroid Build Coastguard Worker             PADDING_SAME_ZERO,
2218*77c1e3ccSAndroid Build Coastguard Worker             NONE,
2219*77c1e3ccSAndroid Build Coastguard Worker             0,
2220*77c1e3ccSAndroid Build Coastguard Worker             0,
2221*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NO_COPY,
2222*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NOC,
2223*77c1e3ccSAndroid Build Coastguard Worker             {},
2224*77c1e3ccSAndroid Build Coastguard Worker             {},
2225*77c1e3ccSAndroid Build Coastguard Worker             0,
2226*77c1e3ccSAndroid Build Coastguard Worker         },
2227*77c1e3ccSAndroid Build Coastguard Worker     },
2228*77c1e3ccSAndroid Build Coastguard Worker   };
2229*77c1e3ccSAndroid Build Coastguard Worker 
2230*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
2231*77c1e3ccSAndroid Build Coastguard Worker 
2232*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
2233*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
2234*77c1e3ccSAndroid Build Coastguard Worker 
2235*77c1e3ccSAndroid Build Coastguard Worker   const AVxWorkerInterface *const winterface = aom_get_worker_interface();
2236*77c1e3ccSAndroid Build Coastguard Worker   AVxWorker workers[4];
2237*77c1e3ccSAndroid Build Coastguard Worker 
2238*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 4; ++i) {
2239*77c1e3ccSAndroid Build Coastguard Worker     winterface->init(&workers[i]);
2240*77c1e3ccSAndroid Build Coastguard Worker   }
2241*77c1e3ccSAndroid Build Coastguard Worker 
2242*77c1e3ccSAndroid Build Coastguard Worker   thread_data = { 4, workers };
2243*77c1e3ccSAndroid Build Coastguard Worker 
2244*77c1e3ccSAndroid Build Coastguard Worker   RunCNNTest(image_width, image_height, input, expected, &cnn_config,
2245*77c1e3ccSAndroid Build Coastguard Worker              image_width, &thread_data, MSE_FLOAT_TOL);
2246*77c1e3ccSAndroid Build Coastguard Worker 
2247*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 4; ++i) {
2248*77c1e3ccSAndroid Build Coastguard Worker     winterface->end(&workers[i]);
2249*77c1e3ccSAndroid Build Coastguard Worker   }
2250*77c1e3ccSAndroid Build Coastguard Worker }
2251*77c1e3ccSAndroid Build Coastguard Worker 
TEST_F(CNNTest,TestMultiOutput)2252*77c1e3ccSAndroid Build Coastguard Worker TEST_F(CNNTest, TestMultiOutput) {
2253*77c1e3ccSAndroid Build Coastguard Worker   const int image_dim = 8;
2254*77c1e3ccSAndroid Build Coastguard Worker   const int image_ch = 3;
2255*77c1e3ccSAndroid Build Coastguard Worker   const int filter_dim = 2;
2256*77c1e3ccSAndroid Build Coastguard Worker   const int stride = 2;
2257*77c1e3ccSAndroid Build Coastguard Worker   const int num_filters = 2;
2258*77c1e3ccSAndroid Build Coastguard Worker 
2259*77c1e3ccSAndroid Build Coastguard Worker   const float input_[] = {
2260*77c1e3ccSAndroid Build Coastguard Worker     1.7537929121f,     0.134331551012f,    0.123580039877f,   0.957731845246f,
2261*77c1e3ccSAndroid Build Coastguard Worker     0.391006834217f,   1.00699352042f,     -0.778177955829f,  -0.814166433059f,
2262*77c1e3ccSAndroid Build Coastguard Worker     -0.656374394915f,  0.321967305228f,    -2.19455719176f,   0.708035038966f,
2263*77c1e3ccSAndroid Build Coastguard Worker     0.409148822266f,   -0.318254408902f,   0.152450211189f,   -0.250210793369f,
2264*77c1e3ccSAndroid Build Coastguard Worker     0.826811563186f,   1.6804156584f,      0.273626975978f,   0.437936241887f,
2265*77c1e3ccSAndroid Build Coastguard Worker     -0.329935520167f,  -0.288761611645f,   0.156937008304f,   0.271054157295f,
2266*77c1e3ccSAndroid Build Coastguard Worker     -0.0224828854332f, 1.70110336895f,     -0.989066699309f,  1.30863131729f,
2267*77c1e3ccSAndroid Build Coastguard Worker     -0.165813705702f,  0.00380178619265f,  -0.0837342367587f, 0.760954783156f,
2268*77c1e3ccSAndroid Build Coastguard Worker     -0.413610373524f,  1.17968204175f,     0.720295719536f,   0.308718974472f,
2269*77c1e3ccSAndroid Build Coastguard Worker     -1.10091337671f,   0.693160033687f,    -0.0202862320697f, 1.0221927503f,
2270*77c1e3ccSAndroid Build Coastguard Worker     -1.24521801881f,   -0.478501952308f,   -1.71648619442f,   -0.182571723636f,
2271*77c1e3ccSAndroid Build Coastguard Worker     0.339292649504f,   2.0806519131f,      0.967974033444f,   0.175248672328f,
2272*77c1e3ccSAndroid Build Coastguard Worker     0.0658124561472f,  0.795504169496f,    0.750592557361f,   -1.46631013249f,
2273*77c1e3ccSAndroid Build Coastguard Worker     -1.79052846838f,   -1.03672179515f,    -0.841985521653f,  1.20995011489f,
2274*77c1e3ccSAndroid Build Coastguard Worker     0.140859718215f,   -0.651552622661f,   0.451065110806f,   1.1189443693f,
2275*77c1e3ccSAndroid Build Coastguard Worker     0.100213260593f,   -0.834076868118f,   -1.28734321611f,   1.22064420095f,
2276*77c1e3ccSAndroid Build Coastguard Worker     -0.364143084361f,  0.750961509335f,    -0.888689074553f,  -0.8253547106f,
2277*77c1e3ccSAndroid Build Coastguard Worker     -1.21800999027f,   -0.966670603566f,   1.37384014741f,    0.47281264834f,
2278*77c1e3ccSAndroid Build Coastguard Worker     -0.420416235531f,  0.520163906493f,    0.501296589423f,   1.53418976951f,
2279*77c1e3ccSAndroid Build Coastguard Worker     0.715234751485f,   0.644551588907f,    0.0763504863375f,  -0.0018541943723f,
2280*77c1e3ccSAndroid Build Coastguard Worker     0.322853189656f,   -0.795099723224f,   -0.125177096675f,  1.4476577471f,
2281*77c1e3ccSAndroid Build Coastguard Worker     -0.585888410088f,  -1.44391754955f,    -0.610543221933f,  -0.221859179799f,
2282*77c1e3ccSAndroid Build Coastguard Worker     0.252060200774f,   -0.86287169623f,    -0.0350246229157f, 1.0932311997f,
2283*77c1e3ccSAndroid Build Coastguard Worker     0.899464648842f,   -0.468806951704f,   -0.300861137168f,  1.15776414206f,
2284*77c1e3ccSAndroid Build Coastguard Worker     1.03268544738f,    -0.171579585622f,   -0.179136557119f,  -0.354091003368f,
2285*77c1e3ccSAndroid Build Coastguard Worker     -0.612298249394f,  -1.20237379258f,    1.54604109659f,    0.130664370287f,
2286*77c1e3ccSAndroid Build Coastguard Worker     0.885225111868f,   1.0362799581f,      0.980561720868f,   -0.619379186999f,
2287*77c1e3ccSAndroid Build Coastguard Worker     -1.33818929924f,   -0.237233737961f,   -1.89335425073f,   0.567821011321f,
2288*77c1e3ccSAndroid Build Coastguard Worker     0.862420368465f,   -1.37380916821f,    0.352190056666f,   0.611261516274f,
2289*77c1e3ccSAndroid Build Coastguard Worker     0.393237747152f,   0.894686247967f,    0.190405182149f,   0.264872662911f,
2290*77c1e3ccSAndroid Build Coastguard Worker     -0.0657009133797f, 0.0580512653493f,   -0.401825294366f,  0.4106081318f,
2291*77c1e3ccSAndroid Build Coastguard Worker     0.49484512188f,    -0.0751103149442f,  -1.43243736382f,   1.79855656009f,
2292*77c1e3ccSAndroid Build Coastguard Worker     -1.1075351975f,    0.000354882733011f, -0.950716438608f,  1.27129831688f,
2293*77c1e3ccSAndroid Build Coastguard Worker     1.00495189838f,    0.110358656713f,    1.08315032822f,    -0.972676676218f,
2294*77c1e3ccSAndroid Build Coastguard Worker     -0.0757668962831f, 1.88932045165f,     -0.0672638136275f, 0.425913010161f,
2295*77c1e3ccSAndroid Build Coastguard Worker     -0.781540372017f,  0.976000248609f,    0.687218504122f,   1.31374513445f,
2296*77c1e3ccSAndroid Build Coastguard Worker     -0.932658930672f,  -1.25339468479f,    0.422071294078f,   -0.24189927912f,
2297*77c1e3ccSAndroid Build Coastguard Worker     0.216906604642f,   -1.88720997548f,    1.99252872889f,    0.353943735777f,
2298*77c1e3ccSAndroid Build Coastguard Worker     0.737434784132f,   -1.17848645017f,    1.70424254896f,    0.775297112968f,
2299*77c1e3ccSAndroid Build Coastguard Worker     -0.516392797501f,  0.398130609129f,    0.737248101457f,   0.166282500886f,
2300*77c1e3ccSAndroid Build Coastguard Worker     1.24699015468f,    0.47116183125f,     1.19091180182f,    -0.372695424578f,
2301*77c1e3ccSAndroid Build Coastguard Worker     0.219773209389f,   -0.829467838962f,   -0.52533122724f,   1.98707754595f,
2302*77c1e3ccSAndroid Build Coastguard Worker     0.553692606972f,   -0.933228902369f,   1.55427751643f,    -1.08813399144f,
2303*77c1e3ccSAndroid Build Coastguard Worker     -0.325686682094f,  0.205091443796f,    -1.70381666435f,   0.466465327942f,
2304*77c1e3ccSAndroid Build Coastguard Worker     1.73126863447f,    -0.939133672634f,   1.48318077459f,    -0.599414038168f,
2305*77c1e3ccSAndroid Build Coastguard Worker     -1.1583078687f,    0.518116190201f,    0.133571482458f,   0.84958342672f,
2306*77c1e3ccSAndroid Build Coastguard Worker     1.02205000597f,    -0.0772082009087f,  -1.69567503859f,   1.4697939436f,
2307*77c1e3ccSAndroid Build Coastguard Worker     1.67813743122f,    -0.627911582938f,   0.131380509137f,   -1.35717850726f,
2308*77c1e3ccSAndroid Build Coastguard Worker   };
2309*77c1e3ccSAndroid Build Coastguard Worker   const float *input[3] = { input_, &input_[image_dim * image_dim],
2310*77c1e3ccSAndroid Build Coastguard Worker                             &input_[2 * image_dim * image_dim] };
2311*77c1e3ccSAndroid Build Coastguard Worker 
2312*77c1e3ccSAndroid Build Coastguard Worker   const float bias[] = { 0.0f, 0.0f };
2313*77c1e3ccSAndroid Build Coastguard Worker 
2314*77c1e3ccSAndroid Build Coastguard Worker   const float weights_1[] = {
2315*77c1e3ccSAndroid Build Coastguard Worker     -0.489547413618f, 0.141916424749f,  -0.279286485585f,  -0.115322211094f,
2316*77c1e3ccSAndroid Build Coastguard Worker     0.299572786936f,  0.205289980785f,  -0.536254480088f,  -0.253626313744f,
2317*77c1e3ccSAndroid Build Coastguard Worker     -0.422883815849f, -0.169702966298f, -0.540104704793f,  0.495319646763f,
2318*77c1e3ccSAndroid Build Coastguard Worker     0.298799079422f,  -0.10054550901f,  -0.306085047056f,  0.171061886165f,
2319*77c1e3ccSAndroid Build Coastguard Worker     -0.108058703878f, -0.410734629888f, -0.0640674673049f, -0.386524840979f,
2320*77c1e3ccSAndroid Build Coastguard Worker     -0.157203423678f, -0.362138920529f, -0.216206085209f,  0.147502517971f,
2321*77c1e3ccSAndroid Build Coastguard Worker   };
2322*77c1e3ccSAndroid Build Coastguard Worker 
2323*77c1e3ccSAndroid Build Coastguard Worker   const float weights_2[] = {
2324*77c1e3ccSAndroid Build Coastguard Worker     0.207580604357f,  0.480821146263f,  -0.29111909562f,   0.47422567493f,
2325*77c1e3ccSAndroid Build Coastguard Worker     0.206892553253f,  -0.235067084092f, 0.354516800602f,   -0.212399370252f,
2326*77c1e3ccSAndroid Build Coastguard Worker     -0.419071343731f, -0.050350731631f, -0.0516457320279f, -0.0359310500731f,
2327*77c1e3ccSAndroid Build Coastguard Worker     0.567044864811f,  -0.060341127522f, 0.0501464839637f,  -0.437785677916f,
2328*77c1e3ccSAndroid Build Coastguard Worker   };
2329*77c1e3ccSAndroid Build Coastguard Worker 
2330*77c1e3ccSAndroid Build Coastguard Worker   const float weights_3[] = {
2331*77c1e3ccSAndroid Build Coastguard Worker     -0.0690452401448f, -0.356657338763f,   -0.219464031809f, 0.551288365843f,
2332*77c1e3ccSAndroid Build Coastguard Worker     0.181372090853f,   -0.00245268542109f, 0.409000696276f,  -0.593209108763f,
2333*77c1e3ccSAndroid Build Coastguard Worker     0.587352566749f,   -0.243720660227f,   0.266232713887f,  -0.00439285245097f,
2334*77c1e3ccSAndroid Build Coastguard Worker     0.252883228305f,   0.152646192631f,    0.0918944932026f, 0.398853715057f,
2335*77c1e3ccSAndroid Build Coastguard Worker   };
2336*77c1e3ccSAndroid Build Coastguard Worker 
2337*77c1e3ccSAndroid Build Coastguard Worker   const float weights_4[] = {
2338*77c1e3ccSAndroid Build Coastguard Worker     0.207560791573f,   0.194201350401f,   0.227802322443f,  0.206533663345f,
2339*77c1e3ccSAndroid Build Coastguard Worker     0.0557331066805f,  0.0224159800424f,  -0.143939197467f, -0.27703361602f,
2340*77c1e3ccSAndroid Build Coastguard Worker     0.130643888389f,   -0.269456557461f,  0.186242862864f,  -0.162879944774f,
2341*77c1e3ccSAndroid Build Coastguard Worker     -0.145503996718f,  -0.0768822987581f, -0.203127976359f, -0.238119922873f,
2342*77c1e3ccSAndroid Build Coastguard Worker     -0.258806479994f,  0.0357957680385f,  -0.1027606976f,   -0.287920082345f,
2343*77c1e3ccSAndroid Build Coastguard Worker     0.189047820993f,   0.250711538481f,   -0.272815714175f, -0.0431449742024f,
2344*77c1e3ccSAndroid Build Coastguard Worker     0.207261230996f,   -0.0396472677451f, 0.131236557412f,  0.174291832499f,
2345*77c1e3ccSAndroid Build Coastguard Worker     -0.251515885765f,  -0.107164007499f,  0.185824534748f,  -0.00561585838161f,
2346*77c1e3ccSAndroid Build Coastguard Worker     0.273393799578f,   -0.139563699075f,  -0.263922456031f, -0.118859844081f,
2347*77c1e3ccSAndroid Build Coastguard Worker     0.109230982597f,   -0.170170294794f,  0.0123025648515f, -0.0839368964355f,
2348*77c1e3ccSAndroid Build Coastguard Worker     -0.0774058234297f, 0.255847138286f,   -0.208430879637f, 0.279170114319f,
2349*77c1e3ccSAndroid Build Coastguard Worker     -0.272890330712f,  -0.217725903006f,  -0.295923275459f, -0.17008723953f,
2350*77c1e3ccSAndroid Build Coastguard Worker     -0.284281803405f,  0.281406323629f,   0.266910044663f,  -0.209963914338f,
2351*77c1e3ccSAndroid Build Coastguard Worker     0.271980962964f,   0.142013581699f,   -0.143896509026f, -0.290509242975f,
2352*77c1e3ccSAndroid Build Coastguard Worker     -0.305768180935f,  0.196902832117f,   -0.090424189662f, -0.147460802346f,
2353*77c1e3ccSAndroid Build Coastguard Worker     0.217722016651f,   0.12353848977f,    -0.169177363577f, -0.0454230918512f,
2354*77c1e3ccSAndroid Build Coastguard Worker   };
2355*77c1e3ccSAndroid Build Coastguard Worker 
2356*77c1e3ccSAndroid Build Coastguard Worker   const float expected_0[] = {
2357*77c1e3ccSAndroid Build Coastguard Worker     -2.04858441055f,  -2.12883075791f,    -0.045177363807f, 0.763949675768f,
2358*77c1e3ccSAndroid Build Coastguard Worker     -0.544361512821f, -1.58123168032f,    1.89319847039f,   0.16859080901f,
2359*77c1e3ccSAndroid Build Coastguard Worker     -1.16023321135f,  -0.396988107751f,   1.76637090744f,   -1.40434786514f,
2360*77c1e3ccSAndroid Build Coastguard Worker     0.908227575669f,  0.817064817605f,    0.215631134908f,  -0.848605613428f,
2361*77c1e3ccSAndroid Build Coastguard Worker     -0.106756747018f, 0.0193027166685f,   0.801345615113f,  -0.395407237598f,
2362*77c1e3ccSAndroid Build Coastguard Worker     -1.79983795658f,  -1.73054496242f,    0.0584392594454f, -0.388786095569f,
2363*77c1e3ccSAndroid Build Coastguard Worker     -0.237269619354f, 0.000843578271263f, -1.24043512104f,  0.487839445893f,
2364*77c1e3ccSAndroid Build Coastguard Worker     -0.394259726605f, 0.559632843424f,    -0.527224052291f, -1.53792340282f,
2365*77c1e3ccSAndroid Build Coastguard Worker   };
2366*77c1e3ccSAndroid Build Coastguard Worker 
2367*77c1e3ccSAndroid Build Coastguard Worker   const float expected_1[] = {
2368*77c1e3ccSAndroid Build Coastguard Worker     0.0f, 0.0f,           0.0f, 0.0f, 0.4057888292f, 0.325309571755f,
2369*77c1e3ccSAndroid Build Coastguard Worker     0.0f, 1.22013465602f,
2370*77c1e3ccSAndroid Build Coastguard Worker   };
2371*77c1e3ccSAndroid Build Coastguard Worker 
2372*77c1e3ccSAndroid Build Coastguard Worker   const float expected_2[] = {
2373*77c1e3ccSAndroid Build Coastguard Worker     0.156119444687f,
2374*77c1e3ccSAndroid Build Coastguard Worker     0.517385299817f,
2375*77c1e3ccSAndroid Build Coastguard Worker   };
2376*77c1e3ccSAndroid Build Coastguard Worker 
2377*77c1e3ccSAndroid Build Coastguard Worker   const float expected_3[] = {
2378*77c1e3ccSAndroid Build Coastguard Worker     0.224177852984f,
2379*77c1e3ccSAndroid Build Coastguard Worker     0.503384419034f,
2380*77c1e3ccSAndroid Build Coastguard Worker     0.156119444687f,
2381*77c1e3ccSAndroid Build Coastguard Worker     0.517385299817f,
2382*77c1e3ccSAndroid Build Coastguard Worker   };
2383*77c1e3ccSAndroid Build Coastguard Worker 
2384*77c1e3ccSAndroid Build Coastguard Worker   const float *expected[] = { expected_0, expected_1, expected_2, expected_3 };
2385*77c1e3ccSAndroid Build Coastguard Worker 
2386*77c1e3ccSAndroid Build Coastguard Worker   CNN_CONFIG cnn_config = {
2387*77c1e3ccSAndroid Build Coastguard Worker     4,  // num_layers
2388*77c1e3ccSAndroid Build Coastguard Worker     0,  // is_residue
2389*77c1e3ccSAndroid Build Coastguard Worker     0,  // ext_width
2390*77c1e3ccSAndroid Build Coastguard Worker     0,  // ext_height
2391*77c1e3ccSAndroid Build Coastguard Worker     0,  // strict_bounds
2392*77c1e3ccSAndroid Build Coastguard Worker     {
2393*77c1e3ccSAndroid Build Coastguard Worker         // layer_config
2394*77c1e3ccSAndroid Build Coastguard Worker         {
2395*77c1e3ccSAndroid Build Coastguard Worker             image_ch,           // in_channels
2396*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_width
2397*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_height
2398*77c1e3ccSAndroid Build Coastguard Worker             num_filters,        // out_channels
2399*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_width
2400*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_height
2401*77c1e3ccSAndroid Build Coastguard Worker             0,                  // max_pool
2402*77c1e3ccSAndroid Build Coastguard Worker             weights_1,          // weights
2403*77c1e3ccSAndroid Build Coastguard Worker             bias,               // bias
2404*77c1e3ccSAndroid Build Coastguard Worker             PADDING_SAME_ZERO,  // pad
2405*77c1e3ccSAndroid Build Coastguard Worker             NONE,               // activation
2406*77c1e3ccSAndroid Build Coastguard Worker             0,                  // deconvolve
2407*77c1e3ccSAndroid Build Coastguard Worker             0,                  // branch
2408*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_OUTPUT,      // branch_copy_type
2409*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NOC,         // branch_combine_type
2410*77c1e3ccSAndroid Build Coastguard Worker             { 2, 0, 0 },        // branch_config
2411*77c1e3ccSAndroid Build Coastguard Worker             {},                 // bn_params
2412*77c1e3ccSAndroid Build Coastguard Worker             0,                  // output_num
2413*77c1e3ccSAndroid Build Coastguard Worker         },
2414*77c1e3ccSAndroid Build Coastguard Worker         {
2415*77c1e3ccSAndroid Build Coastguard Worker             num_filters,        // in_channels
2416*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_width
2417*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_height
2418*77c1e3ccSAndroid Build Coastguard Worker             num_filters,        // out_channels
2419*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_width
2420*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_height
2421*77c1e3ccSAndroid Build Coastguard Worker             0,                  // max_pool
2422*77c1e3ccSAndroid Build Coastguard Worker             weights_2,          // weights
2423*77c1e3ccSAndroid Build Coastguard Worker             bias,               // bias
2424*77c1e3ccSAndroid Build Coastguard Worker             PADDING_SAME_ZERO,  // pad
2425*77c1e3ccSAndroid Build Coastguard Worker             RELU,               // activation
2426*77c1e3ccSAndroid Build Coastguard Worker             0,                  // deconvolve
2427*77c1e3ccSAndroid Build Coastguard Worker             0,                  // branch
2428*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NO_COPY,     // branch_copy_type
2429*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NOC,         // branch_combine_type
2430*77c1e3ccSAndroid Build Coastguard Worker             {},                 // branch_config
2431*77c1e3ccSAndroid Build Coastguard Worker             {},                 // bn_params
2432*77c1e3ccSAndroid Build Coastguard Worker             1,                  // output_num
2433*77c1e3ccSAndroid Build Coastguard Worker         },
2434*77c1e3ccSAndroid Build Coastguard Worker         {
2435*77c1e3ccSAndroid Build Coastguard Worker             num_filters,        // in_channels
2436*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_width
2437*77c1e3ccSAndroid Build Coastguard Worker             filter_dim,         // filter_height
2438*77c1e3ccSAndroid Build Coastguard Worker             num_filters,        // out_channels
2439*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_width
2440*77c1e3ccSAndroid Build Coastguard Worker             stride,             // skip_height
2441*77c1e3ccSAndroid Build Coastguard Worker             0,                  // max_pool
2442*77c1e3ccSAndroid Build Coastguard Worker             weights_3,          // weights
2443*77c1e3ccSAndroid Build Coastguard Worker             bias,               // bias
2444*77c1e3ccSAndroid Build Coastguard Worker             PADDING_SAME_ZERO,  // pad
2445*77c1e3ccSAndroid Build Coastguard Worker             RELU,               // activation
2446*77c1e3ccSAndroid Build Coastguard Worker             0,                  // deconvolve
2447*77c1e3ccSAndroid Build Coastguard Worker             0,                  // branch
2448*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NO_COPY,     // branch_copy_type
2449*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NOC,         // branch_combine_type
2450*77c1e3ccSAndroid Build Coastguard Worker             {},                 // branch_config
2451*77c1e3ccSAndroid Build Coastguard Worker             {},                 // bn_params
2452*77c1e3ccSAndroid Build Coastguard Worker             2,                  // output_num
2453*77c1e3ccSAndroid Build Coastguard Worker         },
2454*77c1e3ccSAndroid Build Coastguard Worker         {
2455*77c1e3ccSAndroid Build Coastguard Worker             num_filters,     // in_channels
2456*77c1e3ccSAndroid Build Coastguard Worker             2 * filter_dim,  // filter_width
2457*77c1e3ccSAndroid Build Coastguard Worker             2 * filter_dim,  // filter_height
2458*77c1e3ccSAndroid Build Coastguard Worker             num_filters,     // out_channels
2459*77c1e3ccSAndroid Build Coastguard Worker             2 * stride,      // skip_width
2460*77c1e3ccSAndroid Build Coastguard Worker             2 * stride,      // skip_height
2461*77c1e3ccSAndroid Build Coastguard Worker             0,               // max_pool
2462*77c1e3ccSAndroid Build Coastguard Worker             weights_4,       // weights
2463*77c1e3ccSAndroid Build Coastguard Worker             bias,            // bias
2464*77c1e3ccSAndroid Build Coastguard Worker             PADDING_VALID,   // pad
2465*77c1e3ccSAndroid Build Coastguard Worker             RELU,            // activation
2466*77c1e3ccSAndroid Build Coastguard Worker             0,               // deconvolve
2467*77c1e3ccSAndroid Build Coastguard Worker             1,               // branch
2468*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_NO_COPY,  // branch_copy_type
2469*77c1e3ccSAndroid Build Coastguard Worker             BRANCH_CAT,      // branch_combine_type
2470*77c1e3ccSAndroid Build Coastguard Worker             { 0, 0, 1 },     // branch_config
2471*77c1e3ccSAndroid Build Coastguard Worker             {},              // bn_params
2472*77c1e3ccSAndroid Build Coastguard Worker             3,               // output_num
2473*77c1e3ccSAndroid Build Coastguard Worker         },
2474*77c1e3ccSAndroid Build Coastguard Worker     },
2475*77c1e3ccSAndroid Build Coastguard Worker   };
2476*77c1e3ccSAndroid Build Coastguard Worker 
2477*77c1e3ccSAndroid Build Coastguard Worker   CNN_THREAD_DATA thread_data = { 1, nullptr };
2478*77c1e3ccSAndroid Build Coastguard Worker 
2479*77c1e3ccSAndroid Build Coastguard Worker   const int num_outputs = 4;
2480*77c1e3ccSAndroid Build Coastguard Worker   const int output_chs[4] = { filter_dim, filter_dim, filter_dim,
2481*77c1e3ccSAndroid Build Coastguard Worker                               2 * filter_dim };
2482*77c1e3ccSAndroid Build Coastguard Worker   const int output_dims[4] = { 4, 2, 1, 1 };
2483*77c1e3ccSAndroid Build Coastguard Worker   const int output_sizes[4] = {
2484*77c1e3ccSAndroid Build Coastguard Worker     output_chs[0] * output_dims[0] * output_dims[0],
2485*77c1e3ccSAndroid Build Coastguard Worker     output_chs[1] * output_dims[1] * output_dims[1],
2486*77c1e3ccSAndroid Build Coastguard Worker     output_chs[2] * output_dims[2] * output_dims[2],
2487*77c1e3ccSAndroid Build Coastguard Worker     output_chs[3] * output_dims[3] * output_dims[3],
2488*77c1e3ccSAndroid Build Coastguard Worker   };
2489*77c1e3ccSAndroid Build Coastguard Worker   float *const output_ = (float *)aom_malloc(
2490*77c1e3ccSAndroid Build Coastguard Worker       sizeof(*output_) *
2491*77c1e3ccSAndroid Build Coastguard Worker       (output_sizes[0] + output_sizes[1] + output_sizes[2] + output_sizes[3]));
2492*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_NE(output_, nullptr);
2493*77c1e3ccSAndroid Build Coastguard Worker   float *output[CNN_MAX_CHANNELS] = { nullptr };
2494*77c1e3ccSAndroid Build Coastguard Worker   int ch_ite = 0;
2495*77c1e3ccSAndroid Build Coastguard Worker   float *output_ite = output_;
2496*77c1e3ccSAndroid Build Coastguard Worker   for (int output_idx = 0; output_idx < num_outputs; output_idx++) {
2497*77c1e3ccSAndroid Build Coastguard Worker     for (int channel = 0; channel < output_chs[output_idx]; ++channel) {
2498*77c1e3ccSAndroid Build Coastguard Worker       output[ch_ite++] = output_ite;
2499*77c1e3ccSAndroid Build Coastguard Worker       output_ite += output_dims[output_idx] * output_dims[output_idx];
2500*77c1e3ccSAndroid Build Coastguard Worker     }
2501*77c1e3ccSAndroid Build Coastguard Worker   }
2502*77c1e3ccSAndroid Build Coastguard Worker   CNN_MULTI_OUT output_struct = { num_outputs, output_chs, output_dims,
2503*77c1e3ccSAndroid Build Coastguard Worker                                   output };
2504*77c1e3ccSAndroid Build Coastguard Worker 
2505*77c1e3ccSAndroid Build Coastguard Worker   RunMultiOutCNNTest(input, image_dim, image_dim, image_dim, &cnn_config,
2506*77c1e3ccSAndroid Build Coastguard Worker                      &thread_data, &output_struct, expected, MSE_FLOAT_TOL);
2507*77c1e3ccSAndroid Build Coastguard Worker 
2508*77c1e3ccSAndroid Build Coastguard Worker   aom_free(output_);
2509*77c1e3ccSAndroid Build Coastguard Worker }
2510*77c1e3ccSAndroid Build Coastguard Worker 
2511*77c1e3ccSAndroid Build Coastguard Worker namespace {
2512*77c1e3ccSAndroid Build Coastguard Worker 
2513*77c1e3ccSAndroid Build Coastguard Worker typedef void (*CNNConvolveNoMaxpoolPaddingValidFunc)(
2514*77c1e3ccSAndroid Build Coastguard Worker     const float **input, int in_width, int in_height, int in_stride,
2515*77c1e3ccSAndroid Build Coastguard Worker     const CNN_LAYER_CONFIG *layer_config, float **output, int out_stride,
2516*77c1e3ccSAndroid Build Coastguard Worker     int start_idx, int cstep, int channel_step);
2517*77c1e3ccSAndroid Build Coastguard Worker 
2518*77c1e3ccSAndroid Build Coastguard Worker typedef libaom_test::FuncParam<CNNConvolveNoMaxpoolPaddingValidFunc>
2519*77c1e3ccSAndroid Build Coastguard Worker     CNNConvolveTestFuncs;
2520*77c1e3ccSAndroid Build Coastguard Worker 
2521*77c1e3ccSAndroid Build Coastguard Worker class CNNConvolveTest : public ::testing::TestWithParam<CNNConvolveTestFuncs> {
2522*77c1e3ccSAndroid Build Coastguard Worker  protected:
SetUp()2523*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override { params_ = GetParam(); }
2524*77c1e3ccSAndroid Build Coastguard Worker 
RunCNNConvolveSetup(int run_times)2525*77c1e3ccSAndroid Build Coastguard Worker   void RunCNNConvolveSetup(int run_times) {
2526*77c1e3ccSAndroid Build Coastguard Worker     int in_width = 65;
2527*77c1e3ccSAndroid Build Coastguard Worker     int in_height = 65;
2528*77c1e3ccSAndroid Build Coastguard Worker 
2529*77c1e3ccSAndroid Build Coastguard Worker     const CNN_CONFIG *cnn_config = &av1_intra_mode_cnn_partition_cnn_config;
2530*77c1e3ccSAndroid Build Coastguard Worker 
2531*77c1e3ccSAndroid Build Coastguard Worker     for (int layer = 0; layer < cnn_config->num_layers; ++layer) {
2532*77c1e3ccSAndroid Build Coastguard Worker       int out_width = 0, out_height = 0;
2533*77c1e3ccSAndroid Build Coastguard Worker       int in_size = in_width * in_height;
2534*77c1e3ccSAndroid Build Coastguard Worker       // Get current layer output width and height.
2535*77c1e3ccSAndroid Build Coastguard Worker       av1_find_cnn_layer_output_size(in_height, in_width,
2536*77c1e3ccSAndroid Build Coastguard Worker                                      &cnn_config->layer_config[layer],
2537*77c1e3ccSAndroid Build Coastguard Worker                                      &out_width, &out_height);
2538*77c1e3ccSAndroid Build Coastguard Worker 
2539*77c1e3ccSAndroid Build Coastguard Worker       int out_size = out_width * out_height;
2540*77c1e3ccSAndroid Build Coastguard Worker       float *input[20], *output_ref[20], *output_mod[20];
2541*77c1e3ccSAndroid Build Coastguard Worker 
2542*77c1e3ccSAndroid Build Coastguard Worker       float *input_data =
2543*77c1e3ccSAndroid Build Coastguard Worker           (float *)aom_malloc(sizeof(*input_data) * in_size *
2544*77c1e3ccSAndroid Build Coastguard Worker                               cnn_config->layer_config[layer].in_channels);
2545*77c1e3ccSAndroid Build Coastguard Worker       float *temp_ptr = input_data;
2546*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NE(temp_ptr, nullptr);
2547*77c1e3ccSAndroid Build Coastguard Worker       for (int i = 0; i < cnn_config->layer_config[layer].in_channels; ++i) {
2548*77c1e3ccSAndroid Build Coastguard Worker         input[i] = temp_ptr;
2549*77c1e3ccSAndroid Build Coastguard Worker         for (int j = 0; j < in_size; j++) {
2550*77c1e3ccSAndroid Build Coastguard Worker           *(temp_ptr++) = ((float)rng_.Rand31() - (1 << 30)) / (1u << 31);
2551*77c1e3ccSAndroid Build Coastguard Worker         }
2552*77c1e3ccSAndroid Build Coastguard Worker       }
2553*77c1e3ccSAndroid Build Coastguard Worker 
2554*77c1e3ccSAndroid Build Coastguard Worker       float *out_data_ref = (float *)aom_calloc(
2555*77c1e3ccSAndroid Build Coastguard Worker           sizeof(*out_data_ref),
2556*77c1e3ccSAndroid Build Coastguard Worker           out_size * cnn_config->layer_config[layer].out_channels);
2557*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NE(out_data_ref, nullptr);
2558*77c1e3ccSAndroid Build Coastguard Worker       float *out_data_mod = (float *)aom_calloc(
2559*77c1e3ccSAndroid Build Coastguard Worker           sizeof(*out_data_mod),
2560*77c1e3ccSAndroid Build Coastguard Worker           out_size * cnn_config->layer_config[layer].out_channels);
2561*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NE(out_data_mod, nullptr);
2562*77c1e3ccSAndroid Build Coastguard Worker       float *temp_ptr1 = out_data_ref;
2563*77c1e3ccSAndroid Build Coastguard Worker       float *temp_ptr2 = out_data_mod;
2564*77c1e3ccSAndroid Build Coastguard Worker       for (int i = 0; i < cnn_config->layer_config[layer].out_channels; ++i) {
2565*77c1e3ccSAndroid Build Coastguard Worker         output_ref[i] = temp_ptr1;
2566*77c1e3ccSAndroid Build Coastguard Worker         output_mod[i] = temp_ptr2;
2567*77c1e3ccSAndroid Build Coastguard Worker         temp_ptr1 += out_size;
2568*77c1e3ccSAndroid Build Coastguard Worker         temp_ptr2 += out_size;
2569*77c1e3ccSAndroid Build Coastguard Worker       }
2570*77c1e3ccSAndroid Build Coastguard Worker 
2571*77c1e3ccSAndroid Build Coastguard Worker       RunCNNConvolveTest(input, in_width, in_height, out_size,
2572*77c1e3ccSAndroid Build Coastguard Worker                          &cnn_config->layer_config[layer], 0, 1, run_times,
2573*77c1e3ccSAndroid Build Coastguard Worker                          layer, output_ref, output_mod, out_width);
2574*77c1e3ccSAndroid Build Coastguard Worker 
2575*77c1e3ccSAndroid Build Coastguard Worker       // Set current layer output width and height as next layer input width and
2576*77c1e3ccSAndroid Build Coastguard Worker       // height.
2577*77c1e3ccSAndroid Build Coastguard Worker       in_width = out_width;
2578*77c1e3ccSAndroid Build Coastguard Worker       in_height = out_height;
2579*77c1e3ccSAndroid Build Coastguard Worker 
2580*77c1e3ccSAndroid Build Coastguard Worker       aom_free(input_data);
2581*77c1e3ccSAndroid Build Coastguard Worker       aom_free(out_data_ref);
2582*77c1e3ccSAndroid Build Coastguard Worker       aom_free(out_data_mod);
2583*77c1e3ccSAndroid Build Coastguard Worker     }
2584*77c1e3ccSAndroid Build Coastguard Worker   }
2585*77c1e3ccSAndroid Build Coastguard Worker 
RunCNNConvolveTest(float ** input,int in_width,int in_height,int out_size,const CNN_LAYER_CONFIG * layer_config,int start_idx,int step,int run_times,int layer,float ** output_ref,float ** output_mod,int out_stride)2586*77c1e3ccSAndroid Build Coastguard Worker   void RunCNNConvolveTest(float **input, int in_width, int in_height,
2587*77c1e3ccSAndroid Build Coastguard Worker                           int out_size, const CNN_LAYER_CONFIG *layer_config,
2588*77c1e3ccSAndroid Build Coastguard Worker                           int start_idx, int step, int run_times, int layer,
2589*77c1e3ccSAndroid Build Coastguard Worker                           float **output_ref, float **output_mod,
2590*77c1e3ccSAndroid Build Coastguard Worker                           int out_stride) {
2591*77c1e3ccSAndroid Build Coastguard Worker     const int cstep = layer_config->in_channels * layer_config->out_channels;
2592*77c1e3ccSAndroid Build Coastguard Worker     const int channel_step = AOMMAX(step, 1);
2593*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer timer;
2594*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_start(&timer);
2595*77c1e3ccSAndroid Build Coastguard Worker     for (int i = 0; i < run_times; ++i) {
2596*77c1e3ccSAndroid Build Coastguard Worker       params_.ref_func((const float **)input, in_width, in_height, in_width,
2597*77c1e3ccSAndroid Build Coastguard Worker                        layer_config, output_ref, out_stride, start_idx, cstep,
2598*77c1e3ccSAndroid Build Coastguard Worker                        channel_step);
2599*77c1e3ccSAndroid Build Coastguard Worker     }
2600*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_mark(&timer);
2601*77c1e3ccSAndroid Build Coastguard Worker     const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer));
2602*77c1e3ccSAndroid Build Coastguard Worker 
2603*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_start(&timer);
2604*77c1e3ccSAndroid Build Coastguard Worker     for (int i = 0; i < run_times; ++i) {
2605*77c1e3ccSAndroid Build Coastguard Worker       params_.tst_func((const float **)input, in_width, in_height, in_width,
2606*77c1e3ccSAndroid Build Coastguard Worker                        layer_config, output_mod, out_stride, start_idx, cstep,
2607*77c1e3ccSAndroid Build Coastguard Worker                        channel_step);
2608*77c1e3ccSAndroid Build Coastguard Worker     }
2609*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_mark(&timer);
2610*77c1e3ccSAndroid Build Coastguard Worker     const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer));
2611*77c1e3ccSAndroid Build Coastguard Worker 
2612*77c1e3ccSAndroid Build Coastguard Worker     if (run_times > 1) {
2613*77c1e3ccSAndroid Build Coastguard Worker       printf("layer : %d \n", layer);
2614*77c1e3ccSAndroid Build Coastguard Worker       printf("%7.2f/%7.2fns (%3.2f)\n", time1, time2, time1 / time2);
2615*77c1e3ccSAndroid Build Coastguard Worker     } else {
2616*77c1e3ccSAndroid Build Coastguard Worker       for (int channel = 0; channel < layer_config->out_channels; ++channel) {
2617*77c1e3ccSAndroid Build Coastguard Worker         const float *buf_ref = output_ref[channel];
2618*77c1e3ccSAndroid Build Coastguard Worker         const float *buf_mod = output_mod[channel];
2619*77c1e3ccSAndroid Build Coastguard Worker 
2620*77c1e3ccSAndroid Build Coastguard Worker         for (int i = 0; i < out_size; ++i) {
2621*77c1e3ccSAndroid Build Coastguard Worker           if (buf_ref[i] < CNN_CONVOLVE_PIXELWISE_FLOAT_TOL) {
2622*77c1e3ccSAndroid Build Coastguard Worker             ASSERT_LE(buf_ref[i], CNN_CONVOLVE_PIXELWISE_FLOAT_TOL)
2623*77c1e3ccSAndroid Build Coastguard Worker                 << "Reference output was near-zero, test output was not ("
2624*77c1e3ccSAndroid Build Coastguard Worker                 << buf_mod[i] << ")";
2625*77c1e3ccSAndroid Build Coastguard Worker           } else {
2626*77c1e3ccSAndroid Build Coastguard Worker             const float error = buf_ref[i] - buf_mod[i];
2627*77c1e3ccSAndroid Build Coastguard Worker             const float relative_error = fabsf(error / buf_ref[i]);
2628*77c1e3ccSAndroid Build Coastguard Worker             ASSERT_LE(relative_error, CNN_CONVOLVE_PIXELWISE_FLOAT_TOL)
2629*77c1e3ccSAndroid Build Coastguard Worker                 << " channel " << channel << " pixel " << i << ": "
2630*77c1e3ccSAndroid Build Coastguard Worker                 << buf_ref[i] << "/" << buf_mod[i] << std::endl;
2631*77c1e3ccSAndroid Build Coastguard Worker           }
2632*77c1e3ccSAndroid Build Coastguard Worker         }
2633*77c1e3ccSAndroid Build Coastguard Worker       }
2634*77c1e3ccSAndroid Build Coastguard Worker     }
2635*77c1e3ccSAndroid Build Coastguard Worker   }
2636*77c1e3ccSAndroid Build Coastguard Worker 
2637*77c1e3ccSAndroid Build Coastguard Worker  private:
2638*77c1e3ccSAndroid Build Coastguard Worker   CNNConvolveTestFuncs params_;
2639*77c1e3ccSAndroid Build Coastguard Worker   libaom_test::ACMRandom rng_;
2640*77c1e3ccSAndroid Build Coastguard Worker };
2641*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CNNConvolveTest);
2642*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(CNNConvolveTest,CheckOutput)2643*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CNNConvolveTest, CheckOutput) { RunCNNConvolveSetup(1); }
2644*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(CNNConvolveTest,DISABLED_Speed)2645*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CNNConvolveTest, DISABLED_Speed) { RunCNNConvolveSetup(100000); }
2646*77c1e3ccSAndroid Build Coastguard Worker 
2647*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_AVX2 && !CONFIG_EXCLUDE_SIMD_MISMATCH
2648*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CNNConvolveTest,
2649*77c1e3ccSAndroid Build Coastguard Worker                          ::testing::Values(CNNConvolveTestFuncs(
2650*77c1e3ccSAndroid Build Coastguard Worker                              &av1_cnn_convolve_no_maxpool_padding_valid_c,
2651*77c1e3ccSAndroid Build Coastguard Worker                              &av1_cnn_convolve_no_maxpool_padding_valid_avx2)));
2652*77c1e3ccSAndroid Build Coastguard Worker #endif
2653*77c1e3ccSAndroid Build Coastguard Worker 
2654*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_NEON
2655*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CNNConvolveTest,
2656*77c1e3ccSAndroid Build Coastguard Worker                          ::testing::Values(CNNConvolveTestFuncs(
2657*77c1e3ccSAndroid Build Coastguard Worker                              &av1_cnn_convolve_no_maxpool_padding_valid_c,
2658*77c1e3ccSAndroid Build Coastguard Worker                              &av1_cnn_convolve_no_maxpool_padding_valid_neon)));
2659*77c1e3ccSAndroid Build Coastguard Worker #endif
2660*77c1e3ccSAndroid Build Coastguard Worker 
2661*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
2662