Main Compliance: Add RESIZE support

Add RELATIVE verify mode for RESIZE.

Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: I4fe352579507211dae7a048bf080c24426ce42a2
diff --git a/verif/conformance/tosa_main_profile_ops_info.json b/verif/conformance/tosa_main_profile_ops_info.json
index b8efd35..dc28bef 100644
--- a/verif/conformance/tosa_main_profile_ops_info.json
+++ b/verif/conformance/tosa_main_profile_ops_info.json
@@ -2645,6 +2645,7 @@
         "profile": [
             "tosa-mi"
         ],
+        "support_for": [ "lazy_data_gen" ],
         "generation": {
             "standard": {
                 "negative_dim_range": "1,10",
@@ -2657,13 +2658,13 @@
                         "--target-dtype",
                         "bf16",
                         "--fp-values-range",
-                        "-2.0,2.0"
+                        "-max,max"
                     ],
                     [
                         "--target-dtype",
                         "fp32",
                         "--fp-values-range",
-                        "-2.0,2.0",
+                        "-max,max",
                         "--target-shape",
                         "1,1103,1,2",
                         "--max-resize-output-dim",
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index a4bced3..4630f35 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -1394,6 +1394,22 @@
             testGen, opName, dtypeList, shapeList, argsDict, error_name
         )
 
+    @staticmethod
+    def tvgResize(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+        data_range = TosaTensorValuesGen._get_data_range(
+            testGen,
+            dtypeList[0],
+            TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE,
+        )
+        if data_range:
+            argsDict["data_range"] = data_range
+            # Needed for compliance
+            argsDict["max_abs_value"] = data_range[1]
+
+        return TosaTensorValuesGen.tvgLazyGenDefault(
+            testGen, opName, dtypeList, shapeList, argsDict, error_name
+        )
+
     # Set the POW exponent high data range
     TVG_FLOAT_HIGH_VALUE_POW_EXP = {
         DType.FP32: 10.0,
@@ -3343,14 +3359,13 @@
                             border[0],
                             border[1],
                         ),
-                        [
-                            mode,
-                            scale,
-                            offset,
-                            border,
-                            dtype,
-                            outputDTypeNew,
-                        ],
+                        {
+                            "mode": mode,
+                            "scale": scale,
+                            "offset": offset,
+                            "border": border,
+                            "output_dtype": outputDTypeNew,
+                        },
                     )
                     if arg_to_append in arg_list:
                         # Skip already generated test params
@@ -3359,6 +3374,16 @@
                     # Valid permutation
                     perm += 1
                     arg_list.append(arg_to_append)
+
+        # Now add data generator types
+        arg_list = TosaArgGen._add_data_generators(
+            testGen,
+            opName,
+            dtype,
+            arg_list,
+            error_name,
+        )
+        # Return list of tuples: (arg_str, args_dict)
         return arg_list
 
     @staticmethod
diff --git a/verif/generator/tosa_error_if.py b/verif/generator/tosa_error_if.py
index 90c3428..5fd647a 100644
--- a/verif/generator/tosa_error_if.py
+++ b/verif/generator/tosa_error_if.py
@@ -2585,9 +2585,9 @@
     @staticmethod
     def ivWrongDataTypeOrModeResize(**kwargs):
         input_dtype = kwargs["input_dtype"]
-        args = kwargs["args"]
-        mode = args[0]
-        output_dtype = args[5]
+        args_dict = kwargs["args"]
+        mode = args_dict["mode"]
+        output_dtype = args_dict["output_dtype"]
 
         if mode == ResizeMode.BILINEAR:
             # Invalid output data type / Invalid input datatype
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index d82f919..ae689b4 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -357,6 +357,12 @@
         elif "compliance" in op and "ulp" in op["compliance"]:
             mode = gtu.ComplianceMode.ULP
             compliance_tens["ulp_info"] = {"ulp": op["compliance"]["ulp"]}
+        elif "compliance" in op and "relative" in op["compliance"]:
+            mode = gtu.ComplianceMode.RELATIVE
+            compliance_tens["relative_info"] = {
+                "max": argsDict["max_abs_value"],
+                "scale": op["compliance"]["relative"],
+            }
         elif op["op"] == Op.REDUCE_PRODUCT:
             mode = gtu.ComplianceMode.REDUCE_PRODUCT
             compliance_tens["reduce_product_info"] = {"n": argsDict["n"]}
@@ -1933,17 +1939,21 @@
     def build_resize(
         self,
         op,
-        input,
-        mode,
-        scale,
-        offset,
-        border,
-        input_dtype,
-        output_dtype,
+        inputs,
+        args_dict,
         validator_fcns,
         error_name=None,
+        qinfo=None,
     ):
-        result_tens = OutputShaper.resizeOp(
+        assert len(inputs) == 1
+        input = inputs[0]
+        mode = args_dict["mode"]
+        scale = args_dict["scale"]
+        offset = args_dict["offset"]
+        border = args_dict["border"]
+        output_dtype = args_dict["output_dtype"]
+
+        result_tensor = OutputShaper.resizeOp(
             self.ser,
             self.rng,
             input,
@@ -1951,14 +1961,14 @@
             scale,
             offset,
             border,
-            input_dtype,
+            input.dtype,
             output_dtype,
             error_name,
         )
 
         # Invalidate Input/Output list for error if checks.
         input_list = [input.name]
-        output_list = [result_tens.name]
+        output_list = [result_tensor.name]
         pCount, cCount = op["operands"]
         num_operands = pCount + cCount
         input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
@@ -1972,25 +1982,28 @@
             op=op,
             mode=mode,
             scale=scale,
-            input_dtype=input_dtype,
+            input_dtype=input.dtype,
             output_dtype=output_dtype,
             input_shape=input.shape,
-            output_shape=result_tens.shape,
+            output_shape=result_tensor.shape,
             offset=offset,
             border=border,
             input_list=input_list,
             output_list=output_list,
-            result_tensors=[result_tens],
+            result_tensors=[result_tensor],
             num_operands=num_operands,
         ):
             return None
 
         attr = ts.TosaSerializerAttribute()
-
         attr.ResizeAttribute(scale, offset, border, mode)
-
         self.ser.addOperator(op["op"], input_list, output_list, attr)
-        return result_tens
+
+        compliance = self.tensorComplianceMetaData(
+            op, input.dtype, args_dict, result_tensor, error_name
+        )
+
+        return TosaTestGen.BuildInfo(result_tensor, compliance)
 
     def build_identityn(self, op, val, val2, validator_fcns=None, error_name=None):
         result_tens = OutputShaper.unaryOp(self.ser, self.rng, val, error_name)
@@ -4610,7 +4623,7 @@
             "build_fcn": (
                 build_resize,
                 TosaTensorGen.tgNHWC,
-                TosaTensorValuesGen.tvgDefault,
+                TosaTensorValuesGen.tvgResize,
                 TosaArgGen.agResize,
             ),
             "types": (DType.INT8, DType.INT16, DType.FP16, DType.BF16, DType.FP32),
@@ -4636,6 +4649,10 @@
                 TosaErrorValidator.evResizeOutputShapeMismatch,
                 TosaErrorValidator.evResizeOutputShapeNonInteger,
             ),
+            "data_gen": {
+                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+            },
+            "compliance": {"relative": 0.006},
         },
         # Type conversion
         "cast": {
diff --git a/verif/generator/tosa_utils.py b/verif/generator/tosa_utils.py
index 6387d06..76e7388 100644
--- a/verif/generator/tosa_utils.py
+++ b/verif/generator/tosa_utils.py
@@ -39,6 +39,7 @@
     FP_SPECIAL = 3
     REDUCE_PRODUCT = 4
     ABS_ERROR = 5
+    RELATIVE = 6
 
 
 class DataGenType(IntEnum):