def test__total_mappers(interferometer_7): g0 = al.Galaxy(redshift=0.5) g1 = al.Galaxy(redshift=1.0) g2 = al.Galaxy(redshift=2.0) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit.total_mappers == 0 g2 = al.Galaxy( redshift=2.0, pixelization=al.pix.Rectangular(), regularization=al.reg.Constant(), ) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit.total_mappers == 1
def test__total_inversions(self, interferometer_7): g0 = al.Galaxy(redshift=0.5) g1 = al.Galaxy(redshift=1.0) g2 = al.Galaxy(redshift=2.0) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(interferometer=interferometer_7, tracer=tracer) assert fit.total_inversions == 0 g2 = al.Galaxy( redshift=2.0, pixelization=al.pix.Rectangular(), regularization=al.reg.Constant(), ) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(interferometer=interferometer_7, tracer=tracer) assert fit.total_inversions == 1 g0 = al.Galaxy( redshift=0.5, pixelization=al.pix.Rectangular(), regularization=al.reg.Constant(), ) g1 = al.Galaxy( redshift=1.0, pixelization=al.pix.Rectangular(), regularization=al.reg.Constant(), ) g2 = al.Galaxy( redshift=2.0, pixelization=al.pix.Rectangular(), regularization=al.reg.Constant(), ) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(interferometer=interferometer_7, tracer=tracer) assert fit.total_inversions == 3
def fit_interferometer_from_agg_obj( agg_obj, settings_masked_interferometer=None, settings_pixelization=None, settings_inversion=None, ): """Compute a generator of *FitInterferometer* objects from an input aggregator, which generates a list of the *FitInterferometer* objects for every set of results loaded in the aggregator. This is performed by mapping the *fit_interferometer_from_agg_obj* with the aggregator, which sets up each fit using only generators ensuring that manipulating the fits of large sets of results is done in a memory efficient way. Parameters ---------- aggregator : af.Aggregator A PyAutoFit aggregator object containing the results of PyAutoLens model-fits.""" masked_interferometer = masked_interferometer_from_agg_obj( agg_obj=agg_obj, settings_masked_interferometer=settings_masked_interferometer) tracer = tracer_from_agg_obj(agg_obj=agg_obj) if settings_pixelization is None: settings_pixelization = agg_obj.settings.settings_pixelization if settings_inversion is None: settings_inversion = agg_obj.settings.settings_inversion return al.FitInterferometer( masked_interferometer=masked_interferometer, tracer=tracer, settings_pixelization=settings_pixelization, settings_inversion=settings_inversion, )
def test___lens_fit_galaxy_model_image_dict__corresponds_to_profile_galaxy_images( self, interferometer_7_grid): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) g2 = al.Galaxy(redshift=1.0) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(interferometer=interferometer_7_grid, tracer=tracer) traced_grids_of_planes = tracer.traced_grids_of_planes_from_grid( grid=interferometer_7_grid.grid) g0_image = g0.image_2d_from_grid(grid=traced_grids_of_planes[0]) g1_image = g1.image_2d_from_grid(grid=traced_grids_of_planes[1]) assert fit.galaxy_model_image_dict[g0].slim == pytest.approx( g0_image, 1.0e-4) assert fit.galaxy_model_image_dict[g1].slim == pytest.approx( g1_image, 1.0e-4)
def test___lens_fit_galaxy_model_visibilities_dict__has_inversion_mapped_reconstructed_visibilities( self, interferometer_7): pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) g0 = al.Galaxy(redshift=0.5) g1 = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer(interferometer=interferometer_7, tracer=tracer) mapper = pix.mapper_from_grid_and_sparse_grid( grid=interferometer_7.grid, sparse_grid=None) inversion = inversions.InversionInterferometerMatrix.from_data_mapper_and_regularization( mapper=mapper, regularization=reg, visibilities=interferometer_7.visibilities, noise_map=interferometer_7.noise_map, transformer=interferometer_7.transformer, ) assert (fit.galaxy_model_visibilities_dict[g0] == (0.0 + 0.0j) * np.zeros((7, ))).all() assert fit.galaxy_model_visibilities_dict[g1].slim == pytest.approx( inversion.mapped_reconstructed_visibilities.slim, 1.0e-4) assert fit.model_visibilities.slim == pytest.approx( fit.galaxy_model_visibilities_dict[g1].slim, 1.0e-4)
def test__fit_figure_of_merit__matches_correct_fit_given_galaxy_profiles( self, interferometer_7, mask_7x7, visibilities_mask_7x2): lens_galaxy = al.Galaxy(redshift=0.5, light=al.lp.EllipticalSersic(intensity=0.1)) phase_interferometer_7 = al.PhaseInterferometer( real_space_mask=mask_7x7, galaxies=[lens_galaxy], cosmology=cosmo.FLRW, sub_size=2, phase_name="test_phase", ) analysis = phase_interferometer_7.make_analysis( dataset=interferometer_7, mask=visibilities_mask_7x2, results=mock_pipeline.MockResults(), ) instance = phase_interferometer_7.model.instance_from_unit_vector([]) fit_figure_of_merit = analysis.fit(instance=instance) real_space_mask = phase_interferometer_7.meta_dataset.mask_with_phase_sub_size_from_mask( mask=mask_7x7) masked_interferometer = al.MaskedInterferometer( interferometer=interferometer_7, visibilities_mask=visibilities_mask_7x2, real_space_mask=real_space_mask, ) tracer = analysis.tracer_for_instance(instance=instance) fit = al.FitInterferometer(masked_interferometer=masked_interferometer, tracer=tracer) assert fit.likelihood == fit_figure_of_merit
def test__model_visibilities_of_planes_list(interferometer_7): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1_linear = al.Galaxy(redshift=0.75, light_profile=al.lp_linear.EllSersic()) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) galaxy_pix_0 = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) galaxy_pix_1 = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies( galaxies=[g0, g1_linear, galaxy_pix_0, galaxy_pix_1]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert fit.model_visibilities_of_planes_list[0] == pytest.approx( fit.galaxy_model_visibilities_dict[g0], 1.0e-4) assert fit.model_visibilities_of_planes_list[1] == pytest.approx( fit.galaxy_model_visibilities_dict[g1_linear], 1.0e-4) assert fit.model_visibilities_of_planes_list[2] == pytest.approx( fit.galaxy_model_visibilities_dict[galaxy_pix_0] + fit.galaxy_model_visibilities_dict[galaxy_pix_1], 1.0e-4, )
def test__figure_of_merit__includes_hyper_image_and_noise__matches_fit( self, interferometer_7): hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) lens_galaxy = al.Galaxy(redshift=0.5, light=al.lp.EllSersic(intensity=0.1)) model = af.Collection( galaxies=af.Collection(lens=lens_galaxy), hyper_background_noise=hyper_background_noise, ) analysis = al.AnalysisInterferometer(dataset=interferometer_7) instance = model.instance_from_unit_vector([]) analysis_log_likelihood = analysis.log_likelihood_function( instance=instance) tracer = analysis.tracer_for_instance(instance=instance) fit = al.FitInterferometer( interferometer=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert fit.log_likelihood == analysis_log_likelihood
def fit_interferometer_from_agg_obj( agg_obj: af.SearchOutput, settings_interferometer: al.SettingsInterferometer = None, settings_pixelization: al.SettingsPixelization = None, settings_inversion: al.SettingsInversion = None, ) -> "al.FitInterferometer": """ Returns a generator of `FitInterferometer` objects from an input aggregator, which generates a list of the `FitInterferometer` objects for every set of results loaded in the aggregator. This is performed by mapping the `fit_interferometer_from_agg_obj` with the aggregator, which sets up each fit using only generators ensuring that manipulating the fits of large sets of results is done in a memory efficient way. Parameters ---------- aggregator : af.Aggregator A PyAutoFit aggregator object containing the results of PyAutoLens model-fits. """ interferometer = interferometer_from_agg_obj( agg_obj=agg_obj, settings_interferometer=settings_interferometer) tracer = tracer_from_agg_obj(agg_obj=agg_obj) if settings_pixelization is None: settings_pixelization = agg_obj.settings_pixelization if settings_inversion is None: settings_inversion = agg_obj.settings_inversion return al.FitInterferometer( interferometer=interferometer, tracer=tracer, settings_pixelization=settings_pixelization, settings_inversion=settings_inversion, )
def make_masked_interferometer_fit_x2_plane_inversion_7x7( masked_interferometer_7, tracer_x2_plane_inversion_7x7 ): return al.FitInterferometer( masked_interferometer=masked_interferometer_7, tracer=tracer_x2_plane_inversion_7x7, )
def test___all_lens_fit_quantities__hyper_background_noise( self, interferometer_7): hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) hyper_noise_map = hyper_background_noise.hyper_noise_map_from_complex_noise_map( noise_map=interferometer_7.noise_map) galaxy_light = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0)) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) galaxy_pix = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[galaxy_light, galaxy_pix]) fit = al.FitInterferometer( interferometer=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert hyper_noise_map.slim == pytest.approx(fit.inversion.noise_map, 1.0e-4) assert hyper_noise_map.slim == pytest.approx(fit.noise_map.slim)
def test___stochastic_mode__gives_different_log_likelihood_list( interferometer_7): pix = al.pix.VoronoiBrightnessImage(pixels=5) reg = al.reg.Constant(coefficient=1.0) g0 = al.Galaxy( redshift=0.5, pixelization=pix, regularization=reg, hyper_model_image=al.Array2D.ones(shape_native=(3, 3), pixel_scales=1.0), hyper_galaxy_image=al.Array2D.ones(shape_native=(3, 3), pixel_scales=1.0), ) tracer = al.Tracer.from_galaxies(galaxies=[al.Galaxy(redshift=0.5), g0]) fit_0 = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_pixelization=al.SettingsPixelization(is_stochastic=False), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) fit_1 = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_pixelization=al.SettingsPixelization(is_stochastic=False), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit_0.log_evidence == fit_1.log_evidence fit_0 = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_pixelization=al.SettingsPixelization(is_stochastic=True), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) fit_1 = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, settings_pixelization=al.SettingsPixelization(is_stochastic=True), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit_0.log_evidence != fit_1.log_evidence
def test__fit_figure_of_merit(interferometer_7): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert (fit.noise_map.slim == np.full(fill_value=2.0 + 2.0j, shape=(7, ))).all() assert fit.log_likelihood == pytest.approx(-21709493.32, 1e-4) assert fit.figure_of_merit == pytest.approx(-21709493.32, 1.0e-4) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=0.01) g0 = al.Galaxy(redshift=0.5, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[al.Galaxy(redshift=0.5), g0]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert (fit.noise_map.slim == np.full(fill_value=2.0 + 2.0j, shape=(7, ))).all() assert fit.log_evidence == pytest.approx(-66.90612, 1e-4) assert fit.figure_of_merit == pytest.approx(-66.90612, 1.0e-4) galaxy_light = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0)) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) galaxy_pix = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[galaxy_light, galaxy_pix]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert (fit.noise_map.slim == np.full(fill_value=2.0 + 2.0j, shape=(7, ))).all() assert fit.log_evidence == pytest.approx(-1570173.14216, 1e-4) assert fit.figure_of_merit == pytest.approx(-1570173.14216, 1.0e-4)
def test__model_visibilities(interferometer_7): g0 = al.Galaxy(redshift=0.5, light_profile=MockLightProfile(image_2d=np.ones(2))) tracer = al.Tracer.from_galaxies(galaxies=[g0]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert fit.model_visibilities.slim[0] == pytest.approx( np.array([1.2933 + 0.2829j]), 1.0e-4) assert fit.log_likelihood == pytest.approx(-27.06284, 1.0e-4)
def print_fit_time_from(interferometer, transformer_class, use_w_tilde, use_linear_operators, repeats=1): settings_interferometer = al.SettingsInterferometer( transformer_class=transformer_class) interferometer = interferometer.apply_settings( settings=settings_interferometer) """ __Numba Caching__ Call FitImaging once to get all numba functions initialized. """ fit = al.FitInterferometer( dataset=interferometer, tracer=tracer, settings_inversion=al.SettingsInversion( use_w_tilde=use_w_tilde, use_linear_operators=use_linear_operators), ) print(fit.figure_of_merit) """ __Fit Time__ Time FitImaging by itself, to compare to profiling dict call. """ start = time.time() for i in range(repeats): fit = al.FitInterferometer( dataset=interferometer, tracer=tracer, settings_inversion=al.SettingsInversion( use_w_tilde=use_w_tilde, use_linear_operators=use_linear_operators), ) fit.figure_of_merit fit_time = (time.time() - start) / repeats print(f"Fit Time = {fit_time} \n")
def test___all_lens_fit_quantities__no_hyper_methods( self, interferometer_7): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer(interferometer=interferometer_7, tracer=tracer) assert interferometer_7.noise_map == pytest.approx(fit.noise_map) model_visibilities = tracer.profile_visibilities_from_grid_and_transformer( grid=interferometer_7.grid, transformer=interferometer_7.transformer) assert model_visibilities == pytest.approx(fit.model_visibilities, 1e-4) residual_map = al.util.fit.residual_map_from( data=interferometer_7.visibilities, model_data=model_visibilities) assert residual_map == pytest.approx(fit.residual_map, 1e-4) normalized_residual_map = al.util.fit.normalized_residual_map_complex_from( residual_map=residual_map, noise_map=interferometer_7.noise_map) assert normalized_residual_map == pytest.approx( fit.normalized_residual_map, 1e-4) chi_squared_map = al.util.fit.chi_squared_map_complex_from( residual_map=residual_map, noise_map=interferometer_7.noise_map) assert chi_squared_map == pytest.approx(fit.chi_squared_map, 1e-4) chi_squared = al.util.fit.chi_squared_complex_from( chi_squared_map=fit.chi_squared_map) noise_normalization = al.util.fit.noise_normalization_complex_from( noise_map=interferometer_7.noise_map) log_likelihood = al.util.fit.log_likelihood_from( chi_squared=chi_squared, noise_normalization=noise_normalization) assert log_likelihood == pytest.approx(fit.log_likelihood, 1e-4) assert log_likelihood == fit.figure_of_merit
def test___all_lens_fit_quantities__hyper_background_noise( self, interferometer_7): hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) hyper_noise_map = hyper_background_noise.hyper_noise_map_from_complex_noise_map( noise_map=interferometer_7.noise_map) g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer( interferometer=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert hyper_noise_map.slim == pytest.approx(fit.noise_map.slim) fit = al.FitInterferometer( interferometer=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, use_hyper_scaling=False, ) assert fit.noise_map == pytest.approx(interferometer_7.noise_map, 1.0e-4) assert fit.noise_map != pytest.approx(hyper_noise_map.slim, 1.0e-4)
def test__noise_map__with_and_without_hyper_background(interferometer_7): g0 = al.Galaxy(redshift=0.5, light_profile=MockLightProfile(image_2d=np.ones(2))) tracer = al.Tracer.from_galaxies(galaxies=[g0]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert (fit.noise_map.slim == np.full(fill_value=2.0 + 2.0j, shape=(7, ))).all() hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert (fit.noise_map.slim == np.full(fill_value=3.0 + 3.0j, shape=(7, ))).all() assert fit.log_likelihood == pytest.approx(-30.24288, 1.0e-4)
def test__1x2_image__1x2_visibilities__simple_fourier_transform(self): # The image plane image generated by the galaxy is [1.0, 1.0] # Thus the chi squared is 4.0**2.0 + 3.0**2.0 = 25.0 uv_wavelengths = np.array([[0.0, 0.0]]) real_space_mask = al.Mask2D.manual( mask=np.array([ [True, True, True, True], [True, False, False, True], [True, True, True, True], ]), pixel_scales=1.0, ) interferometer = al.Interferometer( visibilities=al.Visibilities.full(fill_value=5.0, shape_slim=(1, )), noise_map=al.Visibilities.ones(shape_slim=(1, )), uv_wavelengths=uv_wavelengths, real_space_mask=real_space_mask, settings=al.SettingsInterferometer( sub_size=1, transformer_class=al.TransformerDFT), ) interferometer.visibilities[0] = 5.0 + 4.0j # Setup as a ray trace instance, using a light profile for the lens g0 = al.Galaxy(redshift=0.5, light_profile=MockLightProfile(value=1.0, size=2)) tracer = al.Tracer.from_galaxies(galaxies=[g0]) fit = al.FitInterferometer(interferometer=interferometer, tracer=tracer) assert (fit.visibilities.slim == np.array([5.0 + 4.0j])).all() assert (fit.noise_map.slim == np.array([1.0 + 1.0j])).all() assert (fit.model_visibilities.slim == np.array([2.0 + 0.0j])).all() assert (fit.residual_map.slim == np.array([3.0 + 4.0j])).all() assert (fit.normalized_residual_map.slim == np.array([3.0 + 4.0j ])).all() assert (fit.chi_squared_map.slim == np.array([9.0 + 16.0j])).all() assert fit.chi_squared == 25.0 assert fit.noise_normalization == (2.0 * np.log(2 * np.pi * 1.0**2.0)) assert fit.log_likelihood == -0.5 * ( 25.0 + 2.0 * np.log(2 * np.pi * 1.0**2.0))
def test__simulate_interferometer_data_and_fit__known_likelihood(): mask = al.Mask2D.circular(radius=3.0, shape_native=(31, 31), pixel_scales=0.2, sub_size=1) grid = al.Grid2D.from_mask(mask=mask) lens_galaxy = al.Galaxy( redshift=0.5, light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.8), ) source_galaxy_0 = al.Galaxy( redshift=1.0, pixelization=al.pix.Rectangular(shape=(16, 16)), regularization=al.reg.Constant(coefficient=(1.0)), ) source_galaxy_1 = al.Galaxy( redshift=2.0, pixelization=al.pix.Rectangular(shape=(16, 16)), regularization=al.reg.Constant(coefficient=(1.0)), ) tracer = al.Tracer.from_galaxies( galaxies=[lens_galaxy, source_galaxy_0, source_galaxy_1]) simulator = al.SimulatorInterferometer( uv_wavelengths=np.ones(shape=(7, 2)), transformer_class=al.TransformerDFT, exposure_time=300.0, noise_seed=1, ) interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer( transformer_class=al.TransformerDFT)) fit = al.FitInterferometer( dataset=interferometer, tracer=tracer, settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit.figure_of_merit == pytest.approx(-5.433894158056919, 1.0e-2)
def test__figure_of_merit__matches_correct_fit_given_galaxy_profiles( interferometer_7): lens_galaxy = al.Galaxy(redshift=0.5, light=al.lp.EllSersic(intensity=0.1)) model = af.Collection(galaxies=af.Collection(lens=lens_galaxy)) analysis = al.AnalysisInterferometer(dataset=interferometer_7) instance = model.instance_from_unit_vector([]) analysis_log_likelihood = analysis.log_likelihood_function( instance=instance) tracer = analysis.tracer_via_instance_from(instance=instance) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert fit.log_likelihood == analysis_log_likelihood
def test___fit_figure_of_merit__linear_operator(interferometer_7_lop): pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=0.01) g0 = al.Galaxy(redshift=0.5, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[al.Galaxy(redshift=0.5), g0]) fit = al.FitInterferometer( dataset=interferometer_7_lop, tracer=tracer, settings_inversion=al.SettingsInversion(use_linear_operators=True), ) assert (fit.noise_map.slim == np.full(fill_value=2.0 + 2.0j, shape=(7, ))).all() assert fit.log_evidence == pytest.approx(-71.5177, 1e-4) assert fit.figure_of_merit == pytest.approx(-71.5177, 1.0e-4)
def test__hyper_background_changes_background_sky__reflected_in_likelihood( self, ): uv_wavelengths = np.array([[1.0, 0.0], [1.0, 1.0], [2.0, 2.0]]) real_space_mask = al.Mask2D.manual( mask=np.array([ [True, True, True, True, True], [True, False, False, False, True], [True, True, True, True, True], ]), pixel_scales=1.0, ) interferometer = al.Interferometer( visibilities=al.Visibilities.full(fill_value=5.0, shape_slim=(3, )), noise_map=al.Visibilities.full(fill_value=2.0, shape_slim=(3, )), uv_wavelengths=uv_wavelengths, real_space_mask=real_space_mask, settings=al.SettingsInterferometer(sub_size=1), ) # Setup as a ray trace instance, using a light profile for the lens g0 = al.Galaxy(redshift=0.5, light_profile=MockLightProfile(value=1.0, size=2)) tracer = al.Tracer.from_galaxies(galaxies=[g0]) hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) fit = al.FitInterferometer( interferometer=interferometer, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert (fit.visibilities.slim == (1.0 + 1.0j) * np.full(fill_value=5.0, shape=(3, ))).all() assert (fit.noise_map.slim == (1.0 + 1.0j) * np.full(fill_value=3.0, shape=(3, ))).all()
def test___lens_fit_galaxy_visibilities_dict__corresponds_to_galaxy_visibilities( self, interferometer_7_grid): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) g2 = al.Galaxy(redshift=1.0) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(interferometer=interferometer_7_grid, tracer=tracer) traced_grids_of_planes = tracer.traced_grids_of_planes_from_grid( grid=interferometer_7_grid.grid) g0_profile_visibilities = g0.profile_visibilities_from_grid_and_transformer( grid=traced_grids_of_planes[0], transformer=interferometer_7_grid.transformer, ) g1_profile_visibilities = g1.profile_visibilities_from_grid_and_transformer( grid=traced_grids_of_planes[1], transformer=interferometer_7_grid.transformer, ) assert fit.galaxy_model_visibilities_dict[g0].slim == pytest.approx( g0_profile_visibilities, 1.0e-4) assert fit.galaxy_model_visibilities_dict[g1].slim == pytest.approx( g1_profile_visibilities, 1.0e-4) assert (fit.galaxy_model_visibilities_dict[g2].slim == (0.0 + 0.0j) * np.zeros((7, ))).all() assert fit.model_visibilities.slim == pytest.approx( fit.galaxy_model_visibilities_dict[g0].slim + fit.galaxy_model_visibilities_dict[g1].slim, 1.0e-4, )
def test__fit_figure_of_merit__matches_correct_fit_given_galaxy_profiles( self, interferometer_7, mask_7x7, visibilities_mask_7 ): lens_galaxy = al.Galaxy( redshift=0.5, light=al.lp.EllipticalSersic(intensity=0.1) ) phase_interferometer_7 = al.PhaseInterferometer( galaxies=dict(lens=lens_galaxy), cosmology=cosmo.FLRW, settings=al.SettingsPhaseInterferometer( settings_masked_interferometer=al.SettingsMaskedInterferometer( sub_size=2 ) ), search=mock.MockSearch("test_phase"), real_space_mask=mask_7x7, ) analysis = phase_interferometer_7.make_analysis( dataset=interferometer_7, mask=visibilities_mask_7, results=mock.MockResults(), ) instance = phase_interferometer_7.model.instance_from_unit_vector([]) fit_figure_of_merit = analysis.log_likelihood_function(instance=instance) masked_interferometer = al.MaskedInterferometer( interferometer=interferometer_7, visibilities_mask=visibilities_mask_7, real_space_mask=mask_7x7, settings=al.SettingsMaskedInterferometer(sub_size=2), ) tracer = analysis.tracer_for_instance(instance=instance) fit = al.FitInterferometer( masked_interferometer=masked_interferometer, tracer=tracer ) assert fit.log_likelihood == fit_figure_of_merit
def test__positions__likelihood_overwrite__changes_likelihood( interferometer_7, mask_2d_7x7): lens = al.Galaxy(redshift=0.5, mass=al.mp.SphIsothermal()) source = al.Galaxy(redshift=1.0, light=al.lp.SphSersic()) model = af.Collection(galaxies=af.Collection(lens=lens, source=source)) analysis = al.AnalysisInterferometer(dataset=interferometer_7) instance = model.instance_from_unit_vector([]) analysis_log_likelihood = analysis.log_likelihood_function( instance=instance) tracer = analysis.tracer_via_instance_from(instance=instance) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) assert fit.log_likelihood == analysis_log_likelihood assert analysis_log_likelihood == pytest.approx(-127914.36273, 1.0e-4) positions_likelihood = al.PositionsLHPenalty(positions=al.Grid2DIrregular([ (1.0, 100.0), (200.0, 2.0) ]), threshold=0.01) analysis = al.AnalysisInterferometer( dataset=interferometer_7, positions_likelihood=positions_likelihood) analysis_log_likelihood = analysis.log_likelihood_function( instance=instance) log_likelihood_penalty_base = positions_likelihood.log_likelihood_penalty_base_from( dataset=interferometer_7) log_likelihood_penalty = positions_likelihood.log_likelihood_penalty_from( tracer=tracer) assert analysis_log_likelihood == pytest.approx( log_likelihood_penalty_base - log_likelihood_penalty, 1.0e-4) assert analysis_log_likelihood == pytest.approx(-22048700567.590656, 1.0e-4)
visibilities_mask=np.full(fill_value=False, shape=interferometer.visibilities.shape), settings=al.SettingsMaskedInterferometer( transformer_class=al.TransformerNUFFT), ) print("Number of points = " + str(masked_interferometer.grid.sub_shape_slim) + "\n") print("Number of visibilities = " + str(masked_interferometer.visibilities.shape_slim) + "\n") start_overall = time.time() tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) start = time.time() for i in range(repeats): fit = al.FitInterferometer( masked_interferometer=masked_interferometer, tracer=tracer, settings_inversion=al.SettingsInversion(use_linear_operators=False), ) print(fit.log_likelihood) diff = time.time() - start print("Time to compute fit = {}".format(diff / repeats)) aplt.FitInterferometer.subplot_fit_real_space(fit=fit)
def test__fit_figure_of_merit__include_hyper_methods(interferometer_7): hyper_background_noise = al.hyper_data.HyperBackgroundNoise( noise_scale=1.0) g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert (fit.noise_map.slim == np.full(fill_value=3.0 + 3.0j, shape=(7, ))).all() assert fit.log_likelihood == pytest.approx(-9648681.9168, 1e-4) assert fit.figure_of_merit == pytest.approx(-9648681.9168, 1.0e-4) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, use_hyper_scaling=False, ) assert fit.noise_map == pytest.approx(interferometer_7.noise_map, 1.0e-4) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=0.01) g0 = al.Galaxy(redshift=0.5, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[al.Galaxy(redshift=0.5), g0]) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert (fit.noise_map.slim == np.full(fill_value=3.0 + 3.0j, shape=(7, ))).all() assert fit.log_evidence == pytest.approx(-68.63380, 1e-4) assert fit.figure_of_merit == pytest.approx(-68.63380, 1.0e-4) galaxy_light = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0)) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) galaxy_pix = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[galaxy_light, galaxy_pix]) fit = al.FitInterferometer( dataset=interferometer_7, tracer=tracer, hyper_background_noise=hyper_background_noise, ) assert (fit.noise_map.slim == np.full(fill_value=3.0 + 3.0j, shape=(7, ))).all() assert fit.log_evidence == pytest.approx(-892439.04665, 1e-4) assert fit.figure_of_merit == pytest.approx(-892439.04665, 1.0e-4)
def test__simulate_interferometer_data_and_fit__chi_squared_is_0__noise_normalization_correct( ): grid = al.Grid2D.uniform(shape_native=(51, 51), pixel_scales=0.1, sub_size=1) lens_galaxy = al.Galaxy( redshift=0.5, light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0), ) source_galaxy = al.Galaxy(redshift=1.0, light=al.lp.EllExponential(centre=(0.1, 0.1), intensity=0.5)) tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) simulator = al.SimulatorInterferometer( uv_wavelengths=np.ones(shape=(7, 2)), transformer_class=al.TransformerDFT, exposure_time=300.0, noise_if_add_noise_false=1.0, noise_sigma=None, ) interferometer = simulator.from_tracer_and_grid(tracer=tracer, grid=grid) file_path = path.join( "{}".format(path.dirname(path.realpath(__file__))), "data_temp", "simulate_and_fit", ) try: shutil.rmtree(file_path) except FileNotFoundError: pass if path.exists(file_path) is False: os.makedirs(file_path) interferometer.output_to_fits( visibilities_path=path.join(file_path, "visibilities.fits"), noise_map_path=path.join(file_path, "noise_map.fits"), uv_wavelengths_path=path.join(file_path, "uv_wavelengths.fits"), ) real_space_mask = al.Mask2D.unmasked(shape_native=(51, 51), pixel_scales=0.1, sub_size=2) interferometer = al.Interferometer.from_fits( visibilities_path=path.join(file_path, "visibilities.fits"), noise_map_path=path.join(file_path, "noise_map.fits"), uv_wavelengths_path=path.join(file_path, "uv_wavelengths.fits"), real_space_mask=real_space_mask, ) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer( transformer_class=al.TransformerDFT)) tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) fit = al.FitInterferometer( interferometer=interferometer, tracer=tracer, settings_pixelization=al.SettingsPixelization(use_border=False), ) assert fit.chi_squared == pytest.approx(0.0) pix = al.pix.Rectangular(shape=(7, 7)) reg = al.reg.Constant(coefficient=0.0001) lens_galaxy = al.Galaxy( redshift=0.5, light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0), ) source_galaxy = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) fit = al.FitInterferometer( interferometer=interferometer, tracer=tracer, settings_pixelization=al.SettingsPixelization(use_border=False), ) assert abs(fit.chi_squared) < 1.0e-4 file_path = path.join("{}".format(path.dirname(path.realpath(__file__))), "data_temp") if path.exists(file_path) is True: shutil.rmtree(file_path)
def test___galaxy_model_visibilities_dict(interferometer_7, interferometer_7_grid): g0 = al.Galaxy( redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0), mass_profile=al.mp.SphIsothermal(einstein_radius=1.0), ) g1 = al.Galaxy(redshift=1.0, light_profile=al.lp.EllSersic(intensity=1.0)) g2 = al.Galaxy(redshift=1.0) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2]) fit = al.FitInterferometer(dataset=interferometer_7_grid, tracer=tracer) traced_grids_of_planes = tracer.traced_grid_list_from( grid=interferometer_7_grid.grid) g0_profile_visibilities = g0.visibilities_via_transformer_from( grid=traced_grids_of_planes[0], transformer=interferometer_7_grid.transformer) g1_profile_visibilities = g1.visibilities_via_transformer_from( grid=traced_grids_of_planes[1], transformer=interferometer_7_grid.transformer) assert fit.galaxy_model_visibilities_dict[g0].slim == pytest.approx( g0_profile_visibilities, 1.0e-4) assert fit.galaxy_model_visibilities_dict[g1].slim == pytest.approx( g1_profile_visibilities, 1.0e-4) assert (fit.galaxy_model_visibilities_dict[g2].slim == (0.0 + 0.0j) * np.zeros((7, ))).all() assert fit.model_visibilities.slim == pytest.approx( fit.galaxy_model_visibilities_dict[g0].slim + fit.galaxy_model_visibilities_dict[g1].slim, 1.0e-4, ) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) g0 = al.Galaxy(redshift=0.5) g1 = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1]) fit = al.FitInterferometer(dataset=interferometer_7, tracer=tracer) mapper = pix.mapper_from(source_grid_slim=interferometer_7.grid, source_pixelization_grid=None) inversion = al.Inversion(dataset=interferometer_7, linear_obj_list=[mapper], regularization_list=[reg]) assert (fit.galaxy_model_visibilities_dict[g0] == (0.0 + 0.0j) * np.zeros( (7, ))).all() assert fit.galaxy_model_visibilities_dict[g1].slim == pytest.approx( inversion.mapped_reconstructed_data.slim, 1.0e-4) assert fit.model_visibilities.slim == pytest.approx( fit.galaxy_model_visibilities_dict[g1].slim, 1.0e-4) g0 = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=1.0)) g1 = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=2.0)) g2 = al.Galaxy(redshift=0.5) pix = al.pix.Rectangular(shape=(3, 3)) reg = al.reg.Constant(coefficient=1.0) galaxy_pix = al.Galaxy(redshift=1.0, pixelization=pix, regularization=reg) tracer = al.Tracer.from_galaxies(galaxies=[g0, g1, g2, galaxy_pix]) fit = al.FitInterferometer(dataset=interferometer_7_grid, tracer=tracer) traced_grids = tracer.traced_grid_list_from( grid=interferometer_7_grid.grid) g0_visibilities = g0.visibilities_via_transformer_from( grid=traced_grids[0], transformer=interferometer_7_grid.transformer) g1_visibilities = g1.visibilities_via_transformer_from( grid=traced_grids[1], transformer=interferometer_7_grid.transformer) profile_visibilities = g0_visibilities + g1_visibilities profile_subtracted_visibilities = (interferometer_7_grid.visibilities - profile_visibilities) mapper = pix.mapper_from( source_grid_slim=interferometer_7_grid.grid, settings=al.SettingsPixelization(use_border=False), ) inversion = al.InversionInterferometer( visibilities=profile_subtracted_visibilities, noise_map=interferometer_7_grid.noise_map, transformer=interferometer_7_grid.transformer, linear_obj_list=[mapper], regularization_list=[reg], settings=al.SettingsInversion(use_w_tilde=False), ) assert (fit.galaxy_model_visibilities_dict[g2] == (0.0 + 0.0j) * np.zeros( (7, ))).all() assert fit.galaxy_model_visibilities_dict[g0].slim == pytest.approx( g0_visibilities.slim, 1.0e-4) assert fit.galaxy_model_visibilities_dict[g1].slim == pytest.approx( g1_visibilities.slim, 1.0e-4) assert fit.galaxy_model_visibilities_dict[ galaxy_pix].slim == pytest.approx( inversion.mapped_reconstructed_data.slim, 1.0e-4) assert fit.model_visibilities.slim == pytest.approx( fit.galaxy_model_visibilities_dict[g0].slim + fit.galaxy_model_visibilities_dict[g1].slim + inversion.mapped_reconstructed_data.slim, 1.0e-4, )