Skip to content

Commit 73aa606

Browse files
Jammy2211Jammy2211
authored andcommitted
mapped_reconstructed_data
1 parent b495620 commit 73aa606

File tree

10 files changed

+122
-43
lines changed

10 files changed

+122
-43
lines changed

autoarray/inversion/inversion/abstract.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,22 @@ def mapped_reconstructed_data(self) -> Union[Array2D, Visibilities]:
542542
This uses the unique mappings of every source pixel to image pixels, which is a quantity that is already
543543
computed when using the w-tilde formalism.
544544
545+
Returns
546+
-------
547+
Array2D
548+
The reconstructed image data which the inversion fits.
549+
"""
550+
return sum(self.mapped_reconstructed_data_dict.values())
551+
552+
@property
553+
def mapped_reconstructed_operated_data(self) -> Union[Array2D, Visibilities]:
554+
"""
555+
Using the reconstructed source pixel fluxes we map each source pixel flux back to the image plane and
556+
reconstruct the image data.
557+
558+
This uses the unique mappings of every source pixel to image pixels, which is a quantity that is already
559+
computed when using the w-tilde formalism.
560+
545561
Returns
546562
-------
547563
Array2D

autoarray/inversion/inversion/imaging/mapping.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,9 @@ def curvature_matrix(self):
101101
xp=self._xp,
102102
)
103103

104-
105104
def _mapped_reconstructed_data_dict_from(
106-
self,
107-
mapping_matrix_list,
105+
self,
106+
mapping_matrix_list,
108107
) -> Dict["LinearObj", "Array2D"]:
109108
"""
110109
Shared implementation for mapping a reconstruction to image-plane arrays
@@ -197,4 +196,3 @@ def mapped_reconstructed_operated_data_dict(self) -> Dict["LinearObj", "Array2D"
197196
return self._mapped_reconstructed_data_dict_from(
198197
mapping_matrix_list=self.operated_mapping_matrix_list
199198
)
200-

autoarray/inversion/inversion/imaging/sparse.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,6 @@ def _curvature_matrix_func_list_and_mapper(self) -> np.ndarray:
483483

484484
return curvature_matrix
485485

486-
487486
def _mapped_reconstructed_data_dict_from(
488487
self,
489488
*,
@@ -530,11 +529,12 @@ def _mapped_reconstructed_data_dict_from(
530529

531530
mapped = Array2D(values=mapped, mask=self.mask)
532531

533-
534532
else:
535533

536534
if use_operated_for_linear_func:
537-
mapping_matrix = self.linear_func_operated_mapping_matrix_dict[linear_obj]
535+
mapping_matrix = self.linear_func_operated_mapping_matrix_dict[
536+
linear_obj
537+
]
538538
else:
539539
mapping_matrix = self.linear_func_mapping_matrix_dict[linear_obj]
540540

@@ -607,4 +607,4 @@ def mapped_reconstructed_operated_data_dict(self) -> Dict[LinearObj, Array2D]:
607607
"""
608608
return self._mapped_reconstructed_data_dict_from(
609609
use_operated_for_linear_func=True
610-
)
610+
)

autoarray/inversion/inversion/imaging_numba/inversion_imaging_numba_util.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -790,17 +790,17 @@ def mapped_reconstructed_data_via_image_to_pix_unique_from(
790790

791791
data_pixels = data_to_pix_unique.shape[0]
792792

793-
mapped_reconstructed_data = np.zeros(data_pixels)
793+
mapped_reconstructed_operated_data = np.zeros(data_pixels)
794794

795795
for data_0 in range(data_pixels):
796796
for pix_0 in range(pix_lengths[data_0]):
797797
pix_for_data = data_to_pix_unique[data_0, pix_0]
798798

799-
mapped_reconstructed_data[data_0] += (
799+
mapped_reconstructed_operated_data[data_0] += (
800800
data_weights[data_0, pix_0] * reconstruction[pix_for_data]
801801
)
802802

803-
return mapped_reconstructed_data
803+
return mapped_reconstructed_operated_data
804804

805805

806806
class SparseLinAlgImagingNumba:

autoarray/inversion/inversion/imaging_numba/sparse.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -507,9 +507,11 @@ def _mapped_reconstructed_data_dict_from(
507507
mapped = Array2D(values=mapped, mask=self.mask)
508508

509509
else:
510-
510+
511511
if use_operated_for_linear_func:
512-
mapping_matrix = self.linear_func_operated_mapping_matrix_dict[linear_obj]
512+
mapping_matrix = self.linear_func_operated_mapping_matrix_dict[
513+
linear_obj
514+
]
513515
else:
514516
mapping_matrix = self.linear_func_mapping_matrix_dict[linear_obj]
515517

@@ -583,5 +585,3 @@ def mapped_reconstructed_operated_data_dict(self) -> Dict[LinearObj, Array2D]:
583585
return self._mapped_reconstructed_data_dict_from(
584586
use_operated_for_linear_func=True
585587
)
586-
587-

autoarray/inversion/mock/mock_inversion.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def __init__(
2323
reconstruction: np.ndarray = None,
2424
reconstruction_dict: List[np.ndarray] = None,
2525
mapped_reconstructed_operated_data_dict=None,
26+
mapped_reconstructed_data_dict=None,
2627
mapped_reconstructed_image_dict=None,
2728
reconstruction_noise_map: np.ndarray = None,
2829
reconstruction_noise_map_dict: List[np.ndarray] = None,
@@ -56,7 +57,10 @@ def __init__(
5657
self._reconstruction = reconstruction
5758
self._reconstruction_dict = reconstruction_dict
5859

59-
self._mapped_reconstructed_operated_data_dict = mapped_reconstructed_operated_data_dict
60+
self._mapped_reconstructed_operated_data_dict = (
61+
mapped_reconstructed_operated_data_dict
62+
)
63+
self._mapped_reconstructed_data_dict = mapped_reconstructed_data_dict
6064
self._mapped_reconstructed_image_dict = mapped_reconstructed_image_dict
6165

6266
self._reconstruction_noise_map = reconstruction_noise_map
@@ -131,6 +135,26 @@ def reconstruction_dict(self):
131135
return super().reconstruction_dict
132136
return self._reconstruction_dict
133137

138+
@property
139+
def mapped_reconstructed_data_dict(self):
140+
"""
141+
Using the reconstructed source pixel fluxes we map each source pixel flux back to the image plane and
142+
reconstruct the image data.
143+
144+
This uses the unique mappings of every source pixel to image pixels, which is a quantity that is already
145+
computed when using the w-tilde formalism.
146+
147+
Returns
148+
-------
149+
Array2D
150+
The reconstructed image data which the inversion fits.
151+
"""
152+
153+
if self._mapped_reconstructed_data_dict is None:
154+
return super().mapped_reconstructed_data_dict
155+
156+
return self._mapped_reconstructed_data_dict
157+
134158
@property
135159
def mapped_reconstructed_operated_data_dict(self):
136160
"""

test_autoarray/inversion/inversion/interferometer/test_interferometer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def test__fast_chi_squared(
5555

5656
residual_map = aa.util.fit.residual_map_from(
5757
data=interferometer_7_no_fft.data,
58-
model_data=inversion.mapped_reconstructed_data,
58+
model_data=inversion.mapped_reconstructed_operated_data,
5959
)
6060

6161
chi_squared_map = aa.util.fit.chi_squared_map_complex_from(

test_autoarray/inversion/inversion/test_abstract.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,43 @@ def test__reconstruction_dict():
305305
assert (inversion.reconstruction_dict[mapper_1] == 2.0 * np.ones(3)).all()
306306

307307

308-
def test__mapped_reconstructed_data():
308+
def test__mapped_reconstructed_data_dict():
309+
linear_obj_0 = aa.m.MockLinearObj()
310+
311+
mapped_reconstructed_data_dict = {linear_obj_0: np.ones(3)}
312+
313+
# noinspection PyTypeChecker
314+
inversion = aa.m.MockInversion(
315+
mapped_reconstructed_data_dict=mapped_reconstructed_data_dict,
316+
reconstruction=np.ones(3),
317+
reconstruction_dict=[None],
318+
)
319+
320+
assert (inversion.mapped_reconstructed_data_dict[linear_obj_0] == np.ones(3)).all()
321+
assert (inversion.mapped_reconstructed_data == np.ones(3)).all()
322+
323+
linear_obj_1 = aa.m.MockLinearObj()
324+
325+
mapped_reconstructed_data_dict = {
326+
linear_obj_0: np.ones(2),
327+
linear_obj_1: 2.0 * np.ones(2),
328+
}
329+
330+
# noinspection PyTypeChecker
331+
inversion = aa.m.MockInversion(
332+
mapped_reconstructed_data_dict=mapped_reconstructed_data_dict,
333+
reconstruction=np.array([1.0, 1.0, 2.0, 2.0]),
334+
reconstruction_dict=[None, None],
335+
)
336+
337+
assert (inversion.mapped_reconstructed_data_dict[linear_obj_0] == np.ones(2)).all()
338+
assert (
339+
inversion.mapped_reconstructed_data_dict[linear_obj_1] == 2.0 * np.ones(2)
340+
).all()
341+
assert (inversion.mapped_reconstructed_data == 3.0 * np.ones(2)).all()
342+
343+
344+
def test__mapped_reconstructed_operated_data_dict():
309345
linear_obj_0 = aa.m.MockLinearObj()
310346

311347
mapped_reconstructed_operated_data_dict = {linear_obj_0: np.ones(3)}
@@ -317,8 +353,10 @@ def test__mapped_reconstructed_data():
317353
reconstruction_dict=[None],
318354
)
319355

320-
assert (inversion.mapped_reconstructed_operated_data_dict[linear_obj_0] == np.ones(3)).all()
321-
assert (inversion.mapped_reconstructed_data == np.ones(3)).all()
356+
assert (
357+
inversion.mapped_reconstructed_operated_data_dict[linear_obj_0] == np.ones(3)
358+
).all()
359+
assert (inversion.mapped_reconstructed_operated_data == np.ones(3)).all()
322360

323361
linear_obj_1 = aa.m.MockLinearObj()
324362

@@ -334,11 +372,14 @@ def test__mapped_reconstructed_data():
334372
reconstruction_dict=[None, None],
335373
)
336374

337-
assert (inversion.mapped_reconstructed_operated_data_dict[linear_obj_0] == np.ones(2)).all()
338375
assert (
339-
inversion.mapped_reconstructed_operated_data_dict[linear_obj_1] == 2.0 * np.ones(2)
376+
inversion.mapped_reconstructed_operated_data_dict[linear_obj_0] == np.ones(2)
340377
).all()
341-
assert (inversion.mapped_reconstructed_data == 3.0 * np.ones(2)).all()
378+
assert (
379+
inversion.mapped_reconstructed_operated_data_dict[linear_obj_1]
380+
== 2.0 * np.ones(2)
381+
).all()
382+
assert (inversion.mapped_reconstructed_operated_data == 3.0 * np.ones(2)).all()
342383

343384

344385
def test__mapped_reconstructed_image():

test_autoarray/inversion/inversion/test_factory.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,9 @@ def test__inversion_imaging__linear_obj_func_and_non_func_give_same_terms(
328328

329329
masked_imaging_7x7_no_blur = copy.copy(masked_imaging_7x7_no_blur)
330330

331-
masked_imaging_7x7_no_blur.data -= inversion.mapped_reconstructed_operated_data_dict[
332-
linear_obj
333-
]
331+
masked_imaging_7x7_no_blur.data -= (
332+
inversion.mapped_reconstructed_operated_data_dict[linear_obj]
333+
)
334334

335335
inversion_no_linear_func = aa.Inversion(
336336
dataset=masked_imaging_7x7_no_blur,
@@ -453,11 +453,11 @@ def test__inversion_interferometer__via_mapper(
453453

454454
assert isinstance(inversion.linear_obj_list[0], aa.MapperRectangularUniform)
455455
assert isinstance(inversion, aa.InversionInterferometerMapping)
456-
assert inversion.mapped_reconstructed_data == pytest.approx(
456+
assert inversion.mapped_reconstructed_operated_data == pytest.approx(
457457
1.0 + 0.0j * np.ones(shape=(7,)), 1.0e-4
458458
)
459-
assert (np.imag(inversion.mapped_reconstructed_data) < 0.0001).all()
460-
assert (np.imag(inversion.mapped_reconstructed_data) > 0.0).all()
459+
assert (np.imag(inversion.mapped_reconstructed_operated_data) < 0.0001).all()
460+
assert (np.imag(inversion.mapped_reconstructed_operated_data) > 0.0).all()
461461
assert inversion.log_det_curvature_reg_matrix_term == pytest.approx(10.2116, 1.0e-4)
462462

463463
inversion = aa.Inversion(
@@ -468,11 +468,11 @@ def test__inversion_interferometer__via_mapper(
468468

469469
assert isinstance(inversion.linear_obj_list[0], aa.MapperDelaunay)
470470
assert isinstance(inversion, aa.InversionInterferometerMapping)
471-
assert inversion.mapped_reconstructed_data == pytest.approx(
471+
assert inversion.mapped_reconstructed_operated_data == pytest.approx(
472472
1.0 + 0.0j * np.ones(shape=(7,)), 1.0e-4
473473
)
474-
assert (np.imag(inversion.mapped_reconstructed_data) < 0.0001).all()
475-
assert (np.imag(inversion.mapped_reconstructed_data) > 0.0).all()
474+
assert (np.imag(inversion.mapped_reconstructed_operated_data) < 0.0001).all()
475+
assert (np.imag(inversion.mapped_reconstructed_operated_data) > 0.0).all()
476476
assert inversion.log_det_curvature_reg_matrix_term == pytest.approx(
477477
14.49772, 1.0e-4
478478
)
@@ -540,9 +540,9 @@ def test__inversion_matrices__x2_mappers(
540540
)
541541
assert inversion.reconstruction[13] == pytest.approx(0.49999703908867, 1.0e-4)
542542

543-
assert inversion.mapped_reconstructed_operated_data_dict[rectangular_mapper_7x7_3x3][
544-
4
545-
] == pytest.approx(0.5000029, 1.0e-4)
543+
assert inversion.mapped_reconstructed_operated_data_dict[
544+
rectangular_mapper_7x7_3x3
545+
][4] == pytest.approx(0.5000029, 1.0e-4)
546546
assert inversion.mapped_reconstructed_operated_data_dict[delaunay_mapper_9_3x3][
547547
3
548548
] == pytest.approx(0.49999704, 1.0e-4)

test_autoarray/inversion/inversion/test_inversion_util.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,25 +93,25 @@ def test__mapped_reconstructed_data_via_mapping_matrix_from():
9393

9494
reconstruction = np.array([1.0, 1.0, 2.0])
9595

96-
mapped_reconstructed_data = (
96+
mapped_reconstructed_operated_data = (
9797
aa.util.inversion.mapped_reconstructed_data_via_mapping_matrix_from(
9898
mapping_matrix=mapping_matrix, reconstruction=reconstruction
9999
)
100100
)
101101

102-
assert (mapped_reconstructed_data == np.array([1.0, 1.0, 2.0])).all()
102+
assert (mapped_reconstructed_operated_data == np.array([1.0, 1.0, 2.0])).all()
103103

104104
mapping_matrix = np.array([[0.25, 0.50, 0.25], [0.0, 1.0, 0.0], [0.0, 0.25, 0.75]])
105105

106106
reconstruction = np.array([1.0, 1.0, 2.0])
107107

108-
mapped_reconstructed_data = (
108+
mapped_reconstructed_operated_data = (
109109
aa.util.inversion.mapped_reconstructed_data_via_mapping_matrix_from(
110110
mapping_matrix=mapping_matrix, reconstruction=reconstruction
111111
)
112112
)
113113

114-
assert (mapped_reconstructed_data == np.array([1.25, 1.0, 1.75])).all()
114+
assert (mapped_reconstructed_operated_data == np.array([1.25, 1.0, 1.75])).all()
115115

116116

117117
def test__mapped_reconstructed_data_via_image_to_pix_unique_from():
@@ -134,14 +134,14 @@ def test__mapped_reconstructed_data_via_image_to_pix_unique_from():
134134

135135
reconstruction = np.array([1.0, 1.0, 2.0])
136136

137-
mapped_reconstructed_data = aa.util.inversion_imaging_numba.mapped_reconstructed_data_via_image_to_pix_unique_from(
137+
mapped_reconstructed_operated_data = aa.util.inversion_imaging_numba.mapped_reconstructed_data_via_image_to_pix_unique_from(
138138
data_to_pix_unique=data_to_pix_unique.astype("int"),
139139
data_weights=data_weights,
140140
pix_lengths=pix_lengths.astype("int"),
141141
reconstruction=reconstruction,
142142
)
143143

144-
assert (mapped_reconstructed_data == np.array([1.0, 1.0, 2.0])).all()
144+
assert (mapped_reconstructed_operated_data == np.array([1.0, 1.0, 2.0])).all()
145145

146146
pix_indexes_for_sub_slim_index = np.array(
147147
[[0], [1], [1], [2], [1], [1], [1], [1], [1], [2], [2], [2]]
@@ -164,14 +164,14 @@ def test__mapped_reconstructed_data_via_image_to_pix_unique_from():
164164

165165
reconstruction = np.array([1.0, 1.0, 2.0])
166166

167-
mapped_reconstructed_data = aa.util.inversion_imaging_numba.mapped_reconstructed_data_via_image_to_pix_unique_from(
167+
mapped_reconstructed_operated_data = aa.util.inversion_imaging_numba.mapped_reconstructed_data_via_image_to_pix_unique_from(
168168
data_to_pix_unique=data_to_pix_unique.astype("int"),
169169
data_weights=data_weights,
170170
pix_lengths=pix_lengths.astype("int"),
171171
reconstruction=reconstruction,
172172
)
173173

174-
assert (mapped_reconstructed_data == np.array([1.25, 1.0, 1.75])).all()
174+
assert (mapped_reconstructed_operated_data == np.array([1.25, 1.0, 1.75])).all()
175175

176176

177177
def test__preconditioner_matrix_via_mapping_matrix_from():

0 commit comments

Comments
 (0)