aboutsummaryrefslogtreecommitdiff
path: root/verif/generator/tosa_arg_gen.py
diff options
context:
space:
mode:
authorJeremy Johnson <jeremy.johnson@arm.com>2023-09-27 14:59:43 +0100
committerEric Kunze <eric.kunze@arm.com>2024-03-19 20:28:57 +0000
commit0a6d1deef02f2bd76b3068d615565f20c46075a5 (patch)
treea90e8a17bb167e83419733d20c5e23f2c9c50af2 /verif/generator/tosa_arg_gen.py
parent60dc48c4ddf30f2a76d4cfcf1b40ca57b6f3bf95 (diff)
downloadreference_model-0a6d1deef02f2bd76b3068d615565f20c46075a5.tar.gz
Updated build_tests to support different random generators
All generator functions now take RNG argument to allow different random number generators, rather than relying on global RNG Default behaviour is the same as before using global RNG Added stable random generation mode * shape rng based on operator, rank and datatype * arguments rng based on operator, shape and datatype * build operands and data rng based on op, shape, datatype and args Add optional stable RNG test generation to conformance_generator Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com> Change-Id: I5ee4ff85575a81177fd74ed1617e946bfa3a0769
Diffstat (limited to 'verif/generator/tosa_arg_gen.py')
-rw-r--r--verif/generator/tosa_arg_gen.py580
1 files changed, 292 insertions, 288 deletions
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index a2ef5bf..83487a1 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -30,48 +30,48 @@ class TosaQuantGen:
pass
@staticmethod
- def getZeroPoint(testGen, dtype, error_name=None):
+ def getZeroPoint(rng, zeropoint, dtype, error_name=None):
if dtype == DType.INT8:
- if testGen.args.zeropoint is not None:
- return min(127, max(-128, testGen.args.zeropoint))
- return testGen.randInt(-128, 128)
+ if zeropoint is not None:
+ return min(127, max(-128, zeropoint))
+ return rng.randInt(-128, 128)
elif dtype == DType.UINT8:
- if testGen.args.zeropoint is not None:
- return min(255, max(0, testGen.args.zeropoint))
- return testGen.randInt(0, 256)
+ if zeropoint is not None:
+ return min(255, max(0, zeropoint))
+ return rng.randInt(0, 256)
elif error_name in [
ErrorIf.InputZeroPointNotZero,
ErrorIf.WeightZeroPointNotZero,
ErrorIf.OutputZeroPointNotZero,
]:
- zero_point = testGen.randInt(-128, 128)
+ zero_point = rng.randInt(-128, 128)
if zero_point == 0:
zero_point = 1
return zero_point
return 0
@staticmethod
- def qgUnary(testGen, op, dtype, error_name=None):
+ def qgUnary(rng, zeropoint, op, dtype, error_name=None):
if error_name == ErrorIf.InputZeroPointNotZero:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtype, error_name),
- TosaQuantGen.getZeroPoint(testGen, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype, error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
]
elif error_name == ErrorIf.OutputZeroPointNotZero:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtype),
- TosaQuantGen.getZeroPoint(testGen, dtype, error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype, error_name),
]
else:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtype),
- TosaQuantGen.getZeroPoint(testGen, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
]
return qinfo
@staticmethod
- def qgConv(testGen, op, dtype_or_dtypeList, error_name=None):
+ def qgConv(rng, zeropoint, op, dtype_or_dtypeList, error_name=None):
if isinstance(dtype_or_dtypeList, list):
# a list of [input, weights, accumulator] dtypes
dtypeList = dtype_or_dtypeList
@@ -81,32 +81,32 @@ class TosaQuantGen:
if error_name == ErrorIf.InputZeroPointNotZero:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtypeList[0], error_name),
- TosaQuantGen.getZeroPoint(testGen, dtypeList[1]),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[0], error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[1]),
]
elif error_name == ErrorIf.WeightZeroPointNotZero:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtypeList[0]),
- TosaQuantGen.getZeroPoint(testGen, dtypeList[1], error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[0]),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[1], error_name),
]
else:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtypeList[0]),
- TosaQuantGen.getZeroPoint(testGen, dtypeList[1]),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[0]),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtypeList[1]),
]
return qinfo
@staticmethod
- def qgMatmul(testGen, op, dtype, error_name=None):
+ def qgMatmul(rng, zeropoint, op, dtype, error_name=None):
if error_name == ErrorIf.InputZeroPointNotZero:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtype, error_name),
- TosaQuantGen.getZeroPoint(testGen, dtype, error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype, error_name),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype, error_name),
]
else:
qinfo = [
- TosaQuantGen.getZeroPoint(testGen, dtype),
- TosaQuantGen.getZeroPoint(testGen, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
+ TosaQuantGen.getZeroPoint(rng, zeropoint, dtype),
]
return qinfo
@@ -166,9 +166,9 @@ class TosaTensorGen:
pass
@staticmethod
- def tgBasic(testGen, opName, rank, error_name=None):
- pl, const = opName["operands"]
- shape = testGen.makeShape(rank)
+ def tgBasic(testGen, rng, op, rank, error_name=None):
+ pl, const = op["operands"]
+ shape = testGen.makeShape(rng, rank)
# Constrict the overall size of the shape when creating ERROR_IF tests
if error_name:
@@ -181,20 +181,20 @@ class TosaTensorGen:
# Generates an input rank mismatch for operators with more than one input
if error_name == ErrorIf.RankMismatch:
if rank == 1 and i != 1:
- shape = testGen.makeShape(rank + testGen.rng.choice([1, 2, 3]))
+ shape = testGen.makeShape(rng, rank + rng.choice([1, 2, 3]))
elif i != 1:
- shape = testGen.makeShape(rank + testGen.rng.choice([-1, 1]))
+ shape = testGen.makeShape(rng, rank + rng.choice([-1, 1]))
return shape_list
@staticmethod
- def tgNHWC(testGen, opName, rank, error_name=None):
- pl, const = opName["operands"]
+ def tgNHWC(testGen, rng, op, rank, error_name=None):
+ pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 4
- shape = testGen.makeShape(rank)
+ shape = testGen.makeShape(rng, rank)
shape = testGen.constrictBatchSize(shape)
# Constrict the overall size of the shape when creating ERROR_IF tests
@@ -208,7 +208,7 @@ class TosaTensorGen:
return shape_list
@staticmethod
- def tgGather(testGen, opName, rank, error_name=None):
+ def tgGather(testGen, rng, opName, rank, error_name=None):
pl, const = opName["operands"]
assert pl == 2
@@ -216,18 +216,18 @@ class TosaTensorGen:
if error_name != ErrorIf.WrongRank:
assert rank == 3
- values_shape = testGen.makeShape(rank)
+ values_shape = testGen.makeShape(rng, rank)
values_shape = testGen.constrictBatchSize(values_shape)
N = values_shape[0]
- W = testGen.makeDimension()
+ W = testGen.makeDimension(rng)
indices_shape = [N, W]
shape_list = [values_shape, indices_shape]
return shape_list
@staticmethod
- def tgScatter(testGen, opName, rank, error_name=None):
+ def tgScatter(testGen, rng, opName, rank, error_name=None):
pl, const = opName["operands"]
assert pl == 3
@@ -235,7 +235,7 @@ class TosaTensorGen:
if error_name != ErrorIf.WrongRank:
assert rank == 3
- values_in_shape = testGen.makeShape(rank)
+ values_in_shape = testGen.makeShape(rng, rank)
values_in_shape = testGen.constrictBatchSize(values_in_shape)
N = values_in_shape[0]
@@ -246,7 +246,7 @@ class TosaTensorGen:
# once (having a W greater than K means that you have to repeat a K index)
W_min = min(testGen.args.tensor_shape_range[0], K)
W_max = min(testGen.args.tensor_shape_range[1], K)
- W = testGen.randInt(W_min, W_max) if W_min < W_max else W_min
+ W = rng.randInt(W_min, W_max) if W_min < W_max else W_min
input_shape = [N, W, C]
@@ -258,14 +258,14 @@ class TosaTensorGen:
return shape_list
@staticmethod
- def _get_broadcast_shapes(testGen, num_shapes, rank, error_name=None):
- shape = testGen.makeShape(rank)
+ def _get_broadcast_shapes(testGen, rng, num_shapes, rank, error_name=None):
+ shape = testGen.makeShape(rng, rank)
shape_list = []
# Choose one of the inputs to broadcast
# Note: Simplifies OutputShaper code if we don't change first shape for errors
- bcast_idx = testGen.randInt(0 if error_name is None else 1, num_shapes)
- fuzz_idx = testGen.randInt(0, rank)
+ bcast_idx = rng.randInt(0 if error_name is None else 1, num_shapes)
+ fuzz_idx = rng.randInt(0, rank)
for i in range(num_shapes):
shape_bcast = shape.copy()
@@ -278,13 +278,13 @@ class TosaTensorGen:
if i == bcast_idx:
if error_name == ErrorIf.RankMismatch:
# Add one rank to the shape (or more for rank of 1)
- extra_ranks = testGen.rng.choice([1, 2, 3]) if rank == 1 else 1
+ extra_ranks = rng.choice([1, 2, 3]) if rank == 1 else 1
shape_bcast = np.concatenate(
- (shape_bcast, testGen.makeShape(extra_ranks))
+ (shape_bcast, testGen.makeShape(rng, extra_ranks))
)
if rank != 1:
# Either keep the extra rank, or remove it
- new_len = testGen.rng.choice([-2, len(shape_bcast)])
+ new_len = rng.choice([-2, len(shape_bcast)])
shape_bcast = shape_bcast[:new_len]
elif error_name == ErrorIf.BroadcastShapesMismatch:
shape_bcast[fuzz_idx] += 2
@@ -296,30 +296,32 @@ class TosaTensorGen:
return shape_list
@staticmethod
- def tgBroadcastFuzz(testGen, op, rank, error_name=None):
+ def tgBroadcastFuzz(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
num_shapes = pl + const
return TosaTensorGen._get_broadcast_shapes(
- testGen, num_shapes, rank, error_name
+ testGen, rng, num_shapes, rank, error_name
)
@staticmethod
- def tgMul(testGen, op, rank, error_name=None):
+ def tgMul(testGen, rng, op, rank, error_name=None):
# Get broadcast shapes for the first 2 inputs as the 3rd is shift
- shape_list = TosaTensorGen._get_broadcast_shapes(testGen, 2, rank, error_name)
+ shape_list = TosaTensorGen._get_broadcast_shapes(
+ testGen, rng, 2, rank, error_name
+ )
# Add a single dimension tensor for shift
shape_list.append([1])
return shape_list
@staticmethod
- def tgConv2D(testGen, op, rank, error_name=None):
+ def tgConv2D(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 4
# IFM dimensions are NHWC
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
ifm_shape = testGen.constrictBatchSize(ifm_shape)
# Constrict the overall size of the shape when creating ERROR_IF tests
@@ -332,7 +334,7 @@ class TosaTensorGen:
filter_hw = op["filter"]
# Generate a random OFM depth
- ofm_depth = testGen.makeDimension()
+ ofm_depth = testGen.makeDimension(rng)
# The filter dimensions are OHWI
filter_shape = np.asarray([ofm_depth, filter_hw[0], filter_hw[1], ifm_shape[3]])
@@ -343,14 +345,14 @@ class TosaTensorGen:
return [ifm_shape, filter_shape, bias_shape]
@staticmethod
- def tgConv3D(testGen, op, rank, error_name=None):
+ def tgConv3D(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 5
# IFM dimensions are NDHWC
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
ifm_shape = testGen.constrictBatchSize(ifm_shape)
# Constrict the overall size of the shape when creating ERROR_IF tests
@@ -363,7 +365,7 @@ class TosaTensorGen:
filter_dhw = op["filter"]
# Generate a random OFM channel
- ofm_channel = testGen.makeDimension()
+ ofm_channel = testGen.makeDimension(rng)
# The filter dimensions are ODHWI
filter_shape = np.asarray(
@@ -376,14 +378,14 @@ class TosaTensorGen:
return [ifm_shape, filter_shape, bias_shape]
@staticmethod
- def tgTransposeConv2D(testGen, op, rank, error_name=None):
+ def tgTransposeConv2D(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 4
# IFM dimensions are NHWC
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
ifm_shape = testGen.constrictBatchSize(ifm_shape)
# Constrict the overall size of the shape when creating ERROR_IF tests
@@ -396,7 +398,7 @@ class TosaTensorGen:
filter_hw = op["filter"]
# Generate a random OFM depth
- ofm_depth = testGen.makeDimension()
+ ofm_depth = testGen.makeDimension(rng)
# The filter dimensions are OHWI
filter_shape = np.asarray([ofm_depth, filter_hw[0], filter_hw[1], ifm_shape[3]])
@@ -407,7 +409,7 @@ class TosaTensorGen:
return [ifm_shape, filter_shape, bias_shape]
@staticmethod
- def tgDepthwiseConv2D(testGen, op, rank, error_name=None):
+ def tgDepthwiseConv2D(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
@@ -415,7 +417,7 @@ class TosaTensorGen:
assert pl == 1 and const == 2
# IFM dimensions are NHWC
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
ifm_shape = testGen.constrictBatchSize(ifm_shape)
# Constrict the overall size of the shape when creating ERROR_IF tests
@@ -431,7 +433,7 @@ class TosaTensorGen:
# Generate a random OFM depth, but don't let it get too big because
# the output depth is M * C
filter_m = (
- testGen.makeDimension() % (testGen.args.tensor_shape_range[1] // 4)
+ testGen.makeDimension(rng) % (testGen.args.tensor_shape_range[1] // 4)
) + 1
# The filter dimensions are HWCM
@@ -443,7 +445,7 @@ class TosaTensorGen:
return [ifm_shape, filter_shape, bias_shape]
@staticmethod
- def tgFFT2d(testGen, op, rank, error_name=None):
+ def tgFFT2d(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
@@ -451,7 +453,7 @@ class TosaTensorGen:
assert pl == 2 and const == 0
# IFM dimensions are NHW
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
# Select nearest lower power of two from input height and width
ifm_shape[1] = 2 ** int(math.log(ifm_shape[1], 2))
@@ -466,7 +468,7 @@ class TosaTensorGen:
inc_h = 2 if ifm_shape[1] == 1 else 1
inc_w = 2 if ifm_shape[2] == 1 else 1
inc_choices = [(inc_h, 0), (0, inc_w), (inc_h, inc_w)]
- selected_inc = testGen.rng.choice(inc_choices)
+ selected_inc = rng.choice(inc_choices)
ifm_shape[1] += selected_inc[0]
ifm_shape[2] += selected_inc[1]
@@ -474,15 +476,15 @@ class TosaTensorGen:
ifm_shapes = [ifm_shape.copy(), ifm_shape.copy()]
if error_name == ErrorIf.FFTInputShapeMismatch:
- modify_shape = testGen.rng.choice([0, 1])
+ modify_shape = rng.choice([0, 1])
# Only modify kernel (H, W)
- modify_dim = testGen.rng.choice([1, 2])
+ modify_dim = rng.choice([1, 2])
ifm_shapes[modify_shape][modify_dim] *= 2
return [ifm_shapes[0], ifm_shapes[1]]
@staticmethod
- def tgRFFT2d(testGen, op, rank, error_name=None):
+ def tgRFFT2d(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
@@ -490,7 +492,7 @@ class TosaTensorGen:
assert pl == 1 and const == 0
# IFM dimensions are NHW
- ifm_shape = testGen.makeShape(rank)
+ ifm_shape = testGen.makeShape(rng, rank)
# Select nearest lower power of two from input height and width
ifm_shape[1] = 2 ** int(math.log(ifm_shape[1], 2))
@@ -506,7 +508,7 @@ class TosaTensorGen:
inc_h = 2 if ifm_shape[1] == 1 else 1
inc_w = 2 if ifm_shape[2] == 1 else 1
inc_choices = [(inc_h, 0), (0, inc_w), (inc_h, inc_w)]
- selected_inc = testGen.rng.choice(inc_choices)
+ selected_inc = rng.choice(inc_choices)
ifm_shape[1] += selected_inc[0]
ifm_shape[2] += selected_inc[1]
@@ -515,19 +517,19 @@ class TosaTensorGen:
return [ifm_shape]
@staticmethod
- def tgFullyConnected(testGen, op, rank, error_name=None):
+ def tgFullyConnected(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 2
- input_shape = testGen.makeShape(rank)
+ input_shape = testGen.makeShape(rng, rank)
# Constrict the overall size of the shape when creating ERROR_IF tests
if error_name:
input_shape = TosaErrorIfArgGen.eiRestrictDimensions(input_shape)
- filter_oc = testGen.rng.integers(
+ filter_oc = rng.integers(
low=testGen.args.tensor_shape_range[0],
high=testGen.args.tensor_shape_range[1],
size=1,
@@ -539,14 +541,14 @@ class TosaTensorGen:
return [input_shape, filter_shape, bias_shape]
@staticmethod
- def tgMatmul(testGen, op, rank, error_name=None):
+ def tgMatmul(testGen, rng, op, rank, error_name=None):
pl, const = op["operands"]
if error_name != ErrorIf.WrongRank:
assert rank == 3
assert pl == 2 and const == 0
- a_shape = testGen.makeShape(rank)
+ a_shape = testGen.makeShape(rng, rank)
# Constrict the overall size of the shape when creating ERROR_IF tests
if error_name:
@@ -554,7 +556,7 @@ class TosaTensorGen:
# Get a random number for b_oc even if target shape is defined
b_oc = np.int32(
- testGen.rng.integers(
+ rng.integers(
low=testGen.args.tensor_shape_range[0],
high=testGen.args.tensor_shape_range[1],
size=1,
@@ -568,24 +570,24 @@ class TosaTensorGen:
return [a_shape, b_shape]
@staticmethod
- def tgConcat(testGen, opName, rank, error_name=None):
- pl, const = opName["operands"]
- shape = testGen.makeShape(rank)
+ def tgConcat(testGen, rng, op, rank, error_name=None):
+ pl, const = op["operands"]
+ shape = testGen.makeShape(rng, rank)
# Create extra tensors to concat.
# Take into account value of pl when getting maximum number of concats
- num_tensors = testGen.randInt(0, 4)
+ num_tensors = rng.randInt(0, 4)
shape_list = []
for i in range(pl + const + num_tensors):
if error_name == ErrorIf.ConcatInputRankMismatch and i != 0:
- remove = testGen.rng.choice([True, False])
+ remove = rng.choice([True, False])
wrongShape = shape.copy()
if remove and len(shape) > 1:
wrongShape = wrongShape[1:]
else:
wrongShape = list(wrongShape)
- wrongShape.append(testGen.rng.integers(1, 10))
+ wrongShape.append(rng.integers(1, 10))
shape_list.append(wrongShape)
else:
@@ -594,7 +596,7 @@ class TosaTensorGen:
return shape_list
@staticmethod
- def tgConcatConstInput(testGen, shapeList, axis, error_name=None):
+ def tgConcatConstInput(rng, shapeList, axis, error_name=None):
if error_name in [
ErrorIf.AxisSmallerZero,
ErrorIf.AxisLargerRank,
@@ -610,7 +612,7 @@ class TosaTensorGen:
for shape in shapeList[1:]:
# Negative test shapeLists are created individually for each test,
# so no need to copy the shape before altering it.
- shape[(axis + 1) % len(shape)] += testGen.rng.integers(5, 10)
+ shape[(axis + 1) % len(shape)] += rng.integers(5, 10)
return shapeList
# Create copy of shape we are going to split (so we don't alter shapeList)
@@ -630,7 +632,7 @@ class TosaTensorGen:
# invalidate dimensions
if error_name == ErrorIf.ConcatInputDimMismatch:
- shape[(axis + 1) % len(shape)] += testGen.rng.integers(5, 10)
+ shape[(axis + 1) % len(shape)] += rng.integers(5, 10)
else:
shape[axis] = remaining_length
@@ -672,12 +674,12 @@ class TosaTensorValuesGen:
}
@staticmethod
- def _get_data_range(testGen, dtype, highValueLookup, lowValueLookup=None):
+ def _get_data_range(rng, dtype, highValueLookup, lowValueLookup=None):
# Return a tuple of (low,high) data range values for the given data
# type using a combination of per operator table limits, data limits
# and user supplied ranges for FP numbers
if dtype in highValueLookup:
- type_range = testGen.getDTypeRange(dtype, high_inclusive=True)
+ type_range = rng.dTypeRange(dtype, high_inclusive=True)
high_val = highValueLookup[dtype]
if lowValueLookup is not None and dtype in lowValueLookup:
low_val = lowValueLookup[dtype]
@@ -703,7 +705,7 @@ class TosaTensorValuesGen:
@staticmethod
def tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
# Variable inputs versus constants
pCount, cCount = testGen.TOSA_OP_LIST[opName]["operands"]
@@ -742,8 +744,8 @@ class TosaTensorValuesGen:
):
# Change from inclusive to exclusive range
data_range = (data_range[0], data_range[1] + 1)
- # Ignore lazy data gen option and create data array using any range limits
+ # Ignore lazy data gen option and create data array using any range limits
if "fixed_data" in argsDict and argsDict["fixed_data"][idx] is not None:
if dtype == DType.SHAPE:
arr = np.int64(argsDict["fixed_data"][idx])
@@ -756,7 +758,7 @@ class TosaTensorValuesGen:
else:
assert False, "Unsupported fixed_data type"
else:
- arr = testGen.getRandTensor(shape, dtype, data_range)
+ arr = rng.randTensor(shape, dtype, data_range)
if roundMode:
arr = np.round(arr)
if idx < pCount:
@@ -802,8 +804,7 @@ class TosaTensorValuesGen:
info["data"] = [int(i) for i in argsDict["fixed_data"][idx]]
tens_meta["fixed_data_info"] = info
else:
- # TODO - generate seed for this generator based on test
- info["rng_seed"] = 42
+ info["rng_seed"] = rng.seed
data_range = None
if "data_range_list" in argsDict:
@@ -814,9 +815,7 @@ class TosaTensorValuesGen:
data_range = argsDict["data_range"]
if data_range is None:
- data_range = testGen.getDTypeRange(
- dtypeList[idx], high_inclusive=True
- )
+ data_range = rng.dTypeRange(dtypeList[idx], high_inclusive=True)
info["range"] = [str(v) for v in data_range]
tens_meta["pseudo_random_info"] = info
elif dg_type == gtu.DataGenType.DOT_PRODUCT:
@@ -836,7 +835,7 @@ class TosaTensorValuesGen:
elif dg_type == gtu.DataGenType.FULL_RANGE:
info = {}
info["start_val"] = int(
- testGen.randInt(0, gtu.DTYPE_ATTRIBUTES[dtypeList[idx]]["fullset"])
+ rng.randInt(0, gtu.DTYPE_ATTRIBUTES[dtypeList[idx]]["fullset"])
)
tens_meta["full_range_info"] = info
else:
@@ -883,7 +882,9 @@ class TosaTensorValuesGen:
return TosaTensorValuesGen.TVGInfo(tens_ser_list, tens_data)
@staticmethod
- def tvgNegate(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgNegate(
+ testGen, rng, 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]
@@ -896,7 +897,7 @@ class TosaTensorValuesGen:
max_val = (1 << 31) - 1
min_val = -max_val
arr = np.int32(
- testGen.rng.integers(low=min_val, high=(max_val + 1), size=shapeList[0])
+ rng.integers(low=min_val, high=(max_val + 1), size=shapeList[0])
)
tens_ser_list = []
tens_ser_list.append(
@@ -906,7 +907,7 @@ class TosaTensorValuesGen:
else:
# ERROR_IF or floating point test
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
# Set the ADD/SUB data range to half the largest value to avoid infinities
@@ -917,7 +918,9 @@ class TosaTensorValuesGen:
}
@staticmethod
- def tvgAddSub(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgAddSub(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
if dtypeList[0] in (DType.INT32, DType.SHAPE) and error_name is None:
# Make sure the integer operation does not cause value saturation - where
# the number wraps due to limited number of bits to store the answer
@@ -929,8 +932,8 @@ class TosaTensorValuesGen:
tens_ser_list = []
add = op["op"] in (Op.ADD, Op.ADD_SHAPE)
data_range = testGen.args.tensor_shape_range
- a_arr = testGen.getRandTensor(shapeList[0], dtypeList[0], data_range)
- b_arr = testGen.getRandTensor(shapeList[1], dtypeList[1], data_range)
+ a_arr = rng.randTensor(shapeList[0], dtypeList[0], data_range)
+ b_arr = rng.randTensor(shapeList[1], dtypeList[1], data_range)
if add:
res_arr = np.add(a_arr, b_arr, dtype=np.int64)
else:
@@ -985,18 +988,18 @@ class TosaTensorValuesGen:
else:
# ERROR_IF or floating point test
data_range = TosaTensorValuesGen._get_data_range(
- testGen, dtypeList[0], TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_ADDSUB
+ rng, dtypeList[0], TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_ADDSUB
)
if data_range:
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
def tvgCondIfWhileLoop(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
if dtypeList[0] in (
DType.INT32,
@@ -1012,11 +1015,9 @@ class TosaTensorValuesGen:
tens_ser_list = []
for idx, shape in enumerate(shapeList[:]):
if dtypeList[0] == DType.INT32:
- arr = testGen.getRandTensor(shapeList[idx], DType.INT16)
+ arr = rng.randTensor(shapeList[idx], DType.INT16)
else:
- arr = np.int32(
- testGen.rng.integers(low=0, high=32, size=shapeList[idx])
- )
+ arr = np.int32(rng.integers(low=0, high=32, size=shapeList[idx]))
if pRemain > 0:
tens_ser_list.append(
testGen.ser.addPlaceholder(shape, dtypeList[idx], arr)
@@ -1030,12 +1031,12 @@ class TosaTensorValuesGen:
return TosaTensorValuesGen.TVGInfo(tens_ser_list, None)
else:
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
def tvgArithmeticRightShift(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
op = testGen.TOSA_OP_LIST[opName]
pCount, cCount = op["operands"]
@@ -1048,34 +1049,38 @@ class TosaTensorValuesGen:
for idx, shape in enumerate(shapeList[:]):
if idx == 1:
if dtypeList[idx] == DType.INT8:
- arr = np.int32(testGen.rng.integers(low=0, high=8, size=shape))
+ arr = np.int32(rng.integers(low=0, high=8, size=shape))
elif dtypeList[idx] == DType.INT16:
- arr = np.int32(testGen.rng.integers(low=0, high=16, size=shape))
+ arr = np.int32(rng.integers(low=0, high=16, size=shape))
elif dtypeList[idx] == DType.INT32:
- arr = np.int32(testGen.rng.integers(low=0, high=32, size=shape))
+ arr = np.int32(rng.integers(low=0, high=32, size=shape))
elif error_name == ErrorIf.WrongInputType:
- arr = np.int32(testGen.rng.integers(low=0, high=8, size=shape))
+ arr = np.int32(rng.integers(low=0, high=8, size=shape))
else:
raise Exception("OpArithmeticRightShift: invalid input dtype")
else:
- arr = testGen.getRandTensor(shape, dtypeList[idx])
+ arr = rng.randTensor(shape, dtypeList[idx])
tens_ser_list.append(testGen.ser.addPlaceholder(shape, dtypeList[idx], arr))
return TosaTensorValuesGen.TVGInfo(tens_ser_list, None)
@staticmethod
- def tvgReshape(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgReshape(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
dtypeList[1] = DType.SHAPE
shapeList[1] = [len(argsDict["new_shape"])]
# Create a new list for the pre-generated data in argsDict["fixed_data"]
argsDict["fixed_data"] = [None, argsDict["new_shape"]]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgRescale(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgRescale(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
scale32 = argsDict["scale"]
multiplier_arr = argsDict["multiplier"]
shift_arr = argsDict["shift"]
@@ -1091,11 +1096,11 @@ class TosaTensorValuesGen:
argsDict["fixed_data"] = [None, multiplier_arr, shift_arr]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgPad(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgPad(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
# argsDict["pad"] is 2D array, need to flatten it to get list of values
pad_values = argsDict["pad"].flatten()
dtypeList[1] = DType.SHAPE
@@ -1104,11 +1109,11 @@ class TosaTensorValuesGen:
argsDict["fixed_data"] = [None, pad_values]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgSlice(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgSlice(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
dtypeList[1] = DType.SHAPE
shapeList[1] = [len(argsDict["start"])]
dtypeList[2] = DType.SHAPE
@@ -1117,30 +1122,34 @@ class TosaTensorValuesGen:
argsDict["fixed_data"] = [None, argsDict["start"], argsDict["size"]]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgTile(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgTile(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
dtypeList[1] = DType.SHAPE
shapeList[1] = [len(argsDict["multiples"])]
argsDict["fixed_data"] = [None, argsDict["multiples"]]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgSelect(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgSelect(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
# Set datatype of condition tensor to boolean
dtypeList[0] = DType.BOOL
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgIntDiv(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgIntDiv(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
if error_name is None:
op = testGen.TOSA_OP_LIST[opName]
pCount, cCount = op["operands"]
@@ -1154,8 +1163,8 @@ class TosaTensorValuesGen:
# 1. divisor == 0
# 2. dividend == -(1<<31) and divisor == -1
while True:
- dividend_arr = testGen.getRandTensor(shapeList[0], dtypeList[0])
- divisor_arr = testGen.getRandTensor(shapeList[1], dtypeList[1])
+ dividend_arr = rng.randTensor(shapeList[0], dtypeList[0])
+ divisor_arr = rng.randTensor(shapeList[1], dtypeList[1])
if (divisor_arr == 0).any():
continue
@@ -1175,7 +1184,7 @@ class TosaTensorValuesGen:
return TosaTensorValuesGen.TVGInfo(tens_ser_list, None)
else:
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
# Set the MUL data range to the square root of the largest value
@@ -1187,7 +1196,7 @@ class TosaTensorValuesGen:
}
@staticmethod
- def tvgMul(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgMul(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
if error_name is not None or dtypeList[0] in (
DType.FP16,
DType.BF16,
@@ -1195,7 +1204,7 @@ class TosaTensorValuesGen:
):
# ERROR_IF or floating point test
data_range = TosaTensorValuesGen._get_data_range(
- testGen, dtypeList[0], TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_MUL
+ rng, dtypeList[0], TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_MUL
)
if data_range:
argsDict["data_range"] = data_range
@@ -1208,10 +1217,9 @@ class TosaTensorValuesGen:
argsDict["fixed_data"] = [None, None, [argsDict["shift"]]]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
else:
- # Integer test
op = testGen.TOSA_OP_LIST[opName]
pCount, cCount = op["operands"]
@@ -1231,7 +1239,9 @@ class TosaTensorValuesGen:
elif error_name == ErrorIf.WrongInputType:
num_bits = 8
else:
- raise Exception("OpMul: invalid input dtype")
+ raise Exception(
+ f"OpMul: invalid input dtype {gtu.DTYPE_ATTRIBUTES[dtypeList[0]]['str']}"
+ )
for idx, shape in enumerate(shapeList[:]):
if dtypeList[idx] == DType.SHAPE:
@@ -1241,12 +1251,8 @@ class TosaTensorValuesGen:
low = -(2 ** (num_bits - 1))
high = (2 ** (num_bits - 1)) - 1
- a_arr = np.int32(
- testGen.rng.integers(low=low, high=high, size=shapeList[0])
- )
- b_arr = np.int32(
- testGen.rng.integers(low=low, high=high, size=shapeList[1])
- )
+ a_arr = np.int32(rng.integers(low=low, high=high, size=shapeList[0]))
+ b_arr = np.int32(rng.integers(low=low, high=high, size=shapeList[1]))
i = 0
while True:
@@ -1292,7 +1298,9 @@ class TosaTensorValuesGen:
return TosaTensorValuesGen.TVGInfo(tens_ser_list, None)
@staticmethod
- def tvgConcat(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgConcat(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
count = len(shapeList) - testGen.args.num_const_inputs_concat
if count < 1:
count = 1
@@ -1302,12 +1310,10 @@ class TosaTensorValuesGen:
op = testGen.TOSA_OP_LIST[opName]
if op["op"] == Op.CONCAT_SHAPE:
# Set the axis to 0
- shapeList = TosaTensorGen.tgConcatConstInput(
- testGen, shapeList, 0, error_name
- )
+ shapeList = TosaTensorGen.tgConcatConstInput(rng, shapeList, 0, error_name)
else:
shapeList = TosaTensorGen.tgConcatConstInput(
- testGen, shapeList, argsDict["axis"], error_name
+ rng, shapeList, argsDict["axis"], error_name
)
# Override default pCount/cCount for operator
@@ -1315,20 +1321,20 @@ class TosaTensorValuesGen:
argsDict["c_count"] = len(shapeList) - count
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
def tvgLogicalShift(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
op = testGen.TOSA_OP_LIST[opName]
pCount, cCount = op["operands"]
assert (
pCount == 2 and cCount == 0
), "Op.LOGICAL_LEFT_SHIFT or Op.LOGICAL_RIGHT_SHIFT must have 2 placeholders, 0 consts"
- values_arr = testGen.getRandTensor(shapeList[0], dtypeList[0])
- shift_arr = np.int32(testGen.rng.integers(low=0, high=32, size=shapeList[1]))
+ values_arr = rng.randTensor(shapeList[0], dtypeList[0])
+ shift_arr = np.int32(rng.integers(low=0, high=32, size=shapeList[1]))
tens_ser_list = []
tens_ser_list.append(
testGen.ser.addPlaceholder(shapeList[0], dtypeList[0], values_arr)
@@ -1340,7 +1346,7 @@ class TosaTensorValuesGen:
return TosaTensorValuesGen.TVGInfo(tens_ser_list, None)
@staticmethod
- def tvgEqual(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgEqual(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
if error_name is None and not gtu.dtypeIsSupportedByCompliance(dtypeList[0]):
# Integer
op = testGen.TOSA_OP_LIST[opName]
@@ -1349,8 +1355,8 @@ class TosaTensorValuesGen:
pCount == 2 and cCount == 0
), "Op.EQUAL must have 2 placeholders, 0 consts"
- a_arr = testGen.getRandTensor(shapeList[0], dtypeList[0])
- b_arr = testGen.getRandTensor(shapeList[1], dtypeList[1])
+ a_arr = rng.randTensor(shapeList[0], dtypeList[0])
+ b_arr = rng.randTensor(shapeList[1], dtypeList[1])
# Using random numbers means that it will be very unlikely that
# there are any matching (equal) values, therefore force that
@@ -1362,9 +1368,7 @@ class TosaTensorValuesGen:
for axis in range(0, len(shapeList[0])):
# Index can be up to the largest dimension in both shapes
index = np.int32(
- testGen.rng.integers(
- 0, max(shapeList[0][axis], shapeList[1][axis])
- )
+ rng.integers(0, max(shapeList[0][axis], shapeList[1][axis]))
)
# Reduce the index down to a shape's dim for broadcasting
a_index.append(min(shapeList[0][axis] - 1, index))
@@ -1383,11 +1387,13 @@ class TosaTensorValuesGen:
else:
# ERROR_IF or floating point test
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgReduceSum(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgReduceSum(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
dtype = dtypeList[0]
if dtype == DType.INT32:
op = testGen.TOSA_OP_LIST[opName]
@@ -1399,7 +1405,7 @@ class TosaTensorValuesGen:
# summation of any axis
range_val = int((1 << 31) / max(shapeList[0]))
values_arr = np.int32(
- testGen.rng.integers(low=-range_val, high=range_val, size=shapeList[0])
+ rng.integers(low=-range_val, high=range_val, size=shapeList[0])
)
tens_ser_list = []
tens_ser_list.append(
@@ -1419,18 +1425,18 @@ class TosaTensorValuesGen:
/ max(shapeList[0])
}
data_range = TosaTensorValuesGen._get_data_range(
- testGen, dtype, highval_lookup
+ rng, dtype, highval_lookup
)
assert data_range is not None
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
def tvgReduceProduct(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
dtype = dtypeList[0]
if error_name is None:
@@ -1442,20 +1448,20 @@ class TosaTensorValuesGen:
1 / max(shapeList[0]),
)
}
- data_range = TosaTensorValuesGen._get_data_range(
- testGen, dtype, highval_lookup
- )
+ data_range = TosaTensorValuesGen._get_data_range(rng, dtype, highval_lookup)
assert data_range is not None
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgResize(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgResize(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
data_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtypeList[0],
TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE,
)
@@ -1476,7 +1482,7 @@ class TosaTensorValuesGen:
argsDict["fixed_data"] = [None, scale_values, offset_values, border_values]
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
# Set the POW exponent high data range
@@ -1537,10 +1543,10 @@ class TosaTensorValuesGen:
}
@staticmethod
- def tvgPow(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgPow(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
if error_name is not None:
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
dtype = dtypeList[0]
# Different ranges for POW
@@ -1548,25 +1554,25 @@ class TosaTensorValuesGen:
if test_set == 0:
# Positive base with fractional exponent
base_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtype,
TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_BASE,
TosaTensorValuesGen.TVG_FLOAT_LOW_VALUE_POW_BASE,
)
exp_range = TosaTensorValuesGen._get_data_range(
- testGen, dtype, TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_EXP
+ rng, dtype, TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_EXP
)
exp_round = False
else:
# Integer exponent
exp_range = TosaTensorValuesGen._get_data_range(
- testGen, dtype, TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_EXP
+ rng, dtype, TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_EXP
)
exp_round = True
if test_set == 1:
# Positive base
base_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtype,
TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_BASE,
TosaTensorValuesGen.TVG_FLOAT_LOW_VALUE_POW_BASE,
@@ -1576,7 +1582,7 @@ class TosaTensorValuesGen:
# Negative base
# Supply new look up tables with negative values
base_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtype,
{dtype: -TosaTensorValuesGen.TVG_FLOAT_LOW_VALUE_POW_BASE[dtype]},
{dtype: -TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_POW_BASE[dtype]},
@@ -1593,15 +1599,17 @@ class TosaTensorValuesGen:
)
argsDict["data_range_list"] = data_range_list
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgLogRsqrt(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgLogRsqrt(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
# LOG & RSQRT data range from lowest expressible positive number to
# largest to avoid NaNs
data_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtypeList[0],
TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE,
TosaTensorValuesGen.TVG_FLOAT_LOW_VALUE,
@@ -1610,7 +1618,7 @@ class TosaTensorValuesGen:
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
# Set the EXP data range to the log of the largest to smallest values
@@ -1627,9 +1635,9 @@ class TosaTensorValuesGen:
}
@staticmethod
- def tvgExp(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgExp(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
data_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
dtypeList[0],
TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE_EXP,
TosaTensorValuesGen.TVG_FLOAT_LOW_VALUE_EXP,
@@ -1638,12 +1646,12 @@ class TosaTensorValuesGen:
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
def tvgFullyConnected(
- testGen, opName, dtypeList, shapeList, argsDict, error_name=None
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
):
dtype = dtypeList[0]
if (
@@ -1658,26 +1666,24 @@ class TosaTensorValuesGen:
highval_lookup = {
dtype: math.pow(TosaTensorValuesGen.TVG_FLOAT_HIGH_VALUE[dtype], 1 / IC)
}
- data_range = TosaTensorValuesGen._get_data_range(
- testGen, dtype, highval_lookup
- )
+ data_range = TosaTensorValuesGen._get_data_range(rng, dtype, highval_lookup)
assert data_range is not None
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgCast(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgCast(testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None):
in_dtype = dtypeList[0]
out_dtype = argsDict["out_type"]
# Create look up to limit input tensor to output type maximums to avoid
# FP infinities and saturation of integers
- out_range = testGen.getDTypeRange(out_dtype, high_inclusive=True)
+ out_range = rng.dTypeRange(out_dtype, high_inclusive=True)
highval_lookup = {in_dtype: out_range[1]}
data_range = TosaTensorValuesGen._get_data_range(
- testGen,
+ rng,
in_dtype,
highval_lookup,
)
@@ -1686,11 +1692,13 @@ class TosaTensorValuesGen:
argsDict["data_range"] = data_range
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgGather(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgGather(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
K = shapeList[0][1]
# Fix the type of the indices tensor
@@ -1709,11 +1717,11 @@ class TosaTensorValuesGen:
for idx, shape in enumerate(shapeList):
dtype = dtypeList[idx]
if idx != 1:
- arr = testGen.getRandTensor(shape, dtype)
+ arr = rng.randTensor(shape, dtype)
tens_ser_list.append(testGen.ser.addPlaceholder(shape, dtype, arr))
else:
# Limit data range of indices tensor upto K (exclusive)
- arr = testGen.getRandTensor(shape, dtype, (0, K))
+ arr = rng.randTensor(shape, dtype, (0, K))
# To match old functionality - create indices as CONST
tens_ser_list.append(testGen.ser.addConst(shape, dtype, arr))
@@ -1729,11 +1737,13 @@ class TosaTensorValuesGen:
argsDict["data_range_list"] = data_range_list
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@staticmethod
- def tvgScatter(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+ def tvgScatter(
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name=None
+ ):
K = shapeList[0][1]
W = shapeList[2][1]
@@ -1760,7 +1770,7 @@ class TosaTensorValuesGen:
for idx, shape in enumerate(shapeList):
dtype = dtypeList[idx]
if idx != 1:
- arr = testGen.getRandTensor(shape, dtype)
+ arr = rng.randTensor(shape, dtype)
tens_ser_list.append(testGen.ser.addPlaceholder(shape, dtype, arr))
else:
# Create the indices array
@@ -1769,7 +1779,7 @@ class TosaTensorValuesGen:
for n in range(shape[0]):
# Get a shuffled list of output indices (0 to K-1) and
# limit length to W
- arr.append(testGen.rng.permutation(K)[:W])
+ arr.append(rng.permutation(K)[:W])
indices_arr = np.array(arr, dtype=np.int32) # (N, W)
# To match old functionality - create indices as CONST
tens_ser_list.append(
@@ -1789,7 +1799,7 @@ class TosaTensorValuesGen:
argsDict["data_range_list"] = data_range_list
return TosaTensorValuesGen.tvgLazyGenDefault(
- testGen, opName, dtypeList, shapeList, argsDict, error_name
+ testGen, rng, opName, dtypeList, shapeList, argsDict, error_name
)
@@ -1881,7 +1891,7 @@ class TosaArgGen:
return new_arg_list
@staticmethod
- def agNone(testGen, opName, shapeList, dtype, error_name=None):
+ def agNone(testGen, rng, opName, shapeList, dtype, error_name=None):
"""A trivial argument generator for operators that don't take any
non-tensor arguments"""
arg_list = TosaArgGen._add_data_generators(
@@ -1896,7 +1906,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agPow(testGen, opName, shapeList, dtype, error_name=None):
+ def agPow(testGen, rng, opName, shapeList, dtype, error_name=None):
"""Pow operator needs different test sets to cover random numbers
without creating NaNs or Infs"""
arg_list = TosaArgGen._add_data_generators(
@@ -1911,17 +1921,17 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agAxis(testGen, opName, shapeList, dtype, error_name=None):
+ def agAxis(testGen, rng, opName, shapeList, dtype, error_name=None):
"""Build the axis argument for operators that take a single axis"""
arg_list = []
shape = shapeList[0]
if error_name == ErrorIf.AxisSmallerZero:
# Set too small axis
- axes = [testGen.rng.integers(-5, 0)]
+ axes = [rng.integers(-5, 0)]
elif error_name == ErrorIf.AxisLargerRank:
# Set too large axis
- axes = [testGen.rng.integers(len(shape) + 1, len(shape) + 10)]
+ axes = [rng.integers(len(shape) + 1, len(shape) + 10)]
else:
# Create tests for each dimension
axes = range(0, len(shape))
@@ -1967,7 +1977,7 @@ class TosaArgGen:
return sparsity
@staticmethod
- def agConv(testGen, opName, shapeList, dtypes, error_name=None):
+ def agConv(testGen, rng, opName, shapeList, dtypes, error_name=None):
# Used by CONV2D, CONV3D and DEPTHWISE_CONV2D
arg_list = []
@@ -2005,13 +2015,13 @@ class TosaArgGen:
# Generate comprehensive argument lists
# - except for named errors, which use specific invalid value(s)
if error_name == ErrorIf.PadSmallerZero:
- p_vals = [testGen.rng.choice(range(-5, 0))]
+ p_vals = [rng.choice(range(-5, 0))]
else:
p_vals = [x for x in range(0, testGen.args.max_conv_padding + 1)]
paddings = {x for x in itertools.product(*([p_vals] * k_rank * 2))}
if error_name == ErrorIf.StrideSmallerOne:
# Can't use stride=0, as it is used to derive output shape, as a divisor
- s_vals = [testGen.rng.choice(range(-5, 0))]
+ s_vals = [rng.choice(range(-5, 0))]
else:
# Stride must be greater than 1 to force non-integer error
startStride = (
@@ -2022,7 +2032,7 @@ class TosaArgGen:
]
strides = {x for x in itertools.product(*([s_vals] * k_rank))}
if error_name == ErrorIf.DilationSmallerOne:
- d_vals = [testGen.rng.choice(range(-5, 1))]
+ d_vals = [rng.choice(range(-5, 1))]
else:
d_vals = [x for x in range(1, testGen.args.max_conv_dilation + 1)]
dilations = {x for x in itertools.product(*([d_vals] * k_rank))}
@@ -2195,13 +2205,13 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agFullyConnected(testGen, opName, shapeList, dtypes, error_name=None):
+ def agFullyConnected(testGen, rng, opName, shapeList, dtypes, error_name=None):
assert isinstance(dtypes, (list, tuple)), f"{dtypes} unexpected"
input_dtype = dtypes[0]
if error_name == ErrorIf.WrongOutputType:
- accum_dtype = gtu.get_wrong_output_type(opName, testGen.rng, input_dtype)
+ accum_dtype = gtu.get_wrong_output_type(opName, rng, input_dtype)
elif error_name == ErrorIf.WrongInputType:
# Pick some potentially correct output dtype if input type is incorrect
accum_dtype = DType.INT32
@@ -2230,7 +2240,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agMatMul(testGen, opName, shapeList, dtype, error_name=None):
+ def agMatMul(testGen, rng, opName, shapeList, dtype, error_name=None):
# Get valid accumulate type(s)
if dtype == DType.INT8:
accum_dtypes = [DType.INT32]
@@ -2249,7 +2259,7 @@ class TosaArgGen:
if error_name == ErrorIf.WrongOutputType:
# Get incorrect output dtype for ErrorIf case
- accum_dtypes = [gtu.get_wrong_output_type(opName, testGen.rng, dtype)]
+ accum_dtypes = [gtu.get_wrong_output_type(opName, rng, dtype)]
elif error_name == ErrorIf.WrongInputType:
# Pick some potentially correct output dtype if input type is incorrect
accum_dtypes = [DType.INT32]
@@ -2283,7 +2293,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agTransposeConv2D(testGen, opName, shapeList, dtypes, error_name=None):
+ def agTransposeConv2D(testGen, rng, opName, shapeList, dtypes, error_name=None):
arg_list = []
if testGen.args.level8k and error_name is not None:
@@ -2310,9 +2320,7 @@ class TosaArgGen:
smallest_padding_size = -min(k_shape[0], k_shape[1]) + 1
if error_name == ErrorIf.PadLargerEqualKernel:
max_filter_size = -max(k_shape[0], k_shape[1])
- p_vals = [
- testGen.rng.choice(range(max_filter_size - 10, max_filter_size))
- ]
+ p_vals = [rng.choice(range(max_filter_size - 10, max_filter_size))]
else:
p_vals = [
x
@@ -2323,7 +2331,7 @@ class TosaArgGen:
paddings = {x for x in itertools.product(*([p_vals] * 4))}
if error_name == ErrorIf.StrideSmallerOne:
# Can't use stride=0, as it is used to derive output shape, as a divisor
- s_vals = [testGen.rng.choice(range(-5, 0))]
+ s_vals = [rng.choice(range(-5, 0))]
else:
s_vals = [x for x in range(1, testGen.args.max_conv_stride + 1)]
strides = {x for x in itertools.product(*([s_vals] * 2))}
@@ -2440,7 +2448,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agPad(testGen, opName, shapeList, dtype, error_name=None):
+ def agPad(testGen, rng, opName, shapeList, dtype, error_name=None):
rank = len(shapeList[0])
# Exhaustively test combinations of padding on each side of each dimension
@@ -2454,11 +2462,11 @@ class TosaArgGen:
shape_pad_values = itertools.product(*([axis_pad_values] * rank))
if dtype in [DType.BOOL, DType.INT8, DType.INT16, DType.INT32]:
- pad_const_int = testGen.getRandNumberDType(dtype)
+ pad_const_int = rng.randNumberDType(dtype)
pad_const_fp = 0
elif gtu.dtypeIsFloat(dtype):
pad_const_int = 0
- pad_const_fp = testGen.getRandNumberDType(dtype)
+ pad_const_fp = rng.randNumberDType(dtype)
else:
return []
@@ -2516,7 +2524,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agPooling(testGen, opName, shapeList, dtype, error_name=None):
+ def agPooling(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
shape = shapeList[0]
@@ -2658,7 +2666,7 @@ class TosaArgGen:
ErrorIf.PadLargerEqualKernel,
]:
sNew, pNew, kNew = TosaErrorIfArgGen.eiPoolingErrorIf(
- testGen, error_name, s, p, k
+ rng, error_name, s, p, k
)
if None not in [sNew, pNew, kNew] and n % sparsity == 0:
arg_list.append(
@@ -2722,12 +2730,12 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agCast(testGen, opName, shapeList, inDtype, error_name=None):
+ def agCast(testGen, rng, opName, shapeList, inDtype, error_name=None):
arg_list = []
# Enumerate the output types here
if error_name == ErrorIf.WrongOutputType:
- dtypeList = TosaErrorIfArgGen.eiCastErrorIf(testGen, inDtype)
+ dtypeList = TosaErrorIfArgGen.eiCastErrorIf(inDtype)
elif inDtype == DType.INT8:
dtypeList = [
DType.BOOL,
@@ -2811,7 +2819,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agRescale(testGen, opName, shapeList, inDtype, error_name=None):
+ def agRescale(testGen, rng, opName, shapeList, inDtype, error_name=None):
arg_list = []
# Enumerate the output types here
@@ -2906,7 +2914,7 @@ class TosaArgGen:
# Calculate scale based on:
# scale = a *(2^output_width)/(2^input_width))
- a = np.float32(testGen.rng.random(size=[nc]))
+ a = np.float32(rng.random(size=[nc]))
scale_arr = a * np.float32(
(1 << out_type_width) / (1 << in_type_width)
)
@@ -2965,13 +2973,13 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agMul(testGen, opName, shapeList, dtype, error_name=None):
+ def agMul(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
if dtype is DType.INT32:
for p in range(testGen.args.num_rand_permutations):
- shift = testGen.randInt(0, 32)
+ shift = rng.randInt(0, 32)
arg_list.append(("perm{}_shift{}".format(p, shift), {"shift": shift}))
else:
arg_list.append(("perm0_shift0", {"shift": 0}))
@@ -2988,7 +2996,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agArithmeticRightShift(testGen, opName, shapeList, dtype, error_name=None):
+ def agArithmeticRightShift(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
for round in (True, False):
@@ -3009,7 +3017,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agFFT2d(testGen, opName, shapeList, dtype, error_name=None):
+ def agFFT2d(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
shape = shapeList[0]
@@ -3037,7 +3045,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agRFFT2d(testGen, opName, shapeList, dtype, error_name=None):
+ def agRFFT2d(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
shape = shapeList[0]
@@ -3074,7 +3082,7 @@ class TosaArgGen:
return factors
@staticmethod
- def agReshape(testGen, opName, shapeList, dtype, error_name=None):
+ def agReshape(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
origShape = shapeList[0]
@@ -3085,7 +3093,7 @@ class TosaArgGen:
# This code is NOT fast. Fortunately, the numbers are fairly small.
for p in range(testGen.args.num_rand_permutations):
# Rank from 1 to TOSA_TENSOR_MAX_RANK
- newRank = testGen.randInt(1, (testGen.TOSA_TENSOR_MAX_RANK + 1))
+ newRank = rng.randInt(1, (testGen.TOSA_TENSOR_MAX_RANK + 1))
if len(factors) < newRank:
continue
@@ -3095,12 +3103,12 @@ class TosaArgGen:
# Generate the new shape of the chosen new rank
newShape = []
remainingElements = totalElements
- shuffledFactors = testGen.rng.permutation(factors)
+ shuffledFactors = rng.permutation(factors)
for i in range(1, newRank):
# pick rank-1 factors
newShape.append(shuffledFactors[0])
remainingElements = remainingElements // shuffledFactors[0]
- shuffledFactors = testGen.rng.permutation(
+ shuffledFactors = rng.permutation(
TosaArgGen.getFactors(remainingElements)
)
newShape.append(remainingElements)
@@ -3136,7 +3144,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agTranspose(testGen, opName, shapeList, dtype, error_name=None):
+ def agTranspose(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
ifm_shape = shapeList[0]
@@ -3151,7 +3159,7 @@ class TosaArgGen:
elif error_name == ErrorIf.IndexUsedTwice:
# Create list with a duplicated index
perm_range = list(range(len(ifm_shape)))
- index_choice = testGen.rng.choice(range(len(perm_range)))
+ index_choice = rng.choice(range(len(perm_range)))
perm_range[(index_choice + 1) % len(perm_range)] = perm_range[index_choice]
permutations = [p for p in itertools.permutations(perm_range)]
@@ -3163,7 +3171,7 @@ class TosaArgGen:
limit = min(len(permutations), testGen.args.num_rand_permutations)
# Get random permutation generator that uses all permutations
- random_permutations = testGen.rng.permutation(permutations)
+ random_permutations = rng.permutation(permutations)
# Create list of required amount of permutations
arg_list = [
@@ -3183,7 +3191,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agSlice(testGen, opName, shapeList, dtype, error_name=None):
+ def agSlice(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
ifm_shape = shapeList[0]
@@ -3197,8 +3205,8 @@ class TosaArgGen:
for i in range(rank):
if ifm_shape[i] > 1:
- start.append(testGen.randInt(0, ifm_shape[i]))
- size.append(testGen.randInt(0, ifm_shape[i] - start[i]))
+ start.append(rng.randInt(0, ifm_shape[i]))
+ size.append(rng.randInt(0, ifm_shape[i] - start[i]))
# Invalid slice size?
if size[i] == 0:
@@ -3210,7 +3218,7 @@ class TosaArgGen:
if valid:
# If ERROR_IF test required then incorrect start, size will be returned
start, size = TosaErrorIfArgGen.eiSliceErrorIf(
- testGen, error_name, ifm_shape, start, size
+ rng, error_name, ifm_shape, start, size
)
arg_list.append(("perm{}".format(p), {"start": start, "size": size}))
# Now add data generator types
@@ -3226,7 +3234,7 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agTile(testGen, opName, shapeList, dtype, error_name=None):
+ def agTile(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
ifm_shape = shapeList[0]
@@ -3246,7 +3254,7 @@ class TosaArgGen:
elif max(ifm_shape) > 1000:
multiples.append(2)
else:
- multiples.append(testGen.randInt(1, 4))
+ multiples.append(rng.randInt(1, 4))
arg_list.append(("perm{}".format(p), {"multiples": multiples}))
# Now add data generator types
@@ -3262,15 +3270,15 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agResize(testGen, opName, shapeList, dtype, error_name=None):
+ def agResize(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
ifm_shape = shapeList[0]
def get_aspect_ratio_resize_params():
common_aspect_ratios = ((3, 2), (16, 9), (4, 3))
- aspect_ratio = testGen.rng.choice(common_aspect_ratios)
- invert = testGen.rng.choice((False, True))
- letterbox = testGen.rng.choice((False, True))
+ aspect_ratio = rng.choice(common_aspect_ratios)
+ invert = rng.choice((False, True))
+ letterbox = rng.choice((False, True))
scale_y_n = aspect_ratio[0] if invert else aspect_ratio[1]
scale_x_n = aspect_ratio[1] if invert else aspect_ratio[0]
@@ -3279,13 +3287,13 @@ class TosaArgGen:
if letterbox:
max_border = scale_y_n
- border_y = testGen.randInt(low=0, high=max_border)
+ border_y = rng.randInt(low=0, high=max_border)
border_x = 0
else:
# Pillarboxing
border_y = 0
max_border = scale_x_n
- border_x = testGen.randInt(low=0, high=max_border)
+ border_x = rng.randInt(low=0, high=max_border)
scale = (scale_y_n, scale_y_d, scale_x_n, scale_x_d)
offset = (offset_y, offset_x)
@@ -3296,13 +3304,13 @@ class TosaArgGen:
def get_upscale_downscale_params():
valid_params = False
while not valid_params:
- upscale = testGen.rng.choice((False, True))
+ upscale = rng.choice((False, True))
# True if sampling begins from (0,0). Otherwise (-0.5,-0.5)
- origin_sampling = testGen.rng.choice((False, True))
+ origin_sampling = rng.choice((False, True))
if upscale:
- shift = testGen.randInt(low=1, high=4)
+ shift = rng.randInt(low=1, high=4)
scale_x_d = scale_y_d = 1
scale_x_n = scale_y_n = (
1 << shift if origin_sampling else 2 << shift
@@ -3328,16 +3336,16 @@ class TosaArgGen:
if not valid_scale_y_ds:
scale_y_d = 1
else:
- scale_y_d = testGen.rng.choice(valid_scale_y_ds)
+ scale_y_d = rng.choice(valid_scale_y_ds)
if not valid_scale_x_ds:
scale_x_d = 1
else:
- scale_x_d = testGen.rng.choice(valid_scale_x_ds)
+ scale_x_d = rng.choice(valid_scale_x_ds)
border_x = border_y = 0
- offset_y = testGen.randInt(0, 16 * scale_y_n)
- offset_x = testGen.randInt(0, 16 * scale_x_n)
+ offset_y = rng.randInt(0, 16 * scale_y_n)
+ offset_x = rng.randInt(0, 16 * scale_x_n)
valid_params = True
scale = (scale_y_n, scale_y_d, scale_x_n, scale_x_d)
@@ -3356,11 +3364,11 @@ class TosaArgGen:
return scale_d
# Scale
- scale_y_n = testGen.randInt(low=1, high=(1 << 11))
- scale_x_n = testGen.randInt(low=1, high=(1 << 11))
+ scale_y_n = rng.randInt(low=1, high=(1 << 11))
+ scale_x_n = rng.randInt(low=1, high=(1 << 11))
- scale_y_d = testGen.randInt(low=1, high=(16 * scale_y_n))
- scale_x_d = testGen.randInt(low=1, high=(16 * scale_x_n))
+ scale_y_d = rng.randInt(low=1, high=(16 * scale_y_n))
+ scale_x_d = rng.randInt(low=1, high=(16 * scale_x_n))
scale_y_d = fix_scale_to_max_scale(
scale_y_n, scale_y_d, testGen.TOSA_8K_LEVEL_MAX_SCALE
@@ -3370,10 +3378,10 @@ class TosaArgGen:
)
# Offsets and border within the scale
- offset_y = testGen.randInt(low=-scale_y_n, high=(16 * scale_y_n))
- offset_x = testGen.randInt(low=-scale_x_n, high=(16 * scale_x_n))
- border_y = testGen.randInt(low=(-16 * scale_y_n), high=scale_y_n)
- border_x = testGen.randInt(low=(-16 * scale_x_n), high=scale_x_n)
+ offset_y = rng.randInt(low=-scale_y_n, high=(16 * scale_y_n))
+ offset_x = rng.randInt(low=-scale_x_n, high=(16 * scale_x_n))
+ border_y = rng.randInt(low=(-16 * scale_y_n), high=scale_y_n)
+ border_x = rng.randInt(low=(-16 * scale_x_n), high=scale_x_n)
scale = (scale_y_n, scale_y_d, scale_x_n, scale_x_d)
offset = (offset_y, offset_x)
@@ -3382,24 +3390,24 @@ class TosaArgGen:
def get_level_8k_params():
# Create 64x scale - 64/1 to 2048/32
- scale_d = testGen.randInt(
+ scale_d = rng.randInt(
low=1, high=(1 << 11) / testGen.TOSA_8K_LEVEL_MAX_SCALE
)
scale_n = scale_d * testGen.TOSA_8K_LEVEL_MAX_SCALE
# Create half to fifth scaling
- scale_d_alt = testGen.randInt(low=2, high=6)
+ scale_d_alt = rng.randInt(low=2, high=6)
scale_n_alt = 1
- switch = testGen.rng.choice((False, True))
+ switch = rng.choice((False, True))
if switch:
scale = (scale_n_alt, scale_d_alt, scale_n, scale_d)
else:
scale = (scale_n, scale_d, scale_n_alt, scale_d_alt)
- offset_y = testGen.rng.choice((-scale[0], 0, (16 * scale[0]) - 1))
- offset_x = testGen.rng.choice((-scale[2], 0, (16 * scale[2]) - 1))
+ offset_y = rng.choice((-scale[0], 0, (16 * scale[0]) - 1))
+ offset_x = rng.choice((-scale[2], 0, (16 * scale[2]) - 1))
offset = (offset_y, offset_x)
- border_y = testGen.rng.choice((-16 * scale[0], 0, scale[0] - 1))
- border_x = testGen.rng.choice((-16 * scale[2], 0, scale[2] - 1))
+ border_y = rng.choice((-16 * scale[0], 0, scale[0] - 1))
+ border_x = rng.choice((-16 * scale[2], 0, scale[2] - 1))
border = (border_y, border_x)
return scale, offset, border
@@ -3437,7 +3445,7 @@ class TosaArgGen:
while perm < testGen.args.num_rand_permutations:
# Random choice of type of params we are testing
if not testGen.args.level8k:
- _rnd_param_fn = testGen.rng.choice(
+ _rnd_param_fn = rng.choice(
(
get_rand_params,
get_upscale_downscale_params,
@@ -3541,7 +3549,7 @@ class TosaArgGen:
border,
outputDTypeNew,
) = TosaErrorIfArgGen.eiResizeErrorIf(
- testGen,
+ rng,
error_name,
mode,
dtype,
@@ -3596,17 +3604,13 @@ class TosaArgGen:
return arg_list
@staticmethod
- def agTable(testGen, opName, shapeList, dtype, error_name=None):
+ def agTable(testGen, rng, opName, shapeList, dtype, error_name=None):
arg_list = []
if dtype == DType.INT8:
- table = np.int32(
- testGen.rng.integers(low=-128, high=128, size=[256])
- ).tolist()
+ table = np.int32(rng.integers(low=-128, high=128, size=[256])).tolist()
else: # INT16
- table = np.int32(
- testGen.rng.integers(low=-32768, high=32768, size=[513])
- ).tolist()
+ table = np.int32(rng.integers(low=-32768, high=32768, size=[513])).tolist()
# Make sure all slopes are within REQUIRE min/max 16-bit int
for idx in range(len(table) - 1):
slope = table[idx + 1] - table[idx]
@@ -3635,7 +3639,7 @@ class TosaArgGen:
# Return list of tuples: (arg_str, args_dict)
return arg_list
- def agCondIf(testGen, opName, shapeList, dtype, error_name=None):
+ def agCondIf(testGen, rng, opName, shapeList, dtype, error_name=None):
# CondIf generates the condition values here.
# Convert to tensors in the build function, along with the
# then and else blocks
@@ -3656,7 +3660,7 @@ class TosaArgGen:
# Return list of tuples: (arg_str, args_dict)
return arg_list
- def agWhileLoop(testGen, opName, shapeList, dtype, error_name=None):
+ def agWhileLoop(testGen, rng, opName, shapeList, dtype, error_name=None):
# While loop: 0 iterations, 1, more than 1
arg_list = []