diff options
author | James Conroy <james.conroy@arm.com> | 2020-11-06 16:28:18 +0000 |
---|---|---|
committer | James Conroy <james.conroy@arm.com> | 2020-11-09 18:26:28 +0000 |
commit | aba90cd608eb65ab459cd71a6724511a1507763b (patch) | |
tree | 8c83548e02de2bc6c34811ea2eb9c3dac0976068 /src/backends/backendsCommon/WorkloadData.cpp | |
parent | c9bc80e1d93d27ad298133c7345627e6a946fb92 (diff) | |
download | armnn-aba90cd608eb65ab459cd71a6724511a1507763b.tar.gz |
IVGCVSW-5091 Add Logical ops frontend and ref impl
* Add frontend and reference implementation for logical
ops NOT, AND, OR.
* Unary NOT uses existing ElementwiseUnary layer and
ElementwiseUnary descriptor.
* Binary AND/OR uses new layer LogicalBinary and new
LogicalBinary descriptor.
* Add serialization/deserializion support and add missing
ElementwiseUnary deserializer code.
* Add additional Boolean decoder in BaseIterator.hpp.
Signed-off-by: James Conroy <james.conroy@arm.com>
Change-Id: Id343b01174053a166de1b98b6175e04a5065f720
Diffstat (limited to 'src/backends/backendsCommon/WorkloadData.cpp')
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 6d88664728..b39d6b3c4c 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -3534,7 +3534,21 @@ void ElementwiseUnaryQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) DataType::Signed32 }; - ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); + std::vector<DataType> logicalSupportedTypes = + { + DataType::Boolean + }; + + if (m_Parameters.m_Operation == UnaryOperation::LogicalNot) + { + ValidateDataTypes(inputTensorInfo, logicalSupportedTypes, descriptorName); + } + else + { + ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); + } + + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); } @@ -3567,4 +3581,38 @@ void RankQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const ValidateDataTypes(outputTensorInfo, { DataType::Signed32 }, descriptorName); } +void LogicalBinaryQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const +{ + const std::string descriptorName{"LogicalBinaryQueueDescriptor"}; + + ValidateNumInputs(workloadInfo, descriptorName, 2); + ValidateNumOutputs(workloadInfo, descriptorName, 1); + + const TensorInfo& inputTensorInfo0 = workloadInfo.m_InputTensorInfos[0]; + const TensorInfo& inputTensorInfo1 = workloadInfo.m_InputTensorInfos[1]; + const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0]; + + ValidateBroadcastTensorShapesMatch(inputTensorInfo0, + inputTensorInfo1, + outputTensorInfo, + descriptorName, + "input_0", + "input_1"); + + if (inputTensorInfo0.GetDataType() != DataType::Boolean) + { + throw InvalidArgumentException(descriptorName + ": Input tensor 0 type must be Boolean."); + } + + if (inputTensorInfo1.GetDataType() != DataType::Boolean) + { + throw InvalidArgumentException(descriptorName + ": Input tensor 1 type must be Boolean."); + } + + if (outputTensorInfo.GetDataType() != DataType::Boolean) + { + throw InvalidArgumentException(descriptorName + ": Output tensor type must be Boolean."); + } +} + } // namespace armnn |