Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
744ba47
unused import
rhayes777 Apr 8, 2024
62a31e3
return latent samples
rhayes777 Apr 8, 2024
0d244d7
also illustrate model correctly set
rhayes777 Apr 8, 2024
ad6a5e4
latent samples and database paths
rhayes777 Apr 8, 2024
ce180a1
saving latent samples in directory
rhayes777 Apr 8, 2024
40b0187
migration step for latent samples attribute
rhayes777 Apr 8, 2024
a38cc4b
update abstract search to output latest variables
rhayes777 Apr 8, 2024
49861b8
bringing latent samples in-line with normal samples in search output
rhayes777 Apr 8, 2024
7a01dad
fixes
rhayes777 Apr 8, 2024
2713560
remove unused LatentVariables class
rhayes777 Apr 8, 2024
c5eaf59
info
rhayes777 Apr 8, 2024
fa62446
keep type of original samples
rhayes777 Apr 8, 2024
d407dd1
switched samples type for test
rhayes777 Apr 8, 2024
0926e92
saving latent.results where possible
rhayes777 Apr 8, 2024
a74e739
handling complex models expressed by latent dict
rhayes777 Apr 8, 2024
f2705e0
docs
rhayes777 Apr 8, 2024
9a798cf
fix function name
rhayes777 Apr 8, 2024
201541d
example now uses Visualizer
Jammy2211 Apr 9, 2024
5a340fd
moved should_visualize to Visualizer
Jammy2211 Apr 9, 2024
6892074
Visualizer now has init and is made via Analysis
Jammy2211 Apr 9, 2024
b626c98
use self.Visualizer
Jammy2211 Apr 9, 2024
967d03a
fix integration tests
Jammy2211 Apr 9, 2024
df8b39f
visualization now used by all proejcts
Jammy2211 Apr 9, 2024
74b8e59
docs
Jammy2211 Apr 9, 2024
9cc875a
fix samleps output for prior linking
Jammy2211 Apr 14, 2024
0f25440
fix typo
Jammy2211 Apr 14, 2024
55eadc5
fix example
Jammy2211 Apr 15, 2024
6313bd1
merge
Jammy2211 Apr 15, 2024
3612de3
pass samples info to latent samples
rhayes777 Apr 15, 2024
5767a49
erm
Jammy2211 Apr 15, 2024
bb5bcd2
extract method from analysis and reuse to construct simple model for …
rhayes777 Apr 15, 2024
42382ff
fix
rhayes777 Apr 15, 2024
6cf14c8
try-except
rhayes777 Apr 15, 2024
f593e29
set model for samples summary
rhayes777 Apr 15, 2024
f76740b
distinguish covariance matrices with naming
rhayes777 Apr 15, 2024
fe701f6
retain naming of existing covariance matrix file
rhayes777 Apr 15, 2024
7da2db3
save samples output in a separate directory
rhayes777 Apr 15, 2024
a0cc2d3
update search output to load samples correctly
rhayes777 Apr 15, 2024
08b31cf
fix
rhayes777 Apr 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion autofit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@
from .mapper.prior_model.prior_model import Model
from .mapper.prior_model.util import PriorModelNameValue
from .non_linear.search.abstract_search import NonLinearSearch
from .non_linear.analysis.visualize import Visualizer
from .non_linear.analysis.analysis import Analysis
from .non_linear.analysis.combined import CombinedAnalysis
from .non_linear.analysis.latent_variables import LatentVariables
from .non_linear.grid.grid_search import GridSearchResult
from .non_linear.grid.sensitivity import Sensitivity
from .non_linear.initializer import InitializerBall
Expand Down
67 changes: 42 additions & 25 deletions autofit/aggregator/search_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pickle
from os import path
from pathlib import Path
from typing import Generator, Tuple, Optional, List, cast
from typing import Generator, Tuple, Optional, List, cast, Type

import dill

Expand All @@ -21,6 +21,7 @@
from autofit.non_linear.samples.sample import samples_from_iterator
from autoconf.dictable import from_dict
from autofit.non_linear.samples.summary import SamplesSummary
from autofit.non_linear.samples.util import simple_model_for_kwargs

# noinspection PyProtectedMember
original_create_file_handle = dill._dill._create_filehandle
Expand Down Expand Up @@ -178,6 +179,7 @@ def __init__(self, directory: Path, reference: dict = None):
self.__search = None
self.__model = None
self._samples = None
self._latent_samples = None

self.directory = directory

Expand All @@ -200,7 +202,9 @@ def samples_summary(self) -> SamplesSummary:

This is loaded from a JSON file.
"""
return self.value("samples_summary")
summary = self.value("samples_summary")
summary.model = self.model
return summary

@property
def instance(self):
Expand Down Expand Up @@ -240,36 +244,49 @@ def samples(self) -> SamplesPDF:
and a JSON containing metadata.
"""
if not self._samples:
try:
info_json = JSONOutput(
"info", self.files_path / "samples_info.json"
).dict

