// // Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "BatchMatMulTestHelper.hpp" #include #include namespace armnnDelegate { TEST_SUITE("BATCH_MATMUL_Tests") { TEST_CASE("BatchMatMul2DFp32SimpleTest") { // Set input data std::vector LHSInputShape{ 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul2DInt8SimpleTest") { // Set input data std::vector LHSInputShape{ 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul3DFp32SimpleTest") { // Set input data std::vector LHSInputShape{ 1, 2, 2 }; std::vector RHSInputShape{ 1, 2, 2 }; std::vector outputShape{ 1, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul3DInt8SimpleTest") { // Set input data std::vector LHSInputShape{ 1, 2, 2 }; std::vector RHSInputShape{ 1, 2, 2 }; std::vector outputShape{ 1, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul4DFp32SimpleTest") { // Set input data std::vector LHSInputShape{ 1, 1, 2, 2 }; std::vector RHSInputShape{ 1, 1, 2, 2 }; std::vector outputShape{ 1, 1, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul4DInt8SimpleTest") { // Set input data std::vector LHSInputShape{ 1, 1, 2, 2 }; std::vector RHSInputShape{ 1, 1, 2, 2 }; std::vector outputShape{ 1, 1, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul3DFp32BatchTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 5, 6, 7, 8, 13, 14, 15, 16 }; std::vector expectedOutputValues = { 19, 22, 43, 50, 267, 286, 323, 346 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul3DInt8BatchTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 5, 6, 7, 8, 1, 2, 3, 4 }; std::vector expectedOutputValues = { 19, 22, 43, 50, 39, 58, 47, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul3DFp32BroadcastTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 13, 14, 15, 16 }; std::vector expectedOutputValues = { 43, 46, 99, 106, 267, 286, 323, 346 }; // We know that this is only supported on CpuRef. To enable on all backends just remoev the last parameter. BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false, 1.0f, 0,{armnn::Compute::CpuRef}); } TEST_CASE("BatchMatMul3DInt8BroadcastTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 1, 2, 3, 4 }; std::vector expectedOutputValues = { 7, 10, 15, 22, 39, 58, 47, 70 }; // We know that this is only supported on CpuRef. To enable on all backends just remoev the last parameter. BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false, 1.0f, 0,{armnn::Compute::CpuRef}); } TEST_CASE("BatchMatMul3D2DFp32BroadcastTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 13, 14, 15, 16 }; std::vector expectedOutputValues = { 43, 46, 99, 106, 267, 286, 323, 346 }; // We know that this is only supported on CpuRef. To enable on all backends just remoev the last parameter. BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false, 1.0f, 0,{armnn::Compute::CpuRef}); } TEST_CASE("BatchMatMul3D2DInt8BroadcastTest") { // Set input data std::vector LHSInputShape{ 2, 2, 2 }; std::vector RHSInputShape{ 2, 2 }; std::vector outputShape{ 2, 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 1, 2, 3, 4 }; std::vector expectedOutputValues = { 7, 10, 15, 22, 39, 58, 47, 70 }; // We know that this is only supported on CpuRef. To enable on all backends just remoev the last parameter. BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false, 1.0f, 0,{armnn::Compute::CpuRef}); } TEST_CASE("BatchMatMul2DFp32TinyTest") { // Set input data std::vector LHSInputShape{ 1, 1 }; std::vector RHSInputShape{ 1, 1 }; std::vector outputShape{ 1, 1 }; std::vector LHSInputValues = { 3 }; std::vector RHSInputValues = { 5 }; std::vector expectedOutputValues = { 15 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul2DInt8TinyTest") { // Set input data std::vector LHSInputShape{ 1, 1 }; std::vector RHSInputShape{ 1, 1 }; std::vector outputShape{ 1, 1 }; std::vector LHSInputValues = { 3 }; std::vector RHSInputValues = { 5 }; std::vector expectedOutputValues = { 15 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMulNonSquareFp32Test") { // Set input data std::vector LHSInputShape{ 2, 5, 3 }; std::vector RHSInputShape{ 2, 3, 4 }; std::vector outputShape{ 2, 5, 4 }; std::vector LHSInputValues = { 8, 8, 4, 6, 1, 3, 8, 8, 3, 8, 9, 8, 5, 4, 4, 1, 8, 5, 7, 1, 1, 8, 7, 9, 3, 2, 7, 8, 5, 3 }; std::vector RHSInputValues = { 6, 2, 3, 2, 6, 2, 2, 8, 3, 7, 8, 1, 7, 2, 9, 5, 2, 3, 1, 3, 2, 7, 7, 5 }; std::vector expectedOutputValues = { 108, 60, 72, 84, 51, 35, 44, 23, 105, 53, 64, 83, 126, 90, 106, 96, 66, 46, 55, 46, 33, 61, 52, 54, 53, 24, 71, 43, 88, 100, 142, 106, 39, 61, 78, 56, 72, 52, 98, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMulNonSquareInt8Test") { // Set input data std::vector LHSInputShape{ 2, 5, 3 }; std::vector RHSInputShape{ 2, 3, 4 }; std::vector outputShape{ 2, 5, 4 }; std::vector LHSInputValues = { 8, 8, 4, 6, 1, 3, 8, 8, 3, 8, 9, 8, 5, 4, 4, 1, 8, 5, 7, 1, 1, 8, 7, 9, 3, 2, 7, 8, 5, 3 }; std::vector RHSInputValues = { 6, 2, 3, 2, 6, 2, 2, 8, 3, 7, 8, 1, 7, 2, 3, 5, 2, 3, 1, 3, 2, 7, 7, 5 }; std::vector expectedOutputValues = { 108, 60, 72, 84, 51, 35, 44, 23, 105, 53, 64, 83, 126, 90, 106, 96, 66, 46, 55, 46, 33, 61, 46, 54, 53, 24, 29, 43, 88, 100, 94, 106, 39, 61, 60, 56, 72, 52, 50, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } TEST_CASE("BatchMatMul2DFp32SimpleAdjointTest") { // Set input data std::vector LHSInputShape{ 3, 3 }; std::vector RHSInputShape{ 3, 3 }; std::vector outputShape{ 3, 3 }; std::vector LHSInputValues = { 3, 1, 1, 1, 3, -1, 2, 4, 1 }; std::vector RHSInputValues = { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; std::vector expectedOutputValues = { 3, 1, 2, 1, 3, 4, 1, -1, 1 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, true, false); } TEST_CASE("BatchMatMul2DInt8SimpleAdjointTest") { // Set input data std::vector LHSInputShape{ 3, 3 }; std::vector RHSInputShape{ 3, 3 }; std::vector outputShape{ 3, 3 }; std::vector LHSInputValues = { 3, 1, 1, 1, 3, -1, 2, 4, 1 }; std::vector RHSInputValues = { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; std::vector expectedOutputValues = { 3, 1, 2, 1, 3, 4, 1, -1, 1 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, true, false); } } }