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