• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 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_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
156def 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
283    assert desc.m_AlignCorners == False
284
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():
383    desc = ann.TransposeConvolution2dDescriptor()
384    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
392    assert desc.m_OutputShapeEnabled == False
393
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',
494                                       'ElementwiseUnaryDescriptor',
495                                       'FillDescriptor',
496                                       'GatherDescriptor'])
497class 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',
538                                       'ElementwiseUnaryDescriptor',
539                                       'FillDescriptor',
540                                       'GatherDescriptor'])
541class 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
551