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__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 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")
""" real_space_mask = al.Mask2D.circular( shape_native=(151, 151), pixel_scales=0.05, radius=3.0 ) dataset_name = "mass_sie__source_sersic_x2" dataset_path = path.join("dataset", "interferometer", dataset_name) interferometer = al.Interferometer.from_fits( visibilities_path=path.join(dataset_path, "visibilities.fits"), noise_map_path=path.join(dataset_path, "noise_map.fits"), uv_wavelengths_path=path.join(dataset_path, "uv_wavelengths.fits"), real_space_mask=real_space_mask, ) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer(transformer_class=al.TransformerDFT) ) """ __Inversion Settings (Run Times)__ The run times of an interferometer `Inversion` depend significantly on the following settings: - `transformer_class`: whether a discrete Fourier transform (`TransformerDFT`) or non-uniform fast Fourier Transform (`TransformerNUFFT) is used to map the inversion's image from real-space to Fourier space. - `use_linear_operators`: whether the linear operator formalism or matrix formalism is used for the linear algebra. The optimal settings depend on the number of visibilities in the dataset: - For N_visibilities < 1000: `transformer_class=TransformerDFT` and `use_linear_operators=False` gives the fastest
""" real_space_mask = al.Mask2D.circular(shape_native=(151, 151), pixel_scales=0.05, radius=3.0) dataset_name = "mass_sie__subhalo_nfw__source_sersic_x2" dataset_path = path.join("dataset", "interferometer", dataset_name) interferometer = al.Interferometer.from_fits( visibilities_path=path.join(dataset_path, "visibilities.fits"), noise_map_path=path.join(dataset_path, "noise_map.fits"), uv_wavelengths_path=path.join(dataset_path, "uv_wavelengths.fits"), real_space_mask=real_space_mask, ) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer(transformer_class=al.TransformerNUFFT)) interferometer_plotter = aplt.InterferometerPlotter( interferometer=interferometer) interferometer_plotter.subplot_interferometer() interferometer_plotter.subplot_dirty_images() """ __Paths__ The path the results of all chained searches are output: """ path_prefix = path.join("interferometer", "slam") """ __Redshifts__ The redshifts of the lens and source galaxies, which are used to perform unit converions of the model and data (e.g.
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__simulate_interferometer_data_and_fit__linear_light_profiles_and_pixelization( ): 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=100.0), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0), ) source_galaxy = al.Galaxy( redshift=1.0, bulge=al.lp.EllSersic(intensity=0.1, sersic_index=1.0), disk=al.lp.EllSersic(intensity=0.2, sersic_index=4.0), ) tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) simulator = al.SimulatorInterferometer( uv_wavelengths=np.array([ [0.04, 200.0, 0.3, 400000.0, 60000000.0], [0.00003, 500.0, 600000.0, 0.1, 75555555], ]), transformer_class=al.TransformerDFT, exposure_time=300.0, noise_if_add_noise_false=1.0, noise_sigma=None, ) interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer(grid_class=al.Grid2D, transformer_class=al.TransformerDFT, sub_size=1)) lens_galaxy_linear = al.Galaxy( redshift=0.5, light=al.lp_linear.EllSersic(centre=(0.1, 0.1)), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0), ) source_galaxy_pix = al.Galaxy( redshift=1.0, pixelization=al.pix.Rectangular(shape=(3, 3)), regularization=al.reg.Constant(coefficient=0.01), ) tracer_linear = al.Tracer.from_galaxies( galaxies=[lens_galaxy_linear, source_galaxy_pix]) fit_linear = al.FitInterferometer( dataset=interferometer, tracer=tracer_linear, settings_pixelization=al.SettingsPixelization(use_border=False), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit_linear.inversion.reconstruction == pytest.approx( np.array([ 1.00338472e02, 9.55074606e-02, 9.24767167e-02, 9.45392540e-02, 1.41969109e-01, 1.41828976e-01, 1.41521130e-01, 1.84257307e-01, 1.85507562e-01, 1.83726575e-01, ]), 1.0e-2, ) assert fit_linear.figure_of_merit == pytest.approx(-29.20551989, 1.0e-4) lens_galaxy_image = lens_galaxy.image_2d_from(grid=interferometer.grid) assert fit_linear.galaxy_model_image_dict[ lens_galaxy_linear] == pytest.approx(lens_galaxy_image, 1.0e-2) traced_grid_2d_list = tracer.traced_grid_2d_list_from( grid=interferometer.grid) source_galaxy_image = source_galaxy.image_2d_from( grid=traced_grid_2d_list[1])
def test__simulate_interferometer_data_and_fit__linear_light_profiles_agree_with_standard_light_profiles( ): 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, bulge=al.lp.EllSersic(intensity=0.1, sersic_index=1.0), disk=al.lp.EllSersic(intensity=0.2, sersic_index=4.0), ) tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy]) simulator = al.SimulatorInterferometer( uv_wavelengths=np.array([ [0.04, 200.0, 0.3, 400000.0, 60000000.0], [0.00003, 500.0, 600000.0, 0.1, 75555555], ]), transformer_class=al.TransformerDFT, exposure_time=300.0, noise_if_add_noise_false=1.0, noise_sigma=None, ) interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid) interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer(grid_class=al.Grid2D, transformer_class=al.TransformerDFT, sub_size=1)) fit = al.FitInterferometer( dataset=interferometer, tracer=tracer, settings_pixelization=al.SettingsPixelization(use_border=False), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) lens_galaxy_linear = al.Galaxy( redshift=0.5, light=al.lp_linear.EllSersic(centre=(0.1, 0.1)), mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0), ) source_galaxy_linear = al.Galaxy( redshift=1.0, bulge=al.lp_linear.EllSersic(sersic_index=1.0), disk=al.lp_linear.EllSersic(sersic_index=4.0), ) tracer_linear = al.Tracer.from_galaxies( galaxies=[lens_galaxy_linear, source_galaxy_linear]) fit_linear = al.FitInterferometer( dataset=interferometer, tracer=tracer_linear, settings_pixelization=al.SettingsPixelization(use_border=False), settings_inversion=al.SettingsInversion(use_w_tilde=False), ) assert fit_linear.inversion.reconstruction == pytest.approx( np.array([0.1, 0.1, 0.2]), 1.0e-4) assert fit_linear.linear_light_profile_intensity_dict[ lens_galaxy_linear.light] == pytest.approx(0.1, 1.0e-2) assert fit_linear.linear_light_profile_intensity_dict[ source_galaxy_linear.bulge] == pytest.approx(0.1, 1.0e-2) assert fit_linear.linear_light_profile_intensity_dict[ source_galaxy_linear.disk] == pytest.approx(0.2, 1.0e-2) assert fit.log_likelihood == fit_linear.log_likelihood lens_galaxy_image = lens_galaxy.image_2d_from(grid=interferometer.grid) assert fit_linear.galaxy_model_image_dict[ lens_galaxy_linear] == pytest.approx(lens_galaxy_image, 1.0e-4) traced_grid_2d_list = tracer.traced_grid_2d_list_from( grid=interferometer.grid) source_galaxy_image = source_galaxy.image_2d_from( grid=traced_grid_2d_list[1]) assert fit_linear.galaxy_model_image_dict[ source_galaxy_linear] == pytest.approx(source_galaxy_image, 1.0e-4) lens_galaxy_visibilities = lens_galaxy.visibilities_via_transformer_from( grid=interferometer.grid, transformer=interferometer.transformer) assert fit_linear.galaxy_model_visibilities_dict[ lens_galaxy_linear] == pytest.approx(lens_galaxy_visibilities, 1.0e-4) source_galaxy_visibilities = source_galaxy.visibilities_via_transformer_from( grid=traced_grid_2d_list[1], transformer=interferometer.transformer) assert fit_linear.galaxy_model_visibilities_dict[ source_galaxy_linear] == pytest.approx(source_galaxy_visibilities, 1.0e-4)
transformer_class = al.TransformerDFT """ However, the direct Fourier transform is inefficient. For ~10 million visibilities, it requires **thousands of seconds** to perform a single transform. To model a lens, we'll perform tens of thousands of transforms, making this approach unfeasible for high quality ALMA and radio datasets. For this reason, **PyAutoLens** supports the non-uniform fast fourier transform algorithm **PyNUFFT** (https://github.com/jyhmiinlin/pynufft), which is significantly faster, being able too perform a Fourier transform of ~10 million in less than a second! """ transformer_class = al.TransformerNUFFT """ The use this transformer in a fit, we use the `apply_settings` method. """ interferometer = interferometer.apply_settings( settings=al.SettingsInterferometer(transformer_class=transformer_class)) """ __Fitting__ The interferometer can now be used with a `FitInterferometer` object to fit it to a data-set: """ fit = al.FitInterferometer(dataset=interferometer, tracer=tracer) fit_interferometer_plotter = aplt.FitInterferometerPlotter(fit=fit) fit_interferometer_plotter.subplot_fit_interferometer() """ Interferometer data can also be modeled using pixelized source's, which again perform the source reconstruction by directly fitting the visibilities in the uv-plane. The source reconstruction is visualized in real space: Computing this source recontruction would be extremely inefficient if **PyAutoLens** used a traditional approach to linear algebra which explicitly stored in memory the values required to solve for the source fluxes. In fact, for an
def test__3x2_image__2x2_visibilities__use_transformer_for_likelihood( self): uv_wavelengths = np.array([[1.0, 0.0], [1.0, 1.0], [2.0, 2.0]]) real_space_mask = al.Mask2D.unmasked(shape_native=(1, 3), pixel_scales=1.0) transformer = al.TransformerDFT(uv_wavelengths=uv_wavelengths, real_space_mask=real_space_mask) 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, transformer_class=al.TransformerDFT), ) # Setup as a ray trace instance, using a light profile for the lens g0 = al.Galaxy(redshift=0.5, light_profile=al.lp.EllSersic(intensity=0.001)) image = g0.image_2d_from_grid(grid=interferometer.grid) model_visibilities_manual = transformer.visibilities_from_image( image=image) tracer = al.Tracer.from_galaxies(galaxies=[g0]) fit = al.FitInterferometer(interferometer=interferometer, tracer=tracer) assert (fit.visibilities.slim == np.array( [5.0 + 5.0j, 5.0 + 5.0j, 5.0 + 5.0j])).all() assert (fit.noise_map.slim == np.array( [2.0 + 2.0j, 2.0 + 2.0j, 2.0 + 2.0j])).all() assert fit.model_visibilities.slim == pytest.approx( model_visibilities_manual, 1.0e-4) # moddel visibilities are all [1.94805, 0.0] assert fit.residual_map.slim == pytest.approx( np.array([3.0519 + 5.0j, 3.0519 + 5.0j, 3.0519 + 5.0j]), 1.0e-4) assert fit.normalized_residual_map.slim == pytest.approx( np.array([ 3.0519 / 2.0 + (5.0 / 2.0) * 1.0j, 3.0519 / 2.0 + (5.0 / 2.0) * 1.0j, 3.0519 / 2.0 + (5.0 / 2.0) * 1.0j, ]), 1.0e-4, ) assert fit.chi_squared_map.slim == pytest.approx( np.array([ (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j, (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j, (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j, ]), 1.0e-4, ) assert fit.chi_squared == pytest.approx(25.73579, 1.0e-4) assert fit.noise_normalization == pytest.approx( (6.0 * np.log(2 * np.pi * 2.0**2.0)), 1.0e-4) assert fit.log_likelihood == pytest.approx( -0.5 * (25.73579 + 6.0 * np.log(2 * np.pi * 2.0**2.0)), 1.0e-4)