Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/data offset #171

Merged
merged 14 commits into from
May 14, 2024
1 change: 1 addition & 0 deletions autogalaxy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from autoarray.dataset import preprocess # noqa
from autoarray.dataset.imaging.dataset import Imaging # noqa
from autoarray.dataset.interferometer.dataset import Interferometer # noqa
from autoarray.dataset.dataset_model import DatasetModel
from autoarray.inversion.pixelization import mesh # noqa
from autoarray.inversion import regularization as reg # noqa
from autoarray.inversion.pixelization import image_mesh
Expand Down
32 changes: 1 addition & 31 deletions autogalaxy/abstract_fit.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ class AbstractFitInversion:
def __init__(
self,
model_obj,
sky: Optional[LightProfile],
settings_inversion: aa.SettingsInversion,
):
"""
Expand All @@ -32,14 +31,10 @@ def __init__(
The object which contains the model components (e.g. light profiles, galaxies, etc) which are used to
create the model-data that fits the data. In PyAutoGalaxy this is a list of galaxies and PyAutoLens
it is a `Tracer`.
sky
Contains model components which specifically fit the background sky emission in an image (e.g. a `Sky`
light profile).
settings_inversion
Settings controlling how an inversion is fitted for example which linear algebra formalism is used.
"""
self.model_obj = model_obj
self.sky = sky
self.settings_inversion = settings_inversion

@property
Expand Down Expand Up @@ -68,7 +63,7 @@ def perform_inversion(self) -> bool:
A bool which is True if an inversion is performed.
"""

return self.model_obj.perform_inversion or isinstance(self.sky, Basis)
return self.model_obj.perform_inversion

@property
def w_tilde(self) -> Optional[aa.WTildeImaging]:
Expand Down Expand Up @@ -205,31 +200,6 @@ def model_obj_linear_light_profiles_to_light_profiles(self):

return model_instance.model_obj

@property
def sky_linear_light_profiles_to_light_profiles(self):
"""
The model object may contain linear light profiles, which solve for the `intensity` during the `Inversion`.

This means they are difficult to visualize, because they do not have a valid `intensity` parameter.

To address this, this property creates a new `model_obj` where all linear light profiles are converted to
ordinary light profiles whose `intensity` parameters are set to the results of the Inversion.

Returns
-------
A `model_obj` (E.g. galaxies or `Tracer`) where the light profile intensity values are set to the results
of those inferred via the `Inversion`.
"""

if self.linear_light_profile_intensity_dict is None:
return self.sky

model_instance = self.append_linear_light_profiles_to_model(
model_instance=ModelInstance(dict(sky=self.sky))
)

return model_instance.sky

def append_linear_light_profiles_to_model(self, model_instance):
"""
For a model instance, this function replaces all linear light profiles with instances of their standard
Expand Down
62 changes: 62 additions & 0 deletions autogalaxy/aggregator/dataset_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from __future__ import annotations
import logging
from typing import List

import autofit as af
import autoarray as aa

logger = logging.getLogger(__name__)


def _dataset_model_from(
fit: af.Fit, instance: af.ModelInstance
) -> List[aa.DatasetModel]:
"""
Returns a `DatasetModel` object from a `PyAutoFit` sqlite database `Fit` object.

The results of a model-fit can be stored in a sqlite database, including the following attributes of the fit:

- The model and its best fit parameters (e.g. `model.json`).

Each individual attribute can be loaded from the database via the `fit.value()` method.

This method combines all of these attributes and returns a `DatasetModel` object for a given non-linear search
sample (e.g. the maximum likelihood model).

If multiple `DatasetModel` objects were fitted simultaneously via analysis summing, the `fit.child_values()` method
is instead used to load lists of dataset models. This is necessary if each analysis has different dataset
models (e.g. certain parameters vary across each dataset and `Analysis` object).

Parameters
----------
fit
A `PyAutoFit` `Fit` object which contains the results of a model-fit as an entry in a sqlite database.
instance
A manual instance that overwrites the max log likelihood instance in fit (e.g. for drawing the instance
randomly from the PDF).
"""

if instance is not None:
try:
dataset_model = instance.dataset_model
except AttributeError:
dataset_model = None
else:
try:
dataset_model = fit.instance.dataset_model
except AttributeError:
dataset_model = None

