From 2d70ac4c02808609feb357488dcd080bd6fc5ba5 Mon Sep 17 00:00:00 2001 From: Jeremy Johnson Date: Mon, 6 Nov 2023 17:46:02 +0000 Subject: Main Compliance testing for simple UNARY ops For RECIPROCAL, RSQRT, CEIL, FLOOR, ABS, NEGATE & IDENTITY. Improved ULP informational output. Signed-off-by: Jeremy Johnson Change-Id: I49644573b4c9a30b2b9d6c9624f2a1d46976a378 --- reference_model/src/generate/generate_utils.cc | 7 ++ reference_model/src/verify/verify_ulp.cc | 37 ++++++-- reference_model/src/verify/verify_utils.cc | 26 ++++++ reference_model/src/verify/verify_utils.h | 6 ++ reference_model/test/verify_tests.cpp | 6 +- verif/conformance/tosa_main_profile_ops_info.json | 49 +++++----- verif/generator/tosa_arg_gen.py | 15 +-- verif/generator/tosa_error_if.py | 3 + verif/generator/tosa_test_gen.py | 107 ++++++++++++++-------- 9 files changed, 179 insertions(+), 77 deletions(-) diff --git a/reference_model/src/generate/generate_utils.cc b/reference_model/src/generate/generate_utils.cc index c889f7b..fd42f21 100644 --- a/reference_model/src/generate/generate_utils.cc +++ b/reference_model/src/generate/generate_utils.cc @@ -38,16 +38,23 @@ NLOHMANN_JSON_SERIALIZE_ENUM(DType, NLOHMANN_JSON_SERIALIZE_ENUM(Op, { { Op::Op_UNKNOWN, "UNKNOWN" }, + { Op::Op_ABS, "ABS" }, { Op::Op_ADD, "ADD" }, { Op::Op_ARGMAX, "ARGMAX" }, + { Op::Op_CEIL, "CEIL" }, { Op::Op_CONV2D, "CONV2D" }, + { Op::Op_FLOOR, "FLOOR" }, { Op::Op_FULLY_CONNECTED, "FULLY_CONNECTED" }, + { Op::Op_IDENTITY, "IDENTITY" }, { Op::Op_MATMUL, "MATMUL" }, { Op::Op_MAXIMUM, "MAXIMUM" }, { Op::Op_MAX_POOL2D, "MAX_POOL2D" }, { Op::Op_MINIMUM, "MINIMUM" }, { Op::Op_MUL, "MUL" }, + { Op::Op_NEGATE, "NEGATE" }, { Op::Op_PAD, "PAD" }, + { Op::Op_RECIPROCAL, "RECIPROCAL" }, + { Op::Op_RSQRT, "RSQRT" }, { Op::Op_REDUCE_MAX, "REDUCE_MAX" }, { Op::Op_REDUCE_MIN, "REDUCE_MIN" }, { Op::Op_REDUCE_SUM, "REDUCE_SUM" }, diff --git a/reference_model/src/verify/verify_ulp.cc b/reference_model/src/verify/verify_ulp.cc index 8c27191..2af0012 100644 --- a/reference_model/src/verify/verify_ulp.cc +++ b/reference_model/src/verify/verify_ulp.cc @@ -16,6 +16,7 @@ #include #include #include +#include #include "verifiers.h" @@ -36,9 +37,14 @@ bool tosaCheckULP(double referenceValue, float testValue, double ulpNum) // Start by sanitizing the input. - // The concept of ULP isn't defined for NaN's + // Both must be NaNs to be correct if (std::isnan(referenceValue) || std::isnan(testValue)) { + if (std::isnan(referenceValue) && std::isnan(testValue)) + { + return true; + } + WARNING("[Verfier][ULP] Non-matching NaN values - ref (%10f) versus test (%10f).", referenceValue, testValue); return false; } @@ -112,8 +118,8 @@ bool tosaCheckULP(double referenceValue, float testValue, double ulpNum) bool withinUlp = testValue64 >= referenceMin && testValue64 <= referenceMax; if (!withinUlp) { - WARNING("[Verfier][ULP] value (%10f) is not in ULP %g range (%10f <= ref (%10f) <= %10f).", testValue64, ulpNum, - referenceMin, referenceValue, referenceMax); + WARNING("[Verfier][ULP] value (%10.10f) is not in ULP %g range (%10.10f <= ref (%10.10f) <= %10.10f).", + testValue64, ulpNum, referenceMin, referenceValue, referenceMax); } return withinUlp; } @@ -126,8 +132,8 @@ bool verifyULP(const CTensor* referenceTensor, const CTensor* implementationTens TOSA_REF_REQUIRE(implementationTensor != nullptr, "[ULP] Implementation tensor is missing"); // Get number of elements - const auto elementCount = - numElements(std::vector(referenceTensor->shape, referenceTensor->shape + referenceTensor->num_dims)); + const std::vector refShape(referenceTensor->shape, referenceTensor->shape + referenceTensor->num_dims); + const auto elementCount = numElements(refShape); TOSA_REF_REQUIRE(elementCount > 0, "[ULP] Invalid shape for reference tensor"); const double ulp = ulpInfo.ulp; @@ -138,10 +144,23 @@ bool verifyULP(const CTensor* referenceTensor, const CTensor* implementationTens TOSA_REF_REQUIRE(refData != nullptr, "[ULP] Missing data for reference"); const auto* impData = reinterpret_cast(implementationTensor->data); TOSA_REF_REQUIRE(impData != nullptr, "[ULP] Missing data for implementation"); - return std::equal(refData, std::next(refData, elementCount), impData, std::next(impData, elementCount), - [ulp](const auto& referenceValue, const auto& implementationValue) { - return tosaCheckULP(referenceValue, implementationValue, ulp); - }); + const auto* refDataEnd = std::next(refData, elementCount); + // Use mismatch to get the location of the first unequal value + auto pair = std::mismatch(refData, refDataEnd, impData, std::next(impData, elementCount), + [ulp](const auto& referenceValue, const auto& implementationValue) { + return tosaCheckULP(referenceValue, implementationValue, ulp); + }); + if (std::get<0>(pair) == refDataEnd) + { + // No mismatch found + return true; + } + else + { + auto pos = indexToPosition(std::get<0>(pair) - refData, refShape); + WARNING("[Verfier][ULP] Location %s", positionToString(pos).c_str()); + return false; + } } default: WARNING("[Verifier][ULP] Data-type not supported."); diff --git a/reference_model/src/verify/verify_utils.cc b/reference_model/src/verify/verify_utils.cc index 99cb0c1..9b20fb2 100644 --- a/reference_model/src/verify/verify_utils.cc +++ b/reference_model/src/verify/verify_utils.cc @@ -121,6 +121,32 @@ int64_t numElements(const std::vector& shape) return std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies()); } +std::vector indexToPosition(int64_t index, const std::vector& shape) +{ + std::vector pos; + for (auto d = shape.end() - 1; d >= shape.begin(); --d) + { + pos.insert(pos.begin(), index % *d); + index /= *d; + } + return pos; +} + +std::string positionToString(const std::vector& pos) +{ + std::string str = "["; + for (auto d = pos.begin(); d < pos.end(); ++d) + { + str.append(std::to_string(*d)); + if (pos.end() - d > 1) + { + str.append(","); + } + } + str.append("]"); + return str; +} + DType mapToDType(tosa_datatype_t dataType) { static std::map typeMap = { diff --git a/reference_model/src/verify/verify_utils.h b/reference_model/src/verify/verify_utils.h index 15d7ba5..24d65b0 100644 --- a/reference_model/src/verify/verify_utils.h +++ b/reference_model/src/verify/verify_utils.h @@ -91,6 +91,12 @@ std::optional parseVerifyConfig(const char* tensorName, const char /// \brief Extract number of total elements int64_t numElements(const std::vector& shape); +/// \brief Convert a flat index to a shape position +std::vector indexToPosition(int64_t index, const std::vector& shape); + +/// \brief A string representing the shape or position +std::string positionToString(const std::vector& pos); + /// \brief Map API data-type to DType DType mapToDType(tosa_datatype_t dataType); diff --git a/reference_model/test/verify_tests.cpp b/reference_model/test/verify_tests.cpp index e7d6c4e..31e27c0 100644 --- a/reference_model/test/verify_tests.cpp +++ b/reference_model/test/verify_tests.cpp @@ -392,7 +392,7 @@ TEST_CASE("positive - ulp") const auto elementCount = std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<>()); // Generate some random floats using the full range of fp32. - auto data_fp32 = generateRandomTensorData(elementCount, false); + auto data_fp32 = generateRandomTensorData(elementCount, true); std::vector data_fp64(data_fp32.begin(), data_fp32.end()); SUBCASE("same") @@ -400,7 +400,7 @@ TEST_CASE("positive - ulp") // Generate some data that meets the ULP requirements of the result. auto otherData_fp32 = data_fp32; std::for_each(std::begin(otherData_fp32), std::end(otherData_fp32), [](auto& value) { - if (std::abs(value) != 0.0 && !std::isinf(value)) + if (std::abs(value) != 0.0 && !std::isinf(value) && !std::isnan(value)) value = increment(value, 5); }); const auto referenceTensor = @@ -415,7 +415,7 @@ TEST_CASE("positive - ulp") // Generate some data that exceeds a specified number of ULP for each value in the tensor. auto otherData_fp32 = data_fp32; std::for_each(std::begin(otherData_fp32), std::end(otherData_fp32), [](auto& value) { - if (std::abs(value) != 0.0 && !std::isinf(value)) + if (std::abs(value) != 0.0 && !std::isinf(value) && !std::isnan(value)) value = increment(value, 6); }); diff --git a/verif/conformance/tosa_main_profile_ops_info.json b/verif/conformance/tosa_main_profile_ops_info.json index bdfc281..62505fd 100644 --- a/verif/conformance/tosa_main_profile_ops_info.json +++ b/verif/conformance/tosa_main_profile_ops_info.json @@ -4,6 +4,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "generator_args": [ @@ -15,7 +16,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "16,64", "--target-rank", @@ -33,7 +34,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,16", "--target-rank", @@ -45,7 +46,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,65531,2,1", "--target-shape", @@ -335,6 +336,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "generator_args": [ @@ -346,7 +348,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "4,64", "--target-rank", @@ -364,7 +366,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,16", "--target-rank", @@ -376,7 +378,7 @@ "--target-dtype", "fp16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "2,1,65530,1", "--target-shape", @@ -1058,6 +1060,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "generator_args": [ @@ -1069,7 +1072,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "4,64", "--target-rank", @@ -1087,7 +1090,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,16", "--target-rank", @@ -1099,7 +1102,7 @@ "--target-dtype", "fp32", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,1,65533,2", "--target-shape", @@ -1297,6 +1300,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "no_negative_tests": "true", @@ -1309,7 +1313,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,67", "--target-rank", @@ -1327,7 +1331,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,19", "--target-rank", @@ -1339,7 +1343,7 @@ "--target-dtype", "fp32", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,1,65539,1,1", "--target-shape", @@ -1546,6 +1550,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "negative_dim_range": "1,10", @@ -1558,7 +1563,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "17,64", "--target-rank", @@ -1576,7 +1581,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,22", "--target-rank", @@ -1588,7 +1593,7 @@ "--target-dtype", "fp32", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,65541,3,1", "--target-shape", @@ -1761,6 +1766,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "generator_args": [ @@ -1772,7 +1778,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "15,64", "--target-rank", @@ -1786,7 +1792,7 @@ "--target-dtype", "fp16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,15", "--target-rank", @@ -1798,7 +1804,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,1,65536,4", "--target-shape", @@ -1912,6 +1918,7 @@ "profile": [ "tosa-mi" ], + "support_for": [ "lazy_data_gen" ], "generation": { "standard": { "generator_args": [ @@ -1923,7 +1930,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "15,64", "--target-rank", @@ -1937,7 +1944,7 @@ "--target-dtype", "bf16", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--tensor-dim-range", "1,15", "--target-rank", @@ -1949,7 +1956,7 @@ "--target-dtype", "fp32", "--fp-values-range", - "-2.0,2.0", + "-max,max", "--target-shape", "1,1,3,65541", "--target-shape", diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py index 1f54851..454013a 100644 --- a/verif/generator/tosa_arg_gen.py +++ b/verif/generator/tosa_arg_gen.py @@ -767,8 +767,10 @@ class TosaTensorValuesGen: return TosaTensorValuesGen.TVGInfo(tens_ser_list, tens_data) @staticmethod - def tvgNegate(testGen, op, dtypeList, shapeList, testArgs, error_name=None): + def tvgNegate(testGen, opName, dtypeList, shapeList, argsDict, error_name=None): if dtypeList[0] == DType.INT32 and error_name is None: + # Integer test + op = testGen.TOSA_OP_LIST[opName] pCount, cCount = op["operands"] assert ( pCount == 1 and cCount == 0 @@ -780,14 +782,15 @@ class TosaTensorValuesGen: arr = np.int32( testGen.rng.integers(low=min_val, high=(max_val + 1), size=shapeList[0]) ) - placeholders = [] - placeholders.append( + tens_ser_list = [] + tens_ser_list.append( testGen.ser.addPlaceholder(shapeList[0], dtypeList[0], arr) ) - return placeholders + return TosaTensorValuesGen.TVGInfo(tens_ser_list, None) else: - return TosaTensorValuesGen.tvgDefault( - testGen, op, dtypeList, shapeList, testArgs, error_name + # ERROR_IF or floating point test + return TosaTensorValuesGen.tvgLazyGenDefault( + testGen, opName, dtypeList, shapeList, argsDict, error_name ) # Set the data range to half the largest value diff --git a/verif/generator/tosa_error_if.py b/verif/generator/tosa_error_if.py index ed1a941..86be347 100644 --- a/verif/generator/tosa_error_if.py +++ b/verif/generator/tosa_error_if.py @@ -343,6 +343,9 @@ class TosaErrorValidator: Returns: True if the result matches the expected result; otherwise False """ + if validator_fcns is None: + # Nothing to do + return True overall_result = True for val_fcn in validator_fcns: val_result = val_fcn(True, **kwargs) diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py index d1fe11d..35cd78f 100644 --- a/verif/generator/tosa_test_gen.py +++ b/verif/generator/tosa_test_gen.py @@ -352,28 +352,26 @@ class TosaTestGen: self.resultTensor = resultTensor self.complianceDict = complianceDict - def build_unary(self, op, a, validator_fcns=None, error_name=None, qinfo=None): - result_tens = OutputShaper.unaryOp(self.ser, self.rng, a, error_name) + def build_unary( + self, op, inputs, args_dict, validator_fcns=None, error_name=None, qinfo=None + ): + assert len(inputs) == 1 + a = inputs[0] + result_tensor = OutputShaper.unaryOp(self.ser, self.rng, a, error_name) - # build_placeholder returns an int, ABS/other ops does not - if isinstance(op, int): - self.ser.addOperator(op, a.name, result_tens.name, None) - return result_tens - elif op["op"] == Op.IDENTITY: - self.ser.addOperator(op["op"], a.name, result_tens.name, None) - return result_tens + assert not isinstance(op, int) # Ensure new output type has correct qinfo if error_name == ErrorIf.WrongOutputType: - if result_tens.dtype not in [DType.INT8, DType.UINT8]: + if result_tensor.dtype not in [DType.INT8, DType.UINT8]: qinfo = [ TosaQuantGen.getZeroPoint(self, a.dtype), - TosaQuantGen.getZeroPoint(self, result_tens.dtype), + TosaQuantGen.getZeroPoint(self, result_tensor.dtype), ] # Invalidate Input/Output list for error if checks. input_list = [a.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( @@ -386,9 +384,9 @@ class TosaTestGen: error_name, op=op, input_dtype=a.dtype, - output_dtype=result_tens.dtype, + output_dtype=result_tensor.dtype, qinfo=qinfo, - result_tensors=[result_tens], + result_tensors=[result_tensor], input_list=input_list, output_list=output_list, num_operands=num_operands, @@ -401,7 +399,15 @@ class TosaTestGen: attr.NegateAttribute(qinfo[0], qinfo[1]) self.ser.addOperator(op["op"], input_list, output_list, attr) - return result_tens + + if op["op"] in (Op.EXP, Op.LOG): + # TODO - add compliance support LOG and EXP + compliance = None + else: + compliance = self.tensorComplianceMetaData( + op, a.dtype, args_dict, result_tensor, error_name + ) + return TosaTestGen.BuildInfo(result_tensor, compliance) def build_binary_broadcast( self, op, inputs, args_dict, validator_fcns, error_name=None, qinfo=None @@ -3622,8 +3628,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FI32, "error_if_validators": ( @@ -3632,6 +3638,9 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, }, "bitwise_not": { "op": Op.BITWISE_NOT, @@ -3639,8 +3648,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_INT, "error_if_validators": ( @@ -3656,8 +3665,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3666,6 +3675,10 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, + "compliance": {"ulp": 0.5}, }, "clz": { "op": Op.CLZ, @@ -3673,8 +3686,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": [DType.INT32], "error_if_validators": ( @@ -3690,8 +3703,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3707,8 +3720,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3717,6 +3730,10 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, + "compliance": {"ulp": 0.5}, }, "log": { "op": Op.LOG, @@ -3724,8 +3741,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3741,8 +3758,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_BOOL, "error_if_validators": ( @@ -3759,7 +3776,7 @@ class TosaTestGen: build_unary, TosaTensorGen.tgBasic, TosaTensorValuesGen.tvgNegate, - None, + TosaArgGen.agNone, ), "qgen": TosaQuantGen.qgUnary, "types": TYPE_INT_FP, @@ -3771,6 +3788,9 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, }, "reciprocal": { "op": Op.RECIPROCAL, @@ -3778,8 +3798,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3788,6 +3808,10 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, + "compliance": {"ulp": 1.0}, }, "rsqrt": { "op": Op.RSQRT, @@ -3795,8 +3819,8 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FP, "error_if_validators": ( @@ -3805,6 +3829,10 @@ class TosaTestGen: TosaErrorValidator.evWrongInputList, TosaErrorValidator.evWrongOutputList, ), + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, + "compliance": {"ulp": 2}, }, # Elementwise Ternary operators "select": { @@ -4220,10 +4248,13 @@ class TosaTestGen: "build_fcn": ( build_unary, TosaTensorGen.tgBasic, - TosaTensorValuesGen.tvgDefault, - None, + TosaTensorValuesGen.tvgLazyGenDefault, + TosaArgGen.agNone, ), "types": TYPE_FIB, + "data_gen": { + "fp": (gtu.DataGenType.PSEUDO_RANDOM,), + }, }, # Scatter/Gather "gather": { -- cgit v1.2.1