Source code for autofit.mapper.model_mapper
import os
from autofit.mapper.prior_model.collection import Collection
path = os.path.dirname(os.path.realpath(__file__))
[docs]class ModelMapper(Collection):
"""
A mapper of priors formed by passing in classes to be reconstructed
@DynamicAttrs
The ModelMapper converts a set of classes whose input attributes may be
modeled using a non-linear search, to parameters with priors attached.
A config is passed into the model mapper to provide default setup values for
the priors:
mapper = ModelMapper(config)
All class instances that are to be generated by the model mapper are
specified by adding classes to it:
mapper = ModelMapper()
mapper.sersic = al.lp.AbstractSersic
mapper.gaussian = al.lp.Gaussian
mapper.any_class = SomeClass
A `Model` instance is created each time we add a class to the mapper. We
can access those models using # the mapper attributes:
sersic_model = mapper.sersic
This allows us to replace the default priors:
mapper.sersic.normalization = GaussianPrior(mean=2., sigma=5.)
Or maybe we want to tie two priors together:
mapper.sersic.two = mapper.other_sersic.two
This statement reduces the number of priors by one and means that the two
sersic instances will always share # the same rotation two two.
We can then create instances of every class for a unit hypercube vector
with length equal to # len(mapper.priors):
model_instance = mapper.model_instance_for_vector([.4, .2, .3, .1])
The attributes of the model_instance are named the same as those of the mapper:
sersic_1 = mapper.sersic_1
But this attribute is an instance of the actual AbstractSersic:P
class
A ModelMapper can be concisely constructed using keyword arguments:
mapper = prior.ModelMapper(
source_light_profile=light_profile.AbstractSersic,
lens_mass_profile=mass_profile.IsothermalCore,
lens_light_profile=light_profile.SersicCore
)
"""
@property
def prior_prior_model_dict(self):
"""
Returns
-------
prior_prior_model_dict: {Prior: Model}
A dictionary mapping priors to associated prior models. Each prior will only
have one prior model; if a prior is shared by two prior models then one of
those prior models will be in this dictionary.
"""
return {
prior: prior_model[1]
for prior_model in self.prior_model_tuples
for _, prior in prior_model[1].prior_tuples
}