blob: 663abc6ea9a8f7105aa32c0c10521da7eec9067d [file] [log] [blame]
Richard Burtondc0c6ed2020-04-08 16:39:05 +01001# Copyright © 2020 Arm Ltd. All rights reserved.
2# SPDX-License-Identifier: MIT
3import inspect
4
5import pytest
6
7import pyarmnn as ann
8import numpy as np
9import pyarmnn._generated.pyarmnn as generated
10
11
12def test_activation_descriptor_default_values():
13 desc = ann.ActivationDescriptor()
14 assert desc.m_Function == ann.ActivationFunction_Sigmoid
15 assert desc.m_A == 0
16 assert desc.m_B == 0
17
18
19def test_argminmax_descriptor_default_values():
20 desc = ann.ArgMinMaxDescriptor()
21 assert desc.m_Function == ann.ArgMinMaxFunction_Min
22 assert desc.m_Axis == -1
23
24
25def test_batchnormalization_descriptor_default_values():
26 desc = ann.BatchNormalizationDescriptor()
27 assert desc.m_DataLayout == ann.DataLayout_NCHW
28 np.allclose(0.0001, desc.m_Eps)
29
30
31def test_batchtospacend_descriptor_default_values():
32 desc = ann.BatchToSpaceNdDescriptor()
33 assert desc.m_DataLayout == ann.DataLayout_NCHW
34 assert [1, 1] == desc.m_BlockShape
35 assert [(0, 0), (0, 0)] == desc.m_Crops
36
37
38def test_batchtospacend_descriptor_assignment():
39 desc = ann.BatchToSpaceNdDescriptor()
40 desc.m_BlockShape = (1, 2, 3)
41
42 ololo = [(1, 2), (3, 4)]
43 size_1 = len(ololo)
44 desc.m_Crops = ololo
45
46 assert size_1 == len(ololo)
47 desc.m_DataLayout = ann.DataLayout_NHWC
48 assert ann.DataLayout_NHWC == desc.m_DataLayout
49 assert [1, 2, 3] == desc.m_BlockShape
50 assert [(1, 2), (3, 4)] == desc.m_Crops
51
52
53@pytest.mark.parametrize("input_shape, value, vtype", [([-1], -1, 'int'), (("one", "two"), "'one'", 'str'),
54 ([1.33, 4.55], 1.33, 'float'),
55 ([{1: "one"}], "{1: 'one'}", 'dict')], ids=lambda x: str(x))
56def test_batchtospacend_descriptor_rubbish_assignment_shape(input_shape, value, vtype):
57 desc = ann.BatchToSpaceNdDescriptor()
58 with pytest.raises(TypeError) as err:
59 desc.m_BlockShape = input_shape
60
61 assert "Failed to convert python input value {} of type '{}' to C type 'j'".format(value, vtype) in str(err.value)
62
63
64@pytest.mark.parametrize("input_crops, value, vtype", [([(1, 2), (3, 4, 5)], '(3, 4, 5)', 'tuple'),
65 ([(1, 'one')], "(1, 'one')", 'tuple'),
66 ([-1], -1, 'int'),
67 ([(1, (1, 2))], '(1, (1, 2))', 'tuple'),
68 ([[1, [1, 2]]], '[1, [1, 2]]', 'list')
69 ], ids=lambda x: str(x))
70def test_batchtospacend_descriptor_rubbish_assignment_crops(input_crops, value, vtype):
71 desc = ann.BatchToSpaceNdDescriptor()
72 with pytest.raises(TypeError) as err:
73 desc.m_Crops = input_crops
74
75 assert "Failed to convert python input value {} of type '{}' to C type".format(value, vtype) in str(err.value)
76
77
78def test_batchtospacend_descriptor_empty_assignment():
79 desc = ann.BatchToSpaceNdDescriptor()
80 desc.m_BlockShape = []
81 assert [] == desc.m_BlockShape
82
83
84def test_batchtospacend_descriptor_ctor():
85 desc = ann.BatchToSpaceNdDescriptor([1, 2, 3], [(4, 5), (6, 7)])
86 assert desc.m_DataLayout == ann.DataLayout_NCHW
87 assert [1, 2, 3] == desc.m_BlockShape
88 assert [(4, 5), (6, 7)] == desc.m_Crops
89
90
91def test_convolution2d_descriptor_default_values():
92 desc = ann.Convolution2dDescriptor()
93 assert desc.m_PadLeft == 0
94 assert desc.m_PadTop == 0
95 assert desc.m_PadRight == 0
96 assert desc.m_PadBottom == 0
Teresa Charlinf2ed1b82020-11-24 15:11:54 +000097 assert desc.m_StrideX == 1
98 assert desc.m_StrideY == 1
Richard Burtondc0c6ed2020-04-08 16:39:05 +010099 assert desc.m_DilationX == 1
100 assert desc.m_DilationY == 1
101 assert desc.m_BiasEnabled == False
102 assert desc.m_DataLayout == ann.DataLayout_NCHW
103
104
105def test_depthtospace_descriptor_default_values():
106 desc = ann.DepthToSpaceDescriptor()
107 assert desc.m_BlockSize == 1
108 assert desc.m_DataLayout == ann.DataLayout_NHWC
109
110
111def test_depthwise_convolution2d_descriptor_default_values():
112 desc = ann.DepthwiseConvolution2dDescriptor()
113 assert desc.m_PadLeft == 0
114 assert desc.m_PadTop == 0
115 assert desc.m_PadRight == 0
116 assert desc.m_PadBottom == 0
Teresa Charlinf2ed1b82020-11-24 15:11:54 +0000117 assert desc.m_StrideX == 1
118 assert desc.m_StrideY == 1
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100119 assert desc.m_DilationX == 1
120 assert desc.m_DilationY == 1
121 assert desc.m_BiasEnabled == False
122 assert desc.m_DataLayout == ann.DataLayout_NCHW
123
124
125def test_detectionpostprocess_descriptor_default_values():
126 desc = ann.DetectionPostProcessDescriptor()
127 assert desc.m_MaxDetections == 0
128 assert desc.m_MaxClassesPerDetection == 1
129 assert desc.m_DetectionsPerClass == 1
130 assert desc.m_NmsScoreThreshold == 0
131 assert desc.m_NmsIouThreshold == 0
132 assert desc.m_NumClasses == 0
133 assert desc.m_UseRegularNms == False
134 assert desc.m_ScaleH == 0
135 assert desc.m_ScaleW == 0
136 assert desc.m_ScaleX == 0
137 assert desc.m_ScaleY == 0
138
139
140def test_fakequantization_descriptor_default_values():
141 desc = ann.FakeQuantizationDescriptor()
142 np.allclose(6, desc.m_Max)
143 np.allclose(-6, desc.m_Min)
144
145
Jan Eilers841aca12020-08-12 14:59:06 +0100146def test_fill_descriptor_default_values():
147 desc = ann.FillDescriptor()
148 np.allclose(0, desc.m_Value)
149
150
151def test_gather_descriptor_default_values():
152 desc = ann.GatherDescriptor()
153 assert desc.m_Axis == 0
154
155
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100156def test_fully_connected_descriptor_default_values():
157 desc = ann.FullyConnectedDescriptor()
158 assert desc.m_BiasEnabled == False
159 assert desc.m_TransposeWeightMatrix == False
160
161
162def test_instancenormalization_descriptor_default_values():
163 desc = ann.InstanceNormalizationDescriptor()
164 assert desc.m_Gamma == 1
165 assert desc.m_Beta == 0
166 assert desc.m_DataLayout == ann.DataLayout_NCHW
167 np.allclose(1e-12, desc.m_Eps)
168
169
170def test_lstm_descriptor_default_values():
171 desc = ann.LstmDescriptor()
172 assert desc.m_ActivationFunc == 1
173 assert desc.m_ClippingThresCell == 0
174 assert desc.m_ClippingThresProj == 0
175 assert desc.m_CifgEnabled == True
176 assert desc.m_PeepholeEnabled == False
177 assert desc.m_ProjectionEnabled == False
178 assert desc.m_LayerNormEnabled == False
179
180
181def test_l2normalization_descriptor_default_values():
182 desc = ann.L2NormalizationDescriptor()
183 assert desc.m_DataLayout == ann.DataLayout_NCHW
184 np.allclose(1e-12, desc.m_Eps)
185
186
187def test_mean_descriptor_default_values():
188 desc = ann.MeanDescriptor()
189 assert desc.m_KeepDims == False
190
191
192def test_normalization_descriptor_default_values():
193 desc = ann.NormalizationDescriptor()
194 assert desc.m_NormChannelType == ann.NormalizationAlgorithmChannel_Across
195 assert desc.m_NormMethodType == ann.NormalizationAlgorithmMethod_LocalBrightness
196 assert desc.m_NormSize == 0
197 assert desc.m_Alpha == 0
198 assert desc.m_Beta == 0
199 assert desc.m_K == 0
200 assert desc.m_DataLayout == ann.DataLayout_NCHW
201
202
203def test_origin_descriptor_default_values():
204 desc = ann.ConcatDescriptor()
205 assert 0 == desc.GetNumViews()
206 assert 0 == desc.GetNumDimensions()
207 assert 1 == desc.GetConcatAxis()
208
209
210def test_origin_descriptor_incorrect_views():
211 desc = ann.ConcatDescriptor(2, 2)
212 with pytest.raises(RuntimeError) as err:
213 desc.SetViewOriginCoord(1000, 100, 1000)
214 assert "Failed to set view origin coordinates." in str(err.value)
215
216
217def test_origin_descriptor_ctor():
218 desc = ann.ConcatDescriptor(2, 2)
219 value = 5
220 for i in range(desc.GetNumViews()):
221 for j in range(desc.GetNumDimensions()):
222 desc.SetViewOriginCoord(i, j, value+i)
223 desc.SetConcatAxis(1)
224
225 assert 2 == desc.GetNumViews()
226 assert 2 == desc.GetNumDimensions()
227 assert [5, 5] == desc.GetViewOrigin(0)
228 assert [6, 6] == desc.GetViewOrigin(1)
229 assert 1 == desc.GetConcatAxis()
230
231
232def test_pad_descriptor_default_values():
233 desc = ann.PadDescriptor()
234 assert desc.m_PadValue == 0
235
236
237def test_permute_descriptor_default_values():
238 pv = ann.PermutationVector((0, 2, 3, 1))
239 desc = ann.PermuteDescriptor(pv)
240 assert desc.m_DimMappings.GetSize() == 4
241 assert desc.m_DimMappings[0] == 0
242 assert desc.m_DimMappings[1] == 2
243 assert desc.m_DimMappings[2] == 3
244 assert desc.m_DimMappings[3] == 1
245
246
247def test_pooling_descriptor_default_values():
248 desc = ann.Pooling2dDescriptor()
249 assert desc.m_PoolType == ann.PoolingAlgorithm_Max
250 assert desc.m_PadLeft == 0
251 assert desc.m_PadTop == 0
252 assert desc.m_PadRight == 0
253 assert desc.m_PadBottom == 0
254 assert desc.m_PoolHeight == 0
255 assert desc.m_PoolWidth == 0
256 assert desc.m_StrideX == 0
257 assert desc.m_StrideY == 0
258 assert desc.m_OutputShapeRounding == ann.OutputShapeRounding_Floor
259 assert desc.m_PaddingMethod == ann.PaddingMethod_Exclude
260 assert desc.m_DataLayout == ann.DataLayout_NCHW
261
262
263def test_reshape_descriptor_default_values():
264 desc = ann.ReshapeDescriptor()
265 # check the empty Targetshape
266 assert desc.m_TargetShape.GetNumDimensions() == 0
267
268
269def test_slice_descriptor_default_values():
270 desc = ann.SliceDescriptor()
271 assert desc.m_TargetWidth == 0
272 assert desc.m_TargetHeight == 0
273 assert desc.m_Method == ann.ResizeMethod_NearestNeighbor
274 assert desc.m_DataLayout == ann.DataLayout_NCHW
275
276
277def test_resize_descriptor_default_values():
278 desc = ann.ResizeDescriptor()
279 assert desc.m_TargetWidth == 0
280 assert desc.m_TargetHeight == 0
281 assert desc.m_Method == ann.ResizeMethod_NearestNeighbor
282 assert desc.m_DataLayout == ann.DataLayout_NCHW
Kevin May1c6e9762020-06-03 16:05:00 +0100283 assert desc.m_AlignCorners == False
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100284
285
286def test_spacetobatchnd_descriptor_default_values():
287 desc = ann.SpaceToBatchNdDescriptor()
288 assert desc.m_DataLayout == ann.DataLayout_NCHW
289
290
291def test_spacetodepth_descriptor_default_values():
292 desc = ann.SpaceToDepthDescriptor()
293 assert desc.m_BlockSize == 1
294 assert desc.m_DataLayout == ann.DataLayout_NHWC
295
296
297def test_stack_descriptor_default_values():
298 desc = ann.StackDescriptor()
299 assert desc.m_Axis == 0
300 assert desc.m_NumInputs == 0
301 # check the empty Inputshape
302 assert desc.m_InputShape.GetNumDimensions() == 0
303
304
305def test_slice_descriptor_default_values():
306 desc = ann.SliceDescriptor()
307 desc.m_Begin = [1, 2, 3, 4, 5]
308 desc.m_Size = (1, 2, 3, 4)
309
310 assert [1, 2, 3, 4, 5] == desc.m_Begin
311 assert [1, 2, 3, 4] == desc.m_Size
312
313
314def test_slice_descriptor_ctor():
315 desc = ann.SliceDescriptor([1, 2, 3, 4, 5], (1, 2, 3, 4))
316
317 assert [1, 2, 3, 4, 5] == desc.m_Begin
318 assert [1, 2, 3, 4] == desc.m_Size
319
320
321def test_strided_slice_descriptor_default_values():
322 desc = ann.StridedSliceDescriptor()
323 desc.m_Begin = [1, 2, 3, 4, 5]
324 desc.m_End = [6, 7, 8, 9, 10]
325 desc.m_Stride = (10, 10)
326 desc.m_BeginMask = 1
327 desc.m_EndMask = 2
328 desc.m_ShrinkAxisMask = 3
329 desc.m_EllipsisMask = 4
330 desc.m_NewAxisMask = 5
331
332 assert [1, 2, 3, 4, 5] == desc.m_Begin
333 assert [6, 7, 8, 9, 10] == desc.m_End
334 assert [10, 10] == desc.m_Stride
335 assert 1 == desc.m_BeginMask
336 assert 2 == desc.m_EndMask
337 assert 3 == desc.m_ShrinkAxisMask
338 assert 4 == desc.m_EllipsisMask
339 assert 5 == desc.m_NewAxisMask
340
341
342def test_strided_slice_descriptor_ctor():
343 desc = ann.StridedSliceDescriptor([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], (10, 10))
344 desc.m_Begin = [1, 2, 3, 4, 5]
345 desc.m_End = [6, 7, 8, 9, 10]
346 desc.m_Stride = (10, 10)
347
348 assert [1, 2, 3, 4, 5] == desc.m_Begin
349 assert [6, 7, 8, 9, 10] == desc.m_End
350 assert [10, 10] == desc.m_Stride
351
352
353def test_softmax_descriptor_default_values():
354 desc = ann.SoftmaxDescriptor()
355 assert desc.m_Axis == -1
356 np.allclose(1.0, desc.m_Beta)
357
358
359def test_space_to_batch_nd_descriptor_default_values():
360 desc = ann.SpaceToBatchNdDescriptor()
361 assert [1, 1] == desc.m_BlockShape
362 assert [(0, 0), (0, 0)] == desc.m_PadList
363 assert ann.DataLayout_NCHW == desc.m_DataLayout
364
365
366def test_space_to_batch_nd_descriptor_assigned_values():
367 desc = ann.SpaceToBatchNdDescriptor()
368 desc.m_BlockShape = (90, 100)
369 desc.m_PadList = [(1, 2), (3, 4)]
370 assert [90, 100] == desc.m_BlockShape
371 assert [(1, 2), (3, 4)] == desc.m_PadList
372 assert ann.DataLayout_NCHW == desc.m_DataLayout
373
374
375def test_space_to_batch_nd_descriptor_ctor():
376 desc = ann.SpaceToBatchNdDescriptor((1, 2, 3), [(1, 2), (3, 4)])
377 assert [1, 2, 3] == desc.m_BlockShape
378 assert [(1, 2), (3, 4)] == desc.m_PadList
379 assert ann.DataLayout_NCHW == desc.m_DataLayout
380
381
382def test_transpose_convolution2d_descriptor_default_values():
Jan Eilers841aca12020-08-12 14:59:06 +0100383 desc = ann.TransposeConvolution2dDescriptor()
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100384 assert desc.m_PadLeft == 0
385 assert desc.m_PadTop == 0
386 assert desc.m_PadRight == 0
387 assert desc.m_PadBottom == 0
388 assert desc.m_StrideX == 0
389 assert desc.m_StrideY == 0
390 assert desc.m_BiasEnabled == False
391 assert desc.m_DataLayout == ann.DataLayout_NCHW
Jan Eilers841aca12020-08-12 14:59:06 +0100392 assert desc.m_OutputShapeEnabled == False
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100393
394
395def test_view_descriptor_default_values():
396 desc = ann.SplitterDescriptor()
397 assert 0 == desc.GetNumViews()
398 assert 0 == desc.GetNumDimensions()
399
400
401def test_elementwise_unary_descriptor_default_values():
402 desc = ann.ElementwiseUnaryDescriptor()
403 assert desc.m_Operation == ann.UnaryOperation_Abs
404
405
406def test_view_descriptor_incorrect_input():
407 desc = ann.SplitterDescriptor(2, 3)
408 with pytest.raises(RuntimeError) as err:
409 desc.SetViewOriginCoord(1000, 100, 1000)
410 assert "Failed to set view origin coordinates." in str(err.value)
411
412 with pytest.raises(RuntimeError) as err:
413 desc.SetViewSize(1000, 100, 1000)
414 assert "Failed to set view size." in str(err.value)
415
416
417def test_view_descriptor_ctor():
418 desc = ann.SplitterDescriptor(2, 3)
419 value_size = 1
420 value_orig_coord = 5
421 for i in range(desc.GetNumViews()):
422 for j in range(desc.GetNumDimensions()):
423 desc.SetViewOriginCoord(i, j, value_orig_coord+i)
424 desc.SetViewSize(i, j, value_size+i)
425
426 assert 2 == desc.GetNumViews()
427 assert 3 == desc.GetNumDimensions()
428 assert [5, 5] == desc.GetViewOrigin(0)
429 assert [6, 6] == desc.GetViewOrigin(1)
430 assert [1, 1] == desc.GetViewSizes(0)
431 assert [2, 2] == desc.GetViewSizes(1)
432
433
434def test_createdescriptorforconcatenation_ctor():
435 input_shape_vector = [ann.TensorShape((2, 1)), ann.TensorShape((3, 1)), ann.TensorShape((4, 1))]
436 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
437 assert 3 == desc.GetNumViews()
438 assert 0 == desc.GetConcatAxis()
439 assert 2 == desc.GetNumDimensions()
440 c = desc.GetViewOrigin(1)
441 d = desc.GetViewOrigin(0)
442
443
444def test_createdescriptorforconcatenation_wrong_shape_for_axis():
445 input_shape_vector = [ann.TensorShape((1, 2)), ann.TensorShape((3, 4)), ann.TensorShape((5, 6))]
446 with pytest.raises(RuntimeError) as err:
447 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
448
449 assert "All inputs to concatenation must be the same size along all dimensions except the concatenation dimension" in str(
450 err.value)
451
452
453@pytest.mark.parametrize("input_shape_vector", [([-1, "one"]),
454 ([1.33, 4.55]),
455 ([{1: "one"}])], ids=lambda x: str(x))
456def test_createdescriptorforconcatenation_rubbish_assignment_shape_vector(input_shape_vector):
457 with pytest.raises(TypeError) as err:
458 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
459
460 assert "in method 'CreateDescriptorForConcatenation', argument 1 of type 'std::vector< armnn::TensorShape,std::allocator< armnn::TensorShape > >'" in str(
461 err.value)
462
463
464generated_classes = inspect.getmembers(generated, inspect.isclass)
465generated_classes_names = list(map(lambda x: x[0], generated_classes))
466@pytest.mark.parametrize("desc_name", ['ActivationDescriptor',
467 'ArgMinMaxDescriptor',
468 'PermuteDescriptor',
469 'SoftmaxDescriptor',
470 'ConcatDescriptor',
471 'SplitterDescriptor',
472 'Pooling2dDescriptor',
473 'FullyConnectedDescriptor',
474 'Convolution2dDescriptor',
475 'DepthwiseConvolution2dDescriptor',
476 'DetectionPostProcessDescriptor',
477 'NormalizationDescriptor',
478 'L2NormalizationDescriptor',
479 'BatchNormalizationDescriptor',
480 'InstanceNormalizationDescriptor',
481 'BatchToSpaceNdDescriptor',
482 'FakeQuantizationDescriptor',
483 'ResizeDescriptor',
484 'ReshapeDescriptor',
485 'SpaceToBatchNdDescriptor',
486 'SpaceToDepthDescriptor',
487 'LstmDescriptor',
488 'MeanDescriptor',
489 'PadDescriptor',
490 'SliceDescriptor',
491 'StackDescriptor',
492 'StridedSliceDescriptor',
493 'TransposeConvolution2dDescriptor',
Jan Eilers841aca12020-08-12 14:59:06 +0100494 'ElementwiseUnaryDescriptor',
495 'FillDescriptor',
496 'GatherDescriptor'])
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100497class TestDescriptorMassChecks:
498
499 def test_desc_implemented(self, desc_name):
500 assert desc_name in generated_classes_names
501
502 def test_desc_equal(self, desc_name):
503 desc_class = next(filter(lambda x: x[0] == desc_name, generated_classes))[1]
504
505 assert desc_class() == desc_class()
506
507
508generated_classes = inspect.getmembers(generated, inspect.isclass)
509generated_classes_names = list(map(lambda x: x[0], generated_classes))
510@pytest.mark.parametrize("desc_name", ['ActivationDescriptor',
511 'ArgMinMaxDescriptor',
512 'PermuteDescriptor',
513 'SoftmaxDescriptor',
514 'ConcatDescriptor',
515 'SplitterDescriptor',
516 'Pooling2dDescriptor',
517 'FullyConnectedDescriptor',
518 'Convolution2dDescriptor',
519 'DepthwiseConvolution2dDescriptor',
520 'DetectionPostProcessDescriptor',
521 'NormalizationDescriptor',
522 'L2NormalizationDescriptor',
523 'BatchNormalizationDescriptor',
524 'InstanceNormalizationDescriptor',
525 'BatchToSpaceNdDescriptor',
526 'FakeQuantizationDescriptor',
527 'ResizeDescriptor',
528 'ReshapeDescriptor',
529 'SpaceToBatchNdDescriptor',
530 'SpaceToDepthDescriptor',
531 'LstmDescriptor',
532 'MeanDescriptor',
533 'PadDescriptor',
534 'SliceDescriptor',
535 'StackDescriptor',
536 'StridedSliceDescriptor',
537 'TransposeConvolution2dDescriptor',
Jan Eilers841aca12020-08-12 14:59:06 +0100538 'ElementwiseUnaryDescriptor',
539 'FillDescriptor',
540 'GatherDescriptor'])
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100541class TestDescriptorMassChecks:
542
543 def test_desc_implemented(self, desc_name):
544 assert desc_name in generated_classes_names
545
546 def test_desc_equal(self, desc_name):
547 desc_class = next(filter(lambda x: x[0] == desc_name, generated_classes))[1]
548
549 assert desc_class() == desc_class()
550