| // | |
| // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. | |
| // SPDX-License-Identifier: MIT | |
| // | |
| #include "PadTestHelper.hpp" | |
| #include <armnn_delegate.hpp> | |
| #include <flatbuffers/flatbuffers.h> | |
| #include <tensorflow/lite/schema/schema_generated.h> | |
| #include <doctest/doctest.h> | |
| namespace armnnDelegate | |
| { | |
| void Pad2dTest(std::vector<armnn::BackendId>& backends, | |
| tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD, | |
| float pad = 0.0f) | |
| { | |
| // Set input data | |
| std::vector<int32_t> inputShape { 2, 2, 2 }; | |
| std::vector<int32_t> outputShape { 3, 5, 6 }; | |
| std::vector<int32_t> paddingShape { 3, 2 }; | |
| std::vector<float> inputValues = { 0.0f, 4.0f, | |
| 2.0f, -5.0f, | |
| 6.0f, 1.0f, | |
| 5.0f, -2.0f }; | |
| std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, 0.0f, 4.0f, pad, pad, | |
| pad, pad, 2.0f, -5.0f, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, 6.0f, 1.0f, pad, pad, | |
| pad, pad, 5.0f, -2.0f, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad }; | |
| std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 }; | |
| PadTest<float>(padOperatorCode, | |
| ::tflite::TensorType_FLOAT32, | |
| backends, | |
| inputShape, | |
| paddingShape, | |
| outputShape, | |
| inputValues, | |
| paddingDim, | |
| expectedOutputValues, | |
| pad); | |
| } | |
| void Pad3dTest(std::vector<armnn::BackendId>& backends, | |
| tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD, | |
| float pad = 0.0f) | |
| { | |
| // Set input data | |
| std::vector<int32_t> inputShape { 2, 2, 2 }; | |
| std::vector<int32_t> outputShape { 3, 5, 6 }; | |
| std::vector<int32_t> paddingShape { 3, 2 }; | |
| std::vector<float> inputValues = { 0.0f, 4.0f, | |
| 2.0f, 5.0f, | |
| 6.0f, 1.0f, | |
| 5.0f, 2.0f }; | |
| std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, 0.0f, 4.0f, pad, pad, | |
| pad, pad, 2.0f, 5.0f, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, 6.0f, 1.0f, pad, pad, | |
| pad, pad, 5.0f, 2.0f, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad, | |
| pad, pad, pad, pad, pad, pad }; | |
| std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 }; | |
| PadTest<float>(padOperatorCode, | |
| ::tflite::TensorType_FLOAT32, | |
| backends, | |
| inputShape, | |
| paddingShape, | |
| outputShape, | |
| inputValues, | |
| paddingDim, | |
| expectedOutputValues, | |
| pad); | |
| } | |
| void Pad4dTest(std::vector<armnn::BackendId>& backends, | |
| tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD, | |
| float pad = 0.0f) | |
| { | |
| // Set input data | |
| std::vector<int32_t> inputShape { 2, 2, 3, 2 }; | |
| std::vector<int32_t> outputShape { 4, 5, 7, 4 }; | |
| std::vector<int32_t> paddingShape { 4, 2 }; | |
| std::vector<float> inputValues = { 0.0f, 1.0f, | |
| 2.0f, 3.0f, | |
| 4.0f, 5.0f, | |
| 6.0f, 7.0f, | |
| 8.0f, 9.0f, | |
| 10.0f, 11.0f, | |
| 12.0f, 13.0f, | |
| 14.0f, 15.0f, | |
| 16.0f, 17.0f, | |
| 18.0f, 19.0f, | |
| 20.0f, 21.0f, | |
| 22.0f, 23.0f }; | |
| std::vector<float> expectedOutputValues = { pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, 0.0f, 1.0f, pad, | |
| pad, 2.0f, 3.0f, pad, | |
| pad, 4.0f, 5.0f, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, 6.0f, 7.0f, pad, | |
| pad, 8.0f, 9.0f, pad, | |
| pad, 10.0f, 11.0f, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, 12.0f, 13.0f, pad, | |
| pad, 14.0f, 15.0f, pad, | |
| pad, 16.0f, 17.0f, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, 18.0f, 19.0f, pad, | |
| pad, 20.0f, 21.0f, pad, | |
| pad, 22.0f, 23.0f, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad, | |
| pad, pad, pad, pad }; | |
| std::vector<int32_t> paddingDim = { 1, 1, 2, 1, 3, 1, 1, 1 }; | |
| PadTest<float>(padOperatorCode, | |
| ::tflite::TensorType_FLOAT32, | |
| backends, | |
| inputShape, | |
| paddingShape, | |
| outputShape, | |
| inputValues, | |
| paddingDim, | |
| expectedOutputValues, | |
| pad); | |
| } | |
| void PadInt8Test(std::vector<armnn::BackendId>& backends, | |
| tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD, | |
| int8_t paddingValue = 0, | |
| int8_t p = 3, | |
| float quantizationScale = -2.0f, | |
| int32_t quantizationOffset = 3) | |
| { | |
| // Set input data | |
| std::vector<int32_t> inputShape { 2, 2, 2 }; | |
| std::vector<int32_t> outputShape { 3, 5, 6 }; | |
| std::vector<int32_t> paddingShape { 3, 2 }; | |
| std::vector<int8_t> inputValues = { 0, 4, | |
| 2, -5, | |
| 6, 1, | |
| 5, -2 }; | |
| std::vector<int8_t> expectedOutputValues = { p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, 0, 4, p, p, | |
| p, p, 2, -5, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, 6, 1, p, p, | |
| p, p, 5, -2, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p }; | |
| std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 }; | |
| PadTest<int8_t>(padOperatorCode, | |
| ::tflite::TensorType_INT8, | |
| backends, | |
| inputShape, | |
| paddingShape, | |
| outputShape, | |
| inputValues, | |
| paddingDim, | |
| expectedOutputValues, | |
| paddingValue, | |
| quantizationScale, | |
| quantizationOffset); | |
| } | |
| void PadUint8Test(std::vector<armnn::BackendId>& backends, | |
| tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD, | |
| uint8_t paddingValue = 0, | |
| uint8_t p = 3, | |
| float quantizationScale = -2.0f, | |
| int32_t quantizationOffset = 3) | |
| { | |
| // Set input data | |
| std::vector<int32_t> inputShape { 2, 2, 2 }; | |
| std::vector<int32_t> outputShape { 3, 5, 6 }; | |
| std::vector<int32_t> paddingShape { 3, 2 }; | |
| std::vector<uint8_t> inputValues = { 0, 4, | |
| 2, 5, | |
| 6, 1, | |
| 5, 2 }; | |
| std::vector<uint8_t> expectedOutputValues = { p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, 0, 4, p, p, | |
| p, p, 2, 5, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, 6, 1, p, p, | |
| p, p, 5, 2, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p, | |
| p, p, p, p, p, p }; | |
| std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 }; | |
| PadTest<uint8_t>(padOperatorCode, | |
| ::tflite::TensorType_UINT8, | |
| backends, | |
| inputShape, | |
| paddingShape, | |
| outputShape, | |
| inputValues, | |
| paddingDim, | |
| expectedOutputValues, | |
| paddingValue, | |
| quantizationScale, | |
| quantizationOffset); | |
| } | |
| TEST_SUITE("Pad_CpuRefTests") | |
| { | |
| TEST_CASE ("Pad2d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad2dTest(backends); | |
| } | |
| TEST_CASE ("Pad3d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad3dTest(backends); | |
| } | |
| TEST_CASE ("Pad4d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad4dTest(backends); | |
| } | |
| TEST_CASE ("Pad_Int8_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| PadInt8Test(backends); | |
| } | |
| TEST_CASE ("Pad_Uint8_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| PadUint8Test(backends); | |
| } | |
| TEST_CASE ("PadV22d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5); | |
| } | |
| TEST_CASE ("PadV23d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0); | |
| } | |
| TEST_CASE ("PadV24d_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33); | |
| } | |
| TEST_CASE ("PadV2_Int8_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| TEST_CASE ("PadV2_Uint8_CpuRef_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; | |
| PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| } // TEST_SUITE("Pad_CpuRefTests") | |
| TEST_SUITE("Pad_CpuAccTests") | |
| { | |
| TEST_CASE ("Pad2d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad2dTest(backends); | |
| } | |
| TEST_CASE ("Pad3d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad3dTest(backends); | |
| } | |
| TEST_CASE ("Pad4d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad4dTest(backends); | |
| } | |
| TEST_CASE ("Pad_Int8_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| PadInt8Test(backends); | |
| } | |
| TEST_CASE ("Pad_Uint8_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| PadUint8Test(backends); | |
| } | |
| TEST_CASE ("PadV22d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5); | |
| } | |
| TEST_CASE ("PadV23d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0); | |
| } | |
| TEST_CASE ("PadV24d_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33); | |
| } | |
| TEST_CASE ("PadV2_Int8_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| TEST_CASE ("PadV2_Uint8_CpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc }; | |
| PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| } // TEST_SUITE("Pad_CpuAccTests") | |
| TEST_SUITE("Pad_GpuAccTests") | |
| { | |
| TEST_CASE ("Pad2d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad2dTest(backends); | |
| } | |
| TEST_CASE ("Pad3d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad3dTest(backends); | |
| } | |
| TEST_CASE ("Pad4d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad4dTest(backends); | |
| } | |
| TEST_CASE ("Pad_Int8_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| PadInt8Test(backends); | |
| } | |
| TEST_CASE ("Pad_Uint8_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| PadUint8Test(backends); | |
| } | |
| TEST_CASE ("PadV22d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5); | |
| } | |
| TEST_CASE ("PadV23d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0); | |
| } | |
| TEST_CASE ("PadV24d_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33); | |
| } | |
| TEST_CASE ("PadV2_Int8_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| TEST_CASE ("PadV2_Uint8_GpuAcc_Test") | |
| { | |
| std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc }; | |
| PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1); | |
| } | |
| } // TEST_SUITE("Pad_GpuAccTests") | |
| } // namespace armnnDelegate |