def test_layout(): "Test basis properties of layout and strides" data = [0] * 3 * 5 tensor_data = minitorch.TensorData(data, (3, 5), (5, 1)) assert tensor_data.is_contiguous() assert tensor_data.shape == (3, 5) assert tensor_data.index((1, 0)) == 5 assert tensor_data.index((1, 2)) == 7 tensor_data = minitorch.TensorData(data, (5, 3), (1, 5)) assert tensor_data.shape == (5, 3) assert not tensor_data.is_contiguous() data = [0] * 4 * 2 * 2 tensor_data = minitorch.TensorData(data, (4, 2, 2)) assert tensor_data.strides == (4, 2, 1)
def tensor_data(draw, numbers=floats(), shape=None): if shape is None: shape = draw(shapes()) size = int(minitorch.prod(shape)) data = draw(lists(numbers, min_size=size, max_size=size)) permute = draw(permutations(range(len(shape)))) permute_shape = tuple([shape[i] for i in permute]) reverse_permute = [a[0] for a in sorted(enumerate(permute), key=lambda a: a[1])] td = minitorch.TensorData(data, permute_shape) ret = td.permute(*reverse_permute) assert ret.shape[0] == shape[0] return ret
def matmul_tensors( draw, numbers=floats(allow_nan=False, min_value=-100, max_value=100) ): i, j, k = [draw(integers(min_value=1, max_value=10)) for _ in range(3)] l1 = (i, j) l2 = (j, k) values = [] for shape in [l1, l2]: size = int(minitorch.prod(shape)) data = draw(lists(numbers, min_size=size, max_size=size)) values.append(minitorch.Tensor(minitorch.TensorData(data, shape))) return values
def shaped_tensors( draw, n, numbers=floats(allow_nan=False, min_value=-100, max_value=100), backend=minitorch.TensorFunctions, ): td = draw(tensor_data(numbers)) values = [] for i in range(n): data = draw(lists(numbers, min_size=td.size, max_size=td.size)) values.append( minitorch.Tensor(minitorch.TensorData(data, td.shape), backend=backend)) return values
def tensor_data(draw, numbers=floats(), shape=None): if shape is None: shape = draw(shapes()) size = int(minitorch.prod(shape)) data = draw(lists(numbers, min_size=size, max_size=size)) return minitorch.TensorData(data, shape)
def test_layout_bad(): "Test basis properties of layout and strides" data = [0] * 3 * 5 minitorch.TensorData(data, (3, 5), (6, ))