Skip to content

Commit

Permalink
Remove get_ensemble_by_name from LocalStorage
Browse files Browse the repository at this point in the history
Ensemble names are only unique within a single experiment.
  • Loading branch information
dafeda committed Sep 3, 2024
1 parent 8395bbf commit fbc1e61
Show file tree
Hide file tree
Showing 20 changed files with 91 additions and 65 deletions.
12 changes: 12 additions & 0 deletions src/ert/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,12 @@ def get_ert_parser(parser: Optional[ArgumentParser] = None) -> ArgumentParser:
"then only realizations 0,1,2,3,...,9 will be used to perform experiments "
"while realizations 10,11, 12,...,49 will be excluded",
)
ensemble_smoother_parser.add_argument(
"--experiment-name",
type=str,
default="es",
help="Name of the experiment",
)

# iterative_ensemble_smoother_parser
iterative_ensemble_smoother_description = (
Expand Down Expand Up @@ -483,6 +489,12 @@ def get_ert_parser(parser: Optional[ArgumentParser] = None) -> ArgumentParser:
required=False,
help="The number of iterations to run.",
)
iterative_ensemble_smoother_parser.add_argument(
"--experiment-name",
type=str,
default="ies",
help="Name of the experiment",
)

# es_mda_parser
es_mda_description = f"Run '{ES_MDA_MODE}' in cli"
Expand Down
1 change: 0 additions & 1 deletion src/ert/storage/local_experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ def get_ensemble_by_name(self, name: str) -> LocalEnsemble:
----------
name : str
The name of the ensemble to retrieve.
Returns
-------
local_ensemble : LocalEnsemble
Expand Down
20 changes: 0 additions & 20 deletions src/ert/storage/local_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,26 +185,6 @@ def get_ensemble(self, uuid: Union[UUID, str]) -> LocalEnsemble:
uuid = UUID(uuid)
return self._ensembles[uuid]

def get_ensemble_by_name(self, name: str) -> LocalEnsemble:
"""
Retrieves an ensemble by name.
Parameters
----------
name : str
The name of the ensemble to retrieve.
Returns
-------
local_ensemble : LocalEnsemble
The ensemble associated with the given name.
"""

for ens in self._ensembles.values():
if ens.name == name:
return ens
raise KeyError(f"Ensemble with name '{name}' not found")

@property
def experiments(self) -> Generator[LocalExperiment, None, None]:
yield from self._experiments.values()
Expand Down
1 change: 1 addition & 0 deletions src/ert/storage/migration/block_fs.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ def migrate_case(storage: Storage, path: Path, stack: ExitStack) -> None:
parameters=parameter_configs,
responses=response_configs,
observations=ert_config.observations,
name="migrate-case",
)
ensemble = experiment.create_ensemble(
name=path.name,
Expand Down
3 changes: 2 additions & 1 deletion test-data/poly_example/Plot_correlations.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
"ert_config = ErtConfig.from_file(\"poly.ert\")\n",
"\n",
"with open_storage(ert_config.ens_path, mode=\"r\") as storage:\n",
" ensemble = storage.get_ensemble_by_name(\"default_1\")\n",
" experiment = storage.get_experiment_by_name(\"ensemble-experiment\")\n",
" ensemble = experiment.get_ensemble_by_name(\"default_1\")\n",
" corr_XY = ensemble.load_cross_correlations()\n",
"\n",
"coeffs = corr_XY.COEFFS.values\n",
Expand Down
3 changes: 2 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,8 @@ def snake_oil_storage(snake_oil_case_storage):
@pytest.fixture
def snake_oil_default_storage(snake_oil_case_storage):
with open_storage(snake_oil_case_storage.ens_path) as storage:
yield storage.get_ensemble_by_name("default_0")
experiment = storage.get_experiment_by_name("ensemble-experiment")
yield experiment.get_ensemble_by_name("default_0")


@pytest.fixture(scope="session")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ def run_cli_ES_with_case(poly_config):
poly_config,
"--port-range",
"1024-65535",
"--experiment-name",
"test-experiment",
)
storage_path = ErtConfig.from_file(poly_config).ens_path
with open_storage(storage_path) as storage:
prior_ensemble = storage.get_ensemble_by_name("iter-0")
posterior_ensemble = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("test-experiment")
prior_ensemble = experiment.get_ensemble_by_name("iter-0")
posterior_ensemble = experiment.get_ensemble_by_name("iter-1")
return prior_ensemble, posterior_ensemble


