Skip to content

Commit 8f22034

Browse files
Jammy2211claude
authored andcommitted
fix: restore Grid1D support in decorators — used by workspace scripts
Smoke tests revealed that workspace scripts (e.g. galaxies.py) pass Grid1D to decorated methods. The Grid1D→2D projection in evaluate_func and the via_grid_1d result handlers are needed for this path to work. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2a11503 commit 8f22034

File tree

7 files changed

+84
-4
lines changed

7 files changed

+84
-4
lines changed

autoarray/structures/decorators/abstract.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
from typing import Union
2+
13
import numpy as np
24

5+
from autoarray.mask.mask_1d import Mask1D
36
from autoarray.mask.mask_2d import Mask2D
7+
from autoarray.structures.grids.uniform_1d import Grid1D
48
from autoarray.structures.grids.irregular_2d import Grid2DIrregular
59
from autoarray.structures.grids.uniform_2d import Grid2D
610

@@ -58,7 +62,7 @@ def _xp(self):
5862
return np
5963

6064
@property
61-
def mask(self) -> Mask2D:
65+
def mask(self) -> Union[Mask1D, Mask2D]:
6266
return self.grid.mask
6367

6468
@property
@@ -71,8 +75,14 @@ def via_grid_2d(self, result):
7175
def via_grid_2d_irr(self, result):
7276
raise NotImplementedError
7377

78+
def via_grid_1d(self, result):
79+
raise NotImplementedError
80+
7481
@property
7582
def evaluate_func(self):
83+
if isinstance(self.grid, Grid1D):
84+
grid = self.grid.grid_2d_radial_projected_from()
85+
return self.func(self.obj, grid, self._xp, *self.args, **self.kwargs)
7686
return self.func(self.obj, self.grid, self._xp, *self.args, **self.kwargs)
7787

7888
@property
@@ -93,5 +103,7 @@ def result(self):
93103
return self.via_grid_2d(self.evaluate_func)
94104
elif isinstance(self.grid, Grid2DIrregular):
95105
return self.via_grid_2d_irr(self.evaluate_func)
106+
elif isinstance(self.grid, Grid1D):
107+
return self.via_grid_1d(self.evaluate_func)
96108

97109
return self.evaluate_func

autoarray/structures/decorators/to_array.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
from typing import List, Union
44

55
from autoarray.structures.arrays.irregular import ArrayIrregular
6+
from autoarray.structures.arrays.uniform_1d import Array1D
67
from autoarray.structures.arrays.uniform_2d import Array2D
78
from autoarray.structures.decorators.abstract import AbstractMaker
9+
from autoarray.structures.grids.uniform_1d import Grid1D
810
from autoarray.structures.grids.irregular_2d import Grid2DIrregular
911
from autoarray.structures.grids.uniform_2d import Grid2D
1012

@@ -20,6 +22,11 @@ def via_grid_2d_irr(self, result) -> Union[ArrayIrregular, List[ArrayIrregular]]
2022
return ArrayIrregular(values=result)
2123
return [ArrayIrregular(values=res) for res in result]
2224

25+
def via_grid_1d(self, result) -> Union[Array1D, List[Array1D]]:
26+
if not isinstance(result, list):
27+
return Array1D(values=result, mask=self.mask)
28+
return [Array1D(values=res, mask=self.mask) for res in result]
29+
2330

