ncnn
1// Tencent is pleased to support the open source community by making ncnn available.
2//
3// Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
4//
5// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
6// in compliance with the License. You may obtain a copy of the License at
7//
8// https://opensource.org/licenses/BSD-3-Clause
9//
10// Unless required by applicable law or agreed to in writing, software distributed
11// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12// CONDITIONS OF ANY KIND, either express or implied. See the License for the
13// specific language governing permissions and limitations under the License.
14
15#include "testutil.h"16
17static int test_concat(const std::vector<ncnn::Mat>& a, int axis)18{
19ncnn::ParamDict pd;20pd.set(0, axis); //axis21
22std::vector<ncnn::Mat> weights(0);23
24int ret = test_layer("Concat", pd, weights, a);25if (ret != 0)26{27fprintf(stderr, "test_concat failed a[0].dims=%d a[0]=(%d %d %d %d) axis=%d\n", a[0].dims, a[0].w, a[0].h, a[0].d, a[0].c, axis);28}29
30return ret;31}
32
33static int test_concat_0()34{
35ncnn::Mat a[] = {36RandomMat(15, 5, 6, 13),37RandomMat(15, 5, 6, 20),38RandomMat(15, 5, 6, 24),39RandomMat(15, 5, 6, 48)40};41
42const int n = sizeof(a) / sizeof(a[0]);43
44for (int i = 0; i < n; i++)45{46for (int j = 0; j < n; j++)47{48for (int k = 0; k < n; k++)49{50std::vector<ncnn::Mat> as(4);51as[0] = a[i];52as[1] = a[j];53as[2] = a[k];54as[3] = a[k];55
56int ret = test_concat(as, 0) || test_concat(as, -4);57if (ret != 0)58return ret;59}60}61}62
63return 0;64}
65
66static int test_concat_1()67{
68ncnn::Mat a[] = {69RandomMat(15, 3, 15, 13),70RandomMat(15, 3, 16, 20),71RandomMat(15, 3, 17, 24),72RandomMat(15, 3, 18, 48)73};74
75const int n = sizeof(a) / sizeof(a[0]);76
77for (int i = 0; i < n; i++)78{79std::vector<ncnn::Mat> as(3);80as[0] = a[i];81as[1] = a[i];82as[2] = a[i];83
84int ret = test_concat(as, 1) || test_concat(as, -3);85if (ret != 0)86return ret;87}88
89return 0;90}
91
92static int test_concat_2()93{
94ncnn::Mat a[] = {95RandomMat(15, 15, 6, 13),96RandomMat(15, 16, 6, 20),97RandomMat(15, 17, 6, 24),98RandomMat(15, 18, 6, 48)99};100
101const int n = sizeof(a) / sizeof(a[0]);102
103for (int i = 0; i < n; i++)104{105std::vector<ncnn::Mat> as(3);106as[0] = a[i];107as[1] = a[i];108as[2] = a[i];109
110int ret = test_concat(as, 2) || test_concat(as, -2);111if (ret != 0)112return ret;113}114
115return 0;116}
117
118static int test_concat_3()119{
120ncnn::Mat a[] = {121RandomMat(15, 5, 7, 13),122RandomMat(16, 5, 7, 20),123RandomMat(17, 5, 7, 24),124RandomMat(18, 5, 7, 48)125};126
127const int n = sizeof(a) / sizeof(a[0]);128
129for (int i = 0; i < n; i++)130{131std::vector<ncnn::Mat> as(3);132as[0] = a[i];133as[1] = a[i];134as[2] = a[i];135
136int ret = test_concat(as, 3) || test_concat(as, -1);137if (ret != 0)138return ret;139}140
141return 0;142}
143
144static int test_concat_4()145{
146ncnn::Mat a[] = {147RandomMat(15, 13, 13),148RandomMat(15, 13, 20),149RandomMat(15, 13, 24),150RandomMat(15, 13, 48)151};152
153const int n = sizeof(a) / sizeof(a[0]);154
155for (int i = 0; i < n; i++)156{157for (int j = 0; j < n; j++)158{159for (int k = 0; k < n; k++)160{161std::vector<ncnn::Mat> as(4);162as[0] = a[i];163as[1] = a[j];164as[2] = a[k];165as[3] = a[k];166
167int ret = test_concat(as, 0) || test_concat(as, -3);168if (ret != 0)169return ret;170}171}172}173
174return 0;175}
176
177static int test_concat_5()178{
179ncnn::Mat a[] = {180RandomMat(15, 15, 13),181RandomMat(15, 16, 20),182RandomMat(15, 17, 24),183RandomMat(15, 18, 48)184};185
186const int n = sizeof(a) / sizeof(a[0]);187
188for (int i = 0; i < n; i++)189{190std::vector<ncnn::Mat> as(3);191as[0] = a[i];192as[1] = a[i];193as[2] = a[i];194
195int ret = test_concat(as, 1) || test_concat(as, -2);196if (ret != 0)197return ret;198}199
200return 0;201}
202
203static int test_concat_6()204{
205ncnn::Mat a[] = {206RandomMat(15, 13, 13),207RandomMat(16, 13, 20),208RandomMat(17, 13, 24),209RandomMat(18, 13, 48)210};211
212const int n = sizeof(a) / sizeof(a[0]);213
214for (int i = 0; i < n; i++)215{216std::vector<ncnn::Mat> as(3);217as[0] = a[i];218as[1] = a[i];219as[2] = a[i];220
221int ret = test_concat(as, 2) || test_concat(as, -1);222if (ret != 0)223return ret;224}225
226return 0;227}
228
229static int test_concat_7()230{
231ncnn::Mat a[] = {232RandomMat(19, 29),233RandomMat(19, 44),234RandomMat(19, 56),235RandomMat(19, 80)236};237
238const int n = sizeof(a) / sizeof(a[0]);239
240for (int i = 0; i < n; i++)241{242for (int j = 0; j < n; j++)243{244for (int k = 0; k < n; k++)245{246std::vector<ncnn::Mat> as(4);247as[0] = a[i];248as[1] = a[j];249as[2] = a[k];250as[3] = a[k];251
252int ret = test_concat(as, 0) || test_concat(as, -2);253if (ret != 0)254return ret;255}256}257}258
259return 0;260}
261
262static int test_concat_8()263{
264ncnn::Mat a[] = {265RandomMat(19, 29),266RandomMat(16, 44),267RandomMat(17, 56),268RandomMat(18, 80)269};270
271const int n = sizeof(a) / sizeof(a[0]);272
273for (int i = 0; i < n; i++)274{275std::vector<ncnn::Mat> as(3);276as[0] = a[i];277as[1] = a[i];278as[2] = a[i];279
280int ret = test_concat(as, 1) || test_concat(as, -1);281if (ret != 0)282return ret;283}284
285return 0;286}
287
288static int test_concat_9()289{
290ncnn::Mat a[] = {291RandomMat(29),292RandomMat(44),293RandomMat(56),294RandomMat(80)295};296
297const int n = sizeof(a) / sizeof(a[0]);298
299for (int i = 0; i < n; i++)300{301for (int j = 0; j < n; j++)302{303for (int k = 0; k < n; k++)304{305std::vector<ncnn::Mat> as(4);306as[0] = a[i];307as[1] = a[j];308as[2] = a[k];309as[3] = a[k];310
311int ret = test_concat(as, 0) || test_concat(as, -1);312if (ret != 0)313return ret;314}315}316}317
318return 0;319}
320
321int main()322{
323SRAND(7767517);324
325return 0326|| test_concat_0()327|| test_concat_1()328|| test_concat_2()329|| test_concat_3()330|| test_concat_4()331|| test_concat_5()332|| test_concat_6()333|| test_concat_7()334|| test_concat_8()335|| test_concat_9();336}
337