Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
49 changes: 5 additions & 44 deletions pixi.lock

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ dependencies = [
"numpy>=1.26",
"pandas>=2.1",
"plotly>=5.14",
"pybaum>=0.1.2",
"scipy>=1.11",
"sqlalchemy>=2.0",
"annotated-types>=0.4",
Expand Down Expand Up @@ -349,7 +348,6 @@ ignore_errors = true

[[tool.mypy.overrides]]
module = [
"pybaum",
"scipy",
"scipy.linalg",
"scipy.linalg.lapack",
Expand Down Expand Up @@ -439,6 +437,7 @@ cma = ">=3.3"
pygad = ">=3.2"
pytorch-cpu = ">=2.2"
ruff = ">=0.15.5,<0.16"
optree = ">=0.19.0,<0.20"

[tool.pixi.pypi-dependencies]
optimagic = { path = ".", editable = true }
Expand Down
38 changes: 20 additions & 18 deletions src/estimagic/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,20 @@

import numpy as np
import pandas as pd
from pybaum import leaf_names, tree_flatten, tree_just_flatten, tree_unflatten

from estimagic.bootstrap_ci import calculate_ci
from estimagic.bootstrap_helpers import check_inputs
from estimagic.bootstrap_outcomes import get_bootstrap_outcomes
from estimagic.shared_covs import calculate_estimation_summary
from optimagic.batch_evaluators import joblib_batch_evaluator
from optimagic.parameters.block_trees import matrix_to_block_tree
from optimagic.parameters.tree_registry import get_registry
from optimagic.parameters.tree_registry import (
leaf_names,
tree_flatten,
tree_just_flatten,
tree_unflatten,
)
from optimagic.typing import value_namespace
from optimagic.utilities import get_rng


Expand Down Expand Up @@ -102,9 +107,9 @@ def bootstrap(
# Process results
# ==================================================================================

registry = get_registry(extended=True)
flat_outcomes = [
tree_just_flatten(_outcome, registry=registry) for _outcome in all_outcomes
tree_just_flatten(_outcome, namespace=value_namespace)
for _outcome in all_outcomes
]
internal_outcomes = np.array(flat_outcomes)

Expand Down Expand Up @@ -162,11 +167,10 @@ def outcomes(self):
List[Any]: The boostrap outcomes as a list of pytrees.

"""
registry = get_registry(extended=True)
_, treedef = tree_flatten(self._base_outcome, registry=registry)
_, treedef = tree_flatten(self._base_outcome, namespace=value_namespace)

outcomes = [
tree_unflatten(treedef, out, registry=registry)
tree_unflatten(treedef, out, namespace=value_namespace)
for out in self._internal_outcomes
]
return outcomes
Expand All @@ -182,10 +186,9 @@ def se(self):
cov = self._internal_cov
se = np.sqrt(np.diagonal(cov))

registry = get_registry(extended=True)
_, treedef = tree_flatten(self._base_outcome, registry=registry)
_, treedef = tree_flatten(self._base_outcome, namespace=value_namespace)

se = tree_unflatten(treedef, se, registry=registry)
se = tree_unflatten(treedef, se, namespace=value_namespace)
return se

def cov(self, return_type="pytree"):
Expand All @@ -206,8 +209,7 @@ def cov(self, return_type="pytree"):
cov = self._internal_cov

if return_type == "dataframe":
registry = get_registry(extended=True)
names = np.array(leaf_names(self._base_outcome, registry=registry))
names = np.array(leaf_names(self._base_outcome, namespace=value_namespace))
cov = pd.DataFrame(cov, columns=names, index=names)
elif return_type == "pytree":
cov = matrix_to_block_tree(cov, self._base_outcome, self._base_outcome)
Expand All @@ -234,15 +236,16 @@ def ci(self, ci_method="percentile", ci_level=0.95):
bounds of confidence intervals.

"""
registry = get_registry(extended=True)
base_outcome_flat, treedef = tree_flatten(self._base_outcome, registry=registry)
base_outcome_flat, treedef = tree_flatten(
self._base_outcome, namespace=value_namespace
)

lower_flat, upper_flat = calculate_ci(
base_outcome_flat, self._internal_outcomes, ci_method, ci_level
)

lower = tree_unflatten(treedef, lower_flat, registry=registry)
upper = tree_unflatten(treedef, upper_flat, registry=registry)
lower = tree_unflatten(treedef, lower_flat, namespace=value_namespace)
upper = tree_unflatten(treedef, upper_flat, namespace=value_namespace)
return lower, upper

def p_values(self):
Expand Down Expand Up @@ -271,8 +274,7 @@ def summary(self, ci_method="percentile", ci_level=0.95):
Soon this will be a pytree.

"""
registry = get_registry(extended=True)
names = leaf_names(self.base_outcome, registry=registry)
names = leaf_names(self.base_outcome, namespace=value_namespace)
summary_data = _calulcate_summary_data_bootstrap(
self, ci_method=ci_method, ci_level=ci_level
)
Expand Down
22 changes: 11 additions & 11 deletions src/estimagic/estimate_msm.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

import numpy as np
import pandas as pd
from pybaum import leaf_names, tree_just_flatten

from estimagic.msm_covs import cov_optimal, cov_robust
from estimagic.msm_sensitivity import (
Expand Down Expand Up @@ -51,10 +50,14 @@
from optimagic.parameters.bounds import Bounds, pre_process_bounds
from optimagic.parameters.conversion import Converter, get_converter
from optimagic.parameters.space_conversion import InternalParams
from optimagic.parameters.tree_registry import get_registry
from optimagic.parameters.tree_registry import (
leaf_names,
tree_just_flatten,
)
from optimagic.shared.check_option_dicts import (
check_optimization_options,
)
from optimagic.typing import value_namespace
from optimagic.utilities import get_rng, to_pickle


Expand Down Expand Up @@ -318,8 +321,7 @@ def func(x):
sim_mom = simulate_moments(params, **simulate_moments_kwargs)
if isinstance(sim_mom, dict) and "simulated_moments" in sim_mom:
sim_mom = sim_mom["simulated_moments"]
registry = get_registry(extended=True)
out = np.array(tree_just_flatten(sim_mom, registry=registry))
out = np.array(tree_just_flatten(sim_mom, namespace=value_namespace))
return out

int_jac = first_derivative(
Expand Down Expand Up @@ -418,8 +420,7 @@ def get_msm_optimization_functions(

chol_weights = np.linalg.cholesky(flat_weights)

registry = get_registry(extended=True)
flat_emp_mom = tree_just_flatten(empirical_moments, registry=registry)
flat_emp_mom = tree_just_flatten(empirical_moments, namespace=value_namespace)

_simulate_moments = _partial_kwargs(simulate_moments, simulate_moments_kwargs)
_jacobian = _partial_kwargs(jacobian, jacobian_kwargs)
Expand All @@ -430,7 +431,7 @@ def get_msm_optimization_functions(
simulate_moments=_simulate_moments,
flat_empirical_moments=flat_emp_mom,
chol_weights=chol_weights,
registry=registry,
namespace=value_namespace,
)
)

Expand All @@ -445,7 +446,7 @@ def get_msm_optimization_functions(


def _msm_criterion(
params, simulate_moments, flat_empirical_moments, chol_weights, registry
params, simulate_moments, flat_empirical_moments, chol_weights, namespace
):
"""Calculate msm criterion given parameters and building blocks."""
simulated = simulate_moments(params)
Expand All @@ -454,7 +455,7 @@ def _msm_criterion(
if isinstance(simulated, np.ndarray) and simulated.ndim == 1:
simulated_flat = simulated
else:
simulated_flat = np.array(tree_just_flatten(simulated, registry=registry))
simulated_flat = np.array(tree_just_flatten(simulated, namespace=namespace))

deviations = simulated_flat - flat_empirical_moments
residuals = deviations @ chol_weights
Expand Down Expand Up @@ -975,9 +976,8 @@ def sensitivity(
inner_tree=self._empirical_moments,
)
elif return_type == "dataframe":
registry = get_registry(extended=True)
row_names = self._internal_estimates.names
col_names = leaf_names(self._empirical_moments, registry=registry)
col_names = leaf_names(self._empirical_moments, namespace=value_namespace)
out = pd.DataFrame(
data=raw,
index=row_names,
Expand Down
8 changes: 3 additions & 5 deletions src/estimagic/msm_weighting.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import numpy as np
import pandas as pd
from pybaum import tree_just_flatten
from scipy.linalg import block_diag

from estimagic.bootstrap import bootstrap
from optimagic.parameters.block_trees import block_tree_to_matrix, matrix_to_block_tree
from optimagic.parameters.tree_registry import get_registry
from optimagic.parameters.tree_registry import tree_just_flatten
from optimagic.typing import value_namespace
from optimagic.utilities import robust_inverse


Expand Down Expand Up @@ -51,13 +51,11 @@ def get_moments_cov(

first_eval = calculate_moments(data, **moment_kwargs)

registry = get_registry(extended=True)

@functools.wraps(calculate_moments)
def func(data, **kwargs):
raw = calculate_moments(data, **kwargs)
out = pd.Series(
tree_just_flatten(raw, registry=registry)
tree_just_flatten(raw, namespace=value_namespace)
) # xxxx won't be necessary soon!
return out

Expand Down
18 changes: 9 additions & 9 deletions src/estimagic/shared_covs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
import numpy as np
import pandas as pd
import scipy
from pybaum import tree_just_flatten, tree_unflatten

from optimagic.parameters.block_trees import matrix_to_block_tree
from optimagic.parameters.tree_registry import get_registry
from optimagic.parameters.tree_registry import (
tree_just_flatten,
tree_unflatten,
)
from optimagic.typing import value_namespace


def transform_covariance(
Expand Down Expand Up @@ -146,9 +149,8 @@ def calculate_estimation_summary(
# Flatten summary and construct data frame for flat estimates
# ==================================================================================

registry = get_registry(extended=True)
flat_data = {
key: tree_just_flatten(val, registry=registry)
key: tree_just_flatten(val, namespace=value_namespace)
for key, val in summary_data.items()
}

Expand All @@ -167,7 +169,7 @@ def calculate_estimation_summary(
# ==================================================================================

# create tree with values corresponding to indices of df
indices = tree_unflatten(summary_data["value"], names, registry=registry)
indices = tree_unflatten(summary_data["value"], names, namespace=value_namespace)

estimates_flat = tree_just_flatten(summary_data["value"])
indices_flat = tree_just_flatten(indices)
Expand Down Expand Up @@ -316,8 +318,7 @@ def calculate_free_estimates(estimates, internal_estimates):
mask = internal_estimates.free_mask
names = internal_estimates.names

registry = get_registry(extended=True)
external_flat = np.array(tree_just_flatten(estimates, registry=registry))
external_flat = np.array(tree_just_flatten(estimates, namespace=value_namespace))

free_estimates = FreeParams(
values=external_flat[mask],
Expand Down Expand Up @@ -351,8 +352,7 @@ def transform_free_values_to_params_tree(values, free_params, params):
mask = free_params.free_mask
flat = np.full(len(mask), np.nan)
flat[np.ix_(mask)] = values
registry = get_registry(extended=True)
pytree = tree_unflatten(params, flat, registry=registry)
pytree = tree_unflatten(params, flat, namespace=value_namespace)
return pytree


Expand Down
9 changes: 4 additions & 5 deletions src/optimagic/benchmarking/run_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
"""

import numpy as np
from pybaum import tree_just_flatten

from optimagic import batch_evaluators
from optimagic.algorithms import AVAILABLE_ALGORITHMS
from optimagic.optimization.optimize import minimize
from optimagic.parameters.tree_registry import get_registry
from optimagic.parameters.tree_registry import tree_just_flatten
from optimagic.typing import value_namespace


def run_benchmark(
Expand Down Expand Up @@ -180,7 +180,6 @@ def _process_one_result(optimize_result, problem):
dict: Processed result.

"""
_registry = get_registry(extended=True)
_criterion = problem["noise_free_fun"]
_start_x = problem["inputs"]["params"]
_start_crit_value = _criterion(_start_x)
Expand All @@ -191,15 +190,15 @@ def _process_one_result(optimize_result, problem):

# This will happen if the optimization raised an error
if isinstance(optimize_result, str):
params_history_flat = [tree_just_flatten(_start_x, registry=_registry)]
params_history_flat = [tree_just_flatten(_start_x, namespace=value_namespace)]
criterion_history = [_start_crit_value]
time_history = [np.inf]
batches_history = [0]
else:
history = optimize_result.history
params_history = history.params
params_history_flat = [
tree_just_flatten(p, registry=_registry) for p in params_history
tree_just_flatten(p, namespace=value_namespace) for p in params_history
]
if _is_noisy:
criterion_history = np.array([_criterion(p) for p in params_history])
Expand Down
Loading