def test__samples_in_test_model(self): model = af.PriorModel(af.m.MockClassx4) model.one = af.UniformPrior(lower_limit=0.099, upper_limit=0.101) model.two = af.UniformPrior(lower_limit=0.199, upper_limit=0.201) model.three = af.UniformPrior(lower_limit=0.299, upper_limit=0.301) model.four = af.UniformPrior(lower_limit=0.399, upper_limit=0.401) initializer = af.InitializerPrior() unit_parameter_lists, parameter_lists, figure_of_merit_list = initializer.samples_in_test_mode( total_points=2, model=model, ) assert 0.0 < unit_parameter_lists[0][0] < 1.0 assert 0.0 < unit_parameter_lists[1][0] < 1.0 assert 0.0 < unit_parameter_lists[0][1] < 1.0 assert 0.0 < unit_parameter_lists[1][1] < 1.0 assert 0.0 < unit_parameter_lists[0][2] < 1.0 assert 0.0 < unit_parameter_lists[1][2] < 1.0 assert 0.0 < unit_parameter_lists[0][3] < 1.0 assert 0.0 < unit_parameter_lists[1][3] < 1.0 assert 0.099 < parameter_lists[0][0] < 0.101 assert 0.099 < parameter_lists[1][0] < 0.101 assert 0.199 < parameter_lists[0][1] < 0.201 assert 0.199 < parameter_lists[1][1] < 0.201 assert 0.299 < parameter_lists[0][2] < 0.301 assert 0.299 < parameter_lists[1][2] < 0.301 assert 0.399 < parameter_lists[0][3] < 0.401 assert 0.399 < parameter_lists[1][3] < 0.401 assert figure_of_merit_list == [-1.0e99, -1.0e99]
def test_different_prior_width(self, grid_search, mapper): mapper.component.one_tuple.one_tuple_0 = af.UniformPrior(0.0, 2.0) mappers = list( grid_search.model_mappers( grid_priors=[mapper.component.one_tuple.one_tuple_0], model=mapper ) ) assert len(mappers) == 10 assert mappers[0].component.one_tuple.one_tuple_0.lower_limit == 0.0 assert mappers[0].component.one_tuple.one_tuple_0.upper_limit == 0.2 assert mappers[-1].component.one_tuple.one_tuple_0.lower_limit == 1.8 assert mappers[-1].component.one_tuple.one_tuple_0.upper_limit == 2.0 mapper.component.one_tuple.one_tuple_0 = af.UniformPrior(1.0, 1.5) mappers = list( grid_search.model_mappers( mapper, grid_priors=[mapper.component.one_tuple.one_tuple_0] ) ) assert len(mappers) == 10 assert mappers[0].component.one_tuple.one_tuple_0.lower_limit == 1.0 assert mappers[0].component.one_tuple.one_tuple_0.upper_limit == 1.05 assert mappers[-1].component.one_tuple.one_tuple_0.lower_limit == 1.45 assert mappers[-1].component.one_tuple.one_tuple_0.upper_limit == 1.5
def test__prior__samples_sample_priors(self): model = af.PriorModel(af.m.MockClassx4) model.one = af.UniformPrior(lower_limit=0.099, upper_limit=0.101) model.two = af.UniformPrior(lower_limit=0.199, upper_limit=0.201) model.three = af.UniformPrior(lower_limit=0.299, upper_limit=0.301) model.four = af.UniformPrior(lower_limit=0.399, upper_limit=0.401) initializer = af.InitializerPrior() unit_parameter_lists, parameter_lists, figure_of_merit_list = initializer.samples_from_model( total_points=2, model=model, fitness_function=MockFitness()) assert 0.0 < unit_parameter_lists[0][0] < 1.0 assert 0.0 < unit_parameter_lists[1][0] < 1.0 assert 0.0 < unit_parameter_lists[0][1] < 1.0 assert 0.0 < unit_parameter_lists[1][1] < 1.0 assert 0.0 < unit_parameter_lists[0][2] < 1.0 assert 0.0 < unit_parameter_lists[1][2] < 1.0 assert 0.0 < unit_parameter_lists[0][3] < 1.0 assert 0.0 < unit_parameter_lists[1][3] < 1.0 assert 0.099 < parameter_lists[0][0] < 0.101 assert 0.099 < parameter_lists[1][0] < 0.101 assert 0.199 < parameter_lists[0][1] < 0.201 assert 0.199 < parameter_lists[1][1] < 0.201 assert 0.299 < parameter_lists[0][2] < 0.301 assert 0.299 < parameter_lists[1][2] < 0.301 assert 0.399 < parameter_lists[0][3] < 0.401 assert 0.399 < parameter_lists[1][3] < 0.401 assert figure_of_merit_list == [1.0, 1.0]
def test_mapper_from_prior_arguments_simple_collection(): old = af.UniformPrior() new = af.UniformPrior() collection = af.Collection(value=old) collection = collection.mapper_from_prior_arguments({old: new}) assert collection.value == new
def test__result_derived_properties(self): lower_limit_lists = [[0.0, 0.0], [0.0, 0.5], [0.5, 0.0], [0.5, 0.5]] # noinspection PyTypeChecker grid_search_result = af.GridSearchResult( results=None, grid_priors=[ af.UniformPrior( lower_limit=-2.0, upper_limit=2.0 ), af.UniformPrior( lower_limit=-3.0, upper_limit=3.0 ) ], lower_limits_lists=lower_limit_lists, ) assert grid_search_result.shape == (2, 2) assert grid_search_result.physical_step_sizes == (2.0, 3.0) assert grid_search_result.physical_centres_lists == [ [-1.0, -1.5], [-1.0, 1.5], [1.0, -1.5], [1.0, 1.5], ] assert grid_search_result.physical_upper_limits_lists == [ [0.0, 0.0], [0.0, 3.0], [2.0, 0.0], [2.0, 3.0], ]
def test_collection(): identifier = af.CollectionPriorModel( gaussian=af.PriorModel(Gaussian, centre=af.UniformPrior())).identifier assert identifier == af.CollectionPriorModel( gaussian=af.PriorModel(Gaussian, centre=af.UniformPrior())).identifier assert identifier != af.CollectionPriorModel(gaussian=af.PriorModel( Gaussian, centre=af.UniformPrior(upper_limit=0.5))).identifier
def make_factor_graph_model(): model_factor_1 = g.AnalysisFactor(af.Collection(one=af.UniformPrior()), af.m.MockAnalysis()) model_factor_2 = g.AnalysisFactor(af.Collection(one=af.UniformPrior()), af.m.MockAnalysis()) return g.FactorGraphModel(model_factor_1, model_factor_2)
def _test_gaussian(): n_observations = 100 x = np.arange(n_observations) y = make_data(Gaussian(centre=50.0, normalization=25.0, sigma=10.0), x) prior_model = af.PriorModel( Gaussian, # centre=af.GaussianPrior(mean=50, sigma=10), # normalization=af.GaussianPrior(mean=25, sigma=10), sigma=af.GaussianPrior(mean=10, sigma=10), centre=af.UniformPrior(lower_limit=30, upper_limit=70), normalization=af.UniformPrior(lower_limit=15, upper_limit=35), # sigma=af.UniformPrior(lower_limit=5, upper_limit=15), ) factor_model = ep.AnalysisFactor(prior_model, analysis=Analysis(x=x, y=y)) # optimiser = ep.LaplaceOptimiser( # transform_cls=DiagonalMatrix # ) optimiser = af.DynestyStatic() model = factor_model.optimise(optimiser) assert model.centre.mean == pytest.approx(50, rel=0.1) assert model.normalization.mean == pytest.approx(25, rel=0.1) assert model.sigma.mean == pytest.approx(10, rel=0.1)
def test__check_order_for_different_unit_values(self): mapper = af.ModelMapper( mock_cls_0=af.m.MockChildTuplex2, mock_cls_1=af.m.MockChildTuple, mock_cls_2=af.m.MockChildTuplex2, ) mapper.mock_cls_0.tup.tup_0 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_0.tup.tup_1 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_0.one = af.UniformPrior(0.0, 1.0) mapper.mock_cls_0.two = af.UniformPrior(0.0, 1.0) mapper.mock_cls_1.tup.tup_0 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_1.tup.tup_1 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_2.tup.tup_0 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_2.tup.tup_1 = af.UniformPrior(0.0, 1.0) mapper.mock_cls_2.one = af.UniformPrior(0.0, 1.0) mapper.mock_cls_2.two = af.UniformPrior(0.0, 1.0) model_map = mapper.instance_from_unit_vector( [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) assert model_map.mock_cls_0.tup == (0.1, 0.2) assert model_map.mock_cls_0.one == 0.3 assert model_map.mock_cls_0.two == 0.4 assert model_map.mock_cls_1.tup == (0.5, 0.6) assert model_map.mock_cls_2.tup == (0.7, 0.8) assert model_map.mock_cls_2.one == 0.9 assert model_map.mock_cls_2.two == 1.0
def test__check_order_for_different_unit_values(self): mapper = af.ModelMapper( profile_1=mock_real.EllProfile, profile_2=mock_real.SphProfile, profile_3=mock_real.EllProfile, ) mapper.profile_1.centre.centre_0 = af.UniformPrior(0.0, 1.0) mapper.profile_1.centre.centre_1 = af.UniformPrior(0.0, 1.0) mapper.profile_1.axis_ratio = af.UniformPrior(0.0, 1.0) mapper.profile_1.phi = af.UniformPrior(0.0, 1.0) mapper.profile_2.centre.centre_0 = af.UniformPrior(0.0, 1.0) mapper.profile_2.centre.centre_1 = af.UniformPrior(0.0, 1.0) mapper.profile_3.centre.centre_0 = af.UniformPrior(0.0, 1.0) mapper.profile_3.centre.centre_1 = af.UniformPrior(0.0, 1.0) mapper.profile_3.axis_ratio = af.UniformPrior(0.0, 1.0) mapper.profile_3.phi = af.UniformPrior(0.0, 1.0) model_map = mapper.instance_from_unit_vector( [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) assert model_map.profile_1.centre == (0.1, 0.2) assert model_map.profile_1.axis_ratio == 0.3 assert model_map.profile_1.phi == 0.4 assert model_map.profile_2.centre == (0.5, 0.6) assert model_map.profile_3.centre == (0.7, 0.8) assert model_map.profile_3.axis_ratio == 0.9 assert model_map.profile_3.phi == 1.0
def test_model(): identifier = af.PriorModel(af.Gaussian, centre=af.UniformPrior()).identifier assert identifier == af.PriorModel(af.Gaussian, centre=af.UniformPrior()).identifier assert identifier != af.PriorModel( af.Gaussian, centre=af.UniformPrior(upper_limit=0.5)).identifier
def test__update_stellar_mass_priors_using_einstein_radius(self): grid = al.Grid2D.uniform(shape_native=(200, 200), pixel_scales=0.05) tracer = mock.MockTracer(einstein_radius=1.0, einstein_mass=4.0) fit = mock.MockFit(grid=grid) result = mock.MockResult(max_log_likelihood_tracer=tracer, max_log_likelihood_fit=fit) bulge_prior_model = af.PriorModel(al.lmp.SphericalSersic) bulge_prior_model.intensity = af.UniformPrior(lower_limit=0.99, upper_limit=1.01) bulge_prior_model.effective_radius = af.UniformPrior(lower_limit=0.99, upper_limit=1.01) bulge_prior_model.sersic_index = af.UniformPrior(lower_limit=2.99, upper_limit=3.01) setup = al.SetupMassLightDark(bulge_prior_model=bulge_prior_model) setup.update_stellar_mass_priors_from_result( prior_model=bulge_prior_model, result=result, einstein_mass_range=[0.001, 10.0], bins=10, ) assert setup.bulge_prior_model.mass_to_light_ratio.lower_limit == pytest.approx( 0.00040519, 1.0e-1) assert setup.bulge_prior_model.mass_to_light_ratio.upper_limit == pytest.approx( 4.051935, 1.0e-1)
def test_prior(): identifier = af.UniformPrior().identifier assert identifier == af.UniformPrior().identifier assert identifier != af.UniformPrior( lower_limit=0.5 ).identifier assert identifier != af.UniformPrior( upper_limit=0.5 ).identifier
def customize_priors(self, results): ### Lens Subhalo, Adjust priors to physical masses (10^6 - 10^10) and concentrations (6-24) self.galaxies.subhalo.mass.kappa_s = af.UniformPrior( lower_limit=0.0005, upper_limit=0.2) self.galaxies.subhalo.mass.centre_0 = af.UniformPrior( lower_limit=-2.0, upper_limit=2.0) self.galaxies.subhalo.mass.centre_1 = af.UniformPrior( lower_limit=-2.0, upper_limit=2.0)
def test_tuple_prior(): centre = af.TuplePrior() centre.centre_0 = af.UniformPrior() centre.centre_1 = af.UniformPrior() model = af.Model(af.Gaussian, centre=centre) parameterization = model.parameterization assert parameterization == ( 'model Gaussian (N=4)' )
def customize_priors(self, results): self.galaxies.lens.sersic.centre_0 = 0.0 self.galaxies.lens.sersic.centre_1 = 0.0 self.galaxies.lens.sersic.axis_ratio = af.UniformPrior( lower_limit=-0.5, upper_limit=0.1) self.galaxies.lens.sersic.phi = 90.0 self.galaxies.lens.sersic.intensity = af.UniformPrior( lower_limit=-0.5, upper_limit=0.1) self.galaxies.lens.sersic.effective_radius = 1.3 self.galaxies.lens.sersic.sersic_index = 3.0
def test_model_order_no_complicated(): model_1 = af.Model(af.Gaussian, centre=1.0, normalization=af.UniformPrior(0.0, 1.0)) model_2 = af.Model(af.Gaussian, centre=2.0, normalization=af.UniformPrior(0.0, 0.5)) model_3 = af.Model(af.Gaussian, centre=2.0, normalization=af.UniformPrior(0.0, 1.0)) assert model_1.order_no < model_2.order_no < model_3.order_no
def make_pipeline(name, folders, search=af.DynestyStatic()): lens = al.GalaxyModel(redshift=0.5, mass=al.mp.EllipticalIsothermal) lens.mass.centre_0 = af.UniformPrior(lower_limit=-0.01, upper_limit=0.01) lens.mass.centre_1 = af.UniformPrior(lower_limit=-0.01, upper_limit=0.01) lens.mass.einstein_radius = af.UniformPrior(lower_limit=1.55, upper_limit=1.65) source = al.GalaxyModel(redshift=1.0, light=al.lp.EllipticalSersic) source.light.centre_0 = af.UniformPrior(lower_limit=-0.01, upper_limit=0.01) source.light.centre_1 = af.UniformPrior(lower_limit=-0.01, upper_limit=0.01) source.light.intensity = af.UniformPrior(lower_limit=0.35, upper_limit=0.45) source.light.effective_radius = af.UniformPrior(lower_limit=0.45, upper_limit=0.55) source.light.sersic_index = af.UniformPrior(lower_limit=0.9, upper_limit=1.1) class GridPhase( af.as_grid_search(phase_class=al.PhaseImaging, parallel=True)): @property def grid_priors(self): return [ self.model.galaxies.subhalo.mass.centre_0, self.model.galaxies.subhalo.mass.centre_1, ] subhalo = al.GalaxyModel(redshift=0.5, mass=al.mp.SphericalTruncatedNFWMCRLudlow) subhalo.mass.mass_at_200 = af.LogUniformPrior(lower_limit=1.0e6, upper_limit=1.0e11) subhalo.mass.centre_0 = af.UniformPrior(lower_limit=-2.5, upper_limit=2.5) subhalo.mass.centre_1 = af.UniformPrior(lower_limit=-2.5, upper_limit=2.5) phase1 = GridPhase( phase_name="phase_1", folders=folders, galaxies=dict(lens=lens, subhalo=subhalo, source=source), search=search, settings=al.SettingsPhaseImaging(), number_of_steps=2, ) return al.PipelineDataset(name, phase1)
def customize_priors(self, results): self.galaxies.lens.light.centre_0 = 0.0 self.galaxies.lens.light.centre_1 = 0.0 self.galaxies.lens.light.axis_ratio = results.from_phase( "phase_1").instance.lens.light.axis_ratio self.galaxies.lens.light.phi = results.from_phase( "phase_1").instance.lens.light.phi self.galaxies.lens.light.intensity = results.from_phase( "phase_1").instance.lens.light.intensity self.galaxies.lens.light.effective_radius = af.UniformPrior( lower_limit=0.0, upper_limit=4.0) self.galaxies.lens.light.sersic_index = af.UniformPrior( lower_limit=1.0, upper_limit=8.0)
def test__ball__samples_sample_centre_of_priors(self): model = af.PriorModel(af.m.MockClassx4) model.one = af.UniformPrior(lower_limit=0.0, upper_limit=1.0) model.two = af.UniformPrior(lower_limit=0.0, upper_limit=2.0) model.three = af.UniformPrior(lower_limit=0.0, upper_limit=3.0) model.four = af.UniformPrior(lower_limit=0.0, upper_limit=4.0) initializer = af.InitializerBall(lower_limit=0.4999, upper_limit=0.5001) unit_parameter_lists, parameter_lists, figure_of_merit_list = initializer.samples_from_model( total_points=2, model=model, fitness_function=MockFitness()) assert 0.4999 < unit_parameter_lists[0][0] < 0.5001 assert 0.4999 < unit_parameter_lists[1][0] < 0.5001 assert 0.4999 < unit_parameter_lists[0][1] < 0.5001 assert 0.4999 < unit_parameter_lists[1][1] < 0.5001 assert 0.4999 < unit_parameter_lists[0][2] < 0.5001 assert 0.4999 < unit_parameter_lists[1][2] < 0.5001 assert 0.4999 < unit_parameter_lists[0][3] < 0.5001 assert 0.4999 < unit_parameter_lists[1][3] < 0.5001 assert 0.499 < parameter_lists[0][0] < 0.501 assert 0.499 < parameter_lists[1][0] < 0.501 assert 0.999 < parameter_lists[0][1] < 1.001 assert 0.999 < parameter_lists[1][1] < 1.001 assert 1.499 < parameter_lists[0][2] < 1.501 assert 1.499 < parameter_lists[1][2] < 1.501 assert 1.999 < parameter_lists[0][3] < 2.001 assert 1.999 < parameter_lists[1][3] < 2.001 initializer = af.InitializerBall(lower_limit=0.7999, upper_limit=0.8001) unit_parameter_lists, parameter_lists, figure_of_merit_list = initializer.samples_from_model( total_points=2, model=model, fitness_function=MockFitness()) assert 0.799 < parameter_lists[0][0] < 0.801 assert 0.799 < parameter_lists[1][0] < 0.801 assert 1.599 < parameter_lists[0][1] < 1.601 assert 1.599 < parameter_lists[1][1] < 1.601 assert 2.399 < parameter_lists[0][2] < 2.401 assert 2.399 < parameter_lists[1][2] < 2.401 assert 3.199 < parameter_lists[0][3] < 3.201 assert 3.199 < parameter_lists[1][3] < 3.201 assert figure_of_merit_list == 2 * [1.0]
def make_model(): return af.Model( Gaussian, centre=af.UniformPrior( upper_limit=2.0 ) )
def test_graph(hierarchical_factor): graph = g.FactorGraphModel(hierarchical_factor) assert len(graph.model_factors) == 1 hierarchical_factor.add_drawn_variable( af.UniformPrior(lower_limit=0.0, upper_limit=1.0)) assert len(graph.model_factors) == 2
def test_simple(self): uniform_prior = af.UniformPrior(0.0, 1.0) assert uniform_prior.mean == 0.5 uniform_prior.mean = 1.0 assert uniform_prior.lower_limit == 0.5 assert uniform_prior.upper_limit == 1.5
def test_higher(self): uniform_prior = af.UniformPrior(1.0, 2.0) assert uniform_prior.mean == 1.5 uniform_prior.mean = 2.0 assert uniform_prior.lower_limit == 1.5 assert uniform_prior.upper_limit == 2.5
def set_upper_limit_of_pixelization_pixels_prior(hyper_model: af.Collection, result: af.Result): """ If the pixelization being fitted in the hyper-model fit is a `VoronoiBrightnessImage` pixelization, this function sets the upper limit of its `pixels` prior to the number of data points in the mask. This ensures the KMeans algorithm does not raise an exception due to having fewer data points than source pixels. Parameters ---------- hyper_model : Collection The hyper model used by the hyper-fit, which models hyper-components like a `Pixelization` or `HyperGalaxy`'s. result The result of a previous `Analysis` search whose maximum log likelihood model forms the basis of the hyper model. """ if hasattr(hyper_model, "galaxies"): pixels_in_mask = result.analysis.dataset.mask.pixels_in_mask if pixels_in_mask < hyper_model.galaxies.source.pixelization.pixels.upper_limit: if (hyper_model.galaxies.source.pixelization.cls is aa.pix.VoronoiBrightnessImage): lower_limit = (hyper_model.galaxies.source.pixelization.pixels. lower_limit) hyper_model.galaxies.source.pixelization.pixels = af.UniformPrior( lower_limit=lower_limit, upper_limit=pixels_in_mask)
def test_prior_model(self, prior_model): prior_model_copy = deepcopy(prior_model) assert prior_model == prior_model_copy prior_model_copy.centre_0 = af.UniformPrior() assert prior_model != prior_model_copy
def test_prior_with_limits(self): prior = af.UniformPrior( lower_limit=0, upper_limit=10, ).with_limits(3, 5) assert prior.lower_limit == 3 assert prior.upper_limit == 5
def test_projected_model(): model = af.Model( af.Gaussian, centre=af.UniformPrior() ) samples = af.Samples( model, [ af.Sample( -1.0, -1.0, weight=random(), kwargs={ ("centre",): random(), ("normalization",): random(), ("sigma",): random(), } ) for _ in range(100) ] ) result = af.Result( samples=samples, model=model ) projected_model = result.projected_model assert projected_model.prior_count == 3 assert projected_model.centre is not model.centre assert projected_model.centre.id == model.centre.id assert isinstance( projected_model.centre, af.UniformPrior )
def make_factor_model(centre: float, sigma: float, optimiser=None) -> ep.AnalysisFactor: y = make_data( Gaussian(centre=centre, normalization=normalization, sigma=sigma), x) prior_model = af.PriorModel( Gaussian, centre=af.UniformPrior(lower_limit=10, upper_limit=100), normalization=normalization_prior, sigma=af.UniformPrior(lower_limit=0, upper_limit=20), ) return ep.AnalysisFactor(prior_model, analysis=Analysis(x=x, y=y), optimiser=optimiser)
def test_list_prior_model(self, prior_model): list_prior_model = af.CollectionPriorModel([prior_model]) list_prior_model_copy = deepcopy(list_prior_model) assert list_prior_model == list_prior_model_copy list_prior_model[0].centre_0 = af.UniformPrior() assert list_prior_model != list_prior_model_copy