def test__likelihood__is_sum_of_separations_divided_by_noise(self): positions = al.GridCoordinates([ [(0.0, 0.0), (0.0, 1.0), (0.0, 0.5)], [(0.0, 0.0), (0.0, 0.0), (3.0, 3.0)], [(0.0, 0.0), (1.0, 1.0), (3.0, 3.0)], ]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.chi_squared_map[0] == 1.0 assert fit.chi_squared_map[1] == pytest.approx(18.0, 1e-4) assert fit.chi_squared_map[2] == pytest.approx(18.0, 1e-4) assert fit.figure_of_merit == pytest.approx(-0.5 * (1.0 + 18 + 18), 1e-4) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=2.0) assert fit.chi_squared_map[0] == (1.0 / 2.0)**2.0 assert fit.chi_squared_map[1] == pytest.approx( (np.sqrt(18.0) / 2.0)**2.0, 1e-4) assert fit.chi_squared_map[2] == pytest.approx( (np.sqrt(18.0) / 2.0)**2.0, 1e-4) assert fit.figure_of_merit == pytest.approx( -0.5 * ((1.0 / 2.0)**2.0 + (np.sqrt(18.0) / 2.0)**2.0 + (np.sqrt(18.0) / 2.0)**2.0), 1e-4, )
def test__positions_do_not_trace_within_threshold__raises_exception( self, phase_interferometer_7, interferometer_7, mask_7x7, visibilities_mask_7x2 ): interferometer_7.positions = al.GridCoordinates([[(1.0, 100.0), (200.0, 2.0)]]) phase_interferometer_7 = al.PhaseInterferometer( phase_name="test_phase", real_space_mask=mask_7x7, galaxies=dict( lens=al.Galaxy(redshift=0.5, mass=al.mp.SphericalIsothermal()), source=al.Galaxy(redshift=1.0), ), settings=al.SettingsPhaseInterferometer( settings_lens=al.SettingsLens(positions_threshold=0.01) ), search=mock.MockSearch(), ) analysis = phase_interferometer_7.make_analysis( dataset=interferometer_7, mask=visibilities_mask_7x2, results=mock.MockResults(), ) instance = phase_interferometer_7.model.instance_from_unit_vector([]) with pytest.raises(exc.RayTracingException): analysis.log_likelihood_function(instance=instance)
def test__results_of_phase_include_positions__available_as_property( self, imaging_7x7, mask_7x7, samples_with_result ): phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(samples=samples_with_result) ) result = phase_imaging_7x7.run( dataset=imaging_7x7, mask=mask_7x7, results=mock.MockResults() ) assert result.positions == None phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", galaxies=dict(lens=al.Galaxy(redshift=0.5), source=al.Galaxy(redshift=1.0)), search=mock.MockSearch(samples=samples_with_result), settings=al.SettingsPhaseImaging( settings_lens=al.SettingsLens(positions_threshold=1.0) ), ) imaging_7x7.positions = al.GridCoordinates([[(1.0, 1.0)]]) result = phase_imaging_7x7.run( dataset=imaging_7x7, mask=mask_7x7, results=mock.MockResults() ) assert (result.positions[0] == np.array([1.0, 1.0])).all()
def test_multiple_positions__mock_position_tracer__maximum_separation_is_correct( self): positions = al.GridCoordinates([[(0.0, 0.0), (0.0, 1.0), (0.0, 0.5)]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == 1.0 positions = al.GridCoordinates([[(0.0, 0.0), (0.0, 0.0), (3.0, 3.0)]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == np.sqrt(18) al.GridCoordinates([[(0.0, 0.0), (1.0, 1.0), (3.0, 3.0)]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == np.sqrt(18) positions = al.GridCoordinates([[ (-2.0, -4.0), (1.0, 3.0), (0.1, 0.1), (-0.1, -0.1), (0.3, 0.4), (-0.6, 0.5), ]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == np.sqrt( np.square(3.0) + np.square(7.0)) positions = al.GridCoordinates([[(8.0, 4.0), (8.0, 4.0), (-9.0, -4.0)]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == np.sqrt( np.square(17.0) + np.square(8.0))
def test__threshold__if_not_met_returns_ray_tracing_exception(self): positions = al.GridCoordinates([[(0.0, 0.0), (0.0, 1.0)]]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separation_within_threshold(threshold=100.0) assert not fit.maximum_separation_within_threshold(threshold=0.1)
def test__above_with_real_tracer(self): tracer = al.Tracer.from_galaxies(galaxies=[ al.Galaxy(redshift=0.5, mass=al.mp.SphericalIsothermal(einstein_radius=1.0)), al.Galaxy(redshift=1.0), ]) positions = al.GridCoordinates([[(1.0, 0.0), (-1.0, 0.0)]]) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separation_within_threshold(threshold=0.01) positions = al.GridCoordinates([[(1.2, 0.0), (-1.0, 0.0)]]) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separation_within_threshold(threshold=0.3) assert not fit.maximum_separation_within_threshold(threshold=0.15)
def test__positions_are_input__are_used_in_analysis( self, image_7x7, noise_map_7x7, mask_7x7): # If position threshold is input (not None) and positions are input, make the positions part of the lens dataset. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0), (2.0, 2.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2)), ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=mock.MockResults()) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=mock.MockResults()) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=mock.MockResults()) assert (analysis.masked_dataset.positions.in_list[0][0] == np.array( [1.0, 1.0])).all() assert (analysis.masked_dataset.positions.in_list[0][1] == np.array( [2.0, 2.0])).all() assert analysis.settings.settings_lens.positions_threshold == 0.2 # If position threshold is input (not None) and but no positions are supplied, raise an error with pytest.raises(exc.PhaseException): imaging_7x7 = al.Imaging(image=image_7x7, noise_map=noise_map_7x7, positions=None) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2)), ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=mock.MockResults()) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=mock.MockResults())
def test__positions_do_not_trace_within_threshold__raises_exception( self, ): tracer = al.Tracer.from_galaxies(galaxies=[ al.Galaxy(redshift=0.5, mass=al.mp.SphericalIsothermal()), al.Galaxy(redshift=1.0), ]) settings = al.SettingsLens(positions_threshold=50.0) settings.check_positions_trace_within_threshold_via_tracer( tracer=tracer, positions=al.GridCoordinates([[(1.0, 1.0), (2.0, 2.0)]])) settings = al.SettingsLens(positions_threshold=0.0) with pytest.raises(exc.RayTracingException): settings.check_positions_trace_within_threshold_via_tracer( tracer=tracer, positions=al.GridCoordinates([[(1.0, 1.0), (2.0, 2.0)]])) # No mass profile - doesnt raise exception tracer = al.Tracer.from_galaxies( galaxies=[al.Galaxy(redshift=0.5), al.Galaxy(redshift=1.0)]) settings.check_positions_trace_within_threshold_via_tracer( tracer=tracer, positions=al.GridCoordinates([[(1.0, 1.0), (2.0, 2.0)]])) # Single plane - doesnt raise exception tracer = al.Tracer.from_galaxies(galaxies=[ al.Galaxy(redshift=0.5, mass=al.mp.SphericalIsothermal()) ]) settings.check_positions_trace_within_threshold_via_tracer( tracer=tracer, positions=al.GridCoordinates([[(1.0, 1.0), (2.0, 2.0)]]))
def test_multiple_sets_of_positions__multiple_sets_of_max_distances(self): positions = al.GridCoordinates([ [(0.0, 0.0), (0.0, 1.0), (0.0, 0.5)], [(0.0, 0.0), (0.0, 0.0), (3.0, 3.0)], [(0.0, 0.0), (1.0, 1.0), (3.0, 3.0)], ]) tracer = MockTracerPositions(positions=positions) fit = al.FitPositionsSourcePlaneMaxSeparation(positions=positions, tracer=tracer, noise_value=1.0) assert fit.maximum_separations[0] == 1.0 assert fit.maximum_separations[1] == np.sqrt(18) assert fit.maximum_separations[2] == np.sqrt(18)
def test__uses_auto_update_factor(self, image_7x7, noise_map_7x7, mask_7x7): tracer = al.Tracer.from_galaxies( galaxies=[al.Galaxy(redshift=0.5), al.Galaxy(redshift=1.0)]) # Auto positioning is OFF, so use input positions + threshold. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.1)), ) results = mock.MockResults(max_log_likelihood_tracer=tracer) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.settings.settings_lens.positions_threshold == 0.1 # Auto positioning is ON, but there are no previous results, so use separate of postiions x positions factor.. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 0.0), (-1.0, 0.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.1, auto_positions_factor=1.0)), ) results = mock.MockResults(max_log_likelihood_tracer=tracer) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.settings.settings_lens.positions_threshold == 2.0 # Auto position is ON, and same as above but with a factor of 3.0 which increases the threshold. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 0.0), (-1.0, 0.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=3.0)), ) results = mock.MockResults(max_log_likelihood_tracer=tracer, updated_positions_threshold=0.2) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.settings.settings_lens.positions_threshold == 6.0 # Auto position is ON, and same as above but with a minimum auto positions threshold that rounds the value up. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 0.0), (-1.0, 0.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=3.0, auto_positions_minimum_threshold=10.0, )), ) results = mock.MockResults(max_log_likelihood_tracer=tracer, updated_positions_threshold=0.2) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.settings.settings_lens.positions_threshold == 10.0 # Auto positioning is ON, but positions are None and it cannot find new positions so no threshold. imaging_7x7 = al.Imaging(image=image_7x7, noise_map=noise_map_7x7, positions=None) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( auto_positions_factor=1.0)), ) results = mock.MockResults(max_log_likelihood_tracer=tracer) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) phase_imaging_7x7.modify_settings(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.settings.settings_lens.positions_threshold == None
def test__updates_correct_using_factor(self, imaging_7x7, image_7x7, noise_map_7x7, mask_7x7): tracer = al.Tracer.from_galaxies( galaxies=[al.Galaxy(redshift=0.5), al.Galaxy(redshift=1.0)]) # Auto positioning is OFF, so use input positions + threshold. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.1)), ) results = mock.MockResults(max_log_likelihood_tracer=tracer) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(1.0, 1.0)]] # Auto positioning is ON, but there are no previous results, so use input positions. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=2.0)), ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(1.0, 1.0)]] # Auto positioning is ON, there are previous results so use their new positions and threshold (which is # multiplied by the auto_positions_factor). However, only one set of positions is computed from the previous # result, to use input positions. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=2.0)), ) results = mock.MockResults( max_log_likelihood_tracer=tracer, updated_positions=al.GridCoordinates(coordinates=[[(2.0, 2.0)]]), updated_positions_threshold=0.3, ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(1.0, 1.0)]] # Auto positioning is ON, but the tracer only has a single plane and thus no lensing, so use input positions. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=1.0)), ) tracer_x1_plane = al.Tracer.from_galaxies( galaxies=[al.Galaxy(redshift=0.5)]) results = mock.MockResults( max_log_likelihood_tracer=tracer_x1_plane, updated_positions=al.GridCoordinates(coordinates=[[(2.0, 2.0), (3.0, 3.0)]]), updated_positions_threshold=0.3, ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(1.0, 1.0)]] # Auto positioning is ON, there are previous results so use their new positions and threshold (which is # multiplied by the auto_positions_factor). Multiple positions are available so these are now used. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(1.0, 1.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.2, auto_positions_factor=2.0)), ) results = mock.MockResults( max_log_likelihood_tracer=tracer, updated_positions=al.GridCoordinates(coordinates=[[(2.0, 2.0), (3.0, 3.0)]]), updated_positions_threshold=0.3, ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(2.0, 2.0), (3.0, 3.0)]] # Auto positioning is Off, but there are previous results with updated positions relative to the input # positions, so use those with their positions threshold. imaging_7x7 = al.Imaging( image=image_7x7, noise_map=noise_map_7x7, positions=al.GridCoordinates([[(2.0, 2.0)]]), ) phase_imaging_7x7 = al.PhaseImaging( phase_name="test_phase", search=mock.MockSearch(), settings=al.SettingsPhaseImaging(settings_lens=al.SettingsLens( positions_threshold=0.1)), ) results = mock.MockResults( max_log_likelihood_tracer=tracer, positions=al.GridCoordinates(coordinates=[[(3.0, 3.0), (4.0, 4.0)]]), updated_positions_threshold=0.3, ) phase_imaging_7x7.modify_dataset(dataset=imaging_7x7, results=results) analysis = phase_imaging_7x7.make_analysis(dataset=imaging_7x7, mask=mask_7x7, results=results) assert analysis.masked_dataset.positions.in_list == [[(3.0, 3.0), (4.0, 4.0)]]
positions = solver.solve( lensing_obj=tracer, source_plane_coordinate=tracer.source_plane.galaxies[0].light.centre, ) positions_true = al.GridCoordinates.load(file_path=pickle_path, filename=f"positions_{str(i)}") minimum_separations = util.minimum_separations_from( positions_true=positions, positions=positions_true) in_positions_true = util.check_if_positions_in_positions_true( positions_true=positions_true, positions=positions, threshold=0.1) print() print(positions_true.in_list) print(positions.in_list) print(minimum_separations) print(in_positions_true) positions_plot = al.GridCoordinates( coordinates=[positions.in_list[0], positions_true.in_list[0]]) aplt.Tracer.image( tracer=tracer, grid=grid, positions=positions_plot, include=aplt.Include(origin=False, critical_curves=True, caustics=False), )
mass-model is clearly not accurate. 2) By removing these solutions, a global-maximum solution may be reached instead of a local-maxima. This is because removing the incorrect mass models makes the non-linear parameter space less complex. We can easily check the image-positions are accurate by plotting them using our _Imaging_ _Plotter_ (they are the magenta dots on the image). To specify these positions, we use the *GridCoordinates* object, which is used by __PyAutoLens__ in general to specify (y,x) coordinates. """ # %% positions = al.GridCoordinates(coordinates=[(1.6, 0.0), (0.0, 1.6), (-1.6, 0.0), (0.0, -1.6)]) aplt.Imaging.subplot_imaging(imaging=imaging, positions=positions) # %% """ For the positions to be used in a Phase, we associate them with the _Imaging_ data. We also pass the _SettingsPhaseImaging_ a new object, _SettingsLens_. This includes the *position_threshold* used during modeling to resample inaccurate mass models. """ # %% imaging = al.Imaging( image=imaging.image,