with open(self.files_path / "samples.csv") as f:
sample_list = samples_from_iterator(csv.reader(f))

cls = cast(Samples, get_class(info_json["class_path"]))

self._samples = cls.from_list_info_and_model(
sample_list=sample_list,
samples_info=info_json,
model=self.model,
)
except FileNotFoundError:
raise AttributeError("No samples found")
self._samples = self._load_samples(
model=self.model,
)
return self._samples

@property
def latent_variables(self):
def latent_samples(self):
"""
The latent variables of the search, parsed from a CSV file.
"""
with open(self.files_path / "latent.csv") as f:
reader = csv.reader(f)
headers = next(reader)
from autofit.non_linear.analysis.latent_variables import LatentVariables
if not self._latent_samples:
self._latent_samples = self._load_samples("latent")
return self._latent_samples

def _load_samples(self, name=None, model=None):
if name:
directory = self.files_path / name
else:
directory = self.files_path
try:
info_json = JSONOutput("info", directory / "samples_info.json").dict

with open(directory / "samples.csv") as f:
sample_list = samples_from_iterator(csv.reader(f))

return LatentVariables(headers, [list(map(float, row)) for row in reader])
if model is None:
try:
model = simple_model_for_kwargs(sample_list[0].kwargs)
except IndexError:
model = None

cls = cast(
Type[Samples],
get_class(info_json["class_path"]),
)

return cls.from_list_info_and_model(
sample_list=sample_list,
samples_info=info_json,
model=model,
)
except FileNotFoundError:
raise AttributeError(f"No {name} found")

def names_and_paths(
self,
Expand Down
4 changes: 1 addition & 3 deletions autofit/config/output.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,4 @@ covariance: true # `covariance.csv`: The [free parameters x free parameters] cov
data: true # `data.json`: The value of every data point in the data.
noise_map: true # `noise_map.json`: The value of every RMS noise map value.

search_log: true # `search.log`: logging produced whilst running the fit or fit_sequential method

default: false
search_log: true # `search.log`: logging produced whilst running the fit or fit_sequential method
6 changes: 3 additions & 3 deletions autofit/database/aggregator/scrape.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,8 @@ def _add_files_fit(fit: m.Fit, item: SearchOutput):
except AttributeError:
logger.warning(f"Failed to load samples for {fit.id}")
try:
fit.latent_variables = item.latent_variables
except FileNotFoundError:
fit.latent_samples = item.latent_samples
except AttributeError:
logger.warning(f"Failed to load latent variables for {fit.id}")

_add_files(fit, item)
Expand All @@ -176,7 +176,7 @@ def _add_files(fit: m.Fit, item: SearchOutput):
fit.set_pickle(pickle_output.name, pickle_output.value)

for array_output in item.arrays:
if array_output.name in ("samples", "latent_variables"):
if array_output.name in ("samples", "latent_samples"):
continue
try:
fit.set_array(array_output.name, array_output.value)
Expand Down
3 changes: 3 additions & 0 deletions autofit/database/migration/steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
Step(
"ALTER TABLE object ADD COLUMN latent_variables_for_id INTEGER;",
),
Step(
"ALTER TABLE object RENAME COLUMN latent_variables_for_id TO latent_samples_for_id;",
),
]

migrator = Migrator(*steps)
14 changes: 7 additions & 7 deletions autofit/database/model/fit.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,8 +256,8 @@ def best_fit(self) -> "Fit":
_samples = sa.orm.relationship(
Object, uselist=False, foreign_keys=[Object.samples_for_id]
)
_latent_variables = sa.orm.relationship(
Object, uselist=False, foreign_keys=[Object.latent_variables_for_id]
_latent_samples = sa.orm.relationship(
Object, uselist=False, foreign_keys=[Object.latent_samples_for_id]
)

@property
Expand All @@ -273,12 +273,12 @@ def samples(self, samples):

@property
@try_none
def latent_variables(self) -> dict:
return self._latent_variables()
def latent_samples(self) -> dict:
return self._latent_samples()

@latent_variables.setter
def latent_variables(self, latent_variables):
self._latent_variables = Object.from_object(latent_variables.efficient())
@latent_samples.setter
def latent_samples(self, latent_samples):
self._latent_samples = Object.from_object(latent_samples.minimise())

@property
def info(self):
Expand Down
8 changes: 5 additions & 3 deletions autofit/database/model/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,11 @@ class Object(Base):
"Fit", uselist=False, foreign_keys=[samples_for_id]
)

latent_variables_for_id = sa.Column(sa.String, sa.ForeignKey("fit.id"))
latent_variables_for = sa.orm.relationship(
"Fit", uselist=False, foreign_keys=[latent_variables_for_id]
latent_samples_for_id = sa.Column(sa.String, sa.ForeignKey("fit.id"))
latent_samples_for = sa.orm.relationship(
"Fit",
uselist=False,
foreign_keys=[latent_samples_for_id],
)

children: List["Object"] = sa.orm.relationship(
Expand Down
Loading