Skip to content

Commit

Permalink
Initialize ErtConfig in everest_to_ert
Browse files Browse the repository at this point in the history
  • Loading branch information
yngve-sk committed Oct 14, 2024
1 parent f60c511 commit 9e6dd9b
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 50 deletions.
80 changes: 48 additions & 32 deletions src/everest/simulator/everest_to_ert.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from typing import DefaultDict, Dict, List, Union

import everest
from ert.config import ErtConfig, ExtParamConfig
from ert.config.parsing import ConfigDict
from everest.config import EverestConfig
from everest.config.control_variable_config import (
ControlVariableConfig,
Expand Down Expand Up @@ -459,36 +461,6 @@ def _extract_seed(ever_config: EverestConfig, ert_config):
ert_config["RANDOM_SEED"] = random_seed


def _extract_controls(ever_config: EverestConfig, ert_config):
def _get_variables(
variables: Union[
List[ControlVariableConfig], List[ControlVariableGuessListConfig]
],
) -> Union[List[str], Dict[str, List[str]]]:
if (
isinstance(variables[0], ControlVariableConfig)
and getattr(variables[0], "index", None) is None
):
return [var.name for var in variables]
result: DefaultDict[str, list] = collections.defaultdict(list)
for variable in variables:
if isinstance(variable, ControlVariableGuessListConfig):
result[variable.name].extend(
str(index + 1) for index, _ in enumerate(variable.initial_guess)
)
else:
result[variable.name].append(str(variable.index)) # type: ignore
return dict(result)

# This adds an EXT_PARAM key to the ert_config, which is not a true ERT
# configuration key. When initializing an ERT config object, it is ignored.
# It is used by the Simulator object to inject ExtParamConfig nodes.
controls = ever_config.controls or []
ert_config["EXT_PARAM"] = {
control.name: _get_variables(control.variables) for control in controls
}


def _extract_results(ever_config: EverestConfig, ert_config):
objectives_names = [
objective.name
Expand All @@ -504,7 +476,9 @@ def _extract_results(ever_config: EverestConfig, ert_config):
ert_config["GEN_DATA"] = gen_data


def everest_to_ert_config_dict(ever_config: EverestConfig, site_config=None):
def everest_to_ert_config_dict(
ever_config: EverestConfig, site_config=None
) -> ConfigDict:
"""
Takes as input an Everest configuration, the site-config and converts them
to a corresponding ert configuration.
Expand All @@ -524,7 +498,49 @@ def everest_to_ert_config_dict(ever_config: EverestConfig, site_config=None):
_extract_model(ever_config, ert_config)
_extract_queue_system(ever_config, ert_config)
_extract_seed(ever_config, ert_config)
_extract_controls(ever_config, ert_config)
_extract_results(ever_config, ert_config)

return ert_config


def everest_to_ert_config(ever_config: EverestConfig) -> ErtConfig:
config_dict = everest_to_ert_config_dict(
ever_config, site_config=ErtConfig.read_site_config()
)

ert_config = ErtConfig.with_plugins().from_dict(config_dict=config_dict)
ens_config = ert_config.ensemble_config

def _get_variables(
variables: Union[
List[ControlVariableConfig], List[ControlVariableGuessListConfig]
],
) -> Union[List[str], Dict[str, List[str]]]:
if (
isinstance(variables[0], ControlVariableConfig)
and getattr(variables[0], "index", None) is None
):
return [var.name for var in variables]
result: DefaultDict[str, list] = collections.defaultdict(list)
for variable in variables:
if isinstance(variable, ControlVariableGuessListConfig):
result[variable.name].extend(
str(index + 1) for index, _ in enumerate(variable.initial_guess)
)
else:
result[variable.name].append(str(variable.index)) # type: ignore
return dict(result)

# This adds an EXT_PARAM key to the ert_config, which is not a true ERT
# configuration key. When initializing an ERT config object, it is ignored.
# It is used by the Simulator object to inject ExtParamConfig nodes.
for control in ever_config.controls or []:
ens_config.addNode(
ExtParamConfig(
name=control.name,
input_keys=_get_variables(control.variables),
output_file=control + ".json",
)
)

return ert_config
21 changes: 3 additions & 18 deletions src/everest/simulator/simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,17 @@
from ropt.evaluator import EvaluatorContext, EvaluatorResult

from ert import BatchSimulator, WorkflowRunner
from ert.config import ErtConfig, ExtParamConfig, HookRuntime
from ert.config import HookRuntime
from ert.storage import open_storage
from everest.config import EverestConfig
from everest.simulator.everest_to_ert import everest_to_ert_config_dict
from everest.simulator.everest_to_ert import everest_to_ert_config


class Simulator(BatchSimulator):
"""Everest simulator: BatchSimulator"""

def __init__(self, ever_config: EverestConfig, callback=None) -> None:
config_dict = everest_to_ert_config_dict(
ever_config, site_config=ErtConfig.read_site_config()
)
ert_config = ErtConfig.with_plugins().from_dict(config_dict=config_dict)

# Inject ExtParam nodes. This is needed because EXT_PARAM is not an ERT
# configuration key, but only a placeholder for the control definitions.
ens_config = ert_config.ensemble_config
for control_name, variables in config_dict["EXT_PARAM"].items():
ens_config.addNode(
ExtParamConfig(
name=control_name,
input_keys=variables,
output_file=control_name + ".json",
)
)
ert_config = everest_to_ert_config(ever_config)

super(Simulator, self).__init__(
ert_config,
Expand Down

0 comments on commit 9e6dd9b

Please sign in to comment.