aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Johnson <jeremy.johnson@arm.com>2023-11-06 17:46:02 +0000
committerEric Kunze <eric.kunze@arm.com>2023-11-16 21:24:23 +0000
commit2d70ac4c02808609feb357488dcd080bd6fc5ba5 (patch)
tree7038f213a79b4d2daa5cfcf35e7f1fec54218f3e
parenta4e5139312fbcbaedc998bfde6a0bb3479a388e6 (diff)
downloadreference_model-2d70ac4c02808609feb357488dcd080bd6fc5ba5.tar.gz
Main Compliance testing for simple UNARY ops
For RECIPROCAL, RSQRT, CEIL, FLOOR, ABS, NEGATE & IDENTITY. Improved ULP informational output. Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com> Change-Id: I49644573b4c9a30b2b9d6c9624f2a1d46976a378
-rw-r--r--reference_model/src/generate/generate_utils.cc7
-rw-r--r--reference_model/src/verify/verify_ulp.cc37
-rw-r--r--reference_model/src/verify/verify_utils.cc26
-rw-r--r--reference_model/src/verify/verify_utils.h6
-rw-r--r--reference_model/test/verify_tests.cpp6
-rw-r--r--verif/conformance/tosa_main_profile_ops_info.json49
-rw-r--r--verif/generator/tosa_arg_gen.py15
-rw-r--r--verif/generator/tosa_error_if.py3
-rw-r--r--verif/generator/tosa_test_gen.py107
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 <limits>
#include <memory>
#include <type_traits>
+#include <utility>
#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<int32_t>(referenceTensor->shape, referenceTensor->shape + referenceTensor->num_dims));
+ const std::vector<int32_t> 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<const float*>(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<int32_t>& shape)
return std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<int64_t>());
}
+std::vector<int32_t> indexToPosition(int64_t index, const std::vector<int32_t>& shape)
+{
+ std::vector<int32_t> 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<int32_t>& 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<tosa_datatype_t, DType> 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<VerifyConfig> parseVerifyConfig(const char* tensorName, const char
/// \brief Extract number of total elements
int64_t numElements(const std::vector<int32_t>& shape);
+/// \brief Convert a flat index to a shape position
+std::vector<int32_t> indexToPosition(int64_t index, const std::vector<int32_t>& shape);
+
+/// \brief A string representing the shape or position
+std::string positionToString(const std::vector<int32_t>& 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<float>(elementCount, false);
+ auto data_fp32 = generateRandomTensorData<float>(elementCount, true);
std::vector<double> 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": {