Skip to content

Commit e989ab1

Browse files
authored
Free array iter bugfix (#307)
* free array iter bugfix * same thing in torch handler
1 parent bb854f6 commit e989ab1

4 files changed

Lines changed: 27 additions & 3 deletions

File tree

effectful/handlers/jax/_terms.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ def shape(self) -> Expr[tuple[int, ...]]:
100100
def size(self) -> Expr[int]:
101101
return jnp.size(cast(jax.Array, self))
102102

103+
def __len__(self):
104+
return self.shape[0]
105+
103106
@property
104107
def ndim(self) -> Expr[int]:
105108
return jnp.ndim(cast(jax.Array, self))
@@ -217,15 +220,15 @@ def at(self) -> _IndexUpdateHelper:
217220
"""Return an IndexUpdateHelper for array updates."""
218221
return _IndexUpdateHelper(self)
219222

223+
def __iter__(self):
224+
raise TypeError("A free array is not iterable.")
225+
220226

221227
class _EagerArrayTerm(_ArrayTerm):
222228
def __init__(self, op, tensor, key):
223229
new_shape, new_key = _desugar_tensor_index(tensor.shape, key)
224230
super().__init__(op, jnp.reshape(tensor, new_shape), new_key)
225231

226-
def __len__(self):
227-
return self.shape[0]
228-
229232
def __iter__(self):
230233
for i in range(len(self)):
231234
yield self[i]

effectful/handlers/torch.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,9 @@ def __matmul__(self, other: torch.Tensor) -> torch.Tensor:
489489
def __rmatmul__(self, other: torch.Tensor) -> torch.Tensor:
490490
return torch.matmul(other, typing.cast(torch.Tensor, self))
491491

492+
def __iter__(self):
493+
raise TypeError("A free tensor is not iterable.")
494+
492495

493496
@Term.register
494497
class _EagerTensorTerm(torch.Tensor):

tests/test_handlers_jax.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import jax
2+
import pytest
23

34
import effectful.handlers.jax.numpy as jnp
45
from effectful.handlers.jax import bind_dims, jax_getitem, jit, sizesof
@@ -292,6 +293,9 @@ def test_jax_at_updates():
292293

293294
def test_jax_len():
294295
i = defop(jax.Array, name="i")
296+
with pytest.raises(TypeError):
297+
len(i())
298+
295299
t = jnp.ones((2, 3, 4))
296300
t_i = jax_getitem(t, [i()])
297301
assert len(t_i) == 3
@@ -347,3 +351,9 @@ def test_jax_dimension_addition():
347351
y2 = jax_getitem(y, (i2(), slice(None), None))
348352
assert y2.shape == (4, 1)
349353
assert fvsof(y2) >= {i, i2}
354+
355+
356+
def test_jax_iter():
357+
i = defop(jax.Array, name="i")
358+
with pytest.raises(TypeError):
359+
tuple(i())

tests/test_handlers_torch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,3 +622,11 @@ def test_longtensor_index_variables():
622622

623623
z = x[i()] + y[j()]
624624
assert isinstance(z, torch.Tensor)
625+
626+
627+
def test_tensor_iter():
628+
i = defop(torch.Tensor)
629+
with pytest.raises(TypeError):
630+
len(i())
631+
with pytest.raises(TypeError):
632+
tuple(i())

0 commit comments

Comments
 (0)