blob: a9133cd1bf912b26e31ae7850951ed391468479a [file] [log] [blame]
//
// Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "ElementwiseUnaryTestHelper.hpp"
#include "LogicalTestHelper.hpp"
#include <armnn_delegate.hpp>
#include <flatbuffers/flatbuffers.h>
#include <doctest/doctest.h>
namespace armnnDelegate
{
void LogicalBinaryAndBoolTest()
{
std::vector<int32_t> input0Shape { 1, 2, 2 };
std::vector<int32_t> input1Shape { 1, 2, 2 };
std::vector<int32_t> expectedOutputShape { 1, 2, 2 };
// Set input and output values
std::vector<bool> input0Values { 0, 0, 1, 1 };
std::vector<bool> input1Values { 0, 1, 0, 1 };
std::vector<bool> expectedOutputValues { 0, 0, 0, 1 };
LogicalBinaryTest(tflite::BuiltinOperator_LOGICAL_AND,
::tflite::TensorType_BOOL,
input0Shape,
input1Shape,
expectedOutputShape,
input0Values,
input1Values,
expectedOutputValues);
}
void LogicalBinaryAndBroadcastTest()
{
std::vector<int32_t> input0Shape { 1, 2, 2 };
std::vector<int32_t> input1Shape { 1, 1, 1 };
std::vector<int32_t> expectedOutputShape { 1, 2, 2 };
std::vector<bool> input0Values { 0, 1, 0, 1 };
std::vector<bool> input1Values { 1 };
std::vector<bool> expectedOutputValues { 0, 1, 0, 1 };
LogicalBinaryTest(tflite::BuiltinOperator_LOGICAL_AND,
::tflite::TensorType_BOOL,
input0Shape,
input1Shape,
expectedOutputShape,
input0Values,
input1Values,
expectedOutputValues);
}
void LogicalBinaryOrBoolTest()
{
std::vector<int32_t> input0Shape { 1, 2, 2 };
std::vector<int32_t> input1Shape { 1, 2, 2 };
std::vector<int32_t> expectedOutputShape { 1, 2, 2 };
std::vector<bool> input0Values { 0, 0, 1, 1 };
std::vector<bool> input1Values { 0, 1, 0, 1 };
std::vector<bool> expectedOutputValues { 0, 1, 1, 1 };
LogicalBinaryTest(tflite::BuiltinOperator_LOGICAL_OR,
::tflite::TensorType_BOOL,
input0Shape,
input1Shape,
expectedOutputShape,
input0Values,
input1Values,
expectedOutputValues);
}
void LogicalBinaryOrBroadcastTest()
{
std::vector<int32_t> input0Shape { 1, 2, 2 };
std::vector<int32_t> input1Shape { 1, 1, 1 };
std::vector<int32_t> expectedOutputShape { 1, 2, 2 };
std::vector<bool> input0Values { 0, 1, 0, 1 };
std::vector<bool> input1Values { 1 };
std::vector<bool> expectedOutputValues { 1, 1, 1, 1 };
LogicalBinaryTest(tflite::BuiltinOperator_LOGICAL_OR,
::tflite::TensorType_BOOL,
input0Shape,
input1Shape,
expectedOutputShape,
input0Values,
input1Values,
expectedOutputValues);
}
// LogicalNot operator uses ElementwiseUnary unary layer and descriptor but is still classed as logical operator.
void LogicalNotBoolTest()
{
std::vector<int32_t> inputShape { 1, 2, 2 };
std::vector<bool> inputValues { 0, 1, 0, 1 };
std::vector<bool> expectedOutputValues { 1, 0, 1, 0 };
ElementwiseUnaryBoolTest(tflite::BuiltinOperator_LOGICAL_NOT,
inputShape,
inputValues,
expectedOutputValues);
}
TEST_SUITE("LogicalBinaryTests_Tests")
{
TEST_CASE ("LogicalBinary_AND_Bool_Test")
{
LogicalBinaryAndBoolTest();
}
TEST_CASE ("LogicalBinary_AND_Broadcast_Test")
{
LogicalBinaryAndBroadcastTest();
}
TEST_CASE ("Logical_NOT_Bool_Test")
{
LogicalNotBoolTest();
}
TEST_CASE ("LogicalBinary_OR_Bool_Test")
{
LogicalBinaryOrBoolTest();
}
TEST_CASE ("LogicalBinary_OR_Broadcast_Test")
{
LogicalBinaryOrBroadcastTest();
}
}
} // namespace armnnDelegate