if len(fit.children) > 0:
logger.info(
"""
Using database for a fit with multiple summed Analysis objects.

DatasetModel objects do not fully support this yet (e.g. variables across Analysis objects may not be correct)
so proceed with caution!
"""
)

return [dataset_model] * len(fit.children)

return [dataset_model]
12 changes: 10 additions & 2 deletions autogalaxy/aggregator/fit_imaging.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from autogalaxy.aggregator.imaging import _imaging_from
from autogalaxy.aggregator.galaxies import _galaxies_from
from autogalaxy.aggregator.dataset_model import _dataset_model_from
from autogalaxy.aggregator import agg_util


Expand Down Expand Up @@ -62,6 +63,8 @@ def _fit_imaging_from(

galaxies_list = _galaxies_from(fit=fit, instance=instance)

dataset_model_list = _dataset_model_from(fit=fit, instance=instance)

adapt_images_list = agg_util.adapt_images_from(fit=fit)

settings_inversion = settings_inversion or fit.value(name="settings_inversion")
Expand All @@ -72,8 +75,12 @@ def _fit_imaging_from(

fit_dataset_list = []

for dataset, galaxies, adapt_images, mesh_grids_of_planes in zip(
dataset_list, galaxies_list, adapt_images_list, mesh_grids_of_planes_list
for dataset, galaxies, dataset_model, adapt_images, mesh_grids_of_planes in zip(
dataset_list,
galaxies_list,
dataset_model_list,
adapt_images_list,
mesh_grids_of_planes_list,
):
preloads = agg_util.preloads_from(
preloads_cls=Preloads,
Expand All @@ -86,6 +93,7 @@ def _fit_imaging_from(
FitImaging(
dataset=dataset,
galaxies=galaxies,
dataset_model=dataset_model,
adapt_images=adapt_images,
settings_inversion=settings_inversion,
preloads=preloads,
Expand Down
12 changes: 10 additions & 2 deletions autogalaxy/aggregator/fit_interferometer.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from autogalaxy.aggregator import agg_util
from autogalaxy.aggregator.interferometer import _interferometer_from
from autogalaxy.aggregator.dataset_model import _dataset_model_from
from autogalaxy.aggregator.galaxies import _galaxies_from


Expand Down Expand Up @@ -66,6 +67,8 @@ def _fit_interferometer_from(

galaxies_list = _galaxies_from(fit=fit, instance=instance)

dataset_model_list = _dataset_model_from(fit=fit, instance=instance)

adapt_images_list = agg_util.adapt_images_from(fit=fit)

settings_inversion = settings_inversion or fit.value(name="settings_inversion")
Expand All @@ -76,8 +79,12 @@ def _fit_interferometer_from(

fit_dataset_list = []

for dataset, galaxies, adapt_images, mesh_grids_of_planes in zip(
dataset_list, galaxies_list, adapt_images_list, mesh_grids_of_planes_list
for dataset, galaxies, dataset_model, adapt_images, mesh_grids_of_planes in zip(
dataset_list,
galaxies_list,
dataset_model_list,
adapt_images_list,
mesh_grids_of_planes_list,
):
preloads = agg_util.preloads_from(
preloads_cls=Preloads,
Expand All @@ -90,6 +97,7 @@ def _fit_interferometer_from(
FitInterferometer(
dataset=dataset,
galaxies=galaxies,
dataset_model=dataset_model,
adapt_images=adapt_images,
settings_inversion=settings_inversion,
preloads=preloads,
Expand Down
23 changes: 12 additions & 11 deletions autogalaxy/aggregator/galaxies.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,18 @@ def _galaxies_from(fit: af.Fit, instance: af.ModelInstance) -> List[Galaxy]:
if hasattr(fit.instance, "clumps"):
galaxies = galaxies + fit.instance.clumps

if len(fit.children) > 0:
logger.info(
"""
Using database for a fit with multiple summed Analysis objects.

Galaxy objects do not fully support this yet (e.g. variables across Analysis objects may not be correct)
so proceed with caution!
"""
)

return [galaxies] * len(fit.children)
if fit.children is not None:
if len(fit.children) > 0:
logger.info(
"""
Using database for a fit with multiple summed Analysis objects.

Galaxy objects do not fully support this yet (e.g. variables across Analysis objects may not be correct)
so proceed with caution!
"""
)

return [galaxies] * len(fit.children)

return [galaxies]

Expand Down
12 changes: 6 additions & 6 deletions autogalaxy/analysis/analysis/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,11 @@ def galaxies_via_instance_from(

return Galaxies(galaxies=instance.galaxies, run_time_dict=run_time_dict)

def sky_via_instance_from(
def dataset_model_via_instance_from(
self, instance: af.ModelInstance
) -> Union[lp.Sky, lp_linear.Sky]:
) -> aa.DatasetModel:
"""
Create a sky from a model instance, which is used to fit the dataset.
Create a dataset model from a model instance, which is used to fit the dataset.

Parameters
----------
Expand All @@ -81,10 +81,10 @@ def sky_via_instance_from(

Returns
-------
A sky that is used to then fit the dataset.
A dataset_model that is used to then fit the dataset.
"""
if hasattr(instance, "sky"):
return instance.sky
if hasattr(instance, "dataset_model"):
return instance.dataset_model

def make_result(
self,
Expand Down
18 changes: 0 additions & 18 deletions autogalaxy/analysis/chaining_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,24 +157,6 @@ def source_from(
return source_custom_model_from(result=result, source_is_model=True)


def sky_from(result: Result) -> Optional[af.Model]:
"""


Parameters
----------
result

Returns
-------

"""
try:
return result.model.sky
except AttributeError:
return None


def clumps_from(
result: Result,
light_as_model: bool = False,
Expand Down
2 changes: 0 additions & 2 deletions autogalaxy/analysis/maker.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ def fit_via_model_from(
fit
A fit object where an instance of the model has been fitted to the data.
"""
self.fit_unit_instance_from(unit_value=unit_value)

try:
try:
return self.fit_unit_instance_from(unit_value=unit_value)
Expand Down
10 changes: 10 additions & 0 deletions autogalaxy/config/priors/dataset_model.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
DatasetModel:
background_sky_level:
type: Constant
value: 0.0
grid_offset_0:
type: Constant
value: 0.0
grid_offset_1:
type: Constant
value: 0.0
11 changes: 0 additions & 11 deletions autogalaxy/config/priors/light/standard/sky.yaml

This file was deleted.

16 changes: 0 additions & 16 deletions autogalaxy/galaxy/to_inversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class AbstractToInversion:
def __init__(
self,
dataset: Optional[Union[aa.Imaging, aa.Interferometer, aa.DatasetInterface]],
sky: Optional[Basis] = None,
adapt_images: Optional[AdaptImages] = None,
settings_inversion: aa.SettingsInversion = aa.SettingsInversion(),
preloads=Preloads(),
Expand All @@ -43,7 +42,6 @@ def __init__(

self.dataset = dataset

self.sky = sky
self.adapt_images = adapt_images

self.settings_inversion = settings_inversion
Expand Down Expand Up @@ -97,18 +95,6 @@ def linear_obj_galaxy_dict(

@cached_property
def linear_obj_list(self) -> List[aa.LinearObj]:
if isinstance(self.sky, Basis):
sky_linear_obj_list = LightProfileLinearObjFuncList(
grid=self.dataset.grid,
blurring_grid=self.dataset.blurring_grid,
convolver=self.dataset.convolver,
light_profile_list=self.sky.light_profile_list,
regularization=None,
run_time_dict=self.run_time_dict,
)

return list(self.linear_obj_galaxy_dict.keys()) + [sky_linear_obj_list]

return list(self.linear_obj_galaxy_dict.keys())

@cached_property
Expand All @@ -121,7 +107,6 @@ def __init__(
self,
dataset: Optional[Union[aa.Imaging, aa.Interferometer, aa.DatasetInterface]],
galaxies: List[Galaxy],
sky: Optional[LightProfile] = None,
adapt_images: Optional[AdaptImages] = None,
settings_inversion: aa.SettingsInversion = aa.SettingsInversion(),
preloads=aa.Preloads(),
Expand All @@ -131,7 +116,6 @@ def __init__(

super().__init__(
dataset=dataset,
sky=sky,
adapt_images=adapt_images,
settings_inversion=settings_inversion,
preloads=preloads,
Expand Down
Loading
Loading