IVGCVSW-7272 Add Exception for handling Fp16 infinity values

* Float values which cannot fit in Half are converted as inf/-inf
* Add an InvalidArgumentException for infinity displaying the
  value and data type

Signed-off-by: Kevin May <kevin.may@arm.com>
Change-Id: Iaa5671374364c531e29e37fdfe40732b4fdbcfcb
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
index 01c071d..517b11c 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
@@ -324,24 +324,31 @@
     return arm_compute::Size2D(width, height);
 }
 
-arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float pixelValue)
+arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float value)
 {
     switch (tensorInfo->data_type())
     {
         case arm_compute::DataType::F16:
-            return arm_compute::PixelValue(static_cast<Half>(pixelValue));
+        {
+            arm_compute::PixelValue pixelValue = arm_compute::PixelValue(static_cast<Half>(value));
+            if (isinf(pixelValue.get<Half>())) {
+                throw InvalidArgumentException("Under/Overflow converting float value [" + std::to_string(value) +
+                    "] to fp16: [" + std::to_string(pixelValue.get<Half>()) + "]");
+            }
+            return pixelValue;
+        }
         case arm_compute::DataType::F32:
-            return arm_compute::PixelValue(pixelValue);
+            return arm_compute::PixelValue(value);
         case arm_compute::DataType::QASYMM8:
-            return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
+            return arm_compute::PixelValue(static_cast<uint8_t>(value));
         case arm_compute::DataType::QSYMM16:
-            return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
+            return arm_compute::PixelValue(static_cast<int16_t>(value));
         case arm_compute::DataType::QSYMM8:
         case arm_compute::DataType::QASYMM8_SIGNED:
         case arm_compute::DataType::QSYMM8_PER_CHANNEL:
-            return arm_compute::PixelValue(static_cast<int8_t>(pixelValue));
+            return arm_compute::PixelValue(static_cast<int8_t>(value));
         case arm_compute::DataType::S32:
-            return arm_compute::PixelValue(static_cast<int32_t>(pixelValue));
+            return arm_compute::PixelValue(static_cast<int32_t>(value));
         default:
             throw InvalidArgumentException("Unsupported DataType: [" +
                                            std::to_string(static_cast<int>(tensorInfo->data_type())) + "]");
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.hpp b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
index ee8240f..fdcd867 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.hpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
@@ -75,7 +75,7 @@
 arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsigned int height);
 
 /// Gets the appropriate PixelValue for the TensorInfo DataType
-arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float pixelValue);
+arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float value);
 
 /// Computes the depth multiplier parameter for the Depthwise Conv2d ACL workload.
 unsigned int ComputeDepthwiseConv2dDepthMultiplier(armnn::DataLayout layout,