IVGCVSW-2845: Add TfLite Parser support for TanH activation layer

* Added ParseTanH in TfLiteParser
* Added testcase for parsing TanH activation in Activations.cpp
* Added new supported TanH operator in TensorflowLiteSupport.md

Signed-off-by: Nina Drozd <nina.drozd@arm.com>
Change-Id: Ie60f38994d76b077f86828c21c57381bdeeaeb5a
diff --git a/src/armnnTfLiteParser/TensorFlowLiteSupport.md b/src/armnnTfLiteParser/TensorFlowLiteSupport.md
index afbe2ce..821aecc 100644
--- a/src/armnnTfLiteParser/TensorFlowLiteSupport.md
+++ b/src/armnnTfLiteParser/TensorFlowLiteSupport.md
@@ -56,6 +56,8 @@
 
 * SUB
 
+* TANH
+
 ## Custom Operator
 
 * TFLite_Detection_PostProcess
diff --git a/src/armnnTfLiteParser/TfLiteParser.cpp b/src/armnnTfLiteParser/TfLiteParser.cpp
index c00c218..5c5618b 100644
--- a/src/armnnTfLiteParser/TfLiteParser.cpp
+++ b/src/armnnTfLiteParser/TfLiteParser.cpp
@@ -465,6 +465,7 @@
     m_ParserFunctions[tflite::BuiltinOperator_MEAN]              =  &TfLiteParser::ParseMean;
     m_ParserFunctions[tflite::BuiltinOperator_PAD]               =  &TfLiteParser::ParsePad;
     m_ParserFunctions[tflite::BuiltinOperator_SPLIT]             =  &TfLiteParser::ParseSplit;
+    m_ParserFunctions[tflite::BuiltinOperator_TANH]              =  &TfLiteParser::ParseTanH;
 }
 
 void TfLiteParser::ResetParser()
@@ -1478,6 +1479,11 @@
     ParseActivation(subgraphIndex,operatorIndex,ActivationFunction::Sigmoid);
 }
 
+void TfLiteParser::ParseTanH(size_t subgraphIndex, size_t operatorIndex)
+{
+    ParseActivation(subgraphIndex,operatorIndex,ActivationFunction::TanH);
+}
+
 
 void TfLiteParser::ParseActivation(size_t subgraphIndex, size_t operatorIndex, ActivationFunction activationType)
 {
@@ -1514,6 +1520,13 @@
             layerName += str(boost::format("SIGMOID:%1%:%2%") % subgraphIndex % operatorIndex);
             break;
         }
+        case ActivationFunction::TanH:
+        {
+            layerName += str(boost::format("TANH:%1%:%2%") % subgraphIndex % operatorIndex);
+            activationDesc.m_A = 1.0f;
+            activationDesc.m_B = 1.0f;
+            break;
+        }
         default:
         {
             throw ParseException(
diff --git a/src/armnnTfLiteParser/TfLiteParser.hpp b/src/armnnTfLiteParser/TfLiteParser.hpp
index e166dd5..a3ef22f 100644
--- a/src/armnnTfLiteParser/TfLiteParser.hpp
+++ b/src/armnnTfLiteParser/TfLiteParser.hpp
@@ -117,6 +117,7 @@
     void ParsePad(size_t subgraphIndex, size_t operatorIndex);
     void ParsePool(size_t subgraphIndex, size_t operatorIndex, armnn::PoolingAlgorithm algorithm);
     void ParseSplit(size_t subgraphIndex, size_t operatorIndex);
+    void ParseTanH(size_t subgraphIndex, size_t operatorIndex);
 
     void RegisterProducerOfTensor(size_t subgraphIndex, size_t tensorIndex, armnn::IOutputSlot* slot);
     void RegisterConsumerOfTensor(size_t subgraphIndex, size_t tensorIndex, armnn::IInputSlot* slot);
diff --git a/src/armnnTfLiteParser/test/Activations.cpp b/src/armnnTfLiteParser/test/Activations.cpp
index dac16ce..e8153a2 100644
--- a/src/armnnTfLiteParser/test/Activations.cpp
+++ b/src/armnnTfLiteParser/test/Activations.cpp
@@ -93,4 +93,16 @@
     RunTest<2, armnn::DataType::Float32>(0, { -1.0f,     -0.5f,      4.0f,       -4.0f,  0.0f,      0.5f,     -0.75f },
                                          {0.268941f, 0.377541f, 0.982013f,  0.0179862f,  0.5f, 0.622459f,  0.320821f });
 }
+
+struct TanHFixture : ActivationFixture
+{
+    TanHFixture() : ActivationFixture("TANH", "FLOAT32") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseTanH, TanHFixture)
+{
+    RunTest<2, armnn::DataType::Float32>(0,
+        { -0.1f,       -0.2f,         -0.3f,       -0.4f,    0.1f,         0.2f,              0.3f },
+        { -0.09966799f, -0.19737528f, -0.29131261f, -0.379949f, 0.09966799f, 0.19737528f, 0.29131261f });
+}
 BOOST_AUTO_TEST_SUITE_END()