IVGCVSW-4446 Add HardSwish EndToEnd tests

* adds convert from armnn HardSwish to Acl HardSwish
* adds EndToEnd tests for Ref, Cl and Neon

Signed-off-by: Jan Eilers <jan.eilers@arm.com>
Change-Id: If997dad783ff45d7f061254e7e30bb69d4d4d564
diff --git a/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp
index 23884b0..1b735be 100644
--- a/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp
+++ b/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp
@@ -32,6 +32,8 @@
         // The following values are taken from ArmComputeLibrary/tests/validation/CL/ActivationLayer.cpp
         case ActivationFunction::Elu:
             return (dataType == DataType::Float16 ? 0.01f : 0.00001f);
+        case ActivationFunction::HardSwish:
+            return (dataType == DataType::Float16 ? 0.01f : defaultTolerance);
         default:
             return defaultTolerance;
     }
@@ -123,7 +125,7 @@
                                         1.0f,  2.0f,  3.0f, 4.0f };
 
     std::vector<float> floatExpectedOutputData{ -0.86466471676f,  -0.63212055882f,  -0.0f, 0.0f,
-                                                 1.0f          ,             2.0f,   3.0f, 4.0f };
+                                                 1.0f          ,   2.0f          ,   3.0f, 4.0f };
 
     float qScale = 1.0f;
     int32_t qOffset = 0;
@@ -140,4 +142,33 @@
                                       descriptor);
 }
 
+/** Executes an end to end test for HardSwish activation with specific input and expected-output data
+ *
+ * @tparam ArmnnType  The armnn data type for the input and expected-output data
+ * @param backends  The backends on which to run the test
+ */
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void HardSwishEndToEndTest(const std::vector<BackendId>& backends)
+{
+    std::vector<float> floatInputData{ -2.0f, -1.0f, -0.5f, 0.0f,
+                                       1.0f,  2.0f,  3.0f, 4.0f };
+
+    std::vector<float> floatExpectedOutputData{ -0.33333333333f,  -0.33333333333f, -0.208333f, 0.0f,
+                                                 0.66666666667f,   1.66666666667f,  3.0f     , 4.0f };
+
+    float qScale = 1.0f;
+    int32_t qOffset = 0;
+    armnn::TensorInfo inputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset);
+    armnn::TensorInfo outputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset);
+
+    armnn::ActivationDescriptor descriptor(ActivationFunction::HardSwish, 1.0);
+
+    ActivationEndToEndImpl<ArmnnType>(backends,
+                                      floatInputData,
+                                      floatExpectedOutputData,
+                                      inputInfo,
+                                      outputInfo,
+                                      descriptor);
+}
+
 } // anonymous namespace
\ No newline at end of file