blob: 09c773c930c50710829f70d96535d62686e26040 [file] [log] [blame]
//
// Copyright © 2021, 2023-2024 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "PadTestHelper.hpp"
#include <doctest/doctest.h>
namespace armnnDelegate
{
void MirrorPadSymmetric2dTest(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 3, 3 };
std::vector<int32_t> outputShape { 7, 7 };
std::vector<int32_t> paddingShape { 2, 2 };
std::vector<float> inputValues =
{
1.0f, 2.0f, 3.0f,
4.0f, 5.0f, 6.0f,
7.0f, 8.0f, 9.0f
};
std::vector<float> expectedOutputValues =
{
5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f,
2.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 2.0f,
2.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 2.0f,
5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f,
8.0f, 7.0f, 7.0f, 8.0f, 9.0f, 9.0f, 8.0f,
8.0f, 7.0f, 7.0f, 8.0f, 9.0f, 9.0f, 8.0f,
5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f
};
std::vector<int32_t> paddingDim = { 2, 2, 2, 2 };
PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_FLOAT32,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
0, // Offset
tflite::MirrorPadMode_SYMMETRIC);
}
void MirrorPadReflect2dTest(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 3, 3 };
std::vector<int32_t> outputShape { 7, 7 };
std::vector<int32_t> paddingShape { 2, 2 };
std::vector<float> inputValues =
{
1.0f, 2.0f, 3.0f,
4.0f, 5.0f, 6.0f,
7.0f, 8.0f, 9.0f
};
std::vector<float> expectedOutputValues =
{
9.0f, 8.0f, 7.0f, 8.0f, 9.0f, 8.0f, 7.0f,
6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 2.0f, 1.0f,
6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
9.0f, 8.0f, 7.0f, 8.0f, 9.0f, 8.0f, 7.0f,
6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 2.0f, 1.0f
};
std::vector<int32_t> paddingDim = { 2, 2, 2, 2 };
PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_FLOAT32,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
0, // Offset
tflite::MirrorPadMode_REFLECT);
}
void MirrorPadSymmetric3dTest(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 2, 2, 2 };
std::vector<int32_t> outputShape { 4, 4, 4 };
std::vector<int32_t> paddingShape { 3, 2 };
std::vector<float> inputValues =
{
// Channel 0, Height (2) x Width (2)
1.0f, 2.0f,
3.0f, 4.0f,
// Channel 1, Height (2) x Width (2)
5.0f, 6.0f,
7.0f, 8.0f
};
std::vector<float> expectedOutputValues =
{
1.0f, 1.0f, 2.0f, 2.0f,
1.0f, 1.0f, 2.0f, 2.0f,
3.0f, 3.0f, 4.0f, 4.0f,
3.0f, 3.0f, 4.0f, 4.0f,
1.0f, 1.0f, 2.0f, 2.0f,
1.0f, 1.0f, 2.0f, 2.0f,
3.0f, 3.0f, 4.0f, 4.0f,
3.0f, 3.0f, 4.0f, 4.0f,
5.0f, 5.0f, 6.0f, 6.0f,
5.0f, 5.0f, 6.0f, 6.0f,
7.0f, 7.0f, 8.0f, 8.0f,
7.0f, 7.0f, 8.0f, 8.0f,
5.0f, 5.0f, 6.0f, 6.0f,
5.0f, 5.0f, 6.0f, 6.0f,
7.0f, 7.0f, 8.0f, 8.0f,
7.0f, 7.0f, 8.0f, 8.0f
};
std::vector<int32_t> paddingDim = { 1, 1, 1, 1, 1, 1 };
PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_FLOAT32,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
0, // Offset
tflite::MirrorPadMode_SYMMETRIC);
}
void MirrorPadReflect3dTest(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 2, 2, 2 };
std::vector<int32_t> outputShape { 4, 4, 4 };
std::vector<int32_t> paddingShape { 3, 2 };
std::vector<float> inputValues =
{
// Channel 0, Height (2) x Width (2)
1.0f, 2.0f,
3.0f, 4.0f,
// Channel 1, Height (2) x Width (2)
5.0f, 6.0f,
7.0f, 8.0f
};
std::vector<float> expectedOutputValues =
{
8.0f, 7.0f, 8.0f, 7.0f,
6.0f, 5.0f, 6.0f, 5.0f,
8.0f, 7.0f, 8.0f, 7.0f,
6.0f, 5.0f, 6.0f, 5.0f,
4.0f, 3.0f, 4.0f, 3.0f,
2.0f, 1.0f, 2.0f, 1.0f,
4.0f, 3.0f, 4.0f, 3.0f,
2.0f, 1.0f, 2.0f, 1.0f,
8.0f, 7.0f, 8.0f, 7.0f,
6.0f, 5.0f, 6.0f, 5.0f,
8.0f, 7.0f, 8.0f, 7.0f,
6.0f, 5.0f, 6.0f, 5.0f,
4.0f, 3.0f, 4.0f, 3.0f,
2.0f, 1.0f, 2.0f, 1.0f,
4.0f, 3.0f, 4.0f, 3.0f,
2.0f, 1.0f, 2.0f, 1.0f
};
std::vector<int32_t> paddingDim = { 1, 1, 1, 1, 1, 1 };
PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_FLOAT32,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
0, // Offset
tflite::MirrorPadMode_REFLECT);
}
void MirrorPadSymmetricUint8Test(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 3, 3 };
std::vector<int32_t> outputShape { 5, 7 };
std::vector<int32_t> paddingShape { 2, 2 };
std::vector<uint8_t> inputValues =
{
1, 2, 3,
4, 5, 6,
7, 8, 9
};
std::vector<uint8_t> expectedOutputValues =
{
2, 1, 1, 2, 3, 3, 2,
2, 1, 1, 2, 3, 3, 2,
5, 4, 4, 5, 6, 6, 5,
8, 7, 7, 8, 9, 9, 8,
8, 7, 7, 8, 9, 9, 8,
};
std::vector<int32_t> paddingDim = { 1, 1, 2, 2 };
PadTest<uint8_t>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_UINT8,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
1, // Offset
tflite::MirrorPadMode_SYMMETRIC);
}
void MirrorPadReflectInt8Test(std::vector<armnn::BackendId>& backends)
{
// Set input data
std::vector<int32_t> inputShape { 3, 3 };
std::vector<int32_t> outputShape { 7, 5 };
std::vector<int32_t> paddingShape { 2, 2 };
std::vector<int8_t> inputValues =
{
1, 2, 3,
4, 5, 6,
7, 8, 9
};
std::vector<int8_t> expectedOutputValues =
{
8, 7, 8, 9, 8,
5, 4, 5, 6, 5,
2, 1, 2, 3, 2,
5, 4, 5, 6, 5,
8, 7, 8, 9, 8,
5, 4, 5, 6, 5,
2, 1, 2, 3, 2
};
std::vector<int32_t> paddingDim = { 2, 2, 1, 1 };
PadTest<int8_t>(tflite::BuiltinOperator_MIRROR_PAD,
::tflite::TensorType_INT8,
inputShape,
paddingShape,
outputShape,
inputValues,
paddingDim,
expectedOutputValues,
0, // Padding value - Not used in these tests.
backends,
1.0f, // Scale
1, // Offset
tflite::MirrorPadMode_REFLECT);
}
TEST_SUITE("MirrorPad_CpuRefTests")
{
TEST_CASE ("MirrorPadSymmetric2d_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadSymmetric2dTest(backends);
}
TEST_CASE ("MirrorPadReflect2d_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadReflect2dTest(backends);
}
TEST_CASE ("MirrorPadSymmetric3d_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadSymmetric3dTest(backends);
}
TEST_CASE ("MirrorPadReflect3d_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadReflect3dTest(backends);
}
TEST_CASE ("MirrorPadSymmetricUint8_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadSymmetricUint8Test(backends);
}
TEST_CASE ("MirrorPadSymmetricInt8_CpuRef_Test")
{
std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
MirrorPadReflectInt8Test(backends);
}
} // TEST_SUITE("MirrorPad_CpuRefTests")
} // namespace armnnDelegate