blob: 6d49747d5a328b56b1dd1a971cad3c31005d6174 [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
97 assert desc.m_StrideX == 0
98 assert desc.m_StrideY == 0
99 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
117 assert desc.m_StrideX == 0
118 assert desc.m_StrideY == 0
119 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
146def test_fully_connected_descriptor_default_values():
147 desc = ann.FullyConnectedDescriptor()
148 assert desc.m_BiasEnabled == False
149 assert desc.m_TransposeWeightMatrix == False
150
151
152def test_instancenormalization_descriptor_default_values():
153 desc = ann.InstanceNormalizationDescriptor()
154 assert desc.m_Gamma == 1
155 assert desc.m_Beta == 0
156 assert desc.m_DataLayout == ann.DataLayout_NCHW
157 np.allclose(1e-12, desc.m_Eps)
158
159
160def test_lstm_descriptor_default_values():
161 desc = ann.LstmDescriptor()
162 assert desc.m_ActivationFunc == 1
163 assert desc.m_ClippingThresCell == 0
164 assert desc.m_ClippingThresProj == 0
165 assert desc.m_CifgEnabled == True
166 assert desc.m_PeepholeEnabled == False
167 assert desc.m_ProjectionEnabled == False
168 assert desc.m_LayerNormEnabled == False
169
170
171def test_l2normalization_descriptor_default_values():
172 desc = ann.L2NormalizationDescriptor()
173 assert desc.m_DataLayout == ann.DataLayout_NCHW
174 np.allclose(1e-12, desc.m_Eps)
175
176
177def test_mean_descriptor_default_values():
178 desc = ann.MeanDescriptor()
179 assert desc.m_KeepDims == False
180
181
182def test_normalization_descriptor_default_values():
183 desc = ann.NormalizationDescriptor()
184 assert desc.m_NormChannelType == ann.NormalizationAlgorithmChannel_Across
185 assert desc.m_NormMethodType == ann.NormalizationAlgorithmMethod_LocalBrightness
186 assert desc.m_NormSize == 0
187 assert desc.m_Alpha == 0
188 assert desc.m_Beta == 0
189 assert desc.m_K == 0
190 assert desc.m_DataLayout == ann.DataLayout_NCHW
191
192
193def test_origin_descriptor_default_values():
194 desc = ann.ConcatDescriptor()
195 assert 0 == desc.GetNumViews()
196 assert 0 == desc.GetNumDimensions()
197 assert 1 == desc.GetConcatAxis()
198
199
200def test_origin_descriptor_incorrect_views():
201 desc = ann.ConcatDescriptor(2, 2)
202 with pytest.raises(RuntimeError) as err:
203 desc.SetViewOriginCoord(1000, 100, 1000)
204 assert "Failed to set view origin coordinates." in str(err.value)
205
206
207def test_origin_descriptor_ctor():
208 desc = ann.ConcatDescriptor(2, 2)
209 value = 5
210 for i in range(desc.GetNumViews()):
211 for j in range(desc.GetNumDimensions()):
212 desc.SetViewOriginCoord(i, j, value+i)
213 desc.SetConcatAxis(1)
214
215 assert 2 == desc.GetNumViews()
216 assert 2 == desc.GetNumDimensions()
217 assert [5, 5] == desc.GetViewOrigin(0)
218 assert [6, 6] == desc.GetViewOrigin(1)
219 assert 1 == desc.GetConcatAxis()
220
221
222def test_pad_descriptor_default_values():
223 desc = ann.PadDescriptor()
224 assert desc.m_PadValue == 0
225
226
227def test_permute_descriptor_default_values():
228 pv = ann.PermutationVector((0, 2, 3, 1))
229 desc = ann.PermuteDescriptor(pv)
230 assert desc.m_DimMappings.GetSize() == 4
231 assert desc.m_DimMappings[0] == 0
232 assert desc.m_DimMappings[1] == 2
233 assert desc.m_DimMappings[2] == 3
234 assert desc.m_DimMappings[3] == 1
235
236
237def test_pooling_descriptor_default_values():
238 desc = ann.Pooling2dDescriptor()
239 assert desc.m_PoolType == ann.PoolingAlgorithm_Max
240 assert desc.m_PadLeft == 0
241 assert desc.m_PadTop == 0
242 assert desc.m_PadRight == 0
243 assert desc.m_PadBottom == 0
244 assert desc.m_PoolHeight == 0
245 assert desc.m_PoolWidth == 0
246 assert desc.m_StrideX == 0
247 assert desc.m_StrideY == 0
248 assert desc.m_OutputShapeRounding == ann.OutputShapeRounding_Floor
249 assert desc.m_PaddingMethod == ann.PaddingMethod_Exclude
250 assert desc.m_DataLayout == ann.DataLayout_NCHW
251
252
253def test_reshape_descriptor_default_values():
254 desc = ann.ReshapeDescriptor()
255 # check the empty Targetshape
256 assert desc.m_TargetShape.GetNumDimensions() == 0
257
258
259def test_slice_descriptor_default_values():
260 desc = ann.SliceDescriptor()
261 assert desc.m_TargetWidth == 0
262 assert desc.m_TargetHeight == 0
263 assert desc.m_Method == ann.ResizeMethod_NearestNeighbor
264 assert desc.m_DataLayout == ann.DataLayout_NCHW
265
266
267def test_resize_descriptor_default_values():
268 desc = ann.ResizeDescriptor()
269 assert desc.m_TargetWidth == 0
270 assert desc.m_TargetHeight == 0
271 assert desc.m_Method == ann.ResizeMethod_NearestNeighbor
272 assert desc.m_DataLayout == ann.DataLayout_NCHW
Kevin May1c6e9762020-06-03 16:05:00 +0100273 assert desc.m_AlignCorners == False
Richard Burtondc0c6ed2020-04-08 16:39:05 +0100274
275
276def test_spacetobatchnd_descriptor_default_values():
277 desc = ann.SpaceToBatchNdDescriptor()
278 assert desc.m_DataLayout == ann.DataLayout_NCHW
279
280
281def test_spacetodepth_descriptor_default_values():
282 desc = ann.SpaceToDepthDescriptor()
283 assert desc.m_BlockSize == 1
284 assert desc.m_DataLayout == ann.DataLayout_NHWC
285
286
287def test_stack_descriptor_default_values():
288 desc = ann.StackDescriptor()
289 assert desc.m_Axis == 0
290 assert desc.m_NumInputs == 0
291 # check the empty Inputshape
292 assert desc.m_InputShape.GetNumDimensions() == 0
293
294
295def test_slice_descriptor_default_values():
296 desc = ann.SliceDescriptor()
297 desc.m_Begin = [1, 2, 3, 4, 5]
298 desc.m_Size = (1, 2, 3, 4)
299
300 assert [1, 2, 3, 4, 5] == desc.m_Begin
301 assert [1, 2, 3, 4] == desc.m_Size
302
303
304def test_slice_descriptor_ctor():
305 desc = ann.SliceDescriptor([1, 2, 3, 4, 5], (1, 2, 3, 4))
306
307 assert [1, 2, 3, 4, 5] == desc.m_Begin
308 assert [1, 2, 3, 4] == desc.m_Size
309
310
311def test_strided_slice_descriptor_default_values():
312 desc = ann.StridedSliceDescriptor()
313 desc.m_Begin = [1, 2, 3, 4, 5]
314 desc.m_End = [6, 7, 8, 9, 10]
315 desc.m_Stride = (10, 10)
316 desc.m_BeginMask = 1
317 desc.m_EndMask = 2
318 desc.m_ShrinkAxisMask = 3
319 desc.m_EllipsisMask = 4
320 desc.m_NewAxisMask = 5
321
322 assert [1, 2, 3, 4, 5] == desc.m_Begin
323 assert [6, 7, 8, 9, 10] == desc.m_End
324 assert [10, 10] == desc.m_Stride
325 assert 1 == desc.m_BeginMask
326 assert 2 == desc.m_EndMask
327 assert 3 == desc.m_ShrinkAxisMask
328 assert 4 == desc.m_EllipsisMask
329 assert 5 == desc.m_NewAxisMask
330
331
332def test_strided_slice_descriptor_ctor():
333 desc = ann.StridedSliceDescriptor([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], (10, 10))
334 desc.m_Begin = [1, 2, 3, 4, 5]
335 desc.m_End = [6, 7, 8, 9, 10]
336 desc.m_Stride = (10, 10)
337
338 assert [1, 2, 3, 4, 5] == desc.m_Begin
339 assert [6, 7, 8, 9, 10] == desc.m_End
340 assert [10, 10] == desc.m_Stride
341
342
343def test_softmax_descriptor_default_values():
344 desc = ann.SoftmaxDescriptor()
345 assert desc.m_Axis == -1
346 np.allclose(1.0, desc.m_Beta)
347
348
349def test_space_to_batch_nd_descriptor_default_values():
350 desc = ann.SpaceToBatchNdDescriptor()
351 assert [1, 1] == desc.m_BlockShape
352 assert [(0, 0), (0, 0)] == desc.m_PadList
353 assert ann.DataLayout_NCHW == desc.m_DataLayout
354
355
356def test_space_to_batch_nd_descriptor_assigned_values():
357 desc = ann.SpaceToBatchNdDescriptor()
358 desc.m_BlockShape = (90, 100)
359 desc.m_PadList = [(1, 2), (3, 4)]
360 assert [90, 100] == desc.m_BlockShape
361 assert [(1, 2), (3, 4)] == desc.m_PadList
362 assert ann.DataLayout_NCHW == desc.m_DataLayout
363
364
365def test_space_to_batch_nd_descriptor_ctor():
366 desc = ann.SpaceToBatchNdDescriptor((1, 2, 3), [(1, 2), (3, 4)])
367 assert [1, 2, 3] == desc.m_BlockShape
368 assert [(1, 2), (3, 4)] == desc.m_PadList
369 assert ann.DataLayout_NCHW == desc.m_DataLayout
370
371
372def test_transpose_convolution2d_descriptor_default_values():
373 desc = ann.DepthwiseConvolution2dDescriptor()
374 assert desc.m_PadLeft == 0
375 assert desc.m_PadTop == 0
376 assert desc.m_PadRight == 0
377 assert desc.m_PadBottom == 0
378 assert desc.m_StrideX == 0
379 assert desc.m_StrideY == 0
380 assert desc.m_BiasEnabled == False
381 assert desc.m_DataLayout == ann.DataLayout_NCHW
382
383
384def test_view_descriptor_default_values():
385 desc = ann.SplitterDescriptor()
386 assert 0 == desc.GetNumViews()
387 assert 0 == desc.GetNumDimensions()
388
389
390def test_elementwise_unary_descriptor_default_values():
391 desc = ann.ElementwiseUnaryDescriptor()
392 assert desc.m_Operation == ann.UnaryOperation_Abs
393
394
395def test_view_descriptor_incorrect_input():
396 desc = ann.SplitterDescriptor(2, 3)
397 with pytest.raises(RuntimeError) as err:
398 desc.SetViewOriginCoord(1000, 100, 1000)
399 assert "Failed to set view origin coordinates." in str(err.value)
400
401 with pytest.raises(RuntimeError) as err:
402 desc.SetViewSize(1000, 100, 1000)
403 assert "Failed to set view size." in str(err.value)
404
405
406def test_view_descriptor_ctor():
407 desc = ann.SplitterDescriptor(2, 3)
408 value_size = 1
409 value_orig_coord = 5
410 for i in range(desc.GetNumViews()):
411 for j in range(desc.GetNumDimensions()):
412 desc.SetViewOriginCoord(i, j, value_orig_coord+i)
413 desc.SetViewSize(i, j, value_size+i)
414
415 assert 2 == desc.GetNumViews()
416 assert 3 == desc.GetNumDimensions()
417 assert [5, 5] == desc.GetViewOrigin(0)
418 assert [6, 6] == desc.GetViewOrigin(1)
419 assert [1, 1] == desc.GetViewSizes(0)
420 assert [2, 2] == desc.GetViewSizes(1)
421
422
423def test_createdescriptorforconcatenation_ctor():
424 input_shape_vector = [ann.TensorShape((2, 1)), ann.TensorShape((3, 1)), ann.TensorShape((4, 1))]
425 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
426 assert 3 == desc.GetNumViews()
427 assert 0 == desc.GetConcatAxis()
428 assert 2 == desc.GetNumDimensions()
429 c = desc.GetViewOrigin(1)
430 d = desc.GetViewOrigin(0)
431
432
433def test_createdescriptorforconcatenation_wrong_shape_for_axis():
434 input_shape_vector = [ann.TensorShape((1, 2)), ann.TensorShape((3, 4)), ann.TensorShape((5, 6))]
435 with pytest.raises(RuntimeError) as err:
436 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
437
438 assert "All inputs to concatenation must be the same size along all dimensions except the concatenation dimension" in str(
439 err.value)
440
441
442@pytest.mark.parametrize("input_shape_vector", [([-1, "one"]),
443 ([1.33, 4.55]),
444 ([{1: "one"}])], ids=lambda x: str(x))
445def test_createdescriptorforconcatenation_rubbish_assignment_shape_vector(input_shape_vector):
446 with pytest.raises(TypeError) as err:
447 desc = ann.CreateDescriptorForConcatenation(input_shape_vector, 0)
448
449 assert "in method 'CreateDescriptorForConcatenation', argument 1 of type 'std::vector< armnn::TensorShape,std::allocator< armnn::TensorShape > >'" in str(
450 err.value)
451
452
453generated_classes = inspect.getmembers(generated, inspect.isclass)
454generated_classes_names = list(map(lambda x: x[0], generated_classes))
455@pytest.mark.parametrize("desc_name", ['ActivationDescriptor',
456 'ArgMinMaxDescriptor',
457 'PermuteDescriptor',
458 'SoftmaxDescriptor',
459 'ConcatDescriptor',
460 'SplitterDescriptor',
461 'Pooling2dDescriptor',
462 'FullyConnectedDescriptor',
463 'Convolution2dDescriptor',
464 'DepthwiseConvolution2dDescriptor',
465 'DetectionPostProcessDescriptor',
466 'NormalizationDescriptor',
467 'L2NormalizationDescriptor',
468 'BatchNormalizationDescriptor',
469 'InstanceNormalizationDescriptor',
470 'BatchToSpaceNdDescriptor',
471 'FakeQuantizationDescriptor',
472 'ResizeDescriptor',
473 'ReshapeDescriptor',
474 'SpaceToBatchNdDescriptor',
475 'SpaceToDepthDescriptor',
476 'LstmDescriptor',
477 'MeanDescriptor',
478 'PadDescriptor',
479 'SliceDescriptor',
480 'StackDescriptor',
481 'StridedSliceDescriptor',
482 'TransposeConvolution2dDescriptor',
483 'ElementwiseUnaryDescriptor'])
484class TestDescriptorMassChecks:
485
486 def test_desc_implemented(self, desc_name):
487 assert desc_name in generated_classes_names
488
489 def test_desc_equal(self, desc_name):
490 desc_class = next(filter(lambda x: x[0] == desc_name, generated_classes))[1]
491
492 assert desc_class() == desc_class()
493
494
495generated_classes = inspect.getmembers(generated, inspect.isclass)
496generated_classes_names = list(map(lambda x: x[0], generated_classes))
497@pytest.mark.parametrize("desc_name", ['ActivationDescriptor',
498 'ArgMinMaxDescriptor',
499 'PermuteDescriptor',
500 'SoftmaxDescriptor',
501 'ConcatDescriptor',
502 'SplitterDescriptor',
503 'Pooling2dDescriptor',
504 'FullyConnectedDescriptor',
505 'Convolution2dDescriptor',
506 'DepthwiseConvolution2dDescriptor',
507 'DetectionPostProcessDescriptor',
508 'NormalizationDescriptor',
509 'L2NormalizationDescriptor',
510 'BatchNormalizationDescriptor',
511 'InstanceNormalizationDescriptor',
512 'BatchToSpaceNdDescriptor',
513 'FakeQuantizationDescriptor',
514 'ResizeDescriptor',
515 'ReshapeDescriptor',
516 'SpaceToBatchNdDescriptor',
517 'SpaceToDepthDescriptor',
518 'LstmDescriptor',
519 'MeanDescriptor',
520 'PadDescriptor',
521 'SliceDescriptor',
522 'StackDescriptor',
523 'StridedSliceDescriptor',
524 'TransposeConvolution2dDescriptor',
525 'ElementwiseUnaryDescriptor'])
526class TestDescriptorMassChecks:
527
528 def test_desc_implemented(self, desc_name):
529 assert desc_name in generated_classes_names
530
531 def test_desc_equal(self, desc_name):
532 desc_class = next(filter(lambda x: x[0] == desc_name, generated_classes))[1]
533
534 assert desc_class() == desc_class()
535