Expand Down
23 changes: 14 additions & 9 deletions tests/integration_tests/analysis/test_es_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,15 @@ def test_that_posterior_has_lower_variance_than_prior():
"--realizations",
"1-50",
"poly.ert",
"--experiment-name",
"es-test",
)
facade = LibresFacade.from_config_file("poly.ert")
with open_storage(facade.enspath) as storage:
prior_ensemble = storage.get_ensemble_by_name("iter-0")
experiment = storage.get_experiment_by_name("es-test")
prior_ensemble = experiment.get_ensemble_by_name("iter-0")
df_default = prior_ensemble.load_all_gen_kw_data()
posterior_ensemble = storage.get_ensemble_by_name("iter-1")
posterior_ensemble = experiment.get_ensemble_by_name("iter-1")
df_target = posterior_ensemble.load_all_gen_kw_data()

# The std for the ensemble should decrease
Expand Down Expand Up @@ -132,9 +135,9 @@ def sample_prior(nx, ny):
ert_config = ErtConfig.from_file("snake_oil_surface.ert")

storage = open_storage(ert_config.ens_path)

ens_prior = storage.get_ensemble_by_name("iter-0")
ens_posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
ens_prior = experiment.get_ensemble_by_name("iter-0")
ens_posterior = experiment.get_ensemble_by_name("iter-1")

# Check that surfaces defined in INIT_FILES are not changed by ERT
surf_prior = ens_prior.load_parameters("TOP", list(range(ensemble_size)))["values"]
Expand Down Expand Up @@ -170,8 +173,9 @@ def test_update_multiple_param():
ert_config = ErtConfig.from_file("snake_oil.ert")

storage = open_storage(ert_config.ens_path)
prior_ensemble = storage.get_ensemble_by_name("iter-0")
posterior_ensemble = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior_ensemble = experiment.get_ensemble_by_name("iter-0")
posterior_ensemble = experiment.get_ensemble_by_name("iter-1")

prior_array = _all_parameters(prior_ensemble, list(range(10)))
posterior_array = _all_parameters(posterior_ensemble, list(range(10)))
Expand Down Expand Up @@ -441,8 +445,9 @@ def _evaluate(coeffs, x):
ert_config = ErtConfig.from_file("poly.ert")

with open_storage(ert_config.ens_path) as storage:
prior = storage.get_ensemble_by_name("iter-0")
posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior = experiment.get_ensemble_by_name("iter-0")
posterior = experiment.get_ensemble_by_name("iter-1")

assert all(
posterior.get_ensemble_state()[idx]
Expand Down
10 changes: 6 additions & 4 deletions tests/integration_tests/storage/test_field_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,9 @@ def test_field_param_update(tmpdir):
)
config = ErtConfig.from_file("config.ert")
with open_storage(config.ens_path, mode="w") as storage:
prior = storage.get_ensemble_by_name("iter-0")
posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior = experiment.get_ensemble_by_name("iter-0")
posterior = experiment.get_ensemble_by_name("iter-1")

prior_result = prior.load_parameters("MY_PARAM", list(range(5)))["values"]
assert len(prior_result.x) == NCOL
Expand Down Expand Up @@ -238,8 +239,9 @@ def test_parameter_update_with_inactive_cells_xtgeo_grdecl(tmpdir):
)
config = ErtConfig.from_file("config.ert")
with open_storage(config.ens_path) as storage:
prior = storage.get_ensemble_by_name("iter-0")
posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior = experiment.get_ensemble_by_name("iter-0")
posterior = experiment.get_ensemble_by_name("iter-1")

prior_result = prior.load_parameters("MY_PARAM", list(range(realizations)))[
"values"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,9 @@ def test_surface_param_update(tmpdir):
"config.ert",
)
with open_storage(tmpdir / "storage") as storage:
prior = storage.get_ensemble_by_name("iter-0")
posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior = experiment.get_ensemble_by_name("iter-0")
posterior = experiment.get_ensemble_by_name("iter-1")
prior_param = (
prior.load_parameters("MY_PARAM", range(5))["values"]
.values.reshape(5, 2 * 3)
Expand Down
21 changes: 13 additions & 8 deletions tests/integration_tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -584,8 +584,9 @@ def test_es_mda(snapshot):

with open_storage("storage", "r") as storage:
data = []
experiment = storage.get_experiment_by_name("es-mda")
for iter_nr in range(4):
ensemble = storage.get_ensemble_by_name(f"iter-{iter_nr}")
ensemble = experiment.get_ensemble_by_name(f"iter-{iter_nr}")
data.append(ensemble.load_all_gen_kw_data())
result = pd.concat(
data,
Expand Down Expand Up @@ -670,7 +671,7 @@ def test_that_running_ies_with_different_steplength_produces_different_result():
give different results when running SIES.
"""

def _run(target):
def _run(target, experiment_name):
run_cli(
ITERATIVE_ENSEMBLE_SMOOTHER_MODE,
"--disable-monitor",
Expand All @@ -681,12 +682,15 @@ def _run(target):
"poly.ert",
"--num-iterations",
"1",
"--experiment-name",
experiment_name,
)
facade = LibresFacade.from_config_file("poly.ert")
with open_storage(facade.enspath) as storage:
iter_0_fs = storage.get_ensemble_by_name(f"{target}-0")
experiment = storage.get_experiment_by_name(experiment_name)
iter_0_fs = experiment.get_ensemble_by_name(f"{target}-0")
df_iter_0 = iter_0_fs.load_all_gen_kw_data()
iter_1_fs = storage.get_ensemble_by_name(f"{target}-1")
iter_1_fs = experiment.get_ensemble_by_name(f"{target}-1")
df_iter_1 = iter_1_fs.load_all_gen_kw_data()

result = pd.concat(
Expand All @@ -708,7 +712,7 @@ def _run(target):
)
)

result_1 = _run("target_result_1")
result_1 = _run("target_result_1", experiment_name="ies-1")

# Run SIES with different step-lengths defined
with open("poly.ert", mode="a", encoding="utf-8") as fh:
Expand All @@ -722,7 +726,7 @@ def _run(target):
)
)

result_2 = _run("target_result_2")
result_2 = _run("target_result_2", experiment_name="ies-2")

# Prior should be the same
assert result_1.loc["iter-0"].equals(result_2.loc["iter-0"])
Expand Down Expand Up @@ -826,8 +830,9 @@ def test_exclude_parameter_from_update():
"poly.ert",
)
with open_storage("storage", "r") as storage:
prior = storage.get_ensemble_by_name("iter-0")
posterior = storage.get_ensemble_by_name("iter-1")
experiment = storage.get_experiment_by_name("es")
prior = experiment.get_ensemble_by_name("iter-0")
posterior = experiment.get_ensemble_by_name("iter-1")
assert prior.load_parameters(
"ANOTHER_KW", tuple(range(5))
) == posterior.load_parameters("ANOTHER_KW", tuple(range(5)))
Expand Down
3 changes: 2 additions & 1 deletion tests/performance_tests/enkf/test_load_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ def test_load_from_fs(benchmark, template_config):

with path.as_cwd(), open_storage(path / "storage", mode="w") as storage:
facade = LibresFacade.from_config_file("poly.ert")
load_from = storage.get_ensemble_by_name("default")
experiment = storage.get_experiment_by_name("ensemble-experiment")
load_from = experiment.get_ensemble_by_name("default")
expected_reals = template_config["reals"]
realisations = [True] * expected_reals
loaded_reals = benchmark(
Expand Down
4 changes: 3 additions & 1 deletion tests/performance_tests/test_memory_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ def test_memory_smoothing(poly_template):
ert_config = ErtConfig.from_file("poly.ert")
fill_storage_with_data(poly_template, ert_config)
with open_storage(poly_template / "ensembles", mode="w") as storage:
prior_ens = storage.get_ensemble_by_name("prior")
experiment = storage.get_experiment_by_name("test-experiment")
prior_ens = experiment.get_ensemble_by_name("prior")
posterior_ens = storage.create_ensemble(
prior_ens.experiment_id,
ensemble_size=prior_ens.ensemble_size,
Expand All @@ -69,6 +70,7 @@ def fill_storage_with_data(poly_template: Path, ert_config: ErtConfig) -> None:
parameters=ens_config.parameter_configuration,
responses=ens_config.response_configuration,
observations=ert_config.observations,
name="test-experiment",
)
source = storage.create_ensemble(experiment_id, name="prior", ensemble_size=100)

Expand Down
18 changes: 12 additions & 6 deletions tests/unit_tests/analysis/test_es_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ def test_update_report(
snapshots are correct, they are just documenting the current behavior.
"""
ert_config = snake_oil_case_storage
prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")
posterior_ens = snake_oil_storage.create_ensemble(
prior_ens.experiment_id,
ensemble_size=ert_config.model_config.num_realizations,
Expand Down Expand Up @@ -116,7 +117,8 @@ def test_update_report_with_exception_in_analysis_ES(
snake_oil_storage,
):
ert_config = snake_oil_case_storage
prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")
posterior_ens = snake_oil_storage.create_ensemble(
prior_ens.experiment_id,
ensemble_size=ert_config.model_config.num_realizations,
Expand Down Expand Up @@ -160,7 +162,8 @@ def test_update_report_with_different_observation_status_from_smoother_update(
snake_oil_storage,
):
ert_config = snake_oil_case_storage
prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")

posterior_ens = snake_oil_storage.create_ensemble(
prior_ens.experiment_id,
Expand Down Expand Up @@ -262,7 +265,8 @@ def test_update_snapshot(
# Making sure that row scaling with a row scaling factor of 1.0
# results in the same update as with ES.
# Note: seed must be the same!
prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")
posterior_ens = snake_oil_storage.create_ensemble(
prior_ens.experiment_id,
ensemble_size=ert_config.model_config.num_realizations,
Expand Down Expand Up @@ -615,7 +619,8 @@ def test_update_only_using_subset_observations(
"""
ert_config = snake_oil_case_storage

prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")
posterior_ens = snake_oil_storage.create_ensemble(
prior_ens.experiment_id,
ensemble_size=ert_config.model_config.num_realizations,
Expand Down Expand Up @@ -743,7 +748,8 @@ def test_that_observations_keep_sorting(snake_oil_case_storage, snake_oil_storag
perturbations, so we make sure we maintain the order throughout.
"""
ert_config = snake_oil_case_storage
prior_ens = snake_oil_storage.get_ensemble_by_name("default_0")
experiment = snake_oil_storage.get_experiment_by_name("ensemble-experiment")
prior_ens = experiment.get_ensemble_by_name("default_0")
assert list(ert_config.observations.keys()) == list(
prior_ens.experiment.observations.keys()
)
Expand Down
3 changes: 2 additions & 1 deletion tests/unit_tests/gui/test_csv_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ def verify_exported_content(file_name, gui, ensemble_select):
if ensemble_select == "*":
ensemble_names = [e.name for e in gui.notifier.storage.ensembles]
for name in ensemble_names:
ensemble = gui.notifier.storage.get_ensemble_by_name(name)
experiment = gui.notifier.storage.get_experiment_by_name("es_mda")
ensemble = experiment.get_ensemble_by_name(name)
gen_kw_data = ensemble.load_all_gen_kw_data()

facade = LibresFacade.from_config_file("poly.ert")
Expand Down
7 changes: 4 additions & 3 deletions tests/unit_tests/gui/test_full_manual_update_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ def test_manual_analysis_workflow(ensemble_experiment_has_run, qtbot):
simulation_settings._ensemble_selector.setCurrentIndex(idx)

storage = gui.notifier.storage
ensemble_prior = storage.get_ensemble_by_name("iter-0")
experiment = storage.get_experiment_by_name("ensemble_experiment")
ensemble_prior = experiment.get_ensemble_by_name("iter-0")
active_reals = list(ensemble_prior.get_realization_mask_with_responses())
# Assert that some realizations failed
assert not all(active_reals)
Expand All @@ -92,11 +93,11 @@ def test_manual_analysis_workflow(ensemble_experiment_has_run, qtbot):
)

df_prior = ensemble_prior.load_all_gen_kw_data()
ensemble_posterior = storage.get_ensemble_by_name("iter-0_1")
ensemble_posterior = experiment.get_ensemble_by_name("iter-0_1")
df_posterior = ensemble_posterior.load_all_gen_kw_data()

# Making sure measured data works with failed realizations
MeasuredData(storage.get_ensemble_by_name("iter-0"), ["POLY_OBS"])
MeasuredData(experiment.get_ensemble_by_name("iter-0"), ["POLY_OBS"])

# We expect that ERT's update step lowers the
# generalized variance for the parameters.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ def test_sensitivity_restart(open_gui, qtbot, run_experiment):
simulation_settings._ensemble_selector.setCurrentIndex(idx)

storage = gui.notifier.storage
ensemble_prior = storage.get_ensemble_by_name("iter-0")
experiment = storage.get_experiment_by_name("ensemble_experiment")
ensemble_prior = experiment.get_ensemble_by_name("iter-0")
success = ensemble_prior.get_realization_mask_without_failure()
# Assert that some realizations failed
assert not all(success)
Expand Down
Loading

0 comments on commit fbc1e61

Please sign in to comment.