2431
def to_array(func):
2532
"""
@@ -39,11 +46,11 @@ def to_array(func):
3946
@wraps(func)
4047
def wrapper(
4148
obj: object,
42-
grid: Union[np.ndarray, Grid2D, Grid2DIrregular],
49+
grid: Union[np.ndarray, Grid2D, Grid2DIrregular, Grid1D],
4350
xp=np,
4451
*args,
4552
**kwargs,
46-
) -> Union[np.ndarray, Array2D, ArrayIrregular, List]:
53+
) -> Union[np.ndarray, Array1D, Array2D, ArrayIrregular, List]:
4754
return ArrayMaker(func=func, obj=obj, grid=grid, xp=xp, *args, **kwargs).result
4855

4956
return wrapper

autoarray/structures/decorators/to_grid.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import List, Union
44

55
from autoarray.structures.decorators.abstract import AbstractMaker
6+
from autoarray.structures.grids.uniform_1d import Grid1D
67
from autoarray.structures.grids.irregular_2d import Grid2DIrregular
78
from autoarray.structures.grids.uniform_2d import Grid2D
89

@@ -34,6 +35,13 @@ def via_grid_2d_irr(self, result) -> Union[Grid2DIrregular, List[Grid2DIrregular
3435
return Grid2DIrregular(values=result)
3536
return [Grid2DIrregular(values=res) for res in result]
3637

38+
def via_grid_1d(self, result) -> Union[Grid2D, List[Grid2D]]:
39+
if not isinstance(result, list):
40+
return Grid2D(values=result, mask=self.mask.derive_mask.to_mask_2d)
41+
return [
42+
Grid2D(values=res, mask=self.mask.derive_mask.to_mask_2d) for res in result
43+
]
44+
3745

3846
def to_grid(func):
3947
"""
@@ -53,7 +61,7 @@ def to_grid(func):
5361
@wraps(func)
5462
def wrapper(
5563
obj: object,
56-
grid: Union[np.ndarray, Grid2D, Grid2DIrregular],
64+
grid: Union[np.ndarray, Grid2D, Grid2DIrregular, Grid1D],
5765
xp=np,
5866
*args,
5967
**kwargs,

autoarray/structures/decorators/to_vector_yx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import List, Union
44

55
from autoarray.structures.decorators.abstract import AbstractMaker
6+
from autoarray.structures.grids.uniform_1d import Grid1D
67
from autoarray.structures.grids.irregular_2d import Grid2DIrregular
78
from autoarray.structures.grids.uniform_2d import Grid2D
89
from autoarray.structures.vectors.irregular import VectorYX2DIrregular

autoarray/structures/decorators/transform.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import numpy as np
33
from typing import Union
44

5+
from autoarray.structures.grids.uniform_1d import Grid1D
56
from autoarray.structures.grids.irregular_2d import Grid2DIrregular
67
from autoarray.structures.grids.uniform_2d import Grid2D
78

test_autoarray/structures/decorators/test_to_array.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,22 @@
33
import autoarray as aa
44

55

6+
def test__in_grid_1d__out_ndarray_1d_list():
7+
mask = aa.Mask1D(mask=[True, False, False, True], pixel_scales=(1.0,))
8+
9+
grid_1d = aa.Grid1D.from_mask(mask=mask)
10+
11+
obj = aa.m.MockGrid2DLikeObj()
12+
13+
ndarray_1d_list = obj.ndarray_1d_list_from(grid=grid_1d)
14+
15+
assert isinstance(ndarray_1d_list[0], aa.Array1D)
16+
assert (ndarray_1d_list[0].native == np.array([[0.0, 1.0, 1.0, 0.0]])).all()
17+
18+
assert isinstance(ndarray_1d_list[1], aa.Array1D)
19+
assert (ndarray_1d_list[1].native == np.array([[0.0, 2.0, 2.0, 0.0]])).all()
20+
21+
622
def test__in_grid_2d__out_ndarray_1d_list():
723
mask = aa.Mask2D(
824
mask=[

test_autoarray/structures/decorators/test_to_grid.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,41 @@
44
import autoarray as aa
55

66

7+
def test__in_grid_1d__out_ndarray_2d():
8+
mask_1d = aa.Mask1D(mask=[True, False, False, True], pixel_scales=(1.0,))
9+
10+
grid_1d = aa.Grid1D.from_mask(mask=mask_1d)
11+
12+
obj = aa.m.MockGrid2DLikeObj()
13+
14+
ndarray_2d = obj.ndarray_2d_from(grid=grid_1d)
15+
16+
assert isinstance(ndarray_2d, aa.Grid2D)
17+
assert ndarray_2d.native == pytest.approx(
18+
np.array([[[0.0, 0.0], [0.0, -1.0], [0.0, 1.0], [0.0, 0.0]]]), abs=1.0e-4
19+
)
20+
21+
22+
def test__in_dgrid_1d__out_ndarray_2d_list():
23+
mask = aa.Mask1D(mask=[True, False, False, True], pixel_scales=(1.0,))
24+
25+
grid_1d = aa.Grid1D.from_mask(mask=mask)
26+
27+
obj = aa.m.MockGrid2DLikeObj()
28+
29+
ndarray_2d_list = obj.ndarray_2d_list_from(grid=grid_1d)
30+
31+
assert isinstance(ndarray_2d_list[0], aa.Grid2D)
32+
assert ndarray_2d_list[0].native == pytest.approx(
33+
np.array([[[0.0, 0.0], [0.0, -0.5], [0.0, 0.5], [0.0, 0.0]]]), abs=1.0e-4
34+
)
35+
36+
assert isinstance(ndarray_2d_list[1], aa.Grid2D)
37+
assert ndarray_2d_list[1].native == pytest.approx(
38+
np.array([[[0.0, 0.0], [0.0, -1.0], [0.0, 1.0], [0.0, 0.0]]]), abs=1.0e-4
39+
)
40+
41+
742
def test__in_grid_2d__out_ndarray_2d():
843
mask = aa.Mask2D(
944
mask=[

0 commit comments

Comments
 (0)