aboutsummaryrefslogtreecommitdiff
path: root/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
diff options
context:
space:
mode:
authorMatthew Sloyan <matthew.sloyan@arm.com>2021-04-15 20:46:24 +0100
committerMatthew Sloyan <matthew.sloyan@arm.com>2021-04-15 20:51:23 +0100
commited7fce413410d15c501ea52f9e6bfbbf71b3daf1 (patch)
treef72645fdb44fec0fee95e00bd6c6f51b404ed5c7 /src/armnnTfLiteParser/test/ElementWiseUnary.cpp
parent86723e67a940ed9f288c3cb59c120b9a10a1d590 (diff)
downloadarmnn-ed7fce413410d15c501ea52f9e6bfbbf71b3daf1.tar.gz
IVGCVSW-5829 Segfault in tflite-parser, int8 models
* Updated ParseSplit TfLiteParser function to read correct axis data. * Improved validation in ParseSplit and ParseSplitV function. * Added TensorFlow BOOL support to TfLiteParser. * Added supported ElementWiseUnary operators to TfLiteParser E.g. ABS, LOGICAL_NOT and RSQRT. * Removed ParseExp and ParseNeg function implementation in favour of reusable ParseElementWiseUnary function. * Removed Exp.cpp and Neg.cpp files and moved tests to ElementWiseUnary.cpp. Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com> Change-Id: Ibce36e3ce4d95755dda88abc2ddde1e07e62c5e2
Diffstat (limited to 'src/armnnTfLiteParser/test/ElementWiseUnary.cpp')
-rw-r--r--src/armnnTfLiteParser/test/ElementWiseUnary.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/armnnTfLiteParser/test/ElementWiseUnary.cpp b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
new file mode 100644
index 0000000000..dc236d2637
--- /dev/null
+++ b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
@@ -0,0 +1,148 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <boost/test/unit_test.hpp>
+#include "ParserFlatbuffersFixture.hpp"
+#include "../TfLiteParser.hpp"
+
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
+
+struct ElementWiseUnaryFixture : public ParserFlatbuffersFixture
+{
+ explicit ElementWiseUnaryFixture(const std::string& operatorCode,
+ const std::string& dataType,
+ const std::string& inputShape,
+ const std::string& outputShape)
+ {
+ m_JsonString = R"(
+ {
+ "version": 3,
+ "operator_codes": [ { "builtin_code": )" + operatorCode + R"( } ],
+ "subgraphs": [ {
+ "tensors": [
+ {
+ "shape": )" + inputShape + R"(,
+ "type": )" + dataType + R"( ,
+ "buffer": 0,
+ "name": "inputTensor",
+ "quantization": {
+ "min": [ 0.0 ],
+ "max": [ 255.0 ],
+ "scale": [ 1.0 ],
+ "zero_point": [ 0 ],
+ }
+ },
+ {
+ "shape": )" + outputShape + R"( ,
+ "type": )" + dataType + R"( ,
+ "buffer": 1,
+ "name": "outputTensor",
+ "quantization": {
+ "min": [ 0.0 ],
+ "max": [ 255.0 ],
+ "scale": [ 1.0 ],
+ "zero_point": [ 0 ],
+ }
+ }
+ ],
+ "inputs": [ 0 ],
+ "outputs": [ 1 ],
+ "operators": [
+ {
+ "opcode_index": 0,
+ "inputs": [ 0 ],
+ "outputs": [ 1 ],
+ "custom_options_format": "FLEXBUFFERS"
+ }
+ ],
+ } ],
+ "buffers" : [
+ { },
+ { }
+ ]
+ }
+ )";
+ Setup();
+ }
+};
+
+struct SimpleAbsFixture : public ElementWiseUnaryFixture
+{
+ SimpleAbsFixture() : ElementWiseUnaryFixture("ABS", "FLOAT32", "[ 2, 2 ]", "[ 2, 2 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseAbs, SimpleAbsFixture)
+{
+ std::vector<float> inputValues
+ {
+ -0.1f, 0.2f,
+ 0.3f, -0.4f
+ };
+
+ // Calculate output data
+ std::vector<float> expectedOutputValues(inputValues.size());
+ for (unsigned int i = 0; i < inputValues.size(); ++i)
+ {
+ expectedOutputValues[i] = std::abs(inputValues[i]);
+ }
+
+ RunTest<2, armnn::DataType::Float32>(0, {{ "inputTensor", { inputValues } }},
+ {{ "outputTensor",{ expectedOutputValues } } });
+}
+
+struct SimpleExpFixture : public ElementWiseUnaryFixture
+{
+ SimpleExpFixture() : ElementWiseUnaryFixture("EXP", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseExp, SimpleExpFixture)
+{
+ RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f, 1.0f, 2.0f,
+ 3.0f, 4.0f, 5.0f} }},
+ {{ "outputTensor",{ 1.0f, 2.718281f, 7.3890515f,
+ 20.0855185f, 54.5980834f, 148.4129329f} } });
+}
+
+struct SimpleLogicalNotFixture : public ElementWiseUnaryFixture
+{
+ SimpleLogicalNotFixture() : ElementWiseUnaryFixture("LOGICAL_NOT", "BOOL", "[ 1, 1, 1, 4 ]", "[ 1, 1, 1, 4 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseLogicalNot, SimpleLogicalNotFixture)
+{
+ RunTest<4, armnn::DataType::Boolean>(0, {{ "inputTensor", { 0, 1, 0, 1 } }},
+ {{ "outputTensor",{ 1, 0, 1, 0 } } });
+}
+
+struct SimpleNegFixture : public ElementWiseUnaryFixture
+{
+ SimpleNegFixture() : ElementWiseUnaryFixture("NEG", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseNeg, SimpleNegFixture)
+{
+ RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f, 1.0f, -2.0f,
+ 20.0855185f, -54.5980834f, 5.0f} }},
+ {{ "outputTensor",{ 0.0f, -1.0f, 2.0f,
+ -20.0855185f, 54.5980834f, -5.0f} }});
+}
+
+struct SimpleRsqrtFixture : public ElementWiseUnaryFixture
+{
+ SimpleRsqrtFixture() : ElementWiseUnaryFixture("RSQRT", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseRsqrt, SimpleRsqrtFixture)
+{
+ RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 1.0f, 4.0f, 16.0f,
+ 25.0f, 64.0f, 100.0f } }},
+ {{ "outputTensor",{ 1.0f, 0.5f, 0.25f,
+ 0.2f, 0.125f, 0.1f} }});
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()