Skip to content

Commit

Permalink
MLE conversion complete
Browse files Browse the repository at this point in the history
  • Loading branch information
Jammy2211 committed Jul 31, 2024
1 parent 1ee3e2a commit 3098150
Show file tree
Hide file tree
Showing 36 changed files with 76 additions and 93 deletions.
14 changes: 7 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,13 @@ venv.bak/
.idea
workspace/output/
output
test/optimize/test_fit
test/mle/test_fit
test/test_files/text/
test/
test_autofit/optimize/test_fit/
test_autofit/mle/test_fit/
test_autofit/test_files/text/psycopg2-binary==2.8.1
test_autofit/test_files/text/
fit/test_autofit/optimize/test_fit
fit/test_autofit/mle/test_fit
*.DS_Store

test_autofit/config/priors/old
Expand All @@ -157,7 +157,7 @@ test_autofit/samples.csv
__MACOSX
*.swp
test/autofit/test_fit
# Byte-compiled / optimized / DLL files
# Byte-compiled / mled / DLL files
__pycache__/
*.py[cod]
*$py.class
Expand Down Expand Up @@ -264,13 +264,13 @@ venv.bak/
.idea
workspace/output/
output
test/optimize/test_fit
test/mle/test_fit
test/test_files/text/
test/
test_autofit/optimize/test_fit/
test_autofit/mle/test_fit/
test_autofit/test_files/text/psycopg2-binary==2.8.1
test_autofit/test_files/text/
fit/test_autofit/optimize/test_fit
fit/test_autofit/mle/test_fit
*.DS_Store

test_autofit/config/priors/old
Expand Down
10 changes: 5 additions & 5 deletions autofit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,11 @@
from .non_linear.search.nest.dynesty.search.dynamic import DynestyDynamic
from .non_linear.search.nest.dynesty.search.static import DynestyStatic
from .non_linear.search.nest.ultranest.search import UltraNest
from .non_linear.search.optimize.drawer.search import Drawer
from .non_linear.search.optimize.bfgs.search import BFGS
from .non_linear.search.optimize.bfgs.search import LBFGS
from .non_linear.search.optimize.pyswarms.search.globe import PySwarmsGlobal
from .non_linear.search.optimize.pyswarms.search.local import PySwarmsLocal
from .non_linear.search.mle.drawer.search import Drawer
from .non_linear.search.mle.bfgs.search import BFGS
from .non_linear.search.mle.bfgs.search import LBFGS
from .non_linear.search.mle.pyswarms.search.globe import PySwarmsGlobal
from .non_linear.search.mle.pyswarms.search.local import PySwarmsLocal
from .non_linear.paths.abstract import AbstractPaths
from .non_linear.paths import DirectoryPaths
from .non_linear.paths import DatabasePaths
Expand Down
2 changes: 1 addition & 1 deletion autofit/config/non_linear/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Files

- ``mcmc.yaml``: Settings default behaviour of MCMC non-linear searches (e.g. Emcee).
- ``nest.yaml``: Settings default behaviour of nested sampler non-linear searches (e.g. Dynesty).
- ``optimizer.yaml``: Settings default behaviour of optimizer non-linear searches (e.g. PySwarms).
- ``mle.yaml``: Settings default behaviour of maximum likelihood estimator (mle) searches (e.g. PySwarms).
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Configuration files that customize the default behaviour of non-linear searches.

# **PyAutoFit** supports the following optimizer algorithms:
# **PyAutoFit** supports the following maximum likelihood estimator (MLE) algorithms:

# - PySwarms: https://github.com/ljvmiranda921/pyswarms / https://pyswarms.readthedocs.io/en/latest/index.html

# Settings in the [search], [run] and [options] entries are specific to each nested algorithm and should be
# determined by consulting that optimizers method's own readthedocs.
# determined by consulting that method's own readthedocs.

PySwarmsGlobal:
run:
Expand Down
2 changes: 1 addition & 1 deletion autofit/config/visualize/plots_search.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ nest:
corner_anesthetic: true # Output corner figure (using anestetic) during a non-linear search fit?
mcmc:
corner_cornerpy: true # Output corner figure (using corner.py) during a non-linear search fit?
optimize:
mle:
subplot_parameters: true # Output a subplot of the best-fit parameters of the model?
log_likelihood_vs_iteration: true # Output a plot of the log likelihood versus iteration number?
4 changes: 2 additions & 2 deletions autofit/interpolator/covariance.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,8 @@ def _relationships_for_value(
"""
analysis = self._analysis_for_value(value)
model = self.model(path_relationship_map=path_relationship_map or {})
optimizer = DynestyStatic()
result = optimizer.fit(model=model, analysis=analysis)
search = DynestyStatic()
result = search.fit(model=model, analysis=analysis)
return result.instance

def __getitem__(self, value: Equality) -> float:
Expand Down
2 changes: 1 addition & 1 deletion autofit/mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from autofit.non_linear.mock.mock_result import MockResult
from autofit.non_linear.mock.mock_result import MockResultGrid
from autofit.non_linear.mock.mock_search import MockSearch
from autofit.non_linear.mock.mock_search import MockOptimizer
from autofit.non_linear.mock.mock_search import MockMLE
from autofit.non_linear.mock.mock_samples_summary import MockSamplesSummary
from autofit.non_linear.mock.mock_samples import MockSamples
from autofit.non_linear.mock.mock_samples import MockSamplesNest
Expand Down
4 changes: 2 additions & 2 deletions autofit/non_linear/mock/mock_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,13 +157,13 @@ def perform_update(self, model, analysis, during_analysis, search_internal=None)
)


class MockOptimizer(MockSearch):
class MockMLE(MockSearch):
def __init__(self, **kwargs):
super().__init__(fit_fast=False, **kwargs)

@property
def samples_cls(self):
return MockOptimizer
return MockMLE

def project(
self, factor_approx: FactorApproximation, status: Status = Status()
Expand Down
2 changes: 1 addition & 1 deletion autofit/non_linear/paths/directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ def save_all(self, search_config_dict=None, info=None):
try:
info_start = self.search.initializer.info_from_model(model=self.model)
self._save_model_start_point(info=info_start)
except NotImplementedError:
except (NotImplementedError, AttributeError):
pass

self.save_json("model", to_dict(self.model))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

logger = logging.getLogger(__name__)

class OptimizePlotter(SamplesPlotter):
class MLEPlotter(SamplesPlotter):

def subplot_parameters(self, use_log_y : bool = False, use_last_50_percent : bool = False, **kwargs):
"""
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@
from autofit.non_linear.analysis import Analysis
from autofit.non_linear.search.abstract_search import NonLinearSearch
from autofit.non_linear.samples import Samples
from autofit.non_linear.plot.optimize_plotters import OptimizePlotter
from autofit.non_linear.plot.mle_plotters import MLEPlotter
from autofit.non_linear.plot.output import Output


class AbstractOptimizer(NonLinearSearch, ABC):
class AbstractMLE(NonLinearSearch, ABC):
@property
def config_type(self):
return conf.instance["non_linear"]["optimize"]
return conf.instance["non_linear"]["mle"]

@property
def samples_cls(self):
return Samples

@property
def plotter_cls(self):
return OptimizePlotter
return MLEPlotter

def plot_start_point(
self,
Expand Down Expand Up @@ -68,7 +68,7 @@ def plot_start_point(
def plot_results(self, samples):

def should_plot(name):
return conf.instance["visualize"]["plots_search"]["optimize"][name]
return conf.instance["visualize"]["plots_search"]["mle"][name]

plotter = self.plotter_cls(
samples=samples,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from autofit.database.sqlalchemy_ import sa

from autofit.mapper.prior_model.abstract import AbstractPriorModel
from autofit.non_linear.search.optimize.abstract_optimize import AbstractOptimizer
from autofit.non_linear.search.mle.abstract_mle import AbstractMLE
from autofit.non_linear.analysis import Analysis
from autofit.non_linear.fitness import Fitness
from autofit.non_linear.initializer import AbstractInitializer
Expand All @@ -16,7 +16,7 @@
import numpy as np


class AbstractBFGS(AbstractOptimizer):
class AbstractBFGS(AbstractMLE):
__identifier_fields__ = ()

method = None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

from autofit.mapper.prior_model.abstract import AbstractPriorModel
from autofit.non_linear.fitness import Fitness
from autofit.non_linear.search.optimize.abstract_optimize import AbstractOptimizer
from autofit.non_linear.search.mle.abstract_mle import AbstractMLE
from autofit.non_linear.initializer import AbstractInitializer
from autofit.non_linear.samples import Samples, Sample


class Drawer(AbstractOptimizer):
class Drawer(AbstractMLE):
__identifier_fields__ = ("total_draws",)

def __init__(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from autofit.mapper.prior_model.abstract import AbstractPriorModel
from autofit.non_linear.fitness import Fitness
from autofit.non_linear.initializer import AbstractInitializer
from autofit.non_linear.search.optimize.abstract_optimize import AbstractOptimizer
from autofit.non_linear.search.mle.abstract_mle import AbstractMLE
from autofit.non_linear.samples.sample import Sample
from autofit.non_linear.samples.samples import Samples

Expand Down Expand Up @@ -66,7 +66,7 @@ def __call__(self, parameters, *kwargs):
return np.asarray(figure_of_merit_list)


class AbstractPySwarms(AbstractOptimizer):
class AbstractPySwarms(AbstractMLE):
def __init__(
self,
name: Optional[str] = None,
Expand All @@ -79,7 +79,7 @@ def __init__(
**kwargs
):
"""
A PySwarms Particle Swarm Optimizer global non-linear search.
A PySwarms Particle Swarm MLE global non-linear search.
For a full description of PySwarms, checkout its Github and readthedocs webpages:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from autofit.database.sqlalchemy_ import sa
from autofit.non_linear.initializer import AbstractInitializer
from autofit.non_linear.search.optimize.pyswarms.search.abstract import AbstractPySwarms
from autofit.non_linear.search.mle.pyswarms.search.abstract import AbstractPySwarms


class PySwarmsGlobal(AbstractPySwarms):
Expand All @@ -25,7 +25,7 @@ def __init__(
**kwargs
):
"""
A PySwarms Particle Swarm Optimizer global non-linear search.
A PySwarms Particle Swarm MLE global non-linear search.
For a full description of PySwarms, checkout its Github and readthedocs webpages:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional

from autofit.database.sqlalchemy_ import sa
from autofit.non_linear.search.optimize.pyswarms.search.abstract import AbstractPySwarms
from autofit.non_linear.search.mle.pyswarms.search.abstract import AbstractPySwarms


class PySwarmsLocal(AbstractPySwarms):
Expand All @@ -25,7 +25,7 @@ def __init__(
**kwargs
):
"""
A PySwarms Particle Swarm Optimizer global non-linear search.
A PySwarms Particle Swarm MLE global non-linear search.
For a full description of PySwarms, checkout its Github and readthedocs webpages:
Expand Down
2 changes: 1 addition & 1 deletion autofit/plot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from autofit.non_linear.plot.samples_plotters import SamplesPlotter
from autofit.non_linear.plot.mcmc_plotters import MCMCPlotter
from autofit.non_linear.plot.optimize_plotters import OptimizePlotter
from autofit.non_linear.plot.mle_plotters import MLEPlotter
from autofit.non_linear.plot.nest_plotters import NestPlotter
from autofit.non_linear.plot.output import Output
2 changes: 1 addition & 1 deletion docs/api/plot.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ Plotters

NestPlotter
MCMCPlotter
OptimizePlotter
MLEPlotter
10 changes: 6 additions & 4 deletions docs/api/searches.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Non-Linear Searches

A non-linear search is an algorithm which fits a model to data.

**PyAutoFit** currently supports three types of non-linear search algorithms: nested samplers,
Markov Chain Monte Carlo (MCMC) and optimizers.
**PyAutoFit** currently supports three types of non-linear search algorithms: nested samplers (nest),
Markov Chain Monte Carlo (MCMC) and Maximum Likelihood Estimators (MLE).

**Examples / Tutorials:**

Expand Down Expand Up @@ -41,8 +41,8 @@ MCMC
Emcee
Zeus

Optimizers
----------
Maximum Likelihood Estimators
-----------------------------

.. currentmodule:: autofit

Expand All @@ -51,6 +51,8 @@ Optimizers
:template: custom-class-template.rst
:recursive:

BFGS
LBFGS
PySwarmsLocal
PySwarmsGlobal

Expand Down
6 changes: 3 additions & 3 deletions test_autofit/analysis/test_free_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import autofit as af
from autofit.non_linear.analysis import FreeParameterAnalysis
from autofit.non_linear.mock.mock_search import MockOptimizer
from autofit.non_linear.mock.mock_search import MockMLE


def test_copy():
Expand Down Expand Up @@ -77,8 +77,8 @@ def make_result(
combined_analysis,
model,
):
optimizer = MockOptimizer()
return optimizer.fit(model, combined_analysis)
search = MockMLE()
return search.fit(model, combined_analysis)


@pytest.fixture(autouse=True)
Expand Down
2 changes: 1 addition & 1 deletion test_autofit/config/non_linear/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Files

- ``mcmc.yaml``: Settings default behaviour of MCMC non-linear searches (e.g. Emcee).
- ``nest.yaml``: Settings default behaviour of nested sampler non-linear searches (e.g. Dynesty).
- ``optimizer.yaml``: Settings default behaviour of optimizer non-linear searches (e.g. PySwarms).
- ``mle.yaml``: Settings default behaviour of maximum likelihood estimator (mle) searches (e.g. PySwarms).
Original file line number Diff line number Diff line change
@@ -1,22 +1,3 @@
DownhillSimplex:
initialize:
method: prior
printing:
silence: false
search:
disp: 1
ftol: 0.0001
full_output: 0
maxfun: null
maxiter: null
retall: 0
xtol: 0.0001
updates:
iterations_per_update: 11
log_every_update: 1
model_results_every_update: 1
remove_state_files_at_end: true
visualize_every_update: 1
Drawer:
initialize:
ball_lower_limit: 0.49
Expand Down
2 changes: 1 addition & 1 deletion test_autofit/config/non_linear/mock.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
MockOptimizer:
MockMLE:
initialize:
method: prior
printing:
Expand Down
Loading

0 comments on commit 3098150

Please sign in to comment.