xref: /aosp_15_r20/external/android-nn-driver/test/Concat.cpp (revision 3e777be0405cee09af5d5785ff37f7cfb5bee59a)
1*3e777be0SXin Li //
2*3e777be0SXin Li // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3*3e777be0SXin Li // SPDX-License-Identifier: MIT
4*3e777be0SXin Li //
5*3e777be0SXin Li 
6*3e777be0SXin Li #include "DriverTestHelpers.hpp"
7*3e777be0SXin Li #include "TestTensor.hpp"
8*3e777be0SXin Li 
9*3e777be0SXin Li #include <array>
10*3e777be0SXin Li #include <log/log.h>
11*3e777be0SXin Li 
12*3e777be0SXin Li using namespace android::hardware;
13*3e777be0SXin Li using namespace driverTestHelpers;
14*3e777be0SXin Li using namespace armnn_driver;
15*3e777be0SXin Li 
16*3e777be0SXin Li using HalPolicy = hal_1_0::HalPolicy;
17*3e777be0SXin Li using RequestArgument = V1_0::RequestArgument;
18*3e777be0SXin Li 
19*3e777be0SXin Li namespace
20*3e777be0SXin Li {
21*3e777be0SXin Li 
22*3e777be0SXin Li void
ConcatTestImpl(const std::vector<const TestTensor * > & inputs,int32_t concatAxis,const TestTensor & expectedOutputTensor,armnn::Compute computeDevice,V1_0::ErrorStatus expectedPrepareStatus=V1_0::ErrorStatus::NONE,V1_0::ErrorStatus expectedExecStatus=V1_0::ErrorStatus::NONE)23*3e777be0SXin Li ConcatTestImpl(const std::vector<const TestTensor*> & inputs,
24*3e777be0SXin Li                 int32_t concatAxis,
25*3e777be0SXin Li                 const TestTensor & expectedOutputTensor,
26*3e777be0SXin Li                 armnn::Compute computeDevice,
27*3e777be0SXin Li                 V1_0::ErrorStatus expectedPrepareStatus=V1_0::ErrorStatus::NONE,
28*3e777be0SXin Li                 V1_0::ErrorStatus expectedExecStatus=V1_0::ErrorStatus::NONE)
29*3e777be0SXin Li {
30*3e777be0SXin Li     std::unique_ptr<ArmnnDriver> driver = std::make_unique<ArmnnDriver>(DriverOptions(computeDevice));
31*3e777be0SXin Li     HalPolicy::Model model{};
32*3e777be0SXin Li 
33*3e777be0SXin Li     hidl_vec<uint32_t> modelInputIds;
34*3e777be0SXin Li     modelInputIds.resize(inputs.size()+1);
35*3e777be0SXin Li     for (uint32_t i = 0; i<inputs.size(); ++i)
36*3e777be0SXin Li     {
37*3e777be0SXin Li         modelInputIds[i] = i;
38*3e777be0SXin Li         AddInputOperand<HalPolicy>(model, inputs[i]->GetDimensions());
39*3e777be0SXin Li     }
40*3e777be0SXin Li     modelInputIds[inputs.size()] = inputs.size(); // add an id for the axis too
41*3e777be0SXin Li     AddIntOperand<HalPolicy>(model, concatAxis);
42*3e777be0SXin Li     AddOutputOperand<HalPolicy>(model, expectedOutputTensor.GetDimensions());
43*3e777be0SXin Li 
44*3e777be0SXin Li     // make the concat operation
45*3e777be0SXin Li     model.operations.resize(1);
46*3e777be0SXin Li     model.operations[0].type    = HalPolicy::OperationType::CONCATENATION;
47*3e777be0SXin Li     model.operations[0].inputs  = modelInputIds;
48*3e777be0SXin Li     model.operations[0].outputs = hidl_vec<uint32_t>{static_cast<uint32_t>(inputs.size()+1)};
49*3e777be0SXin Li 
50*3e777be0SXin Li     // make the prepared model
51*3e777be0SXin Li     V1_0::ErrorStatus prepareStatus = V1_0::ErrorStatus::NONE;
52*3e777be0SXin Li     android::sp<V1_0::IPreparedModel> preparedModel = PrepareModelWithStatus(model,
53*3e777be0SXin Li                                                                              *driver,
54*3e777be0SXin Li                                                                              prepareStatus,
55*3e777be0SXin Li                                                                              expectedPrepareStatus);
56*3e777be0SXin Li     DOCTEST_CHECK((int)prepareStatus == (int)expectedPrepareStatus);
57*3e777be0SXin Li     if (prepareStatus != V1_0::ErrorStatus::NONE)
58*3e777be0SXin Li     {
59*3e777be0SXin Li         // prepare failed, we cannot continue
60*3e777be0SXin Li         return;
61*3e777be0SXin Li     }
62*3e777be0SXin Li 
63*3e777be0SXin Li     DOCTEST_CHECK(preparedModel.get() != nullptr);
64*3e777be0SXin Li     if (preparedModel.get() == nullptr)
65*3e777be0SXin Li     {
66*3e777be0SXin Li         // don't spoil other tests if prepare failed
67*3e777be0SXin Li         return;
68*3e777be0SXin Li     }
69*3e777be0SXin Li 
70*3e777be0SXin Li     // construct the request
71*3e777be0SXin Li     hidl_vec<RequestArgument> inputArguments;
72*3e777be0SXin Li     hidl_vec<RequestArgument> outputArguments;
73*3e777be0SXin Li     inputArguments.resize(inputs.size());
74*3e777be0SXin Li     outputArguments.resize(1);
75*3e777be0SXin Li 
76*3e777be0SXin Li     // the request's memory pools will follow the same order as
77*3e777be0SXin Li     // the inputs
78*3e777be0SXin Li     for (uint32_t i = 0; i<inputs.size(); ++i)
79*3e777be0SXin Li     {
80*3e777be0SXin Li         V1_0::DataLocation inloc = {};
81*3e777be0SXin Li         inloc.poolIndex = i;
82*3e777be0SXin Li         inloc.offset = 0;
83*3e777be0SXin Li         inloc.length = inputs[i]->GetNumElements() * sizeof(float);
84*3e777be0SXin Li         RequestArgument input = {};
85*3e777be0SXin Li         input.location = inloc;
86*3e777be0SXin Li         input.dimensions = inputs[i]->GetDimensions();
87*3e777be0SXin Li         inputArguments[i] = input;
88*3e777be0SXin Li     }
89*3e777be0SXin Li 
90*3e777be0SXin Li     // and an additional memory pool is needed for the output
91*3e777be0SXin Li     {
92*3e777be0SXin Li         V1_0::DataLocation outloc = {};
93*3e777be0SXin Li         outloc.poolIndex = inputs.size();
94*3e777be0SXin Li         outloc.offset = 0;
95*3e777be0SXin Li         outloc.length = expectedOutputTensor.GetNumElements() * sizeof(float);
96*3e777be0SXin Li         RequestArgument output = {};
97*3e777be0SXin Li         output.location = outloc;
98*3e777be0SXin Li         output.dimensions = expectedOutputTensor.GetDimensions();
99*3e777be0SXin Li         outputArguments[0] = output;
100*3e777be0SXin Li     }
101*3e777be0SXin Li 
102*3e777be0SXin Li     // make the request based on the arguments
103*3e777be0SXin Li     V1_0::Request request = {};
104*3e777be0SXin Li     request.inputs  = inputArguments;
105*3e777be0SXin Li     request.outputs = outputArguments;
106*3e777be0SXin Li 
107*3e777be0SXin Li     // set the input data
108*3e777be0SXin Li     for (uint32_t i = 0; i<inputs.size(); ++i)
109*3e777be0SXin Li     {
110*3e777be0SXin Li         AddPoolAndSetData(inputs[i]->GetNumElements(),
111*3e777be0SXin Li                             request,
112*3e777be0SXin Li                             inputs[i]->GetData());
113*3e777be0SXin Li     }
114*3e777be0SXin Li 
115*3e777be0SXin Li     // add memory for the output
116*3e777be0SXin Li     android::sp<IMemory> outMemory = AddPoolAndGetData<float>(expectedOutputTensor.GetNumElements(), request);
117*3e777be0SXin Li     float* outdata = static_cast<float*>(static_cast<void*>(outMemory->getPointer()));
118*3e777be0SXin Li 
119*3e777be0SXin Li     // run the execution
120*3e777be0SXin Li     DOCTEST_CHECK(preparedModel.get() != nullptr);
121*3e777be0SXin Li     auto execStatus = Execute(preparedModel, request, expectedExecStatus);
122*3e777be0SXin Li     DOCTEST_CHECK((int)execStatus == (int)expectedExecStatus);
123*3e777be0SXin Li 
124*3e777be0SXin Li     if (execStatus == V1_0::ErrorStatus::NONE)
125*3e777be0SXin Li     {
126*3e777be0SXin Li         // check the result if there was no error
127*3e777be0SXin Li         const float * expectedOutput = expectedOutputTensor.GetData();
128*3e777be0SXin Li         for (unsigned int i=0; i<expectedOutputTensor.GetNumElements();++i)
129*3e777be0SXin Li         {
130*3e777be0SXin Li             DOCTEST_CHECK(outdata[i] == expectedOutput[i]);
131*3e777be0SXin Li         }
132*3e777be0SXin Li     }
133*3e777be0SXin Li }
134*3e777be0SXin Li 
135*3e777be0SXin Li /// Test cases...
SimpleConcatAxis0(armnn::Compute computeDevice)136*3e777be0SXin Li void SimpleConcatAxis0(armnn::Compute computeDevice)
137*3e777be0SXin Li {
138*3e777be0SXin Li     int32_t axis = 0;
139*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
140*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {1}};
141*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1, 1}, {2}};
142*3e777be0SXin Li 
143*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{3, 1, 1, 1}, {0, 1, 2}};
144*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
145*3e777be0SXin Li }
146*3e777be0SXin Li 
ConcatAxis0NoInterleave(armnn::Compute computeDevice)147*3e777be0SXin Li void ConcatAxis0NoInterleave(armnn::Compute computeDevice)
148*3e777be0SXin Li {
149*3e777be0SXin Li     int32_t axis = 0;
150*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{2, 1, 2, 1}, {0, 1,
151*3e777be0SXin Li                                                     2, 3}};
152*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{3, 1, 2, 1}, {4, 5,
153*3e777be0SXin Li                                                     6, 7,
154*3e777be0SXin Li                                                     8, 9}};
155*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10, 11}};
156*3e777be0SXin Li 
157*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{6, 1, 2, 1}, {0, 1,
158*3e777be0SXin Li                                                          2, 3,
159*3e777be0SXin Li                                                          4, 5,
160*3e777be0SXin Li                                                          6, 7,
161*3e777be0SXin Li                                                          8, 9,
162*3e777be0SXin Li                                                          10, 11}};
163*3e777be0SXin Li 
164*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
165*3e777be0SXin Li }
166*3e777be0SXin Li 
SimpleConcatAxis1(armnn::Compute computeDevice)167*3e777be0SXin Li void SimpleConcatAxis1(armnn::Compute computeDevice)
168*3e777be0SXin Li {
169*3e777be0SXin Li     int32_t axis = 1;
170*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
171*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {1}};
172*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1, 1}, {2}};
173*3e777be0SXin Li 
174*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 3, 1, 1}, {0, 1, 2}};
175*3e777be0SXin Li 
176*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
177*3e777be0SXin Li }
178*3e777be0SXin Li 
ConcatAxis1NoInterleave(armnn::Compute computeDevice)179*3e777be0SXin Li void ConcatAxis1NoInterleave(armnn::Compute computeDevice)
180*3e777be0SXin Li {
181*3e777be0SXin Li     int32_t axis = 1;
182*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 2, 2, 1}, {0, 1,
183*3e777be0SXin Li                                                     2, 3}};
184*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 3, 2, 1}, {4, 5,
185*3e777be0SXin Li                                                     6, 7,
186*3e777be0SXin Li                                                     8, 9}};
187*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10, 11}};
188*3e777be0SXin Li 
189*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 6, 2, 1}, {0, 1,
190*3e777be0SXin Li                                                          2, 3,
191*3e777be0SXin Li                                                          4, 5,
192*3e777be0SXin Li                                                          6, 7,
193*3e777be0SXin Li                                                          8, 9,
194*3e777be0SXin Li                                                          10, 11}};
195*3e777be0SXin Li 
196*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
197*3e777be0SXin Li }
198*3e777be0SXin Li 
SimpleConcatAxis1DoInterleave(armnn::Compute computeDevice)199*3e777be0SXin Li void SimpleConcatAxis1DoInterleave(armnn::Compute computeDevice)
200*3e777be0SXin Li {
201*3e777be0SXin Li     int32_t axis = 1;
202*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{2, 2, 1, 1}, {0, 1,
203*3e777be0SXin Li                                                     2, 3}};
204*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{2, 3, 1, 1}, {4, 5, 6,
205*3e777be0SXin Li                                                     7, 8, 9}};
206*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{2, 1, 1, 1}, {10,
207*3e777be0SXin Li                                                     11}};
208*3e777be0SXin Li 
209*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{2, 6, 1, 1}, {0, 1, 4, 5, 6, 10,
210*3e777be0SXin Li                                                          2, 3, 7, 8, 9, 11}};
211*3e777be0SXin Li 
212*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
213*3e777be0SXin Li }
214*3e777be0SXin Li 
SimpleConcatAxis2(armnn::Compute computeDevice)215*3e777be0SXin Li void SimpleConcatAxis2(armnn::Compute computeDevice)
216*3e777be0SXin Li {
217*3e777be0SXin Li     int32_t axis = 2;
218*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
219*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {1}};
220*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1, 1}, {2}};
221*3e777be0SXin Li 
222*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 3, 1}, {0, 1, 2}};
223*3e777be0SXin Li 
224*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
225*3e777be0SXin Li }
226*3e777be0SXin Li 
ConcatAxis2NoInterleave(armnn::Compute computeDevice)227*3e777be0SXin Li void ConcatAxis2NoInterleave(armnn::Compute computeDevice)
228*3e777be0SXin Li {
229*3e777be0SXin Li     int32_t axis = 2;
230*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
231*3e777be0SXin Li                                                     2, 3}};
232*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 3, 2}, {4, 5,
233*3e777be0SXin Li                                                     6, 7,
234*3e777be0SXin Li                                                     8, 9}};
235*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1, 2}, {10, 11}};
236*3e777be0SXin Li 
237*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 6, 2}, {0, 1,
238*3e777be0SXin Li                                                          2, 3,
239*3e777be0SXin Li                                                          4, 5,
240*3e777be0SXin Li                                                          6, 7,
241*3e777be0SXin Li                                                          8, 9,
242*3e777be0SXin Li                                                          10, 11}};
243*3e777be0SXin Li 
244*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
245*3e777be0SXin Li }
246*3e777be0SXin Li 
SimpleConcatAxis2DoInterleave(armnn::Compute computeDevice)247*3e777be0SXin Li void SimpleConcatAxis2DoInterleave(armnn::Compute computeDevice)
248*3e777be0SXin Li {
249*3e777be0SXin Li     int32_t axis = 2;
250*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 2, 2, 1}, {0, 1,
251*3e777be0SXin Li                                                     2, 3}};
252*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 2, 3, 1}, {4, 5, 6,
253*3e777be0SXin Li                                                     7, 8, 9}};
254*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 2, 1, 1}, {10,
255*3e777be0SXin Li                                                     11}};
256*3e777be0SXin Li 
257*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 2, 6, 1}, {0, 1, 4, 5, 6, 10,
258*3e777be0SXin Li                                                          2, 3, 7, 8, 9, 11}};
259*3e777be0SXin Li 
260*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
261*3e777be0SXin Li }
262*3e777be0SXin Li 
SimpleConcatAxis3(armnn::Compute computeDevice)263*3e777be0SXin Li void SimpleConcatAxis3(armnn::Compute computeDevice)
264*3e777be0SXin Li {
265*3e777be0SXin Li     int32_t axis = 3;
266*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
267*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {1}};
268*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1, 1}, {2}};
269*3e777be0SXin Li 
270*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 1, 3}, {0, 1, 2}};
271*3e777be0SXin Li 
272*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
273*3e777be0SXin Li }
274*3e777be0SXin Li 
SimpleConcatAxis3DoInterleave(armnn::Compute computeDevice)275*3e777be0SXin Li void SimpleConcatAxis3DoInterleave(armnn::Compute computeDevice)
276*3e777be0SXin Li {
277*3e777be0SXin Li     int32_t axis = 3;
278*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
279*3e777be0SXin Li                                                     2, 3}};
280*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 2, 3}, {4, 5, 6,
281*3e777be0SXin Li                                                     7, 8, 9}};
282*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10,
283*3e777be0SXin Li                                                     11}};
284*3e777be0SXin Li 
285*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 2, 6}, {0, 1, 4, 5, 6, 10,
286*3e777be0SXin Li                                                          2, 3, 7, 8, 9, 11}};
287*3e777be0SXin Li 
288*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
289*3e777be0SXin Li }
290*3e777be0SXin Li 
AxisTooBig(armnn::Compute computeDevice)291*3e777be0SXin Li void AxisTooBig(armnn::Compute computeDevice)
292*3e777be0SXin Li {
293*3e777be0SXin Li     int32_t axis = 4;
294*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
295*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
296*3e777be0SXin Li 
297*3e777be0SXin Li     // The axis must be within the range of [-rank(values), rank(values))
298*3e777be0SXin Li     // see: https://www.tensorflow.org/api_docs/python/tf/concat
299*3e777be0SXin Li     TestTensor uncheckedOutput{armnn::TensorShape{1, 1, 1, 1}, {0}};
300*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
301*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn}, axis, uncheckedOutput, computeDevice, expectedParserStatus);
302*3e777be0SXin Li }
303*3e777be0SXin Li 
AxisTooSmall(armnn::Compute computeDevice)304*3e777be0SXin Li void AxisTooSmall(armnn::Compute computeDevice)
305*3e777be0SXin Li {
306*3e777be0SXin Li     int32_t axis = -5;
307*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
308*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
309*3e777be0SXin Li 
310*3e777be0SXin Li     // The axis must be within the range of [-rank(values), rank(values))
311*3e777be0SXin Li     // see: https://www.tensorflow.org/api_docs/python/tf/concat
312*3e777be0SXin Li     TestTensor uncheckedOutput{armnn::TensorShape{1, 1, 1, 1}, {0}};
313*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
314*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn}, axis, uncheckedOutput, computeDevice, expectedParserStatus);
315*3e777be0SXin Li }
316*3e777be0SXin Li 
TooFewInputs(armnn::Compute computeDevice)317*3e777be0SXin Li void TooFewInputs(armnn::Compute computeDevice)
318*3e777be0SXin Li {
319*3e777be0SXin Li     int32_t axis = 0;
320*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1, 1}, {0}};
321*3e777be0SXin Li 
322*3e777be0SXin Li     // We need at least two tensors to concatenate
323*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
324*3e777be0SXin Li     ConcatTestImpl({&aIn}, axis, aIn, computeDevice, expectedParserStatus);
325*3e777be0SXin Li }
326*3e777be0SXin Li 
MismatchedInputDimensions(armnn::Compute computeDevice)327*3e777be0SXin Li void MismatchedInputDimensions(armnn::Compute computeDevice)
328*3e777be0SXin Li {
329*3e777be0SXin Li     int32_t axis = 3;
330*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
331*3e777be0SXin Li                                                     2, 3}};
332*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 2, 3}, {4, 5, 6,
333*3e777be0SXin Li                                                     7, 8, 9}};
334*3e777be0SXin Li     TestTensor mismatched{armnn::TensorShape{1, 1, 1, 1}, {10}};
335*3e777be0SXin Li 
336*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 2, 6}, {0, 1, 4, 5, 6, 10,
337*3e777be0SXin Li                                                          2, 3, 7, 8, 9, 11}};
338*3e777be0SXin Li 
339*3e777be0SXin Li     // The input dimensions must be compatible
340*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
341*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &mismatched}, axis, expected, computeDevice, expectedParserStatus);
342*3e777be0SXin Li }
343*3e777be0SXin Li 
MismatchedInputRanks(armnn::Compute computeDevice)344*3e777be0SXin Li void MismatchedInputRanks(armnn::Compute computeDevice)
345*3e777be0SXin Li {
346*3e777be0SXin Li     int32_t axis = 2;
347*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2}, {0, 1}};
348*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1}, {4}};
349*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 3}, {0, 1, 4}};
350*3e777be0SXin Li 
351*3e777be0SXin Li     // The input dimensions must be compatible
352*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
353*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn}, axis, expected, computeDevice, expectedParserStatus);
354*3e777be0SXin Li }
355*3e777be0SXin Li 
MismatchedOutputDimensions(armnn::Compute computeDevice)356*3e777be0SXin Li void MismatchedOutputDimensions(armnn::Compute computeDevice)
357*3e777be0SXin Li {
358*3e777be0SXin Li     int32_t axis = 3;
359*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
360*3e777be0SXin Li                                                     2, 3}};
361*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 2, 3}, {4, 5, 6,
362*3e777be0SXin Li                                                     7, 8, 9}};
363*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10,
364*3e777be0SXin Li                                                     11}};
365*3e777be0SXin Li 
366*3e777be0SXin Li     TestTensor mismatched{armnn::TensorShape{1, 1, 6, 2}, {0, 1, 4, 5, 6, 10,
367*3e777be0SXin Li                                                            2, 3, 7, 8, 9, 11}};
368*3e777be0SXin Li 
369*3e777be0SXin Li     // The input and output dimensions must be compatible
370*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
371*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, mismatched, computeDevice, expectedParserStatus);
372*3e777be0SXin Li }
373*3e777be0SXin Li 
MismatchedOutputRank(armnn::Compute computeDevice)374*3e777be0SXin Li void MismatchedOutputRank(armnn::Compute computeDevice)
375*3e777be0SXin Li {
376*3e777be0SXin Li     int32_t axis = 3;
377*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
378*3e777be0SXin Li                                                     2, 3}};
379*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 2, 3}, {4, 5, 6,
380*3e777be0SXin Li                                                     7, 8, 9}};
381*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10,
382*3e777be0SXin Li                                                     11}};
383*3e777be0SXin Li 
384*3e777be0SXin Li     TestTensor mismatched{armnn::TensorShape{6, 2}, {0, 1, 4, 5, 6, 10,
385*3e777be0SXin Li                                                      2, 3, 7, 8, 9, 11}};
386*3e777be0SXin Li 
387*3e777be0SXin Li     // The input and output ranks must match
388*3e777be0SXin Li     V1_0::ErrorStatus expectedParserStatus = V1_0::ErrorStatus::GENERAL_FAILURE;
389*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, mismatched, computeDevice, expectedParserStatus);
390*3e777be0SXin Li }
391*3e777be0SXin Li 
ValidNegativeAxis(armnn::Compute computeDevice)392*3e777be0SXin Li void ValidNegativeAxis(armnn::Compute computeDevice)
393*3e777be0SXin Li {
394*3e777be0SXin Li     // this is the same as 3
395*3e777be0SXin Li     // see: https://www.tensorflow.org/api_docs/python/tf/concat
396*3e777be0SXin Li     int32_t axis = -1;
397*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 2, 2}, {0, 1,
398*3e777be0SXin Li                                                     2, 3}};
399*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 2, 3}, {4, 5, 6,
400*3e777be0SXin Li                                                     7, 8, 9}};
401*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 2, 1}, {10,
402*3e777be0SXin Li                                                     11}};
403*3e777be0SXin Li 
404*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 2, 6}, {0, 1, 4, 5, 6, 10,
405*3e777be0SXin Li                                                          2, 3, 7, 8, 9, 11}};
406*3e777be0SXin Li 
407*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
408*3e777be0SXin Li }
409*3e777be0SXin Li 
SimpleConcatAxisZero3D(armnn::Compute computeDevice)410*3e777be0SXin Li void SimpleConcatAxisZero3D(armnn::Compute computeDevice)
411*3e777be0SXin Li {
412*3e777be0SXin Li     int32_t axis = 0;
413*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1}, {0}};
414*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1}, {1}};
415*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1}, {2}};
416*3e777be0SXin Li 
417*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{3, 1, 1}, {0, 1, 2}};
418*3e777be0SXin Li 
419*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
420*3e777be0SXin Li }
421*3e777be0SXin Li 
SimpleConcatAxisOne3D(armnn::Compute computeDevice)422*3e777be0SXin Li void SimpleConcatAxisOne3D(armnn::Compute computeDevice)
423*3e777be0SXin Li {
424*3e777be0SXin Li     int32_t axis = 1;
425*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1}, {0}};
426*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1}, {1}};
427*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1}, {2}};
428*3e777be0SXin Li 
429*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 3, 1}, {0, 1, 2}};
430*3e777be0SXin Li 
431*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
432*3e777be0SXin Li }
433*3e777be0SXin Li 
SimpleConcatAxisTwo3D(armnn::Compute computeDevice)434*3e777be0SXin Li void SimpleConcatAxisTwo3D(armnn::Compute computeDevice)
435*3e777be0SXin Li {
436*3e777be0SXin Li     int32_t axis = 2;
437*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1, 1}, {0}};
438*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1, 1}, {1}};
439*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1, 1}, {2}};
440*3e777be0SXin Li 
441*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 1, 3}, {0, 1, 2}};
442*3e777be0SXin Li 
443*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
444*3e777be0SXin Li }
445*3e777be0SXin Li 
SimpleConcatAxisZero2D(armnn::Compute computeDevice)446*3e777be0SXin Li void SimpleConcatAxisZero2D(armnn::Compute computeDevice)
447*3e777be0SXin Li {
448*3e777be0SXin Li     int32_t axis = 0;
449*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1}, {0}};
450*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1}, {1}};
451*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1}, {2}};
452*3e777be0SXin Li 
453*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{3, 1}, {0, 1, 2}};
454*3e777be0SXin Li 
455*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
456*3e777be0SXin Li }
457*3e777be0SXin Li 
SimpleConcatAxisOne2D(armnn::Compute computeDevice)458*3e777be0SXin Li void SimpleConcatAxisOne2D(armnn::Compute computeDevice)
459*3e777be0SXin Li {
460*3e777be0SXin Li     int32_t axis = 1;
461*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1, 1}, {0}};
462*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1, 1}, {1}};
463*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1, 1}, {2}};
464*3e777be0SXin Li 
465*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{1, 3}, {0, 1, 2}};
466*3e777be0SXin Li 
467*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
468*3e777be0SXin Li }
469*3e777be0SXin Li 
SimpleConcatAxisZero1D(armnn::Compute computeDevice)470*3e777be0SXin Li void SimpleConcatAxisZero1D(armnn::Compute computeDevice)
471*3e777be0SXin Li {
472*3e777be0SXin Li     int32_t axis = 0;
473*3e777be0SXin Li     TestTensor aIn{armnn::TensorShape{1}, {0}};
474*3e777be0SXin Li     TestTensor bIn{armnn::TensorShape{1}, {1}};
475*3e777be0SXin Li     TestTensor cIn{armnn::TensorShape{1}, {2}};
476*3e777be0SXin Li 
477*3e777be0SXin Li     TestTensor expected{armnn::TensorShape{3}, {0, 1, 2}};
478*3e777be0SXin Li     ConcatTestImpl({&aIn, &bIn, &cIn}, axis, expected, computeDevice);
479*3e777be0SXin Li }
480*3e777be0SXin Li 
481*3e777be0SXin Li } // namespace <anonymous>
482*3e777be0SXin Li 
483*3e777be0SXin Li DOCTEST_TEST_SUITE("ConcatTests_CpuRef")
484*3e777be0SXin Li {
485*3e777be0SXin Li 
486*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis0")
487*3e777be0SXin Li {
488*3e777be0SXin Li     SimpleConcatAxis0(armnn::Compute::CpuRef);
489*3e777be0SXin Li }
490*3e777be0SXin Li 
491*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis0NoInterleave")
492*3e777be0SXin Li {
493*3e777be0SXin Li     ConcatAxis0NoInterleave(armnn::Compute::CpuRef);
494*3e777be0SXin Li }
495*3e777be0SXin Li 
496*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis1")
497*3e777be0SXin Li {
498*3e777be0SXin Li     SimpleConcatAxis1(armnn::Compute::CpuRef);
499*3e777be0SXin Li }
500*3e777be0SXin Li 
501*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis1NoInterleave")
502*3e777be0SXin Li {
503*3e777be0SXin Li     ConcatAxis1NoInterleave(armnn::Compute::CpuRef);
504*3e777be0SXin Li }
505*3e777be0SXin Li 
506*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis1DoInterleave")
507*3e777be0SXin Li {
508*3e777be0SXin Li     SimpleConcatAxis1DoInterleave(armnn::Compute::CpuRef);
509*3e777be0SXin Li }
510*3e777be0SXin Li 
511*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis2")
512*3e777be0SXin Li {
513*3e777be0SXin Li     SimpleConcatAxis2(armnn::Compute::CpuRef);
514*3e777be0SXin Li }
515*3e777be0SXin Li 
516*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis2NoInterleave")
517*3e777be0SXin Li {
518*3e777be0SXin Li     ConcatAxis2NoInterleave(armnn::Compute::CpuRef);
519*3e777be0SXin Li }
520*3e777be0SXin Li 
521*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis2DoInterleave")
522*3e777be0SXin Li {
523*3e777be0SXin Li     SimpleConcatAxis2DoInterleave(armnn::Compute::CpuRef);
524*3e777be0SXin Li }
525*3e777be0SXin Li 
526*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis3")
527*3e777be0SXin Li {
528*3e777be0SXin Li     SimpleConcatAxis3(armnn::Compute::CpuRef);
529*3e777be0SXin Li }
530*3e777be0SXin Li 
531*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis3DoInterleave")
532*3e777be0SXin Li {
533*3e777be0SXin Li     SimpleConcatAxis3DoInterleave(armnn::Compute::CpuRef);
534*3e777be0SXin Li }
535*3e777be0SXin Li 
536*3e777be0SXin Li DOCTEST_TEST_CASE("AxisTooBig")
537*3e777be0SXin Li {
538*3e777be0SXin Li     AxisTooBig(armnn::Compute::CpuRef);
539*3e777be0SXin Li }
540*3e777be0SXin Li 
541*3e777be0SXin Li DOCTEST_TEST_CASE("AxisTooSmall")
542*3e777be0SXin Li {
543*3e777be0SXin Li     AxisTooSmall(armnn::Compute::CpuRef);
544*3e777be0SXin Li }
545*3e777be0SXin Li 
546*3e777be0SXin Li DOCTEST_TEST_CASE("TooFewInputs")
547*3e777be0SXin Li {
548*3e777be0SXin Li     TooFewInputs(armnn::Compute::CpuRef);
549*3e777be0SXin Li }
550*3e777be0SXin Li 
551*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedInputDimensions")
552*3e777be0SXin Li {
553*3e777be0SXin Li     MismatchedInputDimensions(armnn::Compute::CpuRef);
554*3e777be0SXin Li }
555*3e777be0SXin Li 
556*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedInputRanks")
557*3e777be0SXin Li {
558*3e777be0SXin Li     MismatchedInputRanks(armnn::Compute::CpuRef);
559*3e777be0SXin Li }
560*3e777be0SXin Li 
561*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedOutputDimensions")
562*3e777be0SXin Li {
563*3e777be0SXin Li     MismatchedOutputDimensions(armnn::Compute::CpuRef);
564*3e777be0SXin Li }
565*3e777be0SXin Li 
566*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedOutputRank")
567*3e777be0SXin Li {
568*3e777be0SXin Li     MismatchedOutputRank(armnn::Compute::CpuRef);
569*3e777be0SXin Li }
570*3e777be0SXin Li 
571*3e777be0SXin Li DOCTEST_TEST_CASE("ValidNegativeAxis")
572*3e777be0SXin Li {
573*3e777be0SXin Li     ValidNegativeAxis(armnn::Compute::CpuRef);
574*3e777be0SXin Li }
575*3e777be0SXin Li 
576*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero3D")
577*3e777be0SXin Li {
578*3e777be0SXin Li     SimpleConcatAxisZero3D(armnn::Compute::CpuRef);
579*3e777be0SXin Li }
580*3e777be0SXin Li 
581*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisOne3D")
582*3e777be0SXin Li {
583*3e777be0SXin Li     SimpleConcatAxisOne3D(armnn::Compute::CpuRef);
584*3e777be0SXin Li }
585*3e777be0SXin Li 
586*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisTwo3D")
587*3e777be0SXin Li {
588*3e777be0SXin Li     SimpleConcatAxisTwo3D(armnn::Compute::CpuRef);
589*3e777be0SXin Li }
590*3e777be0SXin Li 
591*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero2D")
592*3e777be0SXin Li {
593*3e777be0SXin Li     SimpleConcatAxisZero2D(armnn::Compute::CpuRef);
594*3e777be0SXin Li }
595*3e777be0SXin Li 
596*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisOne2D")
597*3e777be0SXin Li {
598*3e777be0SXin Li     SimpleConcatAxisOne2D(armnn::Compute::CpuRef);
599*3e777be0SXin Li }
600*3e777be0SXin Li 
601*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero1D")
602*3e777be0SXin Li {
603*3e777be0SXin Li     SimpleConcatAxisZero1D(armnn::Compute::CpuRef);
604*3e777be0SXin Li }
605*3e777be0SXin Li 
606*3e777be0SXin Li }
607*3e777be0SXin Li 
608*3e777be0SXin Li #ifdef ARMCOMPUTECL_ENABLED
609*3e777be0SXin Li DOCTEST_TEST_SUITE("ConcatTests_GpuAcc")
610*3e777be0SXin Li {
611*3e777be0SXin Li 
612*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis0")
613*3e777be0SXin Li {
614*3e777be0SXin Li     SimpleConcatAxis0(armnn::Compute::GpuAcc);
615*3e777be0SXin Li }
616*3e777be0SXin Li 
617*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis0NoInterleave")
618*3e777be0SXin Li {
619*3e777be0SXin Li     ConcatAxis0NoInterleave(armnn::Compute::GpuAcc);
620*3e777be0SXin Li }
621*3e777be0SXin Li 
622*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis1")
623*3e777be0SXin Li {
624*3e777be0SXin Li     SimpleConcatAxis1(armnn::Compute::GpuAcc);
625*3e777be0SXin Li }
626*3e777be0SXin Li 
627*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis1NoInterleave")
628*3e777be0SXin Li {
629*3e777be0SXin Li     ConcatAxis1NoInterleave(armnn::Compute::GpuAcc);
630*3e777be0SXin Li }
631*3e777be0SXin Li 
632*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis1DoInterleave")
633*3e777be0SXin Li {
634*3e777be0SXin Li     SimpleConcatAxis1DoInterleave(armnn::Compute::GpuAcc);
635*3e777be0SXin Li }
636*3e777be0SXin Li 
637*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis2")
638*3e777be0SXin Li {
639*3e777be0SXin Li     SimpleConcatAxis2(armnn::Compute::GpuAcc);
640*3e777be0SXin Li }
641*3e777be0SXin Li 
642*3e777be0SXin Li DOCTEST_TEST_CASE("ConcatAxis2NoInterleave")
643*3e777be0SXin Li {
644*3e777be0SXin Li     ConcatAxis2NoInterleave(armnn::Compute::GpuAcc);
645*3e777be0SXin Li }
646*3e777be0SXin Li 
647*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis2DoInterleave")
648*3e777be0SXin Li {
649*3e777be0SXin Li     SimpleConcatAxis2DoInterleave(armnn::Compute::GpuAcc);
650*3e777be0SXin Li }
651*3e777be0SXin Li 
652*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis3")
653*3e777be0SXin Li {
654*3e777be0SXin Li     SimpleConcatAxis3(armnn::Compute::GpuAcc);
655*3e777be0SXin Li }
656*3e777be0SXin Li 
657*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxis3DoInterleave")
658*3e777be0SXin Li {
659*3e777be0SXin Li     SimpleConcatAxis3DoInterleave(armnn::Compute::GpuAcc);
660*3e777be0SXin Li }
661*3e777be0SXin Li 
662*3e777be0SXin Li DOCTEST_TEST_CASE("AxisTooBig")
663*3e777be0SXin Li {
664*3e777be0SXin Li     AxisTooBig(armnn::Compute::GpuAcc);
665*3e777be0SXin Li }
666*3e777be0SXin Li 
667*3e777be0SXin Li DOCTEST_TEST_CASE("AxisTooSmall")
668*3e777be0SXin Li {
669*3e777be0SXin Li     AxisTooSmall(armnn::Compute::GpuAcc);
670*3e777be0SXin Li }
671*3e777be0SXin Li 
672*3e777be0SXin Li DOCTEST_TEST_CASE("TooFewInputs")
673*3e777be0SXin Li {
674*3e777be0SXin Li     TooFewInputs(armnn::Compute::GpuAcc);
675*3e777be0SXin Li }
676*3e777be0SXin Li 
677*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedInputDimensions")
678*3e777be0SXin Li {
679*3e777be0SXin Li     MismatchedInputDimensions(armnn::Compute::GpuAcc);
680*3e777be0SXin Li }
681*3e777be0SXin Li 
682*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedInputRanks")
683*3e777be0SXin Li {
684*3e777be0SXin Li     MismatchedInputRanks(armnn::Compute::GpuAcc);
685*3e777be0SXin Li }
686*3e777be0SXin Li 
687*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedOutputDimensions")
688*3e777be0SXin Li {
689*3e777be0SXin Li     MismatchedOutputDimensions(armnn::Compute::GpuAcc);
690*3e777be0SXin Li }
691*3e777be0SXin Li 
692*3e777be0SXin Li DOCTEST_TEST_CASE("MismatchedOutputRank")
693*3e777be0SXin Li {
694*3e777be0SXin Li     MismatchedOutputRank(armnn::Compute::GpuAcc);
695*3e777be0SXin Li }
696*3e777be0SXin Li 
697*3e777be0SXin Li DOCTEST_TEST_CASE("ValidNegativeAxis")
698*3e777be0SXin Li {
699*3e777be0SXin Li     ValidNegativeAxis(armnn::Compute::GpuAcc);
700*3e777be0SXin Li }
701*3e777be0SXin Li 
702*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero3D")
703*3e777be0SXin Li {
704*3e777be0SXin Li     SimpleConcatAxisZero3D(armnn::Compute::GpuAcc);
705*3e777be0SXin Li }
706*3e777be0SXin Li 
707*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisOne3D")
708*3e777be0SXin Li {
709*3e777be0SXin Li     SimpleConcatAxisOne3D(armnn::Compute::GpuAcc);
710*3e777be0SXin Li }
711*3e777be0SXin Li 
712*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisTwo3D")
713*3e777be0SXin Li {
714*3e777be0SXin Li     SimpleConcatAxisTwo3D(armnn::Compute::GpuAcc);
715*3e777be0SXin Li }
716*3e777be0SXin Li 
717*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero2D")
718*3e777be0SXin Li {
719*3e777be0SXin Li     SimpleConcatAxisZero2D(armnn::Compute::GpuAcc);
720*3e777be0SXin Li }
721*3e777be0SXin Li 
722*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisOne2D")
723*3e777be0SXin Li {
724*3e777be0SXin Li     SimpleConcatAxisOne2D(armnn::Compute::GpuAcc);
725*3e777be0SXin Li }
726*3e777be0SXin Li 
727*3e777be0SXin Li DOCTEST_TEST_CASE("SimpleConcatAxisZero1D")
728*3e777be0SXin Li {
729*3e777be0SXin Li     SimpleConcatAxisZero1D(armnn::Compute::GpuAcc);
730*3e777be0SXin Li }
731*3e777be0SXin Li 
732*3e777be0SXin Li }// End of GpuAcc Test Suite
733*3e777be0SXin Li #endif