Пример #1
0
    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
Пример #2
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
Пример #3
0
    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,
        )
Пример #4
0
    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
Пример #5
0
    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,
        )
Пример #6
0
    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)
Пример #7
0
    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()
Пример #10
0
    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()
Пример #11
0
    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)]
Пример #12
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()
Пример #13
0
    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
Пример #14
0
    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
Пример #15
0
def make_analysis_imaging_7x7():
    return ag.AnalysisImaging(
        dataset=make_masked_imaging_7x7(),
        settings_inversion=aa.SettingsInversion(use_w_tilde=False),
    )
Пример #16
0
    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)
Пример #17
0
    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)
Пример #21
0
    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)
Пример #22
0
    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)
Пример #23
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)