def test__regularization_term__solution_all_1s__regularization_matrix_simple(self): matrix_shape = (9, 3) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(9), noise_map=np.ones(9), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper(matrix_shape=matrix_shape), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array([1.0, 1.0, 1.0]) inversion.regularization_matrix = np.array( [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] ) # G_l term, Warren & Dye 2003 / Nightingale /2015 2018 # G_l = s_T * H * s # Matrix multiplication: # s_T * H = [1.0, 1.0, 1.0] * [1.0, 1.0, 1.0] = [(1.0*1.0) + (1.0*0.0) + (1.0*0.0)] = [1.0, 1.0, 1.0] # [1.0, 1.0, 1.0] [(1.0*0.0) + (1.0*1.0) + (1.0*0.0)] # [1.0, 1.0, 1.0] [(1.0*0.0) + (1.0*0.0) + (1.0*1.0)] # (s_T * H) * s = [1.0, 1.0, 1.0] * [1.0] = 3.0 # [1.0] # [1.0] assert inversion.regularization_term == 3.0
def inversion_imaging_from( self, dataset: aa.Imaging, image: aa.Array2D, noise_map: aa.Array2D, w_tilde: aa.WTildeImaging, settings_pixelization: aa.SettingsPixelization = aa. SettingsPixelization(), settings_inversion: aa.SettingsInversion = aa.SettingsInversion(), preloads: Preloads = Preloads(), ): linear_obj_galaxy_dict = self.linear_obj_galaxy_dict_from( dataset=dataset, settings_pixelization=settings_pixelization, preloads=preloads, ) linear_obj_list = list(linear_obj_galaxy_dict.keys()) inversion = inversion_imaging_unpacked_from( image=image, noise_map=noise_map, convolver=dataset.convolver, w_tilde=w_tilde, linear_obj_list=linear_obj_list, regularization_list=self.tracer.regularization_list, settings=settings_inversion, preloads=preloads, profiling_dict=self.tracer.profiling_dict, ) inversion.linear_obj_galaxy_dict = linear_obj_galaxy_dict return inversion
def inversion_imaging_from( self, grid, image, noise_map, convolver, w_tilde, settings_pixelization=aa.SettingsPixelization(), settings_inversion=aa.SettingsInversion(), preloads=aa.Preloads(), ): linear_obj_list = self.linear_obj_list_from( grid=grid, settings_pixelization=settings_pixelization, preloads=preloads) return inversion_imaging_unpacked_from( image=image, noise_map=noise_map, convolver=convolver, w_tilde=w_tilde, linear_obj_list=linear_obj_list, regularization_list=self.regularization_list, settings=settings_inversion, profiling_dict=self.profiling_dict, )
def inversion_interferometer_from( self, dataset: aa.Interferometer, visibilities: aa.Visibilities, noise_map: aa.VisibilitiesNoiseMap, w_tilde, settings_pixelization: aa.SettingsPixelization = aa. SettingsPixelization(), settings_inversion: aa.SettingsInversion = aa.SettingsInversion(), preloads: Preloads = Preloads(), ): linear_obj_galaxy_dict = self.linear_obj_galaxy_dict_from( dataset=dataset, settings_pixelization=settings_pixelization, preloads=preloads, ) linear_obj_list = list(linear_obj_galaxy_dict.keys()) inversion = inversion_interferometer_unpacked_from( visibilities=visibilities, noise_map=noise_map, transformer=dataset.transformer, w_tilde=w_tilde, linear_obj_list=linear_obj_list, regularization_list=self.tracer.regularization_list, settings=settings_inversion, profiling_dict=self.tracer.profiling_dict, ) inversion.linear_obj_galaxy_dict = linear_obj_galaxy_dict return inversion
def inversion_interferometer_from( self, grid, visibilities, noise_map, transformer, settings_pixelization=aa.SettingsPixelization(), settings_inversion=aa.SettingsInversion(), preloads=aa.Preloads(), ): linear_obj_list = self.linear_obj_list_from( grid=grid, settings_pixelization=settings_pixelization, preloads=preloads) return inversion_interferometer_unpacked_from( visibilities=visibilities, noise_map=noise_map, transformer=transformer, linear_obj_list=linear_obj_list, regularization_list=self.regularization_list, settings=settings_inversion, profiling_dict=self.profiling_dict, )
def test__interpolated_errors__also_on_image_grid__interpolates_values(self): conf.instance = conf.Config( path.join(directory, path.join("files", "inversion_image_grid")), path.join(directory, "output"), ) matrix_shape = (25, 3) mask = aa.Mask2D.manual( mask=np.array( [ [True, True, True, True, True], [True, True, False, False, True], [True, False, False, False, True], [True, False, False, True, True], [True, True, True, True, True], ] ), pixel_scales=1.0, sub_size=1, ) grid = aa.Grid2D.from_mask(mask=mask) pixelization_grid = aa.Grid2D.uniform( shape_native=(3, 3), pixel_scales=1.0, sub_size=1 ) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(25), noise_map=np.ones(25), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper( matrix_shape=matrix_shape, source_grid_slim=grid, source_pixelization_grid=pixelization_grid, ), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array( [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] ) inversion.curvature_reg_matrix = np.eye(N=9) interpolated_errors = inversion.interpolated_errors_from_shape_native() assert interpolated_errors.shape_native == (5, 5) assert interpolated_errors.slim == pytest.approx(np.ones(shape=(25,)), 1.0e-4) assert interpolated_errors.native == pytest.approx( np.ones(shape=(5, 5)), 1.0e-4 ) assert interpolated_errors.pixel_scales == pytest.approx((1.0, 1.0), 1.0e-4)
def test__reconstruction_different_values__simple_blurred_mapping_matrix__correct_reconstructed_image( self, ): matrix_shape = (9, 3) mask = aa.Mask2D.manual( mask=np.array( [[True, True, True], [False, False, False], [True, True, True]] ), pixel_scales=1.0, sub_size=1, ) grid = aa.Grid2D.from_mask(mask=mask) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(9), noise_map=np.ones(9), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper(matrix_shape=matrix_shape, source_grid_slim=grid), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array([1.0, 2.0, 3.0, 4.0]) inversion.blurred_mapping_matrix = np.array( [[1.0, 1.0, 1.0, 1.0], [1.0, 0.0, 1.0, 1.0], [1.0, 0.0, 0.0, 0.0]] ) # # Imaging pixel 0 maps to 4 pixs pixxels -> value is 1.0 + 2.0 + 3.0 + 4.0 = 10.0 # # Imaging pixel 1 maps to 3 pixs pixxels -> value is 1.0 + 3.0 + 4.0 # # Imaging pixel 2 maps to 1 pixs pixxels -> value is 1.0 assert ( inversion.mapped_reconstructed_image == np.array([10.0, 8.0, 1.0]) ).all() assert ( inversion.mapped_reconstructed_image.native == np.array([[0.0, 0.0, 0.0], [10.0, 8.0, 1.0], [0.0, 0.0, 0.0]]) ).all() assert inversion.errors_with_covariance == pytest.approx( np.array( [ [0.6785, -0.3214, -0.3214], [-0.3214, 0.6785, -0.3214], [-0.3214, -0.3214, 0.6785], ] ), 1.0e-2, ) assert inversion.errors == pytest.approx( np.array([0.6785, 0.6785, 0.6785]), 1.0e-3 )
def test__interferometer(self): visibilities_mask = np.full(fill_value=False, shape=(7, )) real_space_mask = aa.Mask2D.unmasked(shape_native=(7, 7), pixel_scales=0.1, sub_size=1) grid = aa.Grid2D.from_mask(mask=real_space_mask) pix = aa.pix.VoronoiMagnification(shape=(7, 7)) sparse_grid = pix.sparse_grid_from_grid(grid=grid) mapper = pix.mapper_from_grid_and_sparse_grid( grid=grid, sparse_grid=sparse_grid, settings=aa.SettingsPixelization(use_border=False), ) reg = aa.reg.Constant(coefficient=0.0) visibilities = aa.Visibilities.manual_slim(visibilities=[ 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, ]) noise_map = aa.VisibilitiesNoiseMap.ones(shape_slim=(7, )) uv_wavelengths = np.ones(shape=(7, 2)) interferometer = aa.Interferometer( visibilities=visibilities, noise_map=noise_map, uv_wavelengths=uv_wavelengths, real_space_mask=real_space_mask, ) inversion = aa.Inversion( dataset=interferometer, mapper=mapper, regularization=reg, settings=aa.SettingsInversion(check_solution=False), ) assert inversion.mapped_reconstructed_visibilities == pytest.approx( 1.0 + 0.0j * np.ones(shape=(7, )), 1.0e-4) assert (np.imag(inversion.mapped_reconstructed_visibilities) < 0.0001).all() assert (np.imag(inversion.mapped_reconstructed_visibilities) > 0.0).all()
def test__interferometer_linear_operator(self): real_space_mask = aa.Mask2D.unmasked(shape_native=(7, 7), pixel_scales=0.1, sub_size=1) grid = aa.Grid2D.from_mask(mask=real_space_mask) pix = aa.pix.Rectangular(shape=(7, 7)) mapper = pix.mapper_from_grid_and_sparse_grid( grid=grid, sparse_grid=None, settings=aa.SettingsPixelization(use_border=False), ) reg = aa.reg.Constant(coefficient=0.0) visibilities = aa.Visibilities.manual_slim(visibilities=[ 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, 1.0 + 0.0j, ]) noise_map = aa.VisibilitiesNoiseMap.ones(shape_slim=(7, )) uv_wavelengths = np.ones(shape=(7, 2)) interferometer = aa.Interferometer( visibilities=visibilities, noise_map=noise_map, uv_wavelengths=uv_wavelengths, real_space_mask=real_space_mask, settings=aa.SettingsInterferometer( transformer_class=aa.TransformerNUFFT), ) inversion = aa.Inversion( dataset=interferometer, mapper=mapper, regularization=reg, settings=aa.SettingsInversion(use_linear_operators=True, check_solution=False), ) assert inversion.mapped_reconstructed_visibilities == pytest.approx( 1.0 + 0.0j * np.ones(shape=(7, )), 1.0e-4) assert (np.imag(inversion.mapped_reconstructed_visibilities) < 0.0001).all() assert (np.imag(inversion.mapped_reconstructed_visibilities) > 0.0).all()
def __init__( self, dataset: Union[aa.Imaging, aa.Interferometer], hyper_dataset_result: ResultDataset = None, cosmology=cosmo.Planck15, settings_pixelization: aa.SettingsPixelization = None, settings_inversion: aa.SettingsInversion = None, ): """ Abstract Analysis class for all model-fits which fit galaxies (or objects containing galaxies like a plane) to a dataset, like imaging or interferometer data. This class stores the settings used to perform the model-fit for certain components of the model (e.g. a pixelization or inversion), the Cosmology used for the analysis and hyper datasets used for certain model classes. Parameters ---------- dataset The dataset that is the model is fitted too. hyper_dataset_result The hyper-model image and hyper galaxies images of a previous result in a model-fitting pipeline, which are used by certain classes for adapting the analysis to the properties of the dataset. cosmology The Cosmology assumed for this analysis. settings_pixelization settings controlling how a pixelization is fitted during the model-fit, for example if a border is used when creating the pixelization. settings_inversion Settings controlling how an inversion is fitted during the model-fit, for example which linear algebra formalism is used. """ super().__init__(cosmology=cosmology) self.dataset = dataset self.hyper_dataset_result = hyper_dataset_result if self.hyper_dataset_result is not None: if hyper_dataset_result.search is not None: hyper_dataset_result.search.paths = None self.set_hyper_dataset(result=self.hyper_dataset_result) else: self.hyper_galaxy_image_path_dict = None self.hyper_model_image = None self.settings_pixelization = settings_pixelization or aa.SettingsPixelization() self.settings_inversion = settings_inversion or aa.SettingsInversion() self.preloads = aa.Preloads()
def test__brightest_reconstruction_pixel_and_centre(self): matrix_shape = (9, 3) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(9), noise_map=np.ones(9), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper( matrix_shape, source_pixelization_grid=aa.Grid2DVoronoi.manual_slim( [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [5.0, 0.0]] ), ), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array([2.0, 3.0, 5.0, 0.0]) assert inversion.brightest_reconstruction_pixel == 2 assert inversion.brightest_reconstruction_pixel_centre.in_list == [(5.0, 6.0)]
def test__preloads(self): matrix_shape = (9, 3) mask = aa.Mask2D.manual( mask=np.array( [[True, True, True], [False, False, False], [True, True, True]] ), pixel_scales=1.0, sub_size=1, ) grid = aa.Grid2D.from_mask(mask=mask) blurred_mapping_matrix = 2.0 * np.ones(matrix_shape) curvature_matrix = 18.0 * np.ones((matrix_shape[1], matrix_shape[1])) curvature_matrix_sparse_preload, curvature_matrix_preload_counts = aa.util.inversion.curvature_matrix_sparse_preload_via_mapping_matrix_from( mapping_matrix=blurred_mapping_matrix ) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(9), noise_map=np.ones(9), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper(matrix_shape=matrix_shape, source_grid_slim=grid), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), preloads=aa.Preloads( blurred_mapping_matrix=blurred_mapping_matrix, curvature_matrix_sparse_preload=curvature_matrix_sparse_preload, curvature_matrix_preload_counts=curvature_matrix_preload_counts, ), ) assert (inversion.blurred_mapping_matrix == blurred_mapping_matrix).all()
def __init__( self, dataset: aa.Imaging, tracer: Tracer, hyper_image_sky: Optional[ag.hyper_data.HyperImageSky] = None, hyper_background_noise: Optional[ ag.hyper_data.HyperBackgroundNoise] = None, use_hyper_scaling: bool = True, settings_pixelization: aa.SettingsPixelization = aa. SettingsPixelization(), settings_inversion: aa.SettingsInversion = aa.SettingsInversion(), preloads: Preloads = Preloads(), profiling_dict: Optional[Dict] = None, ): """ An lens fitter, which contains the tracer's used to perform the fit and functions to manipulate \ the lens dataset's hyper_galaxies. Parameters ----------- tracer : Tracer The tracer, which describes the ray-tracing and strong lens configuration. """ super().__init__(dataset=dataset, profiling_dict=profiling_dict) super(AbstractFit).__init__() self.tracer = tracer self.hyper_image_sky = hyper_image_sky self.hyper_background_noise = hyper_background_noise self.use_hyper_scaling = use_hyper_scaling self.settings_pixelization = settings_pixelization self.settings_inversion = settings_inversion self.preloads = preloads
def test__regularization_term__solution_and_regularization_matrix_range_of_values( self, ): matrix_shape = (9, 3) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(9), noise_map=np.ones(9), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper(matrix_shape), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) # G_l term, Warren & Dye 2003 / Nightingale /2015 2018 # G_l = s_T * H * s # Matrix multiplication: # s_T * H = [2.0, 3.0, 5.0] * [2.0, -1.0, 0.0] = [(2.0* 2.0) + (3.0*-1.0) + (5.0 *0.0)] = [1.0, -1.0, 7.0] # [-1.0, 2.0, -1.0] [(2.0*-1.0) + (3.0* 2.0) + (5.0*-1.0)] # [ 0.0, -1.0, 2.0] [(2.0* 0.0) + (3.0*-1.0) + (5.0 *2.0)] # (s_T * H) * s = [1.0, -1.0, 7.0] * [2.0] = 34.0 # [3.0] # [5.0] inversion.reconstruction = np.array([2.0, 3.0, 5.0]) inversion.regularization_matrix = np.array( [[2.0, -1.0, 0.0], [-1.0, 2.0, -1.0], [0.0, -1.0, 2.0]] ) assert inversion.regularization_term == 34.0
def make_analysis_imaging_7x7(): return ag.AnalysisImaging( dataset=make_masked_imaging_7x7(), settings_inversion=aa.SettingsInversion(use_w_tilde=False), )
def __init__( self, dataset: aa.Imaging, plane: Plane, hyper_image_sky=None, hyper_background_noise=None, use_hyper_scalings: bool = True, settings_pixelization: aa.SettingsPixelization = aa.SettingsPixelization(), settings_inversion: aa.SettingsInversion = aa.SettingsInversion(), ): """ An lens fitter, which contains the plane's used to perform the fit and functions to manipulate \ the lens dataset's hyper_galaxies. Parameters ----------- plane The plane of galaxies whose model images are used to fit the imaging data. """ self.plane = plane if use_hyper_scalings: image = hyper_image_from( image=dataset.image, hyper_image_sky=hyper_image_sky ) noise_map = hyper_noise_map_from( noise_map=dataset.noise_map, plane=plane, hyper_background_noise=hyper_background_noise, ) else: image = dataset.image noise_map = dataset.noise_map self.blurred_image = self.plane.blurred_image_2d_via_convolver_from( grid=dataset.grid, convolver=dataset.convolver, blurring_grid=dataset.blurring_grid, ) self.profile_subtracted_image = image - self.blurred_image if not plane.has_pixelization: inversion = None model_image = self.blurred_image else: inversion = plane.inversion_imaging_from( grid=dataset.grid_inversion, image=self.profile_subtracted_image, noise_map=noise_map, convolver=dataset.convolver, w_tilde=dataset.w_tilde, settings_pixelization=settings_pixelization, settings_inversion=settings_inversion, ) model_image = self.blurred_image + inversion.mapped_reconstructed_image fit = aa.FitData( data=image, noise_map=noise_map, model_data=model_image, mask=dataset.mask, inversion=inversion, use_mask_in_fit=False, ) super().__init__(dataset=dataset, fit=fit)
def __init__( self, dataset, tracer, hyper_background_noise=None, use_hyper_scaling=True, settings_pixelization=aa.SettingsPixelization(), settings_inversion=aa.SettingsInversion(), preloads=Preloads(), profiling_dict: Optional[Dict] = None, ): """ An lens fitter, which contains the tracer's used to perform the fit and functions to manipulate \ the lens dataset's hyper_galaxies. Parameters ----------- tracer : Tracer The tracer, which describes the ray-tracing and strong lens configuration. """ self.tracer = tracer self.hyper_background_noise = hyper_background_noise self.use_hyper_scaling = use_hyper_scaling self.settings_pixelization = settings_pixelization self.settings_inversion = settings_inversion self.preloads = preloads self.profiling_dict = profiling_dict if use_hyper_scaling: if hyper_background_noise is not None: noise_map = hyper_background_noise.hyper_noise_map_complex_from( noise_map=dataset.noise_map) else: noise_map = dataset.noise_map else: noise_map = dataset.noise_map self.tracer = tracer self.profile_visibilities = self.tracer.visibilities_via_transformer_from( grid=dataset.grid, transformer=dataset.transformer) self.profile_subtracted_visibilities = (dataset.visibilities - self.profile_visibilities) if not tracer.has_pixelization: inversion = None model_visibilities = self.profile_visibilities else: inversion = tracer.inversion_interferometer_from( grid=dataset.grid_inversion, visibilities=self.profile_subtracted_visibilities, noise_map=noise_map, transformer=dataset.transformer, settings_pixelization=settings_pixelization, settings_inversion=settings_inversion, preloads=preloads, ) model_visibilities = (self.profile_visibilities + inversion.mapped_reconstructed_data) fit = aa.FitDataComplex( data=dataset.visibilities, noise_map=noise_map, model_data=model_visibilities, inversion=inversion, use_mask_in_fit=False, profiling_dict=profiling_dict, ) super().__init__(dataset=dataset, fit=fit, profiling_dict=profiling_dict)
def test__15_grid__no_sub_grid(self): mask = aa.Mask2D.manual( mask=[ [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], [True, False, False, False, False, False, True], [True, False, False, False, False, False, True], [True, False, False, False, False, False, True], [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], ], pixel_scales=1.0, sub_size=1, ) # There is no sub-grid, so our grid are just the masked_image grid (note the NumPy weighted_data structure # ensures this has no sub-gridding) grid = aa.Grid2D.manual_mask( grid=[ [0.9, -0.9], [1.0, -1.0], [1.1, -1.1], [0.9, 0.9], [1.0, 1.0], [1.1, 1.1], [-0.01, 0.01], [0.0, 0.0], [0.01, 0.01], [-0.9, -0.9], [-1.0, -1.0], [-1.1, -1.1], [-0.9, 0.9], [-1.0, 1.0], [-1.1, 1.1], ], mask=mask, ) pix = aa.pix.Rectangular(shape=(3, 3)) mapper = pix.mapper_from_grid_and_sparse_grid( grid=grid, sparse_grid=None, settings=aa.SettingsPixelization(use_border=False), ) assert mapper.data_pixelization_grid == None assert mapper.source_pixelization_grid.shape_native_scaled == pytest.approx( (2.2, 2.2), 1.0e-4) assert mapper.source_pixelization_grid.origin == pytest.approx( (0.0, 0.0), 1.0e-4) assert (mapper.mapping_matrix == np.array([ [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], ])).all() assert mapper.shape_native == (3, 3) reg = aa.reg.Constant(coefficient=1.0) regularization_matrix = reg.regularization_matrix_from_mapper( mapper=mapper) assert (regularization_matrix == np.array([ [2.00000001, -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [-1.0, 3.00000001, -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0], [0.0, -1.0, 2.00000001, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0], [-1.0, 0.0, 0.0, 3.00000001, -1.0, 0.0, -1.0, 0.0, 0.0], [0.0, -1.0, 0.0, -1.0, 4.00000001, -1.0, 0.0, -1.0, 0.0], [0.0, 0.0, -1.0, 0.0, -1.0, 3.00000001, 0.0, 0.0, -1.0], [0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 2.00000001, -1.0, 0.0], [0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 3.00000001, -1.0], [0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 2.00000001], ])).all() image = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) noise_map = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) psf = aa.Kernel2D.no_blur(pixel_scales=1.0) imaging = aa.Imaging(image=image, noise_map=noise_map, psf=psf) masked_imaging = imaging.apply_mask(mask=mask) inversion = aa.Inversion( dataset=masked_imaging, mapper=mapper, regularization=reg, settings=aa.SettingsInversion(check_solution=False), ) assert ( inversion.blurred_mapping_matrix == mapper.mapping_matrix).all() assert (inversion.regularization_matrix == regularization_matrix).all() assert inversion.mapped_reconstructed_image == pytest.approx( np.ones(15), 1.0e-4)
def test__3x3_simple_grid__include_mask_with_offset_centre(self): mask = aa.Mask2D.manual( mask=[ [True, True, True, True, True, True, True], [True, True, True, True, False, True, True], [True, True, True, False, False, False, True], [True, True, True, True, False, True, True], [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], ], pixel_scales=1.0, sub_size=1, ) grid = np.array([[2.0, 1.0], [1.0, 0.0], [1.0, 1.0], [1.0, 2.0], [0.0, 1.0]]) grid = aa.Grid2D.manual_mask(grid=grid, mask=mask) pix = aa.pix.VoronoiMagnification(shape=(3, 3)) sparse_grid = aa.Grid2DSparse.from_grid_and_unmasked_2d_grid_shape( grid=grid, unmasked_sparse_shape=pix.shape) mapper = pix.mapper_from_grid_and_sparse_grid( grid=grid, sparse_grid=sparse_grid, settings=aa.SettingsPixelization(use_border=False), ) assert mapper.source_pixelization_grid.shape_native_scaled == pytest.approx( (2.0, 2.0), 1.0e-4) assert (mapper.source_pixelization_grid == sparse_grid).all() # assert mapper.pixelization_grid.origin == pytest.approx((1.0, 1.0), 1.0e-4) assert isinstance(mapper, mappers.MapperVoronoi) assert (mapper.mapping_matrix == np.array([ [1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0], ])).all() reg = aa.reg.Constant(coefficient=1.0) regularization_matrix = reg.regularization_matrix_from_mapper( mapper=mapper) assert (regularization_matrix == np.array([ [3.00000001, -1.0, -1.0, -1.0, 0.0], [-1.0, 3.00000001, -1.0, 0.0, -1.0], [-1.0, -1.0, 4.00000001, -1.0, -1.0], [-1.0, 0.0, -1.0, 3.00000001, -1.0], [0.0, -1.0, -1.0, -1.0, 3.00000001], ])).all() image = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) noise_map = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) psf = aa.Kernel2D.no_blur(pixel_scales=1.0) imaging = aa.Imaging(image=image, noise_map=noise_map, psf=psf) masked_imaging = imaging.apply_mask(mask=mask) inversion = aa.Inversion( dataset=masked_imaging, mapper=mapper, regularization=reg, settings=aa.SettingsInversion(check_solution=False), ) assert ( inversion.blurred_mapping_matrix == mapper.mapping_matrix).all() assert (inversion.regularization_matrix == regularization_matrix).all() assert inversion.mapped_reconstructed_image == pytest.approx( np.ones(5), 1.0e-4)
def test__5_simple_grid__include_sub_grid(self): mask = aa.Mask2D.manual( mask=[ [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], [True, True, True, False, True, True, True], [True, True, False, False, False, True, True], [True, True, True, False, True, True, True], [True, True, True, True, True, True, True], [True, True, True, True, True, True, True], ], pixel_scales=2.0, sub_size=2, ) # Assume a 2x2 sub-grid, so each of our 5 masked_image-pixels are split into 4. # The grid below is unphysical in that the (0.0, 0.0) terms on the end of each sub-grid probably couldn't # happen for a real lens calculation. This is to make a mapping_matrix matrix which explicitly tests the # sub-grid. grid = aa.Grid2D.manual_mask( grid=[ [1.0, -1.0], [1.0, -1.0], [1.0, -1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [-1.0, -1.0], [-1.0, -1.0], [-1.0, -1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], ], mask=mask, ) pix = aa.pix.Rectangular(shape=(3, 3)) mapper = pix.mapper_from_grid_and_sparse_grid( grid=grid, sparse_grid=None, settings=aa.SettingsPixelization(use_border=False), ) assert mapper.data_pixelization_grid == None assert mapper.source_pixelization_grid.shape_native_scaled == pytest.approx( (2.0, 2.0), 1.0e-4) assert mapper.source_pixelization_grid.origin == pytest.approx( (0.0, 0.0), 1.0e-4) assert (mapper.mapping_matrix == np.array([ [0.75, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.75], [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], ])).all() assert mapper.shape_native == (3, 3) reg = aa.reg.Constant(coefficient=1.0) regularization_matrix = reg.regularization_matrix_from_mapper( mapper=mapper) assert (regularization_matrix == np.array([ [2.00000001, -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [-1.0, 3.00000001, -1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0], [0.0, -1.0, 2.00000001, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0], [-1.0, 0.0, 0.0, 3.00000001, -1.0, 0.0, -1.0, 0.0, 0.0], [0.0, -1.0, 0.0, -1.0, 4.00000001, -1.0, 0.0, -1.0, 0.0], [0.0, 0.0, -1.0, 0.0, -1.0, 3.00000001, 0.0, 0.0, -1.0], [0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 2.00000001, -1.0, 0.0], [0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 3.00000001, -1.0], [0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -1.0, 2.00000001], ])).all() image = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) noise_map = aa.Array2D.ones(shape_native=(7, 7), pixel_scales=1.0) psf = aa.Kernel2D.no_blur(pixel_scales=1.0) imaging = aa.Imaging(image=image, noise_map=noise_map, psf=psf) masked_imaging = imaging.apply_mask(mask=mask) inversion = aa.Inversion( dataset=masked_imaging, mapper=mapper, regularization=reg, settings=aa.SettingsInversion(check_solution=False), ) assert ( inversion.blurred_mapping_matrix == mapper.mapping_matrix).all() assert (inversion.regularization_matrix == regularization_matrix).all() assert inversion.mapped_reconstructed_image == pytest.approx( np.ones(5), 1.0e-4)
def __init__( self, dataset, tracer, hyper_image_sky=None, hyper_background_noise=None, use_hyper_scaling=True, settings_pixelization=aa.SettingsPixelization(), settings_inversion=aa.SettingsInversion(), preloads=Preloads(), profiling_dict: Optional[Dict] = None, ): """ An lens fitter, which contains the tracer's used to perform the fit and functions to manipulate \ the lens dataset's hyper_galaxies. Parameters ----------- tracer : Tracer The tracer, which describes the ray-tracing and strong lens configuration. """ self.tracer = tracer self.hyper_image_sky = hyper_image_sky self.hyper_background_noise = hyper_background_noise self.use_hyper_scaling = use_hyper_scaling self.settings_pixelization = settings_pixelization self.settings_inversion = settings_inversion self.preloads = preloads self.profiling_dict = profiling_dict if use_hyper_scaling: image = hyper_image_from(image=dataset.image, hyper_image_sky=hyper_image_sky) noise_map = hyper_noise_map_from( noise_map=dataset.noise_map, tracer=tracer, hyper_background_noise=hyper_background_noise, ) else: image = dataset.image noise_map = dataset.noise_map if preloads.blurred_image is None: self.blurred_image = self.tracer.blurred_image_2d_via_convolver_from( grid=dataset.grid, convolver=dataset.convolver, blurring_grid=dataset.blurring_grid, ) else: self.blurred_image = preloads.blurred_image self.profile_subtracted_image = image - self.blurred_image if not tracer.has_pixelization: inversion = None model_image = self.blurred_image else: inversion = tracer.inversion_imaging_from( grid=dataset.grid_inversion, image=self.profile_subtracted_image, noise_map=noise_map, convolver=dataset.convolver, w_tilde=dataset.w_tilde, settings_pixelization=settings_pixelization, settings_inversion=settings_inversion, preloads=preloads, ) model_image = self.blurred_image + inversion.mapped_reconstructed_image fit = aa.FitData( data=image, noise_map=noise_map, model_data=model_image, mask=dataset.mask, inversion=inversion, use_mask_in_fit=False, profiling_dict=profiling_dict, ) super().__init__(dataset=dataset, fit=fit, profiling_dict=profiling_dict)
def test__interp__manual_shape_native__uses_input_shape_native(self): matrix_shape = (25, 3) mask = aa.Mask2D.manual( mask=np.array( [ [True, True, True, True, True], [True, True, False, False, True], [True, False, False, False, True], [True, False, False, True, True], [True, True, True, True, True], ] ), pixel_scales=1.0, sub_size=1, ) grid = aa.Grid2D.from_mask(mask=mask) pixelization_grid = aa.Grid2D.uniform( shape_native=(3, 3), pixel_scales=1.0, sub_size=1 ) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(25), noise_map=np.ones(25), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper( matrix_shape=matrix_shape, source_grid_slim=grid, source_pixelization_grid=pixelization_grid, ), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array( [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] ) interpolated_reconstruction = inversion.interpolated_reconstructed_data_from_shape_native( shape_native=(2, 2) ) assert ( interpolated_reconstruction.slim == np.array([1.0, 1.0, 1.0, 1.0]) ).all() assert ( interpolated_reconstruction.native == np.array([[1.0, 1.0], [1.0, 1.0]]) ).all() assert interpolated_reconstruction.pixel_scales == pytest.approx( (1.0, 1.0), 1.0e-4 ) inversion.reconstruction = np.array( [1.0, 1.0, 1.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0] ) interpolated_reconstruction = inversion.interpolated_reconstructed_data_from_shape_native( shape_native=(2, 2) ) assert ( interpolated_reconstruction.slim == np.array([3.0, 3.0, 3.0, 3.0]) ).all() assert ( interpolated_reconstruction.native == np.array([[3.0, 3.0], [3.0, 3.0]]) ).all() assert interpolated_reconstruction.pixel_scales == (1.0, 1.0)
def test__interpolated_reconstruction__config_is_source_grid__grid_is_zoomed_as_uses_mapper_grid( self, ): conf.instance = conf.Config( path.join(directory, path.join("files", "inversion_source_grid")), path.join(directory, "output"), ) matrix_shape = (25, 3) mask = aa.Mask2D.manual( mask=np.array( [ [True, True, True, True, True], [True, True, False, False, True], [True, False, False, False, True], [True, False, False, True, True], [True, True, True, True, True], ] ), pixel_scales=1.0, sub_size=1, ) grid = aa.Grid2D.from_mask(mask=mask) pixelization_grid = aa.Grid2D.uniform( shape_native=(3, 3), pixel_scales=1.0, sub_size=1 ) inversion = inversions.InversionImagingMatrix.from_data_mapper_and_regularization( image=np.ones(25), noise_map=np.ones(25), convolver=mock.MockConvolver(matrix_shape), mapper=mock.MockMapper( matrix_shape=matrix_shape, source_grid_slim=grid, source_pixelization_grid=pixelization_grid, ), regularization=mock.MockRegularization(matrix_shape), settings=aa.SettingsInversion(check_solution=False), ) inversion.reconstruction = np.array( [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] ) interpolated_reconstruction = ( inversion.interpolated_reconstructed_data_from_shape_native() ) assert ( interpolated_reconstruction.slim == np.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]) ).all() assert ( interpolated_reconstruction.native == np.array([[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]) ).all() assert interpolated_reconstruction.pixel_scales == pytest.approx( (0.66666, 0.66666), 1.0e-4 ) interpolated_reconstruction = inversion.interpolated_reconstructed_data_from_shape_native( shape_native=(2, 2) ) assert ( interpolated_reconstruction.slim == np.array([1.0, 1.0, 1.0, 1.0]) ).all() assert ( interpolated_reconstruction.native == np.array([[1.0, 1.0], [1.0, 1.0]]) ).all() assert interpolated_reconstruction.pixel_scales == pytest.approx( (1.0, 1.0), 1.0e-4 ) inversion.reconstruction = np.array( [1.0, 1.0, 1.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0] ) interpolated_reconstruction = inversion.interpolated_reconstructed_data_from_shape_native( shape_native=(2, 2) ) assert ( interpolated_reconstruction.slim == np.array([3.0, 3.0, 3.0, 3.0]) ).all() assert ( interpolated_reconstruction.native == np.array([[3.0, 3.0], [3.0, 3.0]]) ).all() assert interpolated_reconstruction.pixel_scales == (1.0, 